GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing quickreference.pages.dev — make 备忘清单 & make cheatsheet & Quick Reference Makefile 入门示例工作流程文件命令自定义文件路径隐式生成规则清空目标文件注释换行 \引用其它的 Makefile变量赋值符在执行时扩展,允许递归扩展在声明时扩展只有在该变量为空时才设置值将值追加到变量的尾端override变量避免递归变量Shell 变量定义多行变量自动变量$@$<$^$+$?$*$%内置命名变量的参数内置已命名的变量内置的变量书写规则文件搜寻(vpath)%通配符*~?静态模式伪目标约定俗成的规则命令回声(@)显示命令、禁止命令显示命令禁止命令执行命令make 参数-debug[=<options>]make 的退出码判断和循环单分支条件判断多分支条件判断ifneq 语法ifeq 语法ifdeffor 循环函数字符串处理函数 - 替换函数(subst)字符串处理函数 - 模式字符串替换函数(patsubst)字符串处理函数 - 去空格函数(strip)字符串处理函数 - 查找字符串函数(findstring)字符串处理函数 - 过滤函数(filter)字符串处理函数 - 反过滤函数(filter-out)字符串处理函数 - 排序函数(sort)字符串处理函数 - 取单词函数(word)字符串处理函数 - 取单词串函数(wordlist)字符串处理函数 - 单词个数统计函数(words)字符串处理函数 - 首单词函数(firstword)文件名操作函数取目录函数(dir)取文件函数(notdir)取后缀函数(suffix)取前缀函数(basename)加后缀函数(addsuffix)加前缀函数(addprefix)连接函数(join)其它函数foreach 函数if 函数call 函数shell 函数控制 make 的函数origin 函数另见 规则
赋值符在执行时扩展,允许递归扩展
在声明时扩展可以防止递归,并且只能引用之前声明过的变量
只有在该变量为空时才设置值
将值追加到变量的尾端
override如果变量前不指定
自动变量
|
| :- | :- |
|---|---|
ARFLAGS | 函数库打包程序AR命令的参数。默认值是 rv |
ASFLAGS | 汇编语言编译器参数。(当明显地调用 .s 或 .S 文件时) |
CFLAGS | C 语言编译器参数。 |
CXXFLAGS | C++ 语言编译器参数。 |
COFLAGS | RCS 命令参数。 |
CPPFLAGS | C 预处理器参数。( C 和 Fortran 编译器也会用到)。 |
FFLAGS | Fortran 语言编译器参数。 |
GFLAGS | SCCS get 程序参数。 |
LDFLAGS | 链接器参数。(如:ld ) |
PFLAGS | Pascal 语言编译器参数。 |
LFLAGS | Lex 文法分析器参数。 |
RFLAGS | Ratfor 程序的 Fortran 编译器参数。 |
YFLAGS | Yacc 文法分析器参数。 |
| :- | :- |
|---|---|
AR | 函数库打包程序。默认命令是 ar |
AS | 汇编语言编译程序。默认命令是 as |
CC | C 语言编译程序。默认命令是 cc |
CXX | C++ 语言编译程序。默认命令是 g++ |
CO | 从 RCS 文件中扩展文件程序。默认命令是 co |
CPP | C 程序的预处理器(输出是标准输出设备)。默认命令是 $(CC) –E |
FC | Fortran 和 Ratfor 的编译器和预处理程序。默认命令是 f77 |
GET | 从 SCCS 文件中扩展文件的程序。默认命令是 get |
LEX | Lex 方法分析器程序(针对于 C 或 Ratfor)。默认命令是 lex |
PC | Pascal 语言编译程序。默认命令是 pc |
YACC | Yacc 文法分析器(针对于 C 程序)。默认命令是 yacc |
YACCR | Yacc 文法分析器(针对于 Ratfor 程序)。默认命令是 yacc –r |
MAKEINFO | 转换 Texinfo 源文件(.texi)到 Info 文件程序。默认命令是 makeinfo |
TEX | 从 TeX 源文件创建TeX DVI文件的程序。默认命令是 tex |
TEXI2DVI | 从 Texinfo 源文件创建 TeX DVI 文件的程序。默认命令是 texi2dvi |
WEAVE | 转换 Web 到 TeX 的程序。默认命令是 weave |
CWEAVE | 转换 C Web 到 TeX 的程序。默认命令是 cweave |
TANGLE | 转换 Web 到 Pascal 语言的程序。默认命令是 tangle |
CTANGLE | 转换 C Web 到 C。默认命令是 ctangle |
RM | 删除文件命令。默认命令是 rm –f |
run:
${CC} -o main main.c
vpath)如果没有指定 vpath 变量,make 只会在当前的目录中去寻找依赖文件和目标文件。否则,如果当前目录没有,就会到指定的目录中去寻找
| :- | :- |
|---|---|
vpath <pattern> <directories> | 为符合模式 <pattern> 的文件指定搜索目录 <directories> |
vpath <pattern> | 清除符合模式 <pattern> 的文件的搜索目录。 |
vpath | 清除所有已被设置好了的文件搜索目录 |
%% 字符。% 的意思是匹配零或若干字符(类似于通配符),并且引用规则是需要使用自动变量vpath %.c dist
TARGET = hello
OBJ = bar.o foo.o
$(TARGET): $(OBJ)
$(CC) -o $@ $^
%.o: $.c
$(CC) -o $< -o #@
TARGET: PREREQUISITES :PREREQUISITES
COMMAMD
#...
target 定义了一系列的目标文件prerequisites 是指明了 target 的模式,也就是的目标集模式。prerequisites 是目标的依赖模式,它对第一个 prerequisites 形成的模式再进行一次依赖目标的定义objects = foo.o main.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
相当于:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
main.o : main.c
$(CC) -c $(CFLAGS) main.c -o main.o
| :- | :- |
|---|---|
-b,-m | 忽略和其它版本make的兼容性 |
-B | (--always-make) 认为所有的目标都需要重编译 |
-C <dir> | (--directory=<dir>) 指定读取makefile的目录 |
-e | (--environment-overrides) 指明环境变量的值覆盖 makefile 中定义的变量的值 |
-f=<file> | 指定需要执行的makefile |
-h | 显示帮助信息 |
-i | (--ignore-errors)在执行时忽略所有的错误 |
-I <dir> | (--include-dir=<dir>) 指定一个被包含 makefile 的搜索目标 |
-j [<nums>] | (--jobs[=<jobsnum>])指同时运行命令的个数 |
-k | (--keep-going)出错也不停止运行 |
-l <load> | --load-average[=<load>]、-max-load[=<load>] 指定make运行命令的负载 |
-n | (--just-print, --dry-run, --recon) 仅输出执行过程中的命令序列,但不执行 |
-o <file> | (--old-file=<file>, --assume-old=<file>)不重新生成的指定的 <file>,即使目标的依赖文件新于它 |
-p | (--print-data-base) 输出 makefile 中的所有数据,包括所有的规则和变量 |
-q | (--question) 不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新 |
-r | (--no-builtin-rules) 禁止 make 使用任何隐含规则 |
-R | (--no-builtin-variabes) 禁止 make 使用任何作用于变量上的隐含规则 |
-s | (--silent,--quiet) 在命令运行时不输出命令的输出 |
-S | (--no-keep-going, --stop) 取消“-k”选项的作用 |
-t | --touch 相当于 UNIX 的 touch 命令,只是把目标的修改日期变成最新的,也就是阻止生成目标的命令运行 |
-v | (--version) 输出 make 程序的版本、版权等关于 make 的信息 |
-w | (--print-directory) 输出运行 makefile 之前和之后的信息。--no-print-directory 可以禁止 -w |
-W <file> | --what-if=<file>, --new-file=<file>, --assume-file=<file> 假定目标 <file> 需要更新,如果和 -n 选项使用,那么这个参数会输出该目标更新时的运行动作 |
--warn-undefined-variables | 只要 make 发现有未定义的变量,那么就输出警告信息 |
dir)从文件名序列 <names> 中取出目录部分。目录部分是指最后一个反斜杠(/)之前的部分。如果没有反斜杠,那么返回 ./。
$(dir <names...>)
$(dir src/foo.c hacks)
#返回值是 src/ ./
notdir)从文件名序列 <names> 中取出非目录部分。非目录部分是指最後一个反斜杠(/)之后的部分。
$(notdir <names...>)
$(notdir src/foo.c hacks)
# 返回值是 foo.c hacks
suffix)从文件名序列 <names> 中取出各个文件名的后缀
$(suffix <names...>)
$(suffix src/foo.c src-1.0/bar.c hacks)
# 返回值是 .c .c
basename)从文件名序列 <names> 中取出各个文件名的前缀部分。
$(basename <names...>)
$(basename src/foo.c src-1.0/bar.c hacks)
# 返回值是 src/foo src-1.0/bar hacks
addsuffix)把后缀 <suffix> 加到 <names> 中的每个单词后面
$(addsuffix <suffix>,<names...>)
$(addsuffix .c,foo bar)
# 返回值是 foo.c bar.c
addprefix)把前缀 <prefix> 加到 <names> 中的每个单词前面。
$(addprefix <prefix>,<names...>)
$(addprefix src/,foo bar)
# 返回值是 src/foo src/bar 。
join)把 <list2> 中的单词对应地加到 <list1> 的单词后面。
$(join <list1>,<list2>)
$(join aaa bbb , 111 222 333)
# 返回值是 aaa111 bbb222 333 。
$(foreach <var>,<list>,<text>)
# $(name) 中的单词会被挨个取出,并存到变量 n 中,
# $(n).o 每次根据 $(n) 计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回
names := a b c d
files := $(foreach n,$(names),$(n).o)
run:
echo $(files)
与之前的条件语句——ifeq 类似
$(if <condition>,<then-part>)
# 或者
$(if <condition>,<then-part>,<else-part>)
call 函数是唯一一个可以用来创建新的参数化的函数。
$(call <expression>,<parm1>,<parm2>,...,<parmn>)
reverse = $(2) $(1)
foo = $(call reverse,a,b)
run:
echo $(foo)
# b a
使用操作系统 Shell 的命令
contents := $(shell cat foo)
files := $(shell echo *.c)
$(error <text ...>)
# and
$(warning <text ...>)
$(origin <variable>)
origin 函数用于告诉这个变量的从何而来
| :- | :- |
|---|---|
undefined | 如果 <variable> 未定义,返回 undefined |
default | 如果 <variable> 是默认的,如 CC |
environment | 如果 <variable> 是环境变量,并且当 Makefile 执行时,-e 参数没有被打开 |
file | 如果 <variable> 这个变量被定义在 Makefile 中。 |
command line | 如果 <variable> 这个变量是被命令行定义的。 |
override | 如果 <variable> 是被 override 指示符重新定义的。 |
automatic | 如果 <variable> 是一个命令运行中的自动化变量 |