获取当前正在执行的makefile所在目录的正确方法是什么?
我目前正在使用export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))
并遇到一些问题,当使用完全相同的选项运行make时,会导致ROOT的值不同。大约90%的时间它具有正确的值,但在剩余的10%中存在许多无效路径。
答案 0 :(得分:10)
realpath
,abspath
,lastword
以及其他几个函数仅在GNU Make 3.81 [引用参考]中引入。现在,您可以使用words
和word
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)