特殊规则或变量
.DEFAULT_GOAL
默认目标,即执行不带参数的 make
命令,例如 .DEFAULT_GOAL := all
。只能配置一条规则,否则报错。
.INTERMEDIATE
.ONESHELL
Makefile 样例:
1 |
|
运行结果:
1 | jeromesun@km:~/workshop/hello$ rmdir abc |
删除 .ONESHELL,运行结果:
1 | jeromesun@km:~/workshop/hello$ make test |
.SECONDEXPANSION
函数
自定义和使用函数
Makefile 样例如下,函数内的代码行不需要以 tab 开始。不以 @开头,在调用时也不会打印出 shell 语句。
通过 define
和 endef
围起来。
1 | .ONESHELL: |
运行结果:
1 | jeromesun@km:~/workshop/hello$ rmdir abc |
使用 eval 在 makefile 规则中赋值
1 | $(eval IMAGE_TIME_STAMP=$(shell date +%Y%m%d%H%M%S)) |
foreach 遍历
call 调用函数
注意:
- Call 调用函数时,注意参数和逗号间不要有空格,否则参数分有带空格和没带空格之分
- 和 foreach 一起使用的时候,注意 call 的自定义函数最后一行要加
;
call 参数没空格样例:
1 | jeromesun@km:~/workshop/hello.test$ cat mkfiles/func_test.mk |
call 参数有空格样例:
1 | jeromesun@km:~/workshop/hello.test$ cat Makefile |
miscellaneous
判断 32 位还是 64 位
来自 stackoverflow 的答案:
1 | ARCH := $(shell getconf LONG_BIT) |
清除某个 CFLAGS 编译选项
来自 stackoverflow 的答案:
1 | CFLAGS := $(filter-out -Werror,$(CFLAGS)) |
在规则中等待输入
1 | reset : |
【已淘汰】在规则中使用 shell 函数
这种写法很挫,不够优雅。用 .ONESHELL + 自定义 Makefile 函数替换。
1 | # $(1) path |
执行 shell 命令
例如 PWD := $(shell pwd)