Makefile中以#开头的视为注释。如需使用#,则需要转意"\#"。
make命令默认识别makefile和Makefile两个文件。makefile比Makefile优先级高。
推荐使用Makefile
如果makefile名字为非默认的两个,则可通过-f/--file这个参数来指定。
make -f t.mk 或者 make --file t.mk clean
makefile的隐式推导规则之一:
目录下有main.c文件
1:make main 来编译main.c生成名字为main的可执行文件
2:make main.o来编译main.c生成main.o的目标文件
通过include指示符将其后面跟随的文件加载到本makefile中,类似于C语言的#include
Makefile:
include /home/xx/include.mk #include指示符需要顶格写
SRC-y += a.c
SRC-y += b.c
include /home/xx/prog.mk
当文件中只有遇到include指示符才去展开相应的文件
include等类似的命令被称为指示符。
注:以下优先级只适用于include后非绝对路径情况。
如果include后跟随的是绝对路径,文件有则有,没有则报错。
include查找文件的优先级:
1: 查找make命令通过-I/--include-dir参数传进的目录
2:/usr/gnu/include,/usr/local/include,/usr/include这三个目录
-include /home/xx/prog.mk
前面的"-"表示如果include出错不提示,继续执行make。直到出现必要的依赖缺失而报错。
MAKEFILES:
export MAKEFILES=/home/xx/proc-t/t.mk aa=ttt #设置环境变量,用空格分开
Makefile:
$(warning $(aa))
make运行结果:ttt。
MAKEFILES要点:
1:MAKEFILS中添加的文件,会像include一样展开到当前makefile,但是这些文件中的目标不会作为终极目标
2:如果MAKEFILES中的文件不存在,则不会报错
3:MAKEFILES中的文件,在一开始就会都展开,而include则是在遇到include指示符的时候展开
如果需要某条规则,即使目标文件存在也要执行,可以使用以下方法:
main:main.c force
gcc -o main main.c
force:;
main目标依赖force,而force使用的是空命令,force不会生成目标,
所以main的依赖force每次都不存在,所以每次都会重新执行。
通过define...endef定义一个命令报
define test
echo "ooo"
a = test
endef
对已定义的变量要修改其值,可通过override命令重写。
ifdef....endif,ifndef...endif,ifeq...endif,ifneq...endif,ifdef...else...endif等
阅读(1171) | 评论(0) | 转发(0) |