% 的意思是匹配零或若干字符
-$(subst output,,$@)
中的 $ 表示执行一个Makefile的函数,函数名为subst, 后面的为参数。这里的这个函数是替换字符串的意思。$@
表示目标的 集合,就像一个数组,$@
依次取出目标,并执于命令。$(filter %.o,$(files))
表示调用Makefile的filter函数,过滤“$files”集,只要其中模式 为“%.o”的内容。大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中 包含的头文件,并生成一个依赖关系。这样一来,你就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用 -MM 参数,不然, -M 参数会把一些标准库的头文件也包含进来。
$$$$
意为一个随机编号$(sources:.c=.d)
中的.c=.d
的意思是做一个替换,把变量$(sources)
所有.c
的字串都替换成.d
如果make执行时,带入make参数 -n 或 –just-print ,那么其只是显示命令,但不会执行 命令,这个功能很有利于我们调试我们的Makefile,看看我们书写的命令是执行起来是什么样子的或是什么 顺序的。而make参数 -s 或 –silent 或 –quiet 则是全面禁止命令的显示。
如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。
忽略命令的出错,我们可以在Makefile的命令行前加一个减号 -
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上
$
符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。还是不要在命令后面直接注释了,注释另起一行比较保险。
我们可以替换变量中的共有的部分,其格式是
$(var:a=b)
或是${var:a=b}
,其意思是, 把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。因此,如果我们在环境变量中设置了 CFLAGS 环境变量,那么我们就可以在所有的Makefile中使用 这个变量了。这对于我们使用统一的编译参数有比较大的好处。如果Makefile中定义了CFLAGS,那么则会 使用Makefile中的这个变量,如果没有定义则使用系统环境变量的值,一个共性和个性的统一,很像“全局 变量”和“局部变量”的特性。
检查tab:
cat -e -t -v makefile_name
make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句, 所以,你最好不要把自动化变量(如
$@
等)放入条件表达式中,因为自动化变量是在运行时才有的。call 函数在处理参数时,如果第2个及其之后的参数中的空格会被保留,可能造成一些奇怪的效果。因而在向call函数提供参数时,最安全的做法是 去除所有多余的空格。
重新学一遍Makefile
本文标题:重新学一遍Makefile
发布时间:2020年03月02日 - 19:03
最后更新:2025年01月29日 - 21:01
原始链接:http://blog.hbsun.top/2020/03/02/%E9%87%8D%E6%96%B0%E5%AD%A6%E4%B8%80%E9%81%8DMakefile/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。