如何在 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)../)
假设您想要一个 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)../)