首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Makefile将附加参数从make命令传递到target命令

Makefile将附加参数从make命令传递到target命令
EN

Stack Overflow用户
提问于 2018-08-28 22:38:22
回答 3查看 9.8K关注 0票数 6

我有一个Makefile,它定义了docker-compose项目。它基本上为我汇编了一条命令:

代码语言:javascript
运行
复制
COMMAND := docker-compose --project-name=$(PREFIX) --file=$(FILE_PATH)

up:
    $(COMMAND) up -d

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

我知道有一个解决方案:

代码语言:javascript
运行
复制
target:
    $(COMMAND) $(ARGS)

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-28 23:18:04

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

你可以做这样的事情,这是令人难以置信的:

代码语言:javascript
运行
复制
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忽略它们:

代码语言:javascript
运行
复制
make target -- --help

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

代码语言:javascript
运行
复制
target%:
        $(COMMAND) $*

然后,您可以运行以下命令:

代码语言:javascript
运行
复制
make "target --help"

但你必须包括引号。

总的来说,我只是建议你重新考虑你想要做的事情。

票数 5
EN

Stack Overflow用户

发布于 2018-08-28 23:03:23

您可以编写一个bash包装器脚本来做您想做的事情:

代码语言:javascript
运行
复制
#/bin/bash
make target ARGS=\"$@\"

您不想在make中执行此操作的原因是,make在解析makefile本身之前解析命令行参数,所以当您读取makefile时,目标、变量等已经设置好了。这意味着make已经将额外的参数解释为新的目标、变量等。

票数 4
EN

Stack Overflow用户

发布于 2020-03-05 04:02:02

第一个答案是正确的,没有通过参数。然而,这里是一种可行实验路径,通过包含选择来使用分支:

代码语言:javascript
运行
复制
# 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添加分支:

代码语言:javascript
运行
复制
echo "ARGS=--help">>local.mk
# make target

和另一个cli控制的分支。

代码语言:javascript
运行
复制
echo "ARGS=--doit">>runner.mk
# LOCAL_MK=runner.mk make target
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52060487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档