停止执行makefile

时间:2019-01-08 10:52:07

标签: bash shell makefile

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

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"

3 个答案:

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

您还可以查看bash-shell-special-parameters