我有一个定义 docker-compose 项目的 Makefile。 它基本上为我组装了一个命令:
COMMAND := docker-compose --project-name=$(PREFIX) --file=$(FILE_PATH)
up:
$(COMMAND) up -d
我想添加一个名为 dc
的 target
,我可以向其传递我想要的任何参数。
我知道有一个解决方案:
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/