一个简单的Makefile描述规则组成:

TARGET...:PREREQUISITES...

  COMMANDS...

  ...

target:规则的目标。通常是程序中间或者最后要生成的文件名,也可以是伪目标。

prerequisites:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。

commands:规则的命令行,每条占一行,必须以[TAB]开头。

GNUMake的执行过程:

  第一阶段:读取所有的makefile文件(包括“MAKEFILE”变量指定的,提示符“include”指定的,以及命令行选项“-f或--file”指定的makefile文件),内建所有的变量,明确规则和隐含规则,并建立所有目标和依赖关系结构链表。

  第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。

目录搜寻:自动搜索依赖文件

1.一般搜索:

  特殊变量VPATH指定依赖文件的搜索路径。用冒号或者空格隔开,当前目录永远是第一搜索目录。

  例:VPATH=src:../headers

 2.选择性搜索:

  为不同类型的文件指定不同的搜索目录,关键字为vpath。使用方法:

  1). vpath PATTERN DIR  #指定模式PATTERN的搜索目录为DIR

  2). vpath PATTERN    #清楚模式PATTERN的文件设置的搜索路径,PATTERN为空则清除所有。

  例:  vpath %.h ../headers  #%匹配一个或多个字符

变量:

1.在规则中,通配符会被自动展开。但在变量的定义和使用函数时不会。这种情况下需要通配符有效,要用到函数“wildcard”

 用法:$(wildcard PATTERN...);

 在Makefile中,它被展开成已存在的,空格分割的,匹配此模式的所有文件列表。

 如:$(patsubst %.c,%.o,$(wildcard *.c))

 将获得一个列表,为上述列表所有.c文件替换为.o文件。

2.变量取值:

 immediate=deferred  (递归展开)

 immediate?=deferred  #如果变量已经被定义过则不做任何操作

 immediate:=deferred  (直接展开)

 immediate+=deferred or immediate (变量追加,以空格分割)

 当变量使用+=时,如果此前这个变量是一个简单变量(使用:=定义的),则认为它是立即展开的,其他情况都被认为是延后展开的变量。

3.自动化变量:

$@ :代表规则中的目标文件名。

$<: 规则的第一个依赖文件名。

$^: 规则的所有依赖文件列表,空格分割。

$?: 所有比目标文件更新的依赖文件列表。

$(@D):目标文件的目录部分(不含最后一个反斜线\)。

$(@F):目标文件的实际文件名。

$*: 在模式规则和静态模式规则中,代表“茎”,即%所代表的部分(若干文件名中存在目录,茎也将其包括)。

  

静态模式规则:

  存在多个目标,并且不同目标可以根据目标文件的名字来自动构造出依赖文件。要求依赖文件类似。

语法:

TARGETS..:TARGET-PATTERN:PREREQ-PATTERNS..

  COMMANDS

  ...

其中TARGETS为一系列目标文件。

TARGET-PATTERN为目标模式。

PREREQ-PATTERNS为依赖模式。

  从目标模式的目标名字中抽取一部分字符串(茎),并使用茎替代依赖模式中相应部分来产生对应目标的依赖文件。常用模式字符为%。

在使用静态模式规则时,指定目标必须和目标模式相匹配,否则会出错。

例:

objects=foo.o bar.o

$(objects):%.o:%.c

  $(cc) -c $< -o $@

 

命令:

·多行命令由多个独立的shell去执行。

·较长行可用反斜线\分解为多行。

·规则中命令在运行结束后,make会检测命令执行的返回状态,如果返回成功,则往下执行;如果出错,则会放弃对当前规则的执行。在命令前加-可以忽略错误。

·命令的执行默认回显,在命令前加@则不回显。

·默认情况下,make执行Makefile中第一个规则(终极目标)。

函数:

  函数的调用方法为:

  $(Function Argv) 或 ${Function Argv} ,当有多个参数时,用逗号隔开。

常用文本处理函数:

·模式替换

  $(patsubst PATTERN,REP,TEXT)

  将TEXT中以空格分开的单词列表,符合模式PATTERN的替换为REP,可用%代表一个单词中的若干字符。返回新的列表。

·字符串操作

  $(strip STRING)

    去掉STRING中开头和结尾的空格。

  $(filter PATTERN...,TEXT)

    过滤掉字符列表中所有不符合模式的单词,多个模式用逗号分隔。$(filter-out ...)与之相反。

·文件名处理

  $(dir NAMES...)  取目录

  $(notdir NAMES...) 取文件名 

  $(suffix NAMES...) 取后缀

  $(addsuffix SUFFIX,NAMES) 加后缀

  $(wildcard PATTERN) 列出当前目录下所有符合模式的文件名。

隐含规则:

  依赖于make中的后缀列表.SUFFIXES(一个特殊目标)。

.SUFFIXES:  #删除所有已定义的可识别后缀

.SUFFIXES:.c .o   #重新定义

最新文章

  1. CozyRSS开发记录1-原型图与Grid
  2. Organization SYMMETRIC MULTIPROCESSORS
  3. windows下CMake使用图文手册 Part 2
  4. 使用 Log4Net 记录日志
  5. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)
  6. ZOJ 1115 Digital Roots
  7. Facebook Asynchronous Layout and Rending
  8. Flex 数据绑定
  9. STL中关于map和set的四个问题?
  10. AppBoxFuture(六): 前端组件化开发
  11. linux c tcp p2p
  12. eclipse:显示堆内存
  13. error: &lt;item&gt; inner element must either be a resource reference or empty.
  14. iframe相关小结
  15. select和select的数据渲染,你知道多少呢?
  16. debian镜像下载地址
  17. scroll事件实现监控滚动条改变标题栏背景透明度(zepto.js )
  18. Gson 使用new TypeToken&lt;List&lt;String&gt;&gt;(){}.getType() 为什么有 {}?
  19. (转)图形学理论知识 BRDF 双向反射分布函数(Bidirectional Reflectance Distribution Function)
  20. Java实现的各种排序算法(包括冒泡,快排等)

热门文章

  1. 将word中的“空格” 转换为换行符
  2. Asp.net MVC知识积累
  3. css透明(支持各浏览器)
  4. ref和out
  5. java之javadoc命令
  6. Hive表分区
  7. mysql 查询
  8. thinkphp join 查询
  9. matlab实现贝塞尔曲线绘图pdf查看
  10. 如何调优JVM - 优化Java虚拟机(大全+实例)