Makefile从make命令向目标命令传递附加参数

时间:2018-08-28 14:38:22

标签: bash makefile docker-compose

我有一个定义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 = ...部分,并将所有内容发送到$@名称之后的命令中。

3 个答案:

答案 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