- .phony是表示目标是伪目标,并不生成相应的文件。.phony标志的文件总是执行的。
1. 短横(-)与@
@(常用在 echo 之前):make 在执行编译打包等命令前会在命令行输出此命令,称之为回显,如果要执行的命令前以字符@开始,则不会回显该条命令,
echo XXX... # 执行该条命令时,将输出: echo XXX... XXX... # 不仅会输出echo要输出的信息(XXX...),还会输出echo这一命令信息 @echo XXX... # 执行命令时,将输出: XXX... # 不会输出echo命令
-短横(用在 clean 目标, rm 命令前),忽略本条命令的执行成功与否,会继续执行后续命令,类似于 try catch finally 的 finally 代码段
clean: rm *.o rm *.a
如果 rm *.o 命令发生错误,rm *.a 将不会被执行,
clean: -rm *.o -rm *.a
不论 -rm .o,是否执行成功,-rm .a 都会被执行;
2. 特殊符号
$@, $^, $<
- $@ 代表目标
- $^ 代表所有的依赖对象
- $< 代表第一个依赖对象
=/:=/+=
- +=:变量的值的尾部增加内容
foo = abc foo += efg # foo 的值就是 abc efg
- :=:立即生效;=:变量被引用时递归生效;
bar=456 foo=${bar} bar=${xxx} xxx=123 all: echo ${foo} # 递归生效,echo 显示的内容为123
bar=456 foo:=${bar} bar=${xxx} xxx=123 all: echo ${foo} # 立即生效,echo 显示的内容为 456
3. all
all : hello another
hello : hello.cpp
g++ -o $@ $<
another : another.cpp
g++ -o $@ $<
- make hello 的话只编译 hello.cpp
- make another 的话只编译 another.cpp
- 直接 make 或 make all 的话会执行 hello.cpp 和 another.cpp 的编译命令
- 后面不加参数的话,会把第一个目标作为默认的(因此,make 等价于 make all,因为 all 为第一个目标)