获取目录makefile驻留在

时间:2010-12-29 14:55:40

标签: makefile gnu-make

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

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

3 个答案:

答案 0 :(得分:10)

realpathabspathlastword以及其他几个函数仅在GNU Make 3.81 [引用参考]中引入。现在,您可以使用wordsword

获取旧版本中的当前文件名
THIS_MAKEFILE:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))

但是我不确定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"

哪个给出了

$ 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

答案 1 :(得分:4)

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

OP的提议

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

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

OPs 10%的问题可以解释如果有一个条件包括在作业前10%的时间,但是,嘿,这是一个猜测......

答案 2 :(得分:1)

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

所有:         echo $(CURDIR)