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 10.15 (Catalina) 创建 Python C 扩展 (MacOS10.9+)
MacBook Pro(13 英寸,2011 年末)A1278 官方最高支持macOS High Sierra,使用macOS Catalina Patcher成功安装macOS Catalina