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
auto系列
- autoscan 扫描源码生成 configure.scan 重命名 configure.ac
- aclocal 扫描configure.ac生成aclocal.m4 包含自建及三方的宏定义
- autoconf 扫描configure.ac生成configure 遇到不认识的宏去aclocal.m4查
- autoheader 扫描configure.ac生成config.h.in
- automake 扫描Makefile.am生成Makefile.in
- m4 宏工具 autoconf依赖m4展开shell脚本
- libtool是脚本 生成编译器连接器的参数
- autoreconf 自动按合理顺序调用上面的工具 ```sh #configure.ac 建议书写顺序 Autoconf requirements AC_INIT(package, version, address) information on the package checks for programs checks for libraries checks for header files checks for types checks for structures checks for compiler characteristics checks for library functions checks for system services AC_CONFIG_FILES([file…]) AC_OUTPUT
#常见宏 AC_PREREQ autoconf 版本要求 AC_INIT 定义软件包信息 AC_CONFIG_SCRDIR 确定源文件存在 AC_CONFIG_HEADER 指定config.h.in生成路径 AC_CONFIG_AUX_DIR 指定辅助脚本文件工具安装目录 AC_CONFIG_MACRO_DIR 宏文件m4存放路径, Makefile.am中 ACLOCAL_AMFLAGS = -I m4路径 AM_INIT_AUTOMAKE 指定需要调用automake AM_PROG_AR 指定AR路径 AC_PROG_CC 指定C编译器路径 AC_MSG_xxx AC_MSG_ERROR… AC_DISABLE_SHARED 禁用动态库, 用户用–enable-shared覆盖 LT_INIT 使用libtool, 需要去掉AC_PROG_RANLIB AC_CANONICAL_HOST 生成host_cpu,host_vendor,host_os AC_CHECK_HEADERS 检查头文件 AC_DEFINE 符号定义,需要AH_TEMPLATE模板 AC_DEFINE_UNQUOTED 类似AC_DEFINE AM_CONDITIONAL 生成automake条件宏, 在Makefile.am使用这个条件判断 AC_ARG_ENABLE 增加编译选项 AS_HELP_STRING 格式化字符串 AC_SUBST 创建或给变量赋值 AC_CONFIG_FILES 生成Makefile文件
```