MacOS Catalina Makefile无法正确处理在CLI中正常运行的Shell命令

时间:2019-12-13 07:06:27

标签: bash macos makefile multiple-makefiles

TL; DR:

这在MacOS(catalina)的Makefile中不起作用:

grab_setup_rule != cat $(all_makefiles_except_current)  | grep -h -E '.+-setup:.*##' | awk '{ print $1 }'

但在命令行上执行,用正确的路径替换了$(all_makefiles_except_current),就可以了。


深入解释

我在Makefile中有以下代码:

BASEPATH = ..
repos = project1 project2
possible_includes = $(foreach repo,$(repos), $(BASEPATH)/$(repo)/Makefile)

-include $(possible_includes)

all_makefiles_except_current := $(wordlist 2,$(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
grab_setup_rule != cat $(all_makefiles_except_current)  | grep -h -E '.+-setup:.*##' | awk '{ print $1 }'

它的作用是包含repos变量中指定的所有Makefile,获取所有包含的文件的列表,并在all_makefiles_except_current中进行设置,然后尝试从结尾的那些Makefile中获取所有目标与-setup

这是包含的Makefile中内容的一个示例:

projectName-targetX: ### desc
    code

projectName-setup: ## desc
    code

<.. more targets ..>

这是self-documenting makefile

如果我运行shell命令:

cat ../project1/Makefile | grep -h -E '.+-setup:.*##' | awk '{ print $1 }'

注意:在Windows和Linux上,grep regex必须没有单引号,例如:grep -h -E .+-setup:.*##

在命令行 IT工作上,我得到了想要的目标,并且可以在Windows(msys2),Linux(ubuntu)和MacOS(catalina)上运行。

但是在Makefile中,grab_setup_rule在MacOS中始终为空。似乎未正确处理。

在MacOS上的grab_setup_rule中我在做什么错了?

1 个答案:

答案 0 :(得分:1)

!=运算符是在GNU make 4.0中添加的。在较早的版本中不可用。

Apple害怕使用GPLv3许可证,并且拒绝发布使用该许可证的任何GNU软件,因此他们将永远不会提供比3.81(2006年发行)新的GNU版本。它们具有其他GNU软件的旧版本和残破版本,包括其标准交互式外壳bash

您可以下载GNU make源代码并自行构建,也可以使用brew或类似方法来获取较新的版本,或者使用:= $(shell ...)方法调用shell命令并将其分配给一个变量,在GNU make 3.81中也可以使用。