bash - Makefile 通过 make 命令将附加参数传递给 targets 命令

标签 bash makefile docker-compose

我有一个定义 docker-compose 项目的 Makefile。 它基本上为我组装了一个命令:

COMMAND := docker-compose --project-name=$(PREFIX) --file=$(FILE_PATH)

up:
    $(COMMAND) up -d

我想添加一个名为 dctarget,我可以向其传递我想要的任何参数。

我知道有一个解决方案:

target:
    $(COMMAND) $(ARGS)

然后用 make target ARGS="--help" 来调用它。

但是没有像 bash $@ 这样更简单的方法吗?我想跳过 ARGS=... 部分并将所有内容发送到 target name 之后的命令。

最佳答案

不是真的。 make 程序将所有参数(不包含 =)解释为要构建的目标名称,您无法覆盖它。因此,即使您可以获得命令行上给出的参数列表(通过 GNU make 特定的 $(MAKECMDGOALS) 变量),您也无法阻止这些参数被视为目标。

你可以做这样的事情,这是非常 hacky 的:

KNOWN_TARGETS = target

ARGS := $(filter-out $(KNOWN_TARGETS),$(MAKECMDGOALS))

.DEFAULT: ;: do nothing

.SUFFIXES:
target:
        $(COMMAND) $(ARGS)

(未经测试)。这里的问题是您必须使 KNOWN_TARGETS 与所有“真实”目标保持同步,以便您可以将它们从命令行给出的目标列表中删除。然后添加 .DEFAULT 目标,该目标将为任何目标运行,make 不知道如何构建,什么都不做。重置 .SUFFIXES 元目标以删除内置规则。

我怀疑这仍然会出现无法正常工作的奇怪边缘情况。

另请注意,您不能只向 make 命令行添加诸如 --help 之类的选项,因为 make 会自行解释它们。您必须在它们前面加上 -- 以强制 make 忽略它们:

make target -- --help

另一种选择是添加这样的目标:

target%:
        $(COMMAND) $*

然后你可以运行这个:

make "target --help"

但是你必须包含引号。

总的来说,我只是建议你重新考虑你想做什么。

关于bash - Makefile 通过 make 命令将附加参数传递给 targets 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52060487/

相关文章:

bash - 如何使用 `cat` 将文件内容传递给 `_values`(zsh 补全)

bash - 如何使用AWK按某列抓取文件中的一行

具有多个规则共享相同配方的 Makefile

c# - 在 docker 容器外公开日志文件

regex - 从特定列的时间戳中删除毫秒

bash - 有选择地从 'iptables -nvL' 命令输出中删除不必要的列空格吗?

c++ - 体系结构 x86_64 的 undefined symbol ,链接器命令失败

c++ - 如何在 Ace Root 中为 MingW-64 构建 ACE no MakeFile

php - Docker:创建一个完全安装的PHP应用程序

kubernetes - docker-compose 是一个 self 修复的协调器吗?