Combining @Gavin Smith and @MadScientist answers with these other questions:
- How to pass argument to Makefile from command line?
- Makefile match any target / task
- How to get the invoking target of makefile?
- Suppress "nothing to be done for 'all' "
- Makefile: declare all targets PHONY
- Makefile set global variable in target body
I built this:
Makefile
ECHOCMD:=/bin/echo -e
SHELL := /bin/bash
define DEFAULTTARGET :=
printf 'Calling makerules.mk "%s"\n\n' "${MAKECMDGOALS}"
make -f makerules.mk ${MAKECMDGOALS}
printf '\n'
printf 'Running something after all rules finished\n'
endef
%:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval IS_MAKEFILE_RUNNING_TARGETS=1)
all:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval IS_MAKEFILE_RUNNING_TARGETS=1)
makerules.mk
all:
printf 'Calling my all rule\n'
foo:
printf 'Calling my foo rule\n'
bar:
printf 'Calling my bar rule\n'
xyzzy:
printf 'Calling my xyzzy rule\n'
Usage examples:
make
printf 'Calling makerules.mk "%s"\n\n' ""
Calling makerules.mk ""
make -f makerules.mk
make[1]: Entering directory '/cygdrive/d/User/Downloads'
printf 'Calling my all rule\n'
Calling my all rule
make[1]: Leaving directory '/cygdrive/d/User/Downloads'
printf '\n'
printf 'Running something after all rules finished\n'
Running something after all rules finished
make all
printf 'Calling makerules.mk "%s"\n\n' "all"
Calling makerules.mk "all"
make -f makerules.mk all
make[1]: Entering directory '/cygdrive/d/User/Downloads'
printf 'Calling my all rule\n'
Calling my all rule
make[1]: Leaving directory '/cygdrive/d/User/Downloads'
printf '\n'
printf 'Running something after all rules finished\n'
Running something after all rules finished
make all foo
printf 'Calling makerules.mk "%s"\n\n' "all foo"
Calling makerules.mk "all foo"
make -f makerules.mk all foo
make[1]: Entering directory '/cygdrive/d/User/Downloads'
printf 'Calling my all rule\n'
Calling my all rule
printf 'Calling my foo rule\n'
Calling my foo rule
make[1]: Leaving directory '/cygdrive/d/User/Downloads'
printf '\n'
printf 'Running something after all rules finished\n'
Running something after all rules finished
make all foo bar
printf 'Calling makerules.mk "%s"\n\n' "all foo bar"
Calling makerules.mk "all foo bar"
make -f makerules.mk all foo bar
make[1]: Entering directory '/cygdrive/d/User/Downloads'
printf 'Calling my all rule\n'
Calling my all rule
printf 'Calling my foo rule\n'
Calling my foo rule
printf 'Calling my bar rule\n'
Calling my bar rule
make[1]: Leaving directory '/cygdrive/d/User/Downloads'
printf '\n'
printf 'Running something after all rules finished\n'
Running something after all rules finished
make all foo bar xyzzy
printf 'Calling makerules.mk "%s"\n\n' "all foo bar xyzzy"
Calling makerules.mk "all foo bar xyzzy"
make -f makerules.mk all foo bar xyzzy
make[1]: Entering directory '/cygdrive/d/User/Downloads'
printf 'Calling my all rule\n'
Calling my all rule
printf 'Calling my foo rule\n'
Calling my foo rule
printf 'Calling my bar rule\n'
Calling my bar rule
printf 'Calling my xyzzy rule\n'
Calling my xyzzy rule
make[1]: Leaving directory '/cygdrive/d/User/Downloads'
printf '\n'
printf 'Running something after all rules finished\n'
Running something after all rules finished
Related questions:
- Stop executing makefile
- Force exit from a Makefile target without raising an error
- Suppress make rule error output
- Make: how to continue after a command fails?
- https://unix.stackexchange.com/questions/460606/make-how-to-suppress-make-error-messages-without-suppressing-other-output
- makefile use variable defined in target
- How do I get a makefile function to stop the current target?
- Can I make a makefile abort outside of a rule?
- Remove target from MAKECMDGOALS?
- How to detect if the makefile **`--silent`** / **`--quiet`** command line option was set?
Update
This is the same as the above, but now you have everything in a single Makefile
:
- Getting the name of the makefile from the makefile
Makefile
ECHOCMD:=/bin/echo -e
SHELL := /bin/bash
ifeq (${IS_MAKEFILE_RUNNING_TARGETS},)
MAKEFILE_JUSTNAME := $(firstword ${MAKEFILE_LIST})
define DEFAULTTARGET :=
printf 'Calling "%s" "%s"\n\n' "${MAKEFILE_JUSTNAME}" "${MAKECMDGOALS}"
make -f ${MAKEFILE_JUSTNAME} ${MAKECMDGOALS}
printf '\n'
printf 'Running something after all rules finished\n'
endef
%:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval export IS_MAKEFILE_RUNNING_TARGETS=1)
all:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval export IS_MAKEFILE_RUNNING_TARGETS=1)
else
all:
printf 'Calling my all rule\n'
foo:
printf 'Calling my foo rule\n'
bar:
printf 'Calling my bar rule\n'
xyzzy:
printf 'Calling my xyzzy rule\n'
endif