-
recipe
语法-
说明
-
执行
- 默认是一行行的执行.
.ONESHELL:
,recipe
一次性执行.
-
recipe
脚本类型- 默认
/bin/sh
. - 修改
SHELL
为其他.
- 默认
-
解析案例
.ONESHELL: .PHONY:all all: @for i in {1..9} do echo $$i done
- 定义
.ONESHELL:
和不定义是两个执行结果.
- 定义
-
脚本解析器
.PHONY:all .ONESHELL: SHELL:= $(shell which python) all: @for i in range(9): print(i)
- 定义和不定义
SHELL
是两个结果.
- 定义和不定义
-
执行模型
def exeRecipe(target): if not target.oneshell: return os.system("\n".join(target.recipes)) for i in target.recipes: ret = os.system(i).returnValue if ret: return ret return 0
-
-
语义
-
make
对recipe
的处理
-
-
recipe
输出 -
recipe
执行-
说明
-
一次性执行
-
修改脚本类型
-
recipe
处理$(SHELL) $(.SHELLFLAGS) recipe
- 修改
SHELL
类型为其他就可以修改recipe
的值. - 不同
rule
不同SHELL
,可以通过局部变量的方式设置.
-
案例
.PHONY:all ok .ONESHELL: all:SHELL:=$(shell which bash) all:ok @echo ok ok:SHELL:=$(shell which python) ok: @import re print(re)
-
SHELL
来源SHELL
不会从环境变量中继承,其他的都可以.SHELL
的值默认是/bin/sh
.- 用户自定义了
SHELL
,如果不export
是不会继承下去的.shell
环境变量依然向下继承.
-
-
-
并行编译
-
错误处理
-
中断
-
递归调用
-
说明
-
-C
-
MAKE
变量 -
make
之间参数传递-
指定上定义变量
make name=value
,父子之间会继承.
-
顶层
make
- 顶层
make
继承父进程shell
的环境变量值. - 优先级:
env < makefile
.-e
选项:env > makefile
.
- 顶层
-
子
make
- 继承父
make
的环境变量.执行recipe
也会继承. - 父
make
可以通过export
添加环境变量. - 优先级同上.
- 继承父
-
变量传递
- 环境变量,指令中声明.
- 变量名只能是数字字母下划线.
export name[op value|names]
.export
传递所有.定义.EXPORT_ALL_VARIABLES:
也传递所有,前者新版本,现在基本都支持;后者老版本,兼容性更好- 可以禁止传递部分变量.
- 禁止传递
unexport names
-
SHELL
SHELL
变量值不会传递.- 最顶层的
shell
的值会传递为默认. - 可以使用
export
强制向下传递.
-
MAKEFLAGS
- 始终传递.
-
MAKELEVEL
- 从
0
开始,输出递归深度. - 全局共享.一般用作条件判断.
- 案例:
.PHONY:all ifeq ($(MAKELEVEL),0) all: @echo $(MAKELEVEL) @$(MAKE) -f makefile else all: @echo ok endif
- 从
-
MAKEFILES
- 让子
Make
预读一些makefile
文件.
- 让子
-
-
选项参数部分传递
-
传递方式
- 借助变量
MAKEFLAGS
. make -ks
这个值就是ks
.
- 借助变量
-
说明
- 基本每一个子
make
都有这个环境变量.
- 基本每一个子
-
变量定义传递
- 也是通过
MAKEFLAGS
,也是=
格式. - 不想传递可以
$(MAKE) -C subdir MAKEFLAGS=
- 也是通过
-
不传递的选项
-C,-f,o,W
.
-
并行编译
-j
- 系统支持,那么使用这个的父
make
可以和所有子make
交互. - 父
make
确保最多N
个同时处理,信号量. - 任何一个任务被标记为
recursive
都不会算在总的job
里面. - 递归算在内那就没有真正执行的了.有可能递归很深就导致一个都不执行.
- 系统支持,那么使用这个的父
-
值定义的值
.PHONY:all ifeq ($(MAKELEVEL),0) all: @echo $(MAKELEVEL) @$(MAKE) -f makefile -b aa=bb else all: @echo ok @echo $(MAKEOVERRIDES): $(MAKEFLAGS) endif
- 实际值定义位置在
MAKEOVERRIDES
.MAKEFLAGS
实际是个值引用. - 不想传递值定义,仅仅传递选项就可以将这个的值设置有空.
- 一般不会用,不过有的时候因为变量定义导致参数太长需要忽略参数定义.
- 实际值定义位置在
-
-
--print-directory
-
-
打包
recipe
-
空的
rule
更新脚本怎么写
最新推荐文章于 2023-03-24 19:55:37 发布