Force Makefile to execute script after building an

2019-07-08 04:45发布

I'd like to execute a shell command when make exits, regardless of whatever target it built. Seems like make doesn't have a way to do this directly. However, here's an example of having make execute a shell command upon startup, regardless of the target:

Force Makefile to execute script before building targets

Is there any similar hack have make execute a shell command once just before exiting? I could put the command at the bottom of every target, but a) it would get executed multiple times, and b) that is ugly and difficult to manage.

3条回答
Evening l夕情丶
2楼-- · 2019-07-08 05:19

The only solution I see is to create a wrapper script that simply passes all arguments to make and then runs the custom action you want:

#!/bin/sh
make $* && ./custom_script.sh
查看更多
祖国的老花朵
3楼-- · 2019-07-08 05:26

You could use two makefiles, one of which calls the other. For example

wrapper.mk:

foo bar:
        make -f other.mk $@
        @echo finished
.PHONY: foo bar

other.mk:

foo bar:
        @echo Building $@

Then running "make -f wrapper.mk foo", wrapper.mk runs other.mk to build foo. The .PHONY target means that the targets will be passed to other.mk for consideration everytime regardless of whether the files exist or not.

This requires listing all your targets in wrapper.mk - there may be ways round this using default rules or match-anything rules.

查看更多
我只想做你的唯一
4楼-- · 2019-07-08 05:41

As janos says, there is no facility built into make to do it. You can use a wrapper such as he suggests. You an also, if you're willing to live with some amount of "bleah", push that into your makefile using recursion. It would look something like this, perhaps:

ifdef RECURSING

    ... normal makefile goes here ...

else

.DEFAULT all:
        @$(MAKE) RECURSING=true $@ ; r=$$? ; \
         <extra shell command here>; \
         exit $$r

endif
查看更多
登录 后发表回答