如何在Makefile中扩展shell函数定义的作用域至整个规则?
Makefile规则内复用自定义shell函数的解决方法
你遇到的问题根源是:Make默认会为规则里的每一行命令单独启动一个shell进程,第一行定义的shell函数仅在当前进程有效,到第二行的新进程就无法识别了。要让函数作用域覆盖整个规则,有两种可行方案:
方法一:用反斜杠续行,共享同一个shell
把规则内的多行命令用反斜杠(\)连接,Make会将它们当作单个shell命令执行,函数就能在后续行复用:
default: myFunc() { echo "Called"; }; \ myFunc; \ echo "再次调用函数:"; \ myFunc;
方法二:使用.ONESHELL伪目标(GNU Make 3.82+支持)
如果你的Make是GNU Make 3.82及以上版本,可在Makefile开头添加.ONESHELL,这样整个规则的所有命令都会在同一个shell实例中运行,无需手动加反斜杠:
.ONESHELL: default: myFunc() { echo "Called"; }; myFunc; echo "再次调用函数:"; myFunc;
注意:.ONESHELL是GNU Make专属特性,若使用非GNU版本的Make,方法一的兼容性更强。
内容的提问来源于stack exchange,提问作者Jaxon
相关产品推荐
相关产品推荐

