获取存放Makefile的目录

5

如何正确获取当前执行的makefile所在目录?

我目前正在使用export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST)))),但是当使用完全相同的选项运行make时,会出现不同的ROOT值的问题。大约90%的时间它具有正确的值,但在剩余的10%中存在许多无效路径。


这真的取决于您使用的操作系统和“make”(Linux?GNU make?)。 - reinierpost
3个回答

12

realpathabspathlastword等几个函数只在GNU Make 3.81中引入[参见ref]。但是,在较旧的版本中,您可以使用wordsword来获取当前文件名:

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技术的链接。

7

由于makefile文件可能存在于除pwd之外的其他目录中(如 make -f 允许的),因此$(shell pwd)不正确。

原作者提出的

export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))

这是没问题的,不过如果顶层makefile在分配给ROOT之前(可能)include其他makefile,则他/她可能想使用firstword,特别是如果是这种情况。

如果在分配之前有10%的条件式include,那么OPs的10%问题可能可以解释,但是这只是一个猜测...


1

为方便起见,当GNU make启动时(在处理任何-C选项之后),它将变量CURDIR设置为当前工作目录的路径名。此值不会被make再次更改:特别要注意的是,如果您包含来自其他目录的文件,则CURDIR的值不会更改。该值具有与在Makefile中设置它相同的优先级(默认情况下,环境变量CURDIR不会覆盖此值)。请注意,设置此变量对make的操作没有影响(例如,它不会使make更改其工作目录)。

all: echo $(CURDIR)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接