MacOS catalina Makefile 无法正确处理在 CLI 中运行的 shell 命令
MacOS catalina Makefile not processing shell commands correctly that work in CLI
TL;DR:
这在 MacOS (catalina) 的 Makefile 中不起作用:
grab_setup_rule != cat $(all_makefiles_except_current) | grep -h -E '.+-setup:.*##' | awk '{ print }'
但是在命令行上执行时,将 $(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 }'
它的作用是包含所有在 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 }'
注意:在 windows 和 linux 上,grep 正则表达式必须没有单引号,例如:grep -h -E .+-setup:.*##
在命令行上,IT WORKS,我得到了我想要的目标,这将在 Windows (msys2) 和 Linux 上运行(ubuntu) 和 MacOS (catalina)。
但是在 Makefile 中,grab_setup_rule
在 MacOS 中总是空的。似乎没有得到正确处理。
我在 MacOS grab_setup_rule
中做错了什么?
GNU make 4.0 添加了 !=
运算符。它在旧版本中不可用。
Apple 害怕 GPLv3 许可证并拒绝发布任何使用该许可证的 GNU 软件,因此他们永远不会提供高于 3.81(2006 年发布)的 GNU make 版本。他们有其他 GNU 软件的类似旧版本和损坏版本,包括他们的标准交互式 shell、bash
.
您可以下载 GNU make 源代码并自行构建,或者使用 brew 或类似工具获取更新版本,或者使用调用 shell 命令的 := $(shell ...)
方法和将它分配给一个在 GNU make 3.81 中工作的变量。
TL;DR:
这在 MacOS (catalina) 的 Makefile 中不起作用:
grab_setup_rule != cat $(all_makefiles_except_current) | grep -h -E '.+-setup:.*##' | awk '{ print }'
但是在命令行上执行时,将 $(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 }'
它的作用是包含所有在 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 }'
注意:在 windows 和 linux 上,grep 正则表达式必须没有单引号,例如:grep -h -E .+-setup:.*##
在命令行上,IT WORKS,我得到了我想要的目标,这将在 Windows (msys2) 和 Linux 上运行(ubuntu) 和 MacOS (catalina)。
但是在 Makefile 中,grab_setup_rule
在 MacOS 中总是空的。似乎没有得到正确处理。
我在 MacOS grab_setup_rule
中做错了什么?
GNU make 4.0 添加了 !=
运算符。它在旧版本中不可用。
Apple 害怕 GPLv3 许可证并拒绝发布任何使用该许可证的 GNU 软件,因此他们永远不会提供高于 3.81(2006 年发布)的 GNU make 版本。他们有其他 GNU 软件的类似旧版本和损坏版本,包括他们的标准交互式 shell、bash
.
您可以下载 GNU make 源代码并自行构建,或者使用 brew 或类似工具获取更新版本,或者使用调用 shell 命令的 := $(shell ...)
方法和将它分配给一个在 GNU make 3.81 中工作的变量。