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"集。

最新文章

  1. JS代码将数据导入Excel
  2. 如何给GridView添加网格
  3. “Transaction rolled back because it has been marked as rollback-only”
  4. 百度地图简单使用——添加折线,圆形等(html,js)
  5. Ubuntu系统下面软件安装更新命令
  6. 轻松学习Linux之Shell文件和目录属性详解
  7. 使用ajax()方法加载服务器数据
  8. Fragment 与 Activity 通信
  9. Delphi使用FindClass实现动态建立对像(有点像反射)
  10. poj 3400 Dropping the stones
  11. 虚拟机配置静态IP地址
  12. MFC 程序入口和执行流程
  13. 豌豆夹Redis解决方案Codis安装使用
  14. 【SSH系列】hibernate映射 -- 一对一双向关联映射
  15. Android开发 - 掌握ConstraintLayout(十)按比例设置视图大小
  16. 关于 tlb 文件
  17. 设置 IntelliJ IDEA 智能提醒时忽略大小写
  18. springboot ----&gt; sts如何启动两个实例
  19. python的单例模式:
  20. php如何在某个时间上加一天?一小时? 时间加减(转)

热门文章

  1. C++ LinearRegression代码实现
  2. Java并发与多线程与锁优化
  3. Lock之ReentrantLock及实现生产者消费者和死锁
  4. SQL SERVER视图对查询效率的提高
  5. ldd3 第12章 PCI驱动程序
  6. BUUCTF | CODE REVIEW 1 (反序列化,md5绕过)
  7. Hbuild X 打包 混合式app
  8. python中将&#39;12345&#39;转换为12345,不要使用int
  9. linux设备驱动第二篇:构造和运行模块
  10. XScreenSaver强大的锁屏工具