获取makefile所在的目录

获取makefile所在的目录,makefile,gnu-make,Makefile,Gnu Make,获取当前执行的makefile所在目录的正确方法是什么 我目前正在使用export ROOT=$(realpath$(dir$(lastword$(MAKEFILE_LIST)))并且遇到了一些问题,当使用完全相同的选项运行make时,将导致ROOT的值不同。大约90%的时间它具有正确的值,但在剩余的10%中有许多无效路径。$(shell pwd)不正确,因为makefile可能存在于pwd以外的目录中(如make-f所允许) 行动建议 export ROOT=$(realpath $(dir

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

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

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

行动建议

export ROOT=$(realpath $(dir $(lastword $(MAKEFILE_LIST))))
很好,但他/她可能想改用
firstword
,特别是如果顶级makefile(可能)
在分配到ROOT之前包含其他makefile


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

realpath
abspath
lastword
,GNU Make 3.81中只引入了两个以上的函数[参见参考文献]。现在,您可以使用
words
word
在旧版本中获取当前文件名:

THIS_MAKEFILE:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
但我不确定在不使用shell的情况下,
realpath
是否有解决方案。e、 g.这适用于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

参考:

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

全部:
echo$(CURDIR)

实际上取决于您使用的操作系统和
make
(Linux?GNU make?)