Automatic-Prerequisite:
Makefile 编译过程中有较多的依赖条件,其中.h也是其中的一种,例如如果Main.c 包含def.h,则规则可以这么写:
main.o: def.h
为了避免需要写入大量的.h依赖,常用的编译器都支持自动生成依赖文件,使用方式如下:
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html
inclue -include sinclude
Makefile中也支持include功能,其中常见的包含include,-include,sinclude 三种。
include 会执行标准的包含动作,如果未指明文件路径,则遵循以下的文件查找规则:
(1)在当前目录下进行查找
(2)查找“-I”或者“–include-dir”命令指定的目录
(3)查找 “/usr/local/include, /usr/gnu/include, /usr/local/include, /usr/include”
当在这些目录下都没有找到“include”指定的文件时,make将会提示一个包含文件未找到的告警提示,但是不会立刻退出。而是继续处理Makefile的后续内容。当完成读取整个Makefile后,make将试图使用规则来创建通过指示符“include”指定的但未找到的文件,当不能创建它时(没有创建这个文件的规则),make将提示致命错误并退出。会输出类似如下错误提示:
Make: * No rule to make target ‘’. Stop
-include 与include具有相同的功能,但唯一的差异是如果我包含的文件不存在,Makefile会忽略出现的错误继续执行
sinclude 与-include具有相同的功能,为了与某些其他make实现兼容,GNU添加了这个命令
https://www.gnu.org/software/make/manual/html_node/Include.html
Makeifle信息显示
makefile包含三种信息输出命令:
(errortext…)输出text信息,并在前面添加Makefile名称和行号,并错误退出
(warning text…)
输出text信息,并在前面添加Makefile名称和行号,但不会错误退出
$(info text…)
输出text信息,不添加Makefile名称和行号,也不会错误退出
https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html