繁体   English   中英

MacOS catalina Makefile 无法正确处理在 CLI 中工作的 shell 命令

[英]MacOS catalina Makefile not processing shell commands correctly that work in CLI

特尔;博士:

这在 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设置,然后尝试从以-setup结尾的那些 Makefile 中获取所有目标。

这是包含的 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 中, 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM