我有一个Makefile,它定义了docker-compose项目。它基本上为我汇编了一条命令:
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名称后的命令。
发布于 2018-08-28 23:18:04
不怎么有意思。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元目标以删除内置规则。
我怀疑这仍然会有奇怪的边缘-在它不工作的情况下。
还需要注意的是,你不能仅仅将像--help这样的选项添加到make命令行中,因为make会自己解释它们。您必须在它们前面加上--,以强制make忽略它们:
make target -- --help另一种选择是像这样添加一个目标:
target%:
        $(COMMAND) $*然后,您可以运行以下命令:
make "target --help"但你必须包括引号。
总的来说,我只是建议你重新考虑你想要做的事情。
发布于 2018-08-28 23:03:23
您可以编写一个bash包装器脚本来做您想做的事情:
#/bin/bash
make target ARGS=\"$@\"您不想在make中执行此操作的原因是,make在解析makefile本身之前解析命令行参数,所以当您读取makefile时,目标、变量等已经设置好了。这意味着make已经将额外的参数解释为新的目标、变量等。
发布于 2020-03-05 04:02:02
第一个答案是正确的,没有通过参数。然而,这里是一种可行实验路径,通过包含选择来使用分支:
# 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 targethttps://stackoverflow.com/questions/52060487
复制相似问题