如何在 GNU make 中获取 makefile 的父目录的基本名称?

How to get the basename of the parent directory of a makefile in GNU make?

假设您想要一个 makefile 生成一个以父目录命名的文件。一种方法是对目标名称进行硬编码,但这不是很 "generic",例如

TARGET := dirname.pdf

$(TARGET): $(TARGET:.pdf=.tex)
    pdflatex $(@:.pdf=.tex)

通过 make 函数检索目录名会好得多。关于如何检索 makefile 的完整路径(例如 )而不是父目录的名称,SA 上有各种问题(和答案)...

在 GNU make 中最有效和便携的方法是什么?

如果你有 GNU make >4.0 和 guile-support($(info .FEATURES) 的输出包含 guile basename 不包含以下空格解决方案无需任何外部依赖项或子流程即可工作:

MAKEFILE_PATH:=$(abspath $(lastword $(MAKEFILE_LIST)))
MAKEFILE_PATH_ELEMS:=$(subst /, ,$(MAKEFILE_PATH))
PARENT_DIR:=$(word $(guile (- $(words $(MAKEFILE_PATH_ELEMS)) 1)),$(MAKEFILE_PATH_ELEMS))

不幸的是,(all/many?) 发行版默认不启用 guile 支持,因此这需要安装一个独特的软件包(例如,Ubuntu 上的 make-guile)提供guile 支持并替换普通的 make.

为什么不直接使用内置的 file name functions

TARGET := $(notdir $(CURDIR))

我想我不确定你说的 "parent directory" 是什么意思;这有点模棱两可。带有路径名和您想要的结果的具体示例会更容易理解。

这在很大程度上取决于您所说的 "parent" 目录。毕竟,make 只能对字符串进行操作,并没有数据类型方面的目录和文件的真正概念。你可以例如通过调用此函数提取路径的姓氏:

parent_name = $(lastword $(subst /, ,$(dir $(abspath ))))
$(info $(call parent_name,/home/stefanct/myproject/foo.c))

输出:

myproject

如果父目录是指:

生成文件路径:

/some/file/path/Makefile

Makefile 目录:

/some/file/path

(Makefile 的)父目录

/some/file

那么下面的简单代码可能就是您要找的:

 MK_PATH:=$(dir $(realpath $(lastword $(MAKEFILE_LIST))))
 MK_PARENT:=$(realpath $(MK_PATH)../)