Starting from GNU make 3.82 (July 2010), you can use the .ONESHELL
special target to run all recipe lines in a single instantiation of the shell (bold emphasis mine):
- New special target:
.ONESHELL
instructs make to invoke a single instance of the shell and provide it with the entire recipe, regardless of how many lines it contains.
.ONESHELL: # Only applies to all target
all:
cd ~/some_dir
pwd # Prints ~/some_dir if cd succeeded
another_rule:
cd ~/some_dir
pwd # Oops, prints ~