GUN make 简明手册

GNU make 简明手册

TODO: 介绍

基本语法

1
2
3
target: prerequisite1 prerequisite2 ... prerequisiteN
[tab]command
...

续行, 转义: ‘\‘

有效的 Makefile 文件

1
./Makefile ./makefile ./GNUMakefile

目标

1
第一个 target 作为最终的(默认) target, 或指定 target: make target

变量(宏)

1
2
objects = 一行字符
引用(展开): $(objects)

自动推导(隐晦规则)

1
当 target 为 %.o 的形式, %.c 将自动加入依赖关系中, 并生成 command: cc -c %.c

公共依赖

1
2
3
4
$(ojectes): header.h
objecte1: header1.h
objecte2: header2.h
...

伪目标

1
2
3
4
.PHONY target1 target2 ... targetN

.PHONY 的作用:
.PHONY 修饰明确告诉 make一个 target 与文件无关, 在生成这个 target 之前不必检查对应文件是不是 up-to-date 的, 如果当前目录刚好有一个与 target 名字相同, 比依赖新的文件将混淆 make, 造成生成 all clean 等目标也会失败

- 标记

1
2
3
-command: 忽略错误

-rm $(targets) *.o

规则文件

1
显式指定makefile: make --file Makefile.mk

包含

1
2
3
inc = makefile1 makefile2
include foo.make *.mk $(inc)
include 目录: -I --include-dir ./include

通配符

1
2
objects = *.o:不会被展开
objects := $(wildcard *.o)

文件搜索

1
2
3
4
5
6
7
8
VPATH src:../inc
目录以:分隔

vpath <pattern> <directories>
<pattern>: %.c
多目录, 按顺序搜索
vpath <pattern>
vpath

伪目标

1
2
伪目标可有依赖, 也可被依赖
伪目标旧于依赖, 新于被依赖

多目标

1
$@ $^

静态模式

1
2
3
4
5
6
7
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>

objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@

其他

1
2
@command: 不显示命令
-n --just-print: 只显示命令

命令执行

1
2
继承环境, command1; command2
cd ~/; pwd

嵌套 make

1
2
3
4
5
6
变量会传递到下层 make, 但不会覆盖
export variable = ...
unexport variable = ...
variable = ...
export variable
传递所有:export

变量

1
2
大小写敏感, 使用:$variable, $(variable), ${variable}
转义$: $$

赋值

1
2
3
4
= :可引用后面定义的的变量
:= :不可引用后面定义的变量
?= :如果已有定义,什么也不做
追加: +=

条件结构

1
2
3
4
5
6
7
8
ifeq (a, b)
...
else
...
endif

ifneq
ifdef

函数

1
2
3
4
$(函数名 参数1, 参数2, ..., 参数n)
$(shell command): `command`
$(error, <text>)
$(warning, <text>)

约定

1
2
3
4
5
6
7
8
AR - 函数库打包程序, 默认命令是"ar"
AS - 汇编语言编译程序, 默认命令是"as"
CC - C语言编译程序, 默认命令是"cc"
CXX - C++语言编译程序, 默认命令是"g++"
CPP - C预处理器, 默认命令是"$(CC) -E"
TEX - 创建TeX DVI, 默认命令是"tex"
WEAVE - 转换Web到TeX的程序, 默认命令是"weave"
RM - 删除文件命令, 默认命令是"rm -r"

自动化变量

1
2
3
4
5
$@ - 目标文件集
$% - 仅当目标是函数库文件中, 表示目标成员名
$< - 第一个依赖
$? - 所有比目标新的依赖
$^ - 所有依赖
如果这篇文章对您有用,可以考虑打赏:)