make如何运行
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,找指定的target如果没有指定兆文件中的第一个目标(target),并把这个文件作为最终的目标文件。
- 如果target文件不存在或target所依赖的文件修改时间要比target文件新,执行后面定义的命令来生成target文件。
- 如果target所依赖的文件需要生成,在当前文件中找依赖文件的依赖性,如果找到则再根据这个依赖规则生成文件。类似递归
- 无依赖后逐级返回生成。
make命令行
- -f –file –makefile=
指定makefile命令。 - -n –just-print –dry-run –recon 只显示命令行不会执行命令
- -s –slient 禁止显示命令行
- -i –ignore-errors 忽略所有命令行错误
- -k –keep-going 忽略某个命令行出错的target
- -w –print-directory 显示make的当前工作目录。
- -C –directory=
指定make的当前工作目录。 - -e –environment-overrides 系统变量值将代替makefile中定义的同名变量值。
- -t –touch 更新target的生成日期但不真正生成
- -q –question 查找target找到返回2找不到返回错误
- -W
--what-if= --assume-new= --new-file= 执行与指定文件相关的规则 - -b -m 忽略兼容性
- -B –always-make 强制所有文件重新编译
-
—debug <a b v i j m> a输出所有、b只输出简单的调试信息、v输出哪个makefile被解析,不需要被重编译的依赖文件(或是依赖目标)等、i输出所有的隐含规则、j输出执行规则中命令的详细信息,如命令的PID、返回码等、m输出make读取makefile,更新makefile,执行makefile的信息。 - -d 相当于–debug=a
- -h –help
- -j –jobs[=
] 同时执行命令的个数 - -l –load-average —max-load[=
] make命令的负载? - -o –old-file –assume-old=
不重新生成某个文件 - -p –print-data-base 打印make中的所有变量、规则并执行
- -r –no-builtin-rules 禁止使用任何隐含规则
- -R –no-builtin-variabes 禁止使用应用到变量上的隐含规则
- -s –silent –quiet 不输出命令的输出
- -S –no-keep-going –stop 可以取消-k的作用,有命令出错就停止
- -v –version 输出版本信息
- –no-print-directory 禁用-w选项
- -W –what-if –new-file –assume-file=
更新某文件日期但不真正生成 - –warn-undefined-variables 发现未定义变量则输出警告
引用其它的Makefile
- include
- -include
忽略文件不存在的错误 - sinclude
忽略文件不存在的错误 - MAKEFILES 环境变量 指定在所有makefile中包含的文件,但这些文件的错误、target不起作用。
符号使用
- * 表示任意字符
- % 表示0或任意字符
- ~ 表示当前用户的$HOME目录。“~hchen”则表示用户hchen的宿主目录。在Windows或是MS-DOS下根据环境变量“HOME”而定。
- $@ 表示target的一个数组,依次取内容执行代入操作。
- $< 表示依赖的一个数组,依次取内容执行代入操作。
- @ 用于命令前,表示当前命令行不显示
-
- 表示忽略本行所导致的错误继续执行
- = := ?= += 变量赋值,:当赋值过程中有后面才定义的变量会用空代入。?如果当前变量已经定义则什么都不做。+追加内容。
-
$% 类似$< 只在target为库文件(.a .lib)时代入,其它代入空 - $? 所有比target新的的依赖文件
- $^ 所有依赖的文件以空格间隔会去重
- $+ 类似$^但不去重
- $* %及它之前的部分
- $(@D)、$(*D)、$(%D) $@单词中目录部分,如果没有目录返回.
- $(@F)、$(*F)、$(%F) $@单词中文件部分
- $(<D)、$(+D)、$(^D)、$(?D)
- $(<F)、$(+F)、$(^F)、$(?D)
特殊变量
- VPATH 指定搜索文件目录,目录由“:”分隔。
关键字
- vpath 指定搜索目录。vpath %.h path1:path2 指定h头文件搜索目录,vpath %.h 清除h头文件搜索路径。vpaht清除所有
- .PHONY 指定伪目标。
- .IGNORE 作为目标 指定此目标下的所有命令错误都将被忽略
- export 将变量传递给子make使用。
- define endef 定义多行变量,可以用来写子函数。
- override 变量名前,表示make命令行参数可以赋值给这个变量。
语法
- 命令前必须有Tab或命令直接跟在依赖后并用封号分隔。
- 在定义参数前用target限定,该参数只在当前target及其衍生target中起作用。
- ifeq ifneq ifdef ifndef else endif 在读取时判断非运行时
- foreach 零时变量,数组,命令 循环取数组执行命令
- call 带序号变量的表达式,参数1,参数2… 序号变量为$(1) $(2)等 #系统自带的表达式if foreach strip
函数
- subst 被代替,代替,源 #静态替换
- patsubst 被代替的模式,代替模式,源 #通配符替换,通配符可在被替代中代入
- strip 源 #删除源开头和结尾的空格
- findstring 被查找串,源 #找到返回被查找串,否则返回空
- filter 过滤模式 过滤模式 …,源 #将源中符合模式的单词挑出
- filter-out 过滤模式 过滤模式 …,源 #将源中符合模式的单词去掉
- sort 源 #删除重复单词并排序
- word n,源 #提取第n个单词
- wordlist begin,end,源 #提取从begin到end的单词
- words 源 #返回单词个数
- firstword 源 #返回第一个单词
- dir 源 #取源中文件的路径,如果文件没有带路径则返回./
- notdir 源 #取源中文件的文件名
- suffix 源 #取源中文件的后缀
- basename 源 #取源中文件的前缀
- addsuffix 后缀,源 #将源中单词加上后缀
- addprefix 前缀,源 #将源中单词加上前缀
- join 源1,源2 #将源2中的单词链接到源1的单词后面,多的部分直接放在后面
- origin 变量名 #返回变量定义来源undefined、default、environment、file、command line、override、automatic
- shell cmd #将shell命令的结果返回
- error 提示 #抛出致命错误信息,停止执行
- warning 提示 #抛出警告信息,不停止执行
- wildcard 匹配模式 #由于在变量及函数中匹配并不代入因此使用函数将其展开并用空格分隔。
- if 条件,命令<,命令> #类似ifeq
endif - eval 内容 #将内容作为makefile的一部分执行
- lastword 源 #返回最后一个单词
Make的返回值
- 0 成功
- 1 错误
- 2 命令行使用-q 并且target不需要生成
command line build err
- ld file was built for archive which is not the architecture being linked - brew uninstall binutils