Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Force Makefile to execute script after building any target (just before exiting)

Tags:

shell

makefile

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.

like image 519
PonyEars Avatar asked Dec 14 '13 10:12

PonyEars


3 Answers

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
like image 51
MadScientist Avatar answered Nov 09 '22 06:11

MadScientist


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.

like image 30
Gavin Smith Avatar answered Nov 09 '22 07:11

Gavin Smith


You could 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
like image 2
janos Avatar answered Nov 09 '22 05:11

janos