这在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 ..>
如果我运行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
中我在做什么错了?
答案 0 :(得分:1)
!=
运算符是在GNU make 4.0中添加的。在较早的版本中不可用。
Apple害怕使用GPLv3许可证,并且拒绝发布使用该许可证的任何GNU软件,因此他们将永远不会提供比3.81(2006年发行)新的GNU版本。它们具有其他GNU软件的旧版本和残破版本,包括其标准交互式外壳bash
。
您可以下载GNU make源代码并自行构建,也可以使用brew或类似方法来获取较新的版本,或者使用:= $(shell ...)
方法调用shell命令并将其分配给一个变量,在GNU make 3.81中也可以使用。