首页 > 解决方案 > MacOS catalina Makefile 无法正确处理在 CLI 中工作的 shell 命令

问题描述

TL;博士:

这在 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 ..>

这是一个自我记录的 makefile

如果我运行 shell 命令:

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

注意:在 windows 和 linux 上,grep 正则表达式必须没有单引号,例如:grep -h -E .+-setup:.*##

在命令行IT WORKS上,我得到了我想要的目标,这将在 Windows (msys2)、Linux (ubuntu) 和 MacOS (catalina) 上运行。

但在 Makefile 中,MacOS 中的grab_setup_rule始终为空。似乎它没有得到正确处理。

grab_setup_rule在 MacOS 上做错了什么?

标签: bashmacosmakefilemultiple-makefiles

解决方案


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

Apple 害怕 GPLv3 许可证并拒绝使用该许可证发布任何 GNU 软件,因此他们永远不会提供比 3.81(2006 年发布)更新的 GNU 版本。他们有其他 GNU 软件的类似旧版本和损坏版本,包括他们的标准交互式 shell bash,.

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


推荐阅读