如何无需ARGS变量将可选参数从Makefile传递至Shell脚本?
解决方法
可以通过Makefile的内置变量和通配符规则实现直接传递这类参数,修改后的Makefile如下:
do-something: sh ./Scripts/do-something.sh "$(name)" $(filter-out $@,$(MAKECMDGOALS)) # 匹配所有未定义的目标,避免make报错 %: @:
原理说明
MAKECMDGOALS是Make的内置变量,会保存你在命令行指定的所有目标(比如这里的do-something、--noBar、--noBaz)$(filter-out $@,$(MAKECMDGOALS))会过滤掉当前目标$@(也就是do-something),剩下的就是你传入的--noBar --noBaz,直接传给脚本即可- 最后那条
%:规则是个通配符规则,匹配所有没有单独定义的“伪目标”(也就是你传的那些参数),@:表示执行空命令,避免make报错提示找不到这些目标
现在执行make do-something name=Foo --noBar --noBaz,就会自动把--noBar --noBaz传递给脚本,效果和直接调用sh ./Scripts/do-something.sh "Foo" --noBar --noBaz一致。
内容的提问来源于stack exchange,提问作者Ashley Mills
相关产品推荐
相关产品推荐

