如何正确获取当前执行的makefile所在目录?
我目前正在使用export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))
,但是当使用完全相同的选项运行make时,会出现不同的ROOT值的问题。大约90%的时间它具有正确的值,但在剩余的10%中存在许多无效路径。
realpath
、abspath
、lastword
等几个函数只在GNU Make 3.81中引入[参见ref]。但是,在较旧的版本中,您可以使用words
和word
来获取当前文件名:
THIS_MAKEFILE:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
但是我不确定有没有避开 shell 的 realpath
解决方法,例如这个方法适用于 make v3.80:
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
THIS_MAKEFILE:=$(notdir $(THIS_MAKEFILE_PATH))
all:
@echo "This makefile is $(THIS_MAKEFILE) in the $(THIS_DIR) directory"
这提供了
$ make -f ../M
This makefile is M in the /home/sandipb directory
参考:http://cvs.savannah.gnu.org/viewvc/make/NEWS?revision=2.93&root=make&view=markup
这是一个关于IT技术的链接。由于makefile文件可能存在于除pwd之外的其他目录中(如 make -f
允许的),因此$(shell pwd)不正确。
原作者提出的
export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))
这是没问题的,不过如果顶层makefile在分配给ROOT之前(可能)include
其他makefile,则他/她可能想使用firstword
,特别是如果是这种情况。
如果在分配之前有10%的条件式include
,那么OPs的10%问题可能可以解释,但是这只是一个猜测...
为方便起见,当GNU make启动时(在处理任何-C选项之后),它将变量CURDIR设置为当前工作目录的路径名。此值不会被make再次更改:特别要注意的是,如果您包含来自其他目录的文件,则CURDIR的值不会更改。该值具有与在Makefile中设置它相同的优先级(默认情况下,环境变量CURDIR不会覆盖此值)。请注意,设置此变量对make的操作没有影响(例如,它不会使make更改其工作目录)。
all: echo $(CURDIR)