我有一个定义docker-compose项目的Makefile。 它实际上是为我汇编的命令:
COMMAND := docker-compose --project-name=$(PREFIX) --file=$(FILE_PATH)
up:
$(COMMAND) up -d
我想添加一个名为target
的{{1}},我可以在其中传递我想要的任何参数。
我知道有一种解决方法:
dc
然后使用target:
$(COMMAND) $(ARGS)
进行调用。
但是,还有没有像bash make target ARGS="--help"
中那样更简单的方法吗?我想跳过ARGS = ...部分,并将所有内容发送到$@
名称之后的命令中。
答案 0 :(得分:3)
您可以编写bash包装器脚本来执行您想要的操作:
#/bin/bash
make target ARGS=\"$@\"
您不想在make中执行此操作的原因是,make在解析makefile本身之前先解析了命令行参数 ,因此在您读取makefile时,目标,变量等已被设置。这意味着make将已经将额外的参数解释为新的目标,变量等。
答案 1 :(得分:3)
不是。 make程序将所有参数(不包含=
)解释为要构建的目标名称,您无法覆盖它。因此,即使您可以获得命令行上给出的参数列表(通过GNU make特定的$(MAKECMDGOALS)
变量),也无法防止将这些参数视为目标。
您可以做这样的事情,这确实令人难以置信:
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"
但是您必须包括引号。
通常,我只建议您重新考虑您想做什么。
答案 2 :(得分:0)
第一个答案是正确的,没有参数的传递。但是,这是一条可行的实验路径,通过包含选择来使用分支:
# Makefile:
COMMAND := $(PYTHON) this_shit_got_real.py
LOCAL_MK ?= local.mk
# '-' important, absence of LOCAL_MK is not cause for error, just run with no overrides
- include $(LOCAL_MK)
target:
$(COMMAND) $(ARGS)
现在看看如何使用env添加分支:
echo "ARGS=--help">>local.mk
# make target
另一个由cli控制的分支
echo "ARGS=--doit">>runner.mk
# LOCAL_MK=runner.mk make target