获取目录makefile驻留在

Nic*_*ick 4 makefile gnu-make

获取当前正在执行的makefile所在目录的正确方法是什么?

我正在使用export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))并遇到一些问题,当使用完全相同的选项运行make时,会导致ROOT的值不同.大约90%的时间它具有正确的值,但在剩余的10%中有许多无效路径.

San*_*rya 10

realpath,abspath,lastword和一对夫妇的更多的功能只在GNU推出使3.81 [见参考文献.现在,您可以使用words和获取旧版本中的当前文件名word:

THIS_MAKEFILE:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
Run Code Online (Sandbox Code Playgroud)

但是我不确定realpath没有进入shell 的解决方法.例如,这适用于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"
Run Code Online (Sandbox Code Playgroud)

这使

$ make -f ../M
This makefile is M in the /home/sandipb directory
Run Code Online (Sandbox Code Playgroud)

参考:http://cvs.savannah.gnu.org/viewvc/make/NEWS? revision= 2.93& root= make& view= markup


mal*_*ook 6

$(shell pwd) 不正确,因为 makefile 可能存在于 pwd 以外的目录中(由 允许make -f)。

OP 的提议

export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))
Run Code Online (Sandbox Code Playgroud)

很好,除了他/他可能想firstword改用,特别是如果顶级 makefile(可能include)在分配给 ROOT 之前是其他 makefile。

如果在分配之前有 10% 的时间有条件包含,则可以解释 OP 10% 的问题,但是,嘿,这是一个猜测......