假设您想要一个生成文件,该文件将生成一个以父目录命名的文件。一种方法是硬编码目标名称,但这不是很“通用”,例如
TARGET := dirname.pdf
$(TARGET): $(TARGET:.pdf=.tex)
pdflatex $(@:.pdf=.tex)
通过make函数检索目录名会更好。关于SA如何检索Makefile的完整路径(例如https://stackoverflow.com/a/18137056/1905491)而不是父目录名称的问题,存在各种问题(和答案)...
在GNU make中最有效,最便携的方法是什么?
答案 0 :(得分:1)
为什么不只使用内置的file name functions?
TARGET := $(notdir $(CURDIR))
我想我不确定您所说的“父目录”是什么意思;这有点模棱两可。带有路径名和所需结果的特定示例将使其更易于理解。
答案 1 :(得分:1)
这在很大程度上取决于“父”目录的含义。毕竟,make只能对字符串进行操作,就数据类型而言,没有目录和文件的真实概念。您可以例如通过调用此函数来提取路径的姓氏:
parent_name = $(lastword $(subst /, ,$(dir $(abspath $1))))
$(info $(call parent_name,/home/stefanct/myproject/foo.c))
输出:
myproject
答案 2 :(得分:0)
如果您的GNU make> 4.0具有guile支持($(info .FEATURES)
的输出包含guile
)并且基名称不包含空格,则以下解决方案可以在没有任何外部条件的情况下工作依赖项或子流程:
MAKEFILE_PATH:=$(abspath $(lastword $(MAKEFILE_LIST)))
MAKEFILE_PATH_ELEMS:=$(subst /, ,$(MAKEFILE_PATH))
PARENT_DIR:=$(word $(guile (- $(words $(MAKEFILE_PATH_ELEMS)) 1)),$(MAKEFILE_PATH_ELEMS))
不幸的是,(所有/很多?)发行版默认不启用guile支持,因此这需要安装一个独特的软件包(例如Ubuntu上的make-guile
)来提供guile支持并替换普通的{{ 1}}。
答案 3 :(得分:0)
如果按父目录的意思是:
Makefile路径:
/some/file/path/Makefile
Makefile目录:
/some/file/path
(Makefile的)父目录
/some/file
那么下面的简单代码可能就是您想要的:
MK_PATH:=$(dir $(realpath $(lastword $(MAKEFILE_LIST))))
MK_PARENT:=$(realpath $(MK_PATH)../)