10年前第一次学习Makefile就是这份资料。现在正好在做底层,那么就拿出来复习下。
- “.PHONY : all”声明了“all”这个目标为“伪目标”。
- “%.o”表明要所有以“.o”结尾的目标,也就是“foo.o bar.o”
- “@”表示目标集(也就是“foo.o bar.o”)。
- 如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
- 如果make执行时,带入make参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令,这个功能很有利于我们调试我们的Makefile,看看我们书写的命令是执行起来是什么样子的或是什么顺序的。
- 如果你要传递变量到下级Makefile中,那么你可以使用这样的声明:export <variable ...>
- 如果我们执行“总控Makefile”时有make参数或是在上层Makefile中定义了这个变量,那么MAKEFILES变量将会是这些参数,并会传递到下层Makefile中,这是一个系统级的环境变量。
- 还有一个在“嵌套执行”中比较有用的参数,“-w”或是“--print-directory”会在make的过程中输出一些信息,让你看到目前的工作目录。
- include_dirs
CFLAGS = (var:a=b)”或是“(foo:%.o=%.c)也是替换 - 如果make指定了“-e”参数,那么,系统环境变量将覆盖Makefile中定义的变量,不推荐把许多的变量都定义在系统环境中。
- 变量可以定义在某个目标上。模式变量的好处就是,我们可以给定一种“模式”,可以把变量定义在符合这种模式的所有目标上。
- 条件判断ifeq/ifneq/ifdef
- 常用函数subst、patsubst、strip、findstring、filter、filter-out、wordlist、notdir、suffix、join
- $(foreach <var>,<list>,<text>)
- $(if <condition>,<then-part>)
- call函数
网友评论