bash - 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 上做错了什么?
解决方案
该!=
运算符是在 GNU make 4.0 中添加的。它在旧版本中不可用。
Apple 害怕 GPLv3 许可证并拒绝使用该许可证发布任何 GNU 软件,因此他们永远不会提供比 3.81(2006 年发布)更新的 GNU 版本。他们有其他 GNU 软件的类似旧版本和损坏版本,包括他们的标准交互式 shell bash
,.
您可以下载 GNU make 源代码并自己构建它,或者使用 brew 或类似工具来获取更新的版本,或者使用:= $(shell ...)
调用 shell 命令并将其分配给在 GNU make 3.81 中也可以使用的变量的方法。
推荐阅读
- reactjs - 输入 onChange 处理程序处理程序不起作用 - React Hooks
- python - 在python中选择特征
- html - 为什么我的主题文本(“学习初等数学”)被推到左边?
- azure - 无法登录 Azure:错误:通过 Terraform 计划从 Azure 元数据服务检索环境
- excel - Excel宏选择行和列的可变范围
- python-3.x - TypeError:float() 参数必须是字符串或数字,而不是“PolyCollection”
- asp.net-core - 如何从浏览器中清除 Blazor WebAssembly DLL?
- angular - 在不使用数据库的情况下以角度保存复选框数据
- apache-spark - 在 Spark SQL 中按日和月比较日期
- javascript - 尝试使用 ahax 将值作为数组获取并分配给变量