Skip to content

Makefile 语法 ​

注释 ​

makefile
# 这是注释
result.txt: source.txt
    # 这是注释
    cp source.txt result.txt # 这也是注释

回声(echoing) ​

正常情况下,make会打印每条命令,然后再执行,这就叫做回声(echoing)。

make
test:
    # This is a test.

执行上面的规则,会得到下面的结果。

bash
❯ make test
# This is a test.

在命令的前面加上@,就可以关闭回声。

make
test:
    @# 这是测试

现在再执行 make test,就不会有任何输出。

由于在构建过程中,需要了解当前在执行哪条命令,所以通常只在注释和纯显示的echo命令前面加上@。

make
test:
    @# 这是测试
    @echo TODO

通配符 ​

通配符(wildcard)用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 一致,主要有星号 *、问号 ? 和 ...。比如, *.o 表示所有后缀名为 o 的文件。

make
clean:
	rm -f *.o

模式匹配 ​

Make命令允许对文件名,进行类似正则运算的匹配,主要用到的匹配符是 %。比如,假定当前目录下有 f1.c 和 f2.c 两个源码文件,需要将它们编译为对应的对象文件。

make
%.o: %.c

等同于下面的写法。

make
f1.o: f1.c
f2.o: f2.c

使用匹配符 %,可以将大量同类型的文件,只用一条规则就完成构建。

变量和赋值符 ​

Makefile 允许使用等号自定义变量。

make
txt = hello world
test:
	@echo $(txt)

上面代码中,变量 txt 等于 Hello World。调用时,变量需要放在 \$( ) 之中。

调用Shell变量,需要在美元符号前,再加一个美元符号,这是因为Make命令会对美元符号转义。

make
test:
    @echo $$HOME
make
VARIABLE = value
# 在执行时扩展,允许递归扩展。

VARIABLE := value
# 在定义时扩展。

VARIABLE ?= value
# 只有在该变量为空时才设置值。

VARIABLE += value
# 将值追加到变量的尾端。

内置变量 ​

Make命令提供一系列内置变量,比如,(MAKE) 指向当前使用的Make工具,这主要是为了跨平台的兼容性。

make
output:
    $(CC) -o output input.c