重新学一遍Makefile

  1. 链接

  2. % 的意思是匹配零或若干字符

  3. -$(subst output,,$@) 中的 $ 表示执行一个Makefile的函数,函数名为subst, 后面的为参数。这里的这个函数是替换字符串的意思。
  4. $@ 表示目标的 集合,就像一个数组, $@ 依次取出目标,并执于命令。
  5. $< 表示第一个依赖文件,或表示了所有依赖目标的挨个值
  6. $(filter %.o,$(files)) 表示调用Makefile的filter函数,过滤“$files”集,只要其中模式 为“%.o”的内容。
  7. 大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中 包含的头文件,并生成一个依赖关系。这样一来,你就不必再手动书写若干文件的依赖关系,而由编译器自动生成了。需要提醒一句的是,如果你使用GNU的C/C++编译器,你得用 -MM 参数,不然, -M 参数会把一些标准库的头文件也包含进来。
  8. GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,为每一 个 name.c 的文件都生成一个 name.d 的Makefile文件, .d 文件中就存放对应 .c 文件的依赖关系。
  9. $$$$ 意为一个随机编号
  10. $(sources:.c=.d) 中的 .c=.d 的意思是做一个替换,把变量 $(sources) 所有 .c 的字串都替换成 .d
  11. @ 字符在命令行前,那么, 这个命令将不被make显示出来
  12. 如果make执行时,带入make参数 -n 或 –just-print ,那么其只是显示命令,但不会执行 命令,这个功能很有利于我们调试我们的Makefile,看看我们书写的命令是执行起来是什么样子的或是什么 顺序的。而make参数 -s 或 –silent 或 –quiet 则是全面禁止命令的显示。
  13. 如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。
  14. 忽略命令的出错,我们可以在Makefile的命令行前加一个减号 -
  15. 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
  16. 还是不要在命令后面直接注释了,注释另起一行比较保险。
  17. ?= 和 :=
  18. 我们可以替换变量中的共有的部分,其格式是 $(var:a=b) 或是 ${var:a=b} ,其意思是, 把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。
  19. 因此,如果我们在环境变量中设置了 CFLAGS 环境变量,那么我们就可以在所有的Makefile中使用 这个变量了。这对于我们使用统一的编译参数有比较大的好处。如果Makefile中定义了CFLAGS,那么则会 使用Makefile中的这个变量,如果没有定义则使用系统环境变量的值,一个共性和个性的统一,很像“全局 变量”和“局部变量”的特性。

  20. 检查tab: cat -e -t -v makefile_name

  21. make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句, 所以,你最好不要把自动化变量(如 $@ 等)放入条件表达式中,因为自动化变量是在运行时才有的。
  22. 函数
  23. call 函数在处理参数时,如果第2个及其之后的参数中的空格会被保留,可能造成一些奇怪的效果。因而在向call函数提供参数时,最安全的做法是 去除所有多余的空格。
  24. 自动化变量

本文标题:重新学一遍Makefile

文章作者:Alfred

发布时间:2020年03月02日 - 19:03

最后更新:2020年03月02日 - 19:03

原始链接:http://blog.hbsun.top/2020/03/02/重新学一遍Makefile/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。