如何在不同Makefile之间正确传递包含$符号的变量
Makefile传递含$符号变量的解决方案
核心原因
$是Makefile的保留字符,用于标记变量引用,每被Make解析一次就会消耗一层转义;如果通过命令行传递变量,还会额外经过shell层解析,多重转义叠加就会导致变量值异常。
方案1:通过export传递(推荐,一致性最高)
该方式无需通过命令行传参,避开shell层解析,仅需要处理Make本身的转义规则:
Makefile1 代码
# 表示字面量$需要在Makefile中写两个$$ RPATH1 = 12$$34 export RPATH1 all: @echo RPATH1 "(Makefile1)" $(RPATH1) @make -f Makefile2
Makefile2 代码
all: # 使用value函数获取变量原始值,避免Make二次解析$符号 @echo RPATH1 "(Makefile2)" $(value RPATH1)
运行输出
$ make -f Makefile1 RPATH1 (Makefile1) 12$34 make[1]: Entering directory '/tmp/make' RPATH1 (Makefile2) 12$34 make[1]: Leaving directory '/tmp/make'
方案2:命令行显式传参
如果必须通过make -f Makefile2 变量=值的形式传递参数,需要对$做四层转义,同时用单引号包裹避免shell拆分参数:
Makefile1 代码
# 四层$最终传递到子make解析后得到一个字面量$ RPATH1 = 12$$$$34 export RPATH1 all: @echo RPATH1 "(Makefile1)" $(RPATH1) @make -f Makefile2 RPATH2='$(RPATH1)'
Makefile2 代码
all: @echo RPATH1 "(Makefile2)" $(value RPATH1) @echo RPATH2 "(Makefile2)" $(value RPATH2)
运行输出
$ make -f Makefile1 RPATH1 (Makefile1) 12$34 make[1]: Entering directory '/tmp/make' RPATH1 (Makefile2) 12$34 RPATH2 (Makefile2) 12$34 make[1]: Leaving directory '/tmp/make'
内容的提问来源于stack exchange,提问作者Adriano dos Santos Fernandes
相关产品推荐
相关产品推荐

