1. make中的变量

makefile中的变量就是c/c++中的宏

2. 引用其他的make文件

类似于c语言中的#include,被包含的文件会原模原样的放在当前文件的包含位置。

include<filename>,filename可以是当前操作系统shell的文件模式(可以包含路径和通配符)。例如,有多个文件,x.mk, y.mk, z.mk,还有文件child.mk,

变量${var},该变量的值为p.mk, q.mk。

对于如下语句:

include *.mk child.mk ${var} 会被解析成:

include x.mk y.mk z.mk child.mk p.mk q.mk

3. 文件搜寻

使用VPATH变量 告诉make在指定目录中寻找。

VPATH=src:../headers  定义指定两个目录,src和../headers,make会按这个顺序进行搜索,目录由冒号分隔。

关键字:vpath

vpath <pattern> <directories> 为符合模式<pattern>的文件指定搜索目录<directories>

vpath <pattern> 清除符合模式<pattern>的文件指定搜索目录

vpath 清除所有被设置好了的文件搜索目录

vpath使用方法中的<pattern>需要包含”%“字符,意思为匹配0或若干字符,如:

vpath %.h ../headers 要求make在“../headers”下搜索所有以“.h”结尾的文件。

可以连续使用vpath,指定不同的搜索策略。如果出现了相同的pattern,或是被重复了的pattern, make会按照vpath的先后顺序来搜索。

vpath %.c d1

vpath %.c d2

vpath %.c d3

表示结尾“.c”的文件,现在目录d1,然后d2,最后d3.

4. 伪目标的具体用法

.PHONY: clean

用.PHONY来显示指明clean是一个伪目标,不管是否有这个文件。

伪目标的依赖性:

all: program1 program2 program3
.PHONY: all program1: program1.o
cc -o program1 program1.o program2: program2.o
cc -o program2 program2.o program3: program3.o
cc -o program3 program3.o

Makefile中第一个目标会被作为默认目标,声明了一个“all”的伪目标后,其依赖于其他三个目标,伪目标的特性是总是会被执行的,所以其依赖的三个目标总是不如all这个目标新。

5. 静态模式

静态模式可以更加容易地定义多目标规则:

<targets...>:<target-pattern>:<prereq-patterns...>

  <commands>

targets定义了一系列的目标集合,可以有通配符,是目标的一个集合。

target-pattern指明了targets模式,即是目标集的模式。

prereq-patterns是目标的依赖模式,它对target-pattern形成的模式再进行以此依赖目标的定义。

如果<target-pattern>定义成"%.o",意思是我们的集合中都是以".o"结尾的,而如果我们的<prereq-patterns>定义成"%.c",是对<target-pattern>所形成的目标集进行二次定义,计算方法是:取<target-pattern>模式中的"%"(去掉.o这个结尾),并为其加上.c这个结尾,形成的新集合。

objs=program1.o program2.o
all:$(objs) $(objs):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@

指明了目标从$objs中获取,“%.o”表明所有的以“.o”结尾的目标,而依赖模式“%.c”则去模式“%.o”的“%”,也就是program1,并为其加上".c"的后缀,则依赖目标就是“program1.c program2.c”,“$<”表示所有的依赖目标集,“$@”表示目标集。则上面的代码可扩展为以下代码:

program1.o: program1.c
$(CC) -c $(CFLAGS) program1.c -o program1.o program2.o: program2.c
$(CC) -c $(CFLAGS) program2.c -o program2.o

另外的例子:

files=foo.elc bar.o lose.o

$(filter %.o,$(files)):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@ $(filter %.elc,$(files)):%.elc:%.el
emacs -f batch-byte-compile $<

$(filter%.o,$(files))调用Makefile的filter函数,过滤"$filter"集。

make编写教程(二)的更多相关文章

  1. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  2. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

  4. MIP开发教程(二) 使用MIP-CLI工具调试MIP网页

    初始化 MIP 配置 新建一个 MIP 网页 编写 MIP 网页代码 校验 MIP 网页 调试 MIP 网页 1. 初始化 MIP 配置 首先在html目录下进行初始化 MIP 配置: $ mip i ...

  5. webpack4 系列教程(二): 编译 ES6

    今天介绍webpack怎么编译ES6的各种函数和语法.敲黑板:这是webpack4版本哦, 有一些不同于webpack3的地方. >>> 本节课源码 >>> 所有课 ...

  6. MapReduce教程(二)MapReduce框架Partitioner分区<转>

    1 Partitioner分区 1.1 Partitioner分区描述 在进行MapReduce计算时,有时候需要把最终的输出数据分到不同的文件中,按照手机号码段划分的话,需要把同一手机号码段的数据放 ...

  7. BAT脚本编写教程(比较易懂和全面)

    这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面.适合有一定编程基础的人   作者不详.敬意! echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令, ...

  8. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

  9. RabbitMQ官方教程二 Work Queues(GOLANG语言实现)

    RabbitMQ官方教程二 Work Queues(GOLANG语言实现) 在第一个教程中,我们编写了程序来发送和接收来自命名队列的消息. 在这一部分中,我们将创建一个工作队列,该队列将用于在多个wo ...

  10. RabbitMQ入门教程(二):简介和基本概念

    原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

随机推荐

  1. 为什么js的"关联数组"不能转成json字符串而对象可以?

    定义这么一个js的“关联数组”: var arr = new Array(); arr[; arr[; alert(JSON.stringify(arr)); 得到的结果如图: [] 一句话,你的 a ...

  2. CSU 1503: 点到圆弧的距离(计算几何)

    题目描述 输入一个点 P 和一条圆弧(圆周的一部分),你的任务是计算 P 到圆弧的最短距离.换句话 说,你需要在圆弧上找一个点,到 P点的距离最小. 提示:请尽量使用精确算法.相比之下,近似算法更难通 ...

  3. Minimal Power of Prime

    题目链接 题意:输入n,求所有质因子幂的最小值.n奇大无比. 思路:先对n所有n开五次方根的质因子约完,然后如果没有除尽的话,因子最多也就4个了,所以幂数大于1的情况有p1^4,p1^3, p1^2  ...

  4. 转载:IDEA lombok插件的安装和使用

    转载自:https://jingyan.baidu.com/article/0a52e3f4e53ca1bf63ed725c.html lombok插件的安装   1 首先我们需要安装IntelliJ ...

  5. web前端典型示例

    1.轨迹回放:https://openlayers.org/en/v4.6.5/examples/feature-move-animation.html https://blog.csdn.net/s ...

  6. VS2010提示error TRK0002: Failed to execute command

    转自VC错误:http://www.vcerror.com/?p=277 问题描述: windows8自动更新Microsoft .NET Framework 3.5和4.5.1安全更新程序,今天用V ...

  7. PHP DOMDocument操作 XML类 属性、方法

    属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definition 以DTD或XML模式给出的节 ...

  8. 利用float与overflow:hidden实现移动端两栏自适应布局

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Html5 学习笔记 【PC固定布局】 实战2 导航栏搜索区域

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  10. Java + selenium 元素定位(1)之By id/Name/ClassName

    这篇文章开始,要介绍web自动化核心的内容,也是最困难的部分了,就是定位元素,并去对元素进行操作.想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素,如果连元素都定位不到,后续什么操作都 ...