make的参数和运行规则

1.退出码

make执行后会返回一个退出值:
0 :表示执行成功
1 : 运行时出错
2:如果使用了make的-q参数,并且make是的一些目标不需要更新,就返回2

2.指定makefile

GNU make会自动在当前目录下依次查找 GNUmakefile 、makefile 和 Makefile这三个文件,GNUmakefile是GNU特有的,其他版本的make不一定会查找这个文件,剩下两个则是大多数make都会去查找的文件名。推荐使用Makefile这个名称,因为大写的字典序比较靠前。这也是业界通常的做法,使用Makefile这个文件名来编写make的规则。
我们也可以使用参数来指定要执行的makefile

make -f filename
make --file=filename
make --makefile=filename

3.指定目标

make默认生成makefile里的第一个目标,我们也可以指定要生成的目标/伪目标。

make clean
make install

4.检查规则

有些时候我们只是想查看要更新的文件有什么,而不需要生成。
-n: 不执行参数,这些参数只是打印命令,不管目标是否更新,把规则和连带规则下的命令打印出来, 但不执行,这些参数对于我们调试 makefile 很有用处。

5.include

使用include指令可以读入其他makefile文件的内容,效果就如同在include的位置用对应的文件内容替换一样。

include mkf1 mkf2 # 可以引入多个文件,用空格隔开
include *.mk # 可以用通配符,表示引入所有以.mk结尾的文件

如果找不到对应文件,则会报错,如果要忽略错误,可以在include前加-

-include mkf1 mkf2

应用实例:自动生成依赖

gcc -MM demo.c 这条命令会输出demo.c所依赖的文件

objs = a.o b.o c.o e.o d.o demo.o

demo:$(objs)
gcc $(objs) -o $@

%.o:%.c
gcc -c $<
@echo $^


include $(objs:%.o=%.d) # 导入所有.d文件,如果不存在,就去找对应的生成规则来生成.d文件。引入后的目标依赖会进行目标合并

%.d:%.c
@-rm $@
gcc -MM $< > $@.temp
@sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.temp > $@
@-rm $@.temp

.PHONY:clean
clean:
-rm *.o
-rm *.d

6.嵌套makefile

如果将一个大项目分为许多小项目,则可以使用嵌套(递归)使用make。具体做法为,写一个总的Makefile,然后在每个子项目中都写一个Makefile,在总Makefile中进行调用。

$(MAKE) -C subdir

这一指令会自动进入subdir文件夹然后执行make。

可以通过export指令向子项目的make传递变量。

export var  # 传递var
export # 传递所有变量
unexport # 取消传递

7.

更过参数的使用详见官方文档