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

Posted

技术标签:

【中文标题】MacOS catalina Makefile 无法正确处理在 CLI 中工作的 shell 命令【英文标题】:MacOS catalina Makefile not processing shell commands correctly that work in CLI 【发布时间】:2019-12-13 07:06:27 【问题描述】:

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

这是包含的 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 正则表达式必须不带单引号,例如:grep -h -E .+-setup:.*##

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

但在 Makefile 中,grab_setup_rule在 MacOS 中始终为空。好像没有正确处理。

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

【问题讨论】:

你在 Catalina (make --version) 下使用什么版本的 make?而make使用的shell是什么? 【参考方案1】:

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

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

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

【讨论】:

哦哇...现在说得通了。我不能使用$(shell... 作为命令,无论出于何种原因不能正常使用它,这就是我使用!= 的原因。 Make 至少可以给我一个错误……但什么也没有。谢谢!!! 它不会给你一个错误(在那个旧版本中),因为你写的是一个有效的 make 命令。将其解析为三个“令牌”:grab_setup_rule !,然后是 =,然后是 cat ...。因此,您将 make 变量 grab_setup_rule ! 设置为值 cat ...。没有规则(在那些旧版本的 make 中)反对创建包含空格的变量名。如果你运行 make -p 来显示数据库,你会发现这里设置了这个变量。 我不知道为什么$(shell ...) 不起作用。实现!=$(shell ...) 的代码完全相同(只是对结果的解释方式稍作改变)。

以上是关于MacOS catalina Makefile 无法正确处理在 CLI 中工作的 shell 命令的主要内容,如果未能解决你的问题,请参考以下文章

macOS Catalina 10.15.5 正式版 下载 百度网盘

升级macos catalina卡顿怎么办

virtualbox安macOS Catalina

MacOS 10.15 Catalina 的颤振问题

使用向后兼容的 MacOS 10.15 (Catalina) 创建 Python C 扩展 (MacOS10.9+)

MacBook Pro(13 英寸,2011 年末)A1278 官方最高支持macOS High Sierra,使用macOS Catalina Patcher成功安装macOS Catalina