【发布时间】: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 ..>
如果我运行 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是什么?
标签: bash macos makefile multiple-makefiles