makefile规则整理

实际开发中,makefile改的多,写的少。

为了后面不要在编译链接这种地方花费太多的时间,在这里系统性的整理其规则:

基本格式
TARGET : PREREQUISITES
command1
command2
... TARGET:1个目标(.o,lable,可执行文件等等) PREREQUISITES: 一个或者多个,依赖的文件 command:
任意的shell命令;
当依赖的文件中,只要有文件修改日期比TARGET的修改日期新,或者TARGET不存 在,就会触发下面的command执行;
命令需要以TAB键开头,默认的是/bin/sh;
如果下一个命令需要建立在上一个执行,那么需要写到同一行,用分号分隔开;
命令失败,make会退出规则执行,命令前加一个'-'可以忽略出错,继续执行;
makefile的查找顺序

默认情况下,当前目录下依次查找:“GNUmakefile”、“makefile”、“Makefile”
makefile中的“include”可以将其余位置的makefile文件内容展开到当前文件;
makefile的执行顺序

第一个目标是终极目标,终极目标有且仅有一个;
不跟lable的make命令执行,会找到第一个目标开始生成,一层一层往下找依赖关系生成目标,直到第一个TARGET生成后结束;
其中的command命令执行失败,不会影响make的继续运行;
但是依赖文件的生成失败,会导致makefile报错退出;
用.PHONY可以声明一些labe,控制make的执行顺序;
makefile特殊变量

VPATH:寻找依赖文件时,当前路径下没有的情况下,可以自动去这个变量路径找
makefile自动变量

$@
规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。 $<
依赖目标中的第一个目标名字 $?
所有比目标新的依赖目标的集合。以空格分隔 $^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,去除重复的依赖目标,只保留一份 $+
所有依赖目标的集合。不去除重复的依赖目标
静态规则
TARGETS:TARGET-PATTERN:PRE-PATTERN
command 这个用法其实就是将“多目标规则”和“目标依赖文件模式通配”相结合。
TARGET-PATTERN通配TARGETS,PRE-PATTERN是对TARGET-PATTERN进行一个二次解析的替换,最终类似与:TARGETS:PRE-PATTERN的效果。
命令参数

make -h :输出help信息(其实有这个就足够了)
make -n :不执行命令,只显示命令,用于调试
make -s :禁止命令显示
make -C :cd到一个目录,然后执行make
make -f :指定make文件
make -B :认为所有的目标都更新,重编译
变量的使用

1. $(var)进行var的使用;
2. $$,表示$字符
3. := ,覆盖之前的值,值决定于它在makefile中的位置,而不是整个makefile展开后的最终值
4. ?= ,如果没有被赋值过就赋予等号后面的值
5. = , make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值
6. +=, 追加变量的值

最新文章

  1. Nginx配置文件
  2. (20160604)开源第三方学习之CocoaLumberjack
  3. jellyfish K-mer analysis and genome size estimate
  4. memcached/redis安全性
  5. 将矩阵转化为LibSvm需要的格式
  6. 解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一
  7. c++ 输出虚函数表内容
  8. 【CNMP系列】CentOS7.0下安装PHP5.6.30服务
  9. EFcore与动态模型(三)
  10. Scaffolding Template on Asp.Net Core Razor Page
  11. Discuz论坛URL静态化规则urlrewrite
  12. [poj2152]fire_树形dp
  13. Gradle 1.12用户指南翻译——第四十二章. Announce插件
  14. 常用MySQL操作(一)
  15. php生成带参数二维码
  16. 工作时间看股票:采用Excel RTD技术获取和讯网的实时股票行情及深沪港最新指数
  17. VitualBox安装linux记录
  18. 用javac编译servlet类出现问题
  19. D - I Think I Need a Houseboat(1.3.1)
  20. doDBA 监控用法

热门文章

  1. Ubuntu搜狗输入法无法输入中文等问题
  2. 1、React-Native的基础入门
  3. JDK1.8简单配置环境变量---两步曲
  4. 使用inotify-tools与rsync构建实时备份系统
  5. 【c学习-6】
  6. php-5.6.26源代码 - 扩展模块的种类,扩展模块的执行埋点
  7. python中的字典内置方法小结
  8. 将Komodo Edit打造成Python开发的IDE
  9. Python学习笔记:sqlite3(sqlite数据库操作)
  10. 创建控制器view的几种方式