我实现了一个配方,以便将所有剩余的字符串传递给命令,例如此脚本中的示例:
Makefile
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"
答案 0 :(得分:8)
您可能可以通过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比这更复杂,那么任何匹配规则都可能会成为问题,因为它可能会捕获您不想捕获的其他目标。在这种情况下,可以使用条件选项:
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
答案 1 :(得分:5)
我认为您不应该使用Makefile。您想对选项进行自己的解析,而在make中这样做比较麻烦。
如果您对它不满意,可以执行以下操作:
out_buffer
...这将避免打印空行。
不过,最好在Bash中执行此操作。这是您可以做到的一种方法:
%:
@true
这似乎更容易且可扩展。
答案 2 :(得分:3)
如果只希望将变量传递给make或传递给shell脚本,则始终可以在执行make之前传递/设置ENV变量。
MYPARAM1=123 MYPARAM2=456 make
使用子shell或
(MYPARAM1=123; MYPARAM2=456; echo A=$MYPARAM1 B=$MYPARAM2; make)
(export MYPARAM1=123; export MYPARAM2=456; A=$MYPARAM1 B=$MYPARAM2; make) // exporting