【问题标题】:How to get the basename of the parent directory of a makefile in GNU make?如何在 GNU make 中获取 makefile 的父目录的基本名称?
【发布时间】:2019-03-17 21:54:36
【问题描述】:

假设您想要一个生成文件,该文件将生成一个以父目录命名的文件。一种方法是硬编码目标名称,但这不是很“通用”,例如

TARGET := dirname.pdf

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

通过 make 函数检索目录名称会更好。关于如何检索 makefile 的完整路径(例如,https://stackoverflow.com/a/18137056/1905491)而不是父目录的名称,SA 上有各种问题(和答案)...

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

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

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

    TARGET := $(notdir $(CURDIR))
    

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

    【讨论】:

    • 这似乎比 [Vroomfondel 的解决方案] (stackoverflow.com/a/52784116/1905491) 还要优雅。首先,我认为使用-C 时它不起作用,但文档明确指出CURDIR 是在应用任何-C 操作之后设置的,并且我已经使用GNU make 4.1 对其进行了测试。谢谢!
    【解决方案2】:

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

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

    输出:

    myproject
    

    【讨论】:

    • 对,我忘了从dir 的路径中删除makefile 的名称。从那里使用lastword 很容易(参见我的convoluted solution :) 谢谢!
    【解决方案3】:

    如果你的意思是父目录:

    生成文件路径:

    /some/file/path/Makefile
    

    Makefile 目录:

    /some/file/path
    

    (Makefile 的)父目录

    /some/file
    

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

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

    【讨论】:

      【解决方案4】:

      如果您有 GNU make >4.0 和 guile-support($(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))
      

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

      【讨论】:

        猜你喜欢
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 2019-10-27
        • 2017-08-14
        • 1970-01-01
        相关资源
        最近更新 更多