通常情况下,我会正常递归:
recipe-X:
$(MAKE) recipe-Y
然而,在 MacOS 上我以不同的方式递归:
recipe-X:
ifeq ($(shell uname -s),Darwin)
colima ssh -- make $@
else
<recipe script>
endif
我应该使用$(MAKE)
,还是在这种情况下我真的应该使用make
?我不清楚在这种情况下这两种模式之间的区别,以及它们将如何相互作用。我的理解是 是$(MAKE)
一个将并行性、环境和其他问题传播给子 make 的宏……但我遇到了一些麻烦。
我注意到的是,通过传播环境变量,$(MAKE)
可能会破坏原本可以访问网络的命令。但是,使用普通的 ..commands 执行基于网络的命令时,我并没有成功,而当我进入并通过 调用时,这些命令确实有效。vm
make
ssh
vm
cli
因此,在深入研究并做一些过于聪明的事情之前,我认为可能有一种特殊的方法可以make
让我用它来达到这个目的。
$(MAKE)
做三件事:/my/special/make/bin/make
但/my/special/make/bin
不在之前PATH
,/usr/bin
则使用简单make
递归会给出错误的make二进制文件)。-n
它告诉 make 即使在(不构建)模式下运行也应调用配方。您通常需要这个,否则它make -n
不会告诉您实际将构建什么。MAKEFLAGS
环境变量,以便它可以参与 jobserver(并行构建控制)功能。如果您要在远程系统上运行 make,那么您肯定不想要 #3,因为作业服务器仅在本地:它不具备网络感知能力。
不清楚您是否想要 #1:这取决于您和您的环境。在 MacOS 上尤其如此,它附带了一个非常老旧且非常破损的 GNU Make 版本作为其“正常”版本,任何人都不应该使用它。
$(MAKE)
您也可能想要或不想要 #2,这取决于这些食谱实际上的作用,但是如果您在食谱前加上 ,那么您可以获得相同的行为而无需使用+
。简而言之,在这种情况下你可能不想使用
$(MAKE)
它。但你可能必须做一些事情来模拟你想要的部分。