gpt4 book ai didi

bash - 停止执行 makefile

转载 作者:行者123 更新时间:2023-11-29 08:52:50 25 4
gpt4 key购买 nike

我实现了一个配方,以便将所有剩余的字符串传递给命令,如以下脚本中的示例:

生成文件

run:
# ./bin/run.sh $(filter-out $@,$(MAKECMDGOALS))
@echo $(filter-out $@,$(MAKECMDGOALS))

但是当我以例子运行时:

>make run my custom input params
my custom input params
make: *** No rule to make target `my'. Stop.

makefile 尝试执行剩余的字符串,所以错误:

make: *** No rule to make target `my'.  Stop.

我怎样才能避免这种情况?

注意:作为解决方法,我定义了一个虚拟配方:

%:
@echo

所以这将打印一个空字符串而不是错误。

我想避免做类似的事情:

make run-example param="my custom param"

最佳答案

您可能可以使用 match-anything rule 实现您想要的效果.示例(使用虚拟 printf 配方而不是真实配方):

PARAMS := $(filter-out run,$(MAKECMDGOALS))

run:
@printf './bin/run.sh $(PARAMS)\n'

%:;

演示:

$ make run my custom input params
./bin/run.sh my custom input params
make: 'my' is up to date.
make: 'custom' is up to date.
make: 'input' is up to date.
make: 'params' is up to date.

您可以忽略 make: 'target' is up to date. 消息或使用 --quiet 选项(或 --silent-s):

$ make --quiet run my custom input params
./bin/run.sh my custom input params

如果您的 Makefile 比这更复杂,则 match-anything 规则可能会成为问题,因为它可能会捕获您不想捕获的其他目标。在这种情况下,make 条件是一个选项:

ifeq ($(SECONDPASS),)
PARAMS := $(filter-out run,$(MAKECMDGOALS))

run:
@$(MAKE) --quiet $@ PARAMS='$(PARAMS)' SECONDPASS=true

%:;
else
run:
@printf './bin/run.sh $(PARAMS)\n'

# other rules if any
endif

最后,如果第一个目标的名称不总是相同的,您可以使用:

GOAL   := $(firstword $(MAKECMDGOALS))
PARAMS := $(filter-out $(GOAL),$(MAKECMDGOALS))

$(GOAL):
@printf './bin/$(GOAL).sh $(PARAMS)\n'

%:;

或者:

GOAL   := $(firstword $(MAKECMDGOALS))

ifeq ($(SECONDPASS),)
PARAMS := $(filter-out $(GOAL),$(MAKECMDGOALS))

$(GOAL):
@$(MAKE) --quiet $@ PARAMS='$(PARAMS)' SECONDPASS=true

%:;
else
$(GOAL):
@printf './bin/$(GOAL).sh $(PARAMS)\n'

# other rules if any
endif

演示:

$ make --quiet nur foo bar
./bin/nur.sh foo bar

关于bash - 停止执行 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54090238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com