Makefile Quick Reference Card
常规伪目标:
. PHONY 向make说明不管是否有这个文件,这个目标就是伪目标。
all 所有目标的目标。
clean 删除所有make创建的文件。
install 安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中。
print 列出改变过的源文件。
tar 把源程序打包备份。
dist 创建一个压缩文件,一般是把tar文件压成Z文件或gz文件。
TAGS 更新所有的目标,以备完整地重编译使用。
check和test
这两个一般用来测试makefile的流程。
常用自动化变量
$@ 目标文件集。
$% 仅当目标是函数库文件,表示规则中的目标成员名。如,一个目标是foo.a(bar.o),那么,"$%"就是"bar.o","$@"就是"foo.a"。
$< 依赖文件集,如果依赖目标是以模式(即"%")定义的。
$? 所有比目标新的依赖目标的集合。
$^ 所有的依赖目标的集合。
$+ 很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$* 表示目标模式中"%"及其之前的部分。后缀是make所不能识别的,那么"$*"就是空值。
make的参数
“-b”
“-m” 忽略和其它版本make的兼容性。
“-B”
“--always-make”
所有的目标都需要更新(重编译)。
“-C <dir>”
“--directory=<dir>”
指定读取makefile的目录。
“—debug[=<options>]”
输出make的调试信息。有几种不同的级别,如没参数,输出最简单的调试信息。下面是<options>的取值:
a ——输出所有的调试信息。
b——只输出简单的调试信息。 v ——在b选项的级别之上。
i ——输出所以的隐含规则。
j ——输出执行规则中命令的详细信息。
m ——输出make读取makefile,更新makefile,执行makefile的信息。
“-d”
相当于“--debug=a”。
“-e”
“--environment-overrides”
指明环境变量的值覆盖makefile中定义的变量的值。
“-f=<file>”
“--file=<file>”
“--makefile=<file>”
指定需要执行的makefile。
“-h”
“--help”
显示帮助信息。
“-i”
“--ignore-errors”
在执行时忽略所有的错误。
“-I <dir>”
“--include-dir=<dir>”
指定一个被包含makefile的搜索目标。
“-j [<jobsnum>]”
“--jobs[=<jobsnum>]”
指同时运行命令的个数。
“-k”
“--keep-going”
出错也不停止运行。
“-l <load>”
“--load-average[=<load]”
“—max-load[=<load>]”
指定make运行命令的负载。
“-n”
“--just-print”
“--dry-run”
“--recon”
仅输出执行过程中的命令序列,但并不执行。
“-o <file>”
“--old-file=<file>”
“--assume-old=<file>”
不重新生成的指定的<file>,即使这个目标的依赖文件新于它。
“-p”
“--print-data-base”
输出makefile中的所有数据,包括所有的规则和变量。
“-q”
“--question”
不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,如果是2则说明有错误发生。
“-r”
“--no-builtin-rules”
禁止make使用任何隐含规则。
“-R”
“--no-builtin-variabes”
禁止make使用任何作用于变量上的隐含规则。
“-s”
“--silent”
“--quiet”
在命令运行时不输出命令的输出。
“-S”
“--no-keep-going”
“--stop”
取消“-k”选项的作用。
“-t”
“--touch”
把目标的修改日期变成最新的。
“-v”
“--version”
输出make程序的版本、版权等信息。
“-w”
“--print-directory”
输出运行makefile之前和之后的信息。
“--no-print-directory”
禁止“-w”选项。
“-W <file>”
“--what-if=<file>”
“--new-file=<file>”
“--assume-file=<file>”
假定目标<file>需要更新,如果和“-n”选项使用,那么这个参数会输出该目标更新时的运行动作。如果没有“-n”那么就像运行UNIX的“touch”命令一样,使得<file>的修改时间为当前时间。
“--warn-undefined-variables”
只 要make发现有未定义的变量,那么就输出警告信息。
条件控制
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
Endif
循环控制
SUBDIRS= fs io ipc mem pty sched syscalls
all:
@set –e; for i in $(SUBDIRS); do $(MAKE) –C $$i ; done
install:
@set –e; for i in $(SUBDIRS); do $(MAKE) –C $$i install ; done
clean:
@set –e; for i in $(SUBDIRS); do $(MAKE) –C $$i clean ; done
其中$$i表示SUBDIRS中的各个项。
常用函数
$(str:a=b) 将str中的a替换成b。
$(subst <from>,<to>,<text>)
$(patsubst <pattern>,<replacement>,<text>)
$(strip <string>)
$(findstring <find>,<in>)
$(filter <pattern...>,<text>)
$(filter-out <pattern...>,<text>)
$(sort <list>)
$(word <n>,<text>)
$(wordlist <s>,<e>,<text>)
$(words <text>)
$(firstword <text>)
$(dir <names...>)
$(notdir <names...>)
$(suffix <names...>)
$(basename <names...>)
$(addsuffix <suffix>,<names...>)
$(addprefix <prefix>,<names...>)
$(join <list1>,<list2>)
$(wildcard *.o)