Makefile笔记
一个简单的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笔记的更多相关文章
- Makefile笔记之二------make的递归执行
1.make的递归过程指的是: 在Makefile中使用"make"作为一个命令来执行本身或者其它makefile文件的过程. 2.递归的意义: 当前目录下存在一个"su ...
- Makefile笔记之一 ------ 变量的引用及赋值
1.变量的引用方式: "$(变量名)"或者"¥{变量名}" 例如: ${Objs}就是取变量Objs的值 注意: 当变量名为单字符是可以采用:"$a& ...
- makefile 笔记
1.Makefile中命令前的@和-符号 如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果; Android中会定义某个变量等于@,例如 hide:= @ 通常make执行的命令 ...
- 数码相框之Makefile笔记
本程序的Makefile分为3类:1. 顶层目录的Makefile2. 顶层目录的Makefile.build3. 各级子目录的Makefile 一.各级子目录的Makefile: 它最简单,形式如下 ...
- makefile笔记9 - makefile隐含规则
在我们使用 Makefile 时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix 下是[.o]文件,Windows 下是[.obj]文件). ...
- makefile笔记10 - makefile 函数库文件
函数库文件也就是对 Object 文件(程序编译的中间文件)的打包文件.在 Unix 下,一般是由命令"ar"来完成打包工作. 一.函数库文件的成员 一个函数库文件由多个文件组成. ...
- makefile笔记8 - make的运行
一般来说,最简单的就是直接在命令行下输入 make 命令, make 命令会找当前目录的makefile 来执行,一切都是自动的.但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有 ...
- makefile笔记7 - makefile函数
在 Makefile 中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能. make 所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使用. ...
- makefile笔记6 - makefile条件判断
使用条件判断,可以让 make 根据运行时的不同情况选择不同的执行分支.条件表达式可以是比较变量的值,或是变量和常量的值. 一.示例 下面的例子,判断\(\$\)(CC)变量是否"gcc&q ...
随机推荐
- Jquery Slick幻灯片插件
slick 是一个基于 jQuery 的幻灯片插件,具有以下特点: 支持响应式 浏览器支持 CSS3 时,则使用 CSS3 过度/动画 支持移动设备滑动 支持桌面浏览器鼠标拖动 支持循环 支持左右控制 ...
- 简单实用的PHP验证码类
一个简单实用的php验证码类,分享出来 ,供大家参考. 代码如下: <?php /** @ php 验证码类 @ http://www.jbxue.com */ Class code { var ...
- js日期相关函数总结分享
一个倒计时程序,因为经常要在手机端访问,所以没有引用jquery,对于用习惯jquery的我还真不习惯. 下面简单说明js日期相关函数,并说明实现倒计时的原理 var dateTo=new Date( ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
- hadoop启动后jps 没有namenode
hadoop集群启动后,jps 发现没有namenode. 网上查了下,这问题可能是由于两次或两次以上格式化NameNode造成的. 因为我的是刚刚新搭建的集群,里面没什么资料,所以我直接删除各个 ...
- 面试问到struts1与struts2的解析对比
一.struts1要继承一个抽象类.struts1是类编程而不是接口编程. struts2的action可以实现一个action接口,也可以实现其他的接口,使其成为可选的定制的服务. 二.struts ...
- java笔记之类和对象
现在编程的思想分成了两大阵营,面向过程和面向对象.现在谈谈啥是面向对象. 作为一只单身狗,谈“对象”还是很伤心很伤心的(:′⌒`)...... 先看看百度怎么说? 好吧,百度说的太抽象,我换个简单的说 ...
- CSS进阶
盒子模型的边框就是围绕着内容及补白的线,这条线你可以设置它的粗细.样式和颜色(边框三个属性). 1.border-style(边框样式)常见样式有:dashed(虚线)| dotted(点线)| so ...
- UML: CIM & PIM
CIM-1:定义业务流程 定义及分析业务流程(Business Process)是为了尽快理清系统范围,以便估算开发成本及时间,可不是为了要改造业务流程.系统分析员千万别误解了此步骤的目的.所以,系统 ...
- SQL语言笔记
字符串用单引号',判断用单等号=,两个单引号''转义为一个单引号' 不等号是<> 不区分大小写 []括起来的要不是关键字,要不是非法变量,比如空格隔起来的变量 创建与删除数据库 - ...