How to get a Makefile directory path

Posted: 27th September 2015 by Tim in Linux, Make
Tags: , , , , , ,

Sometimes in a Makefile you need to reference something from the directory where the Makefile lives. $(PWD) won’t work in this instance, since that will return the path from where make was called which may be different if, for example, you use the --directory option. In this case, we can use the following code to find Makefile’s directory:

$(dir $(realpath $(firstword $(MAKEFILE_LIST))))

Let’s pull this apart and look at each component. For this example, our Makefile path is /tmp/path/to/my/Makefile and contains the following:


include other/Makefile
default:
	@echo $(PWD)
	@echo $(dir $(realpath $(firstword $(MAKEFILE_LIST))))

First, MAKEFILE_LIST will contain all of the Makefiles which have been loaded. If you havent’t included any others, only one will be listed here:
$(MAKEFILE_LIST) = Makefile other/Makefile

Since we’re only interested in the current Makefile, we strip off the includes:
$(firstword $(MAKEFILE_LIST)) = Makefile

Now that we have one file, find the absolute path:
$(realpath $(firstword $(MAKEFILE_LIST))) = /tmp/path/to/my/Makefile

Finally, strip off the file name, leaving only the directory path:
$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) = /tmp/path/to/my/

So, if we call make --directory=/tmp/path/to/my default from the /tmp directory, the following will be printed:

/tmp
/tmp/path/to/my/

If you’re interested in the path of the last included Makefile, use lastword instead of firstword. For example, you may use lastword from other/Makefile to find that directory.