GNU make 简明手册
TODO: 介绍
基本语法
1 2 3
| target: prerequisite1 prerequisite2 ... prerequisiteN [tab]command ...
|
续行, 转义: ‘\‘
有效的 Makefile 文件
1
| ./Makefile ./makefile ./GNUMakefile
|
目标
1
| 第一个 target 作为最终的(默认) target, 或指定 target: make target
|
变量(宏)
1 2
| objects = 一行字符 引用(展开): $(objects)
|
自动推导(隐晦规则)
1
| 当 target 为 %.o 的形式, %.c 将自动加入依赖关系中, 并生成 command: cc -c %.c
|
公共依赖
1 2 3 4
| $(ojectes): header.h objecte1: header1.h objecte2: header2.h ...
|
伪目标
1 2 3 4
| .PHONY target1 target2 ... targetN
.PHONY 的作用: .PHONY 修饰明确告诉 make一个 target 与文件无关, 在生成这个 target 之前不必检查对应文件是不是 up-to-date 的, 如果当前目录刚好有一个与 target 名字相同, 比依赖新的文件将混淆 make, 造成生成 all clean 等目标也会失败
|
- 标记
1 2 3
| -command: 忽略错误
-rm $(targets) *.o
|
规则文件
1
| 显式指定makefile: make --file Makefile.mk
|
包含
1 2 3
| inc = makefile1 makefile2 include foo.make *.mk $(inc) include 目录: -I --include-dir ./include
|
通配符
1 2
| objects = *.o:不会被展开 objects := $(wildcard *.o)
|
文件搜索
1 2 3 4 5 6 7 8
| VPATH src:../inc 目录以:分隔
vpath <pattern> <directories> <pattern>: %.c 多目录, 按顺序搜索 vpath <pattern> vpath
|
伪目标
1 2
| 伪目标可有依赖, 也可被依赖 伪目标旧于依赖, 新于被依赖
|
多目标
静态模式
1 2 3 4 5 6 7
| <targets ...>: <target-pattern>: <prereq-patterns ...> <commands>
objects = foo.o bar.o all: $(objects) $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@
|
其他
1 2
| @command: 不显示命令 -n --just-print: 只显示命令
|
命令执行
1 2
| 继承环境, command1; command2 cd ~/; pwd
|
嵌套 make
1 2 3 4 5 6
| 变量会传递到下层 make, 但不会覆盖 export variable = ... unexport variable = ... variable = ... export variable 传递所有:export
|
变量
1 2
| 大小写敏感, 使用:$variable, $(variable), ${variable} 转义$: $$
|
赋值
1 2 3 4
| = :可引用后面定义的的变量 := :不可引用后面定义的变量 ?= :如果已有定义,什么也不做 追加: +=
|
条件结构
1 2 3 4 5 6 7 8
| ifeq (a, b) ... else ... endif
ifneq ifdef
|
函数
1 2 3 4
| $(函数名 参数1, 参数2, ..., 参数n) $(shell command): `command` $(error, <text>) $(warning, <text>)
|
约定
1 2 3 4 5 6 7 8
| AR - 函数库打包程序, 默认命令是"ar" AS - 汇编语言编译程序, 默认命令是"as" CC - C语言编译程序, 默认命令是"cc" CXX - C++语言编译程序, 默认命令是"g++" CPP - C预处理器, 默认命令是"$(CC) -E" TEX - 创建TeX DVI, 默认命令是"tex" WEAVE - 转换Web到TeX的程序, 默认命令是"weave" RM - 删除文件命令, 默认命令是"rm -r"
|
自动化变量
1 2 3 4 5
| $@ - 目标文件集 $% - 仅当目标是函数库文件中, 表示目标成员名 $< - 第一个依赖 $? - 所有比目标新的依赖 $^ - 所有依赖
|