Travis CI环境下Makefile中$(shell)变量赋值报错求助
问题原因
Travis CI环境下的make对变量定义中嵌套的$(shell)函数解析更严格:当$(shell)内部包含双引号包裹的sed表达式,且表达式中引用了Makefile变量(如$(GEN))时,make会错误地将变量展开后的内容与shell函数的括号匹配,导致判定shell函数未闭合。
解决方法
方法1:使用Makefile内置字符串替换函数(推荐)
完全避免调用shell和sed,利用make原生的subst函数完成字符串替换,更高效且无解析歧义:
SPECSRC = $(subst {gen},$(GEN),{gen})
方法2:修正shell命令的引号写法
如果必须使用shell命令,调整sed表达式的引号包裹方式,将$(GEN)单独用双引号引起来,避免make解析时混淆括号边界:
SPECSRC = $(shell echo '{gen}' | sed -e 's#{gen}#'"$(GEN)"'#')
验证用修改后的测试Makefile
# Very stripped-down test Makefile GEN = $(CURDIR)/gen all: shell shellvar shell: echo 'shell: trying inline shell-sed' echo $(shell echo '{gen}' | sed -e "s#{gen}#$(GEN)#") # 方法1写法(推荐) SPECSRC = $(subst {gen},$(GEN),{gen}) # 方法2写法(保留shell调用时使用) # SPECSRC = $(shell echo '{gen}' | sed -e 's#{gen}#'"$(GEN)"'#') shellvar: echo 'shellvar: trying shell-sed through a variable' echo SPECSRC = $(SPECSRC)
内容的提问来源于stack exchange,提问作者user19197154
相关产品推荐
相关产品推荐

