一个简单的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   #重新定义

Makefile笔记的更多相关文章

  1. Makefile笔记之二------make的递归执行

    1.make的递归过程指的是: 在Makefile中使用"make"作为一个命令来执行本身或者其它makefile文件的过程. 2.递归的意义: 当前目录下存在一个"su ...

  2. Makefile笔记之一 ------ 变量的引用及赋值

    1.变量的引用方式: "$(变量名)"或者"¥{变量名}" 例如: ${Objs}就是取变量Objs的值 注意: 当变量名为单字符是可以采用:"$a& ...

  3. makefile 笔记

    1.Makefile中命令前的@和-符号 如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果; Android中会定义某个变量等于@,例如 hide:= @ 通常make执行的命令 ...

  4. 数码相框之Makefile笔记

    本程序的Makefile分为3类:1. 顶层目录的Makefile2. 顶层目录的Makefile.build3. 各级子目录的Makefile 一.各级子目录的Makefile: 它最简单,形式如下 ...

  5. makefile笔记9 - makefile隐含规则

    在我们使用 Makefile 时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix 下是[.o]文件,Windows 下是[.obj]文件). ...

  6. makefile笔记10 - makefile 函数库文件

    函数库文件也就是对 Object 文件(程序编译的中间文件)的打包文件.在 Unix 下,一般是由命令"ar"来完成打包工作. 一.函数库文件的成员 一个函数库文件由多个文件组成. ...

  7. makefile笔记8 - make的运行

    一般来说,最简单的就是直接在命令行下输入 make 命令, make 命令会找当前目录的makefile 来执行,一切都是自动的.但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有 ...

  8. makefile笔记7 - makefile函数

    在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能. make 所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使用. ...

  9. makefile笔记6 - makefile条件判断

    使用条件判断,可以让 make 根据运行时的不同情况选择不同的执行分支.条件表达式可以是比较变量的值,或是变量和常量的值. 一.示例 下面的例子,判断\(\$\)(CC)变量是否"gcc&q ...

随机推荐

  1. 解决Discuz“完善用户资料”任务不能完成的问题

    最近用 Discuz X3.2 搭建了个论坛,在测试过程中发现"完善用户资料"这个官方自带的任务有个Bug,将所有的资料都填写完成后,任务仍然无法完成,而且没有明确提示有哪些项目没 ...

  2. 关于C语言中的typedef

    在C语言中定义一个结构体,要最好使用typedef,使用typedef,实际上就是为我们的结构体起了一个新的名字,即定义了一个新的类型,在后面书写自己代码的时候,就可以直接使用自己定义的新的类型第一变 ...

  3. android连接本地tomcat服务器,报timeout

    1.在eclipse环境下连接时,没有任何问题 2.直接将服务端发布到tomcat服务下,报timeout 3.查明原因: 3.1打开IE访问,一切正常,可以获取到数据,说明不是服务端的问题 3.2打 ...

  4. MyEclipse反编译Class文件

    对于需要查看Java Class文件源码的筒子们来说,必须在项目中导入Java源码才能查看Class文件的具体实现,这不仅十分的麻烦,因为有时我们并不可以获得Class文件对应的Java源码.今天就给 ...

  5. Entity Framework Power Tools安装和使用

    Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. 大致来说,这个工具 ...

  6. 敏捷开发之道(三)极限编程XP续

    上次的博文敏捷开发之道(二)极限编程XP中,我们了解了XP的实践中的其中四个,今天我们来一起学习一下剩余的实践. --接上文 5).结对编程 结对编程就是由结对的开发人员使用同一台电脑共同完成一项任务 ...

  7. iOS的影片播放 MediaPlayer 和 AVPlayer(转)

    分类: Iphone2013-01-28 16:19 5230人阅读 评论(0) 收藏 举报 在iOS開發上,如果遇到需要播放影片,如開機動畫…,我們很習慣地會使用MediaPlayer來播放影片,因 ...

  8. 使用libuv实现生产者和消费者模式

    生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...

  9. 20145120 《Java程序设计》第3周学习总结

    20145120 <Java程序设计>第3周学习总结 教材学习内容总结 基本类型与类类型的概念 在java里使用数组和字符串 封装的概念 在java定义函数 重载的概念 static的概念 ...

  10. Week1 Team Homework #1: Study the projects done by previous student groups

      我们研究了学长的项目:百度3D地图API的调用.下面是我们对该项目的一些看法: 优点: 界面清晰 各类之间调用及其他关系容易理清. 缺点: 前段html代码过于冗杂,很多(div)块间的层次关系不 ...