【问题标题】:Included Makefile's parent directory包含 Makefile 的父目录
【发布时间】:2014-07-25 16:11:45
【问题描述】:

我想在顶级Makefile 可以包含的文件中描述每个子制作的依赖关系。这是为了允许递归 make 设置(具有实例变量和相对路径的所有功能),但所有依赖项都在顶级 make 中描述,以提高编译速度和并行度。

例如,假设我们有一个如下所示的目录树:

project/
|-- lib1
|   |-- Makefile
|   `-- Makefile.reg
|-- lib2
|   |-- Makefile
|   `-- Makefile.reg
|-- Makefile
`-- Makefile.reg

project/lib1/Makefile.reg 文件的文件可能如下所示:

REG := lib1
include ../Makefile.reg

project/lib2/Makefile.reg 文件的文件可能如下所示:

REG := lib2
DEP := lib1
include ../Makefile.reg

文件project/Makefile.reg 将如下所示:

$(REG)_DIR = ????
$(REG): $(DEP)
  $(MAKE) -C $($@_DIR)

最后,顶级project/Makefile 如下所示:

include $(shell find . -name "Makefile.reg")

现在,顶级 Makefile 拥有每个目标的所有依赖关系信息,并且可以智能地调用递归 make 并利用完全并行性,同时保持依赖关系树完好无损。

问题是我不确定如何让project/Makefile.reg 知道当前子制作的Makefile.reg 的路径是什么。 make 将始终从顶级目录调用,因此 $(shell pwd) 将始终报告 project/。一种解决方案是包含来自this SO 答案的行,但是我希望每个Makefile.reg 只指定一个目标和一个可选的依赖项列表。

有没有办法将目录路径发现包含在常见的project/Makefile.reg 中,而不是在每个子make Makefile.reg 中添加一个新行?换句话说,一个包含的makefile可以推断出父makefile的目录吗?我看到了 MAKEFILE_LIST 变量的一些不同解析的潜力。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    正如链接票证答案中包含的文档 sn-p 所示。 MAKEFILE_LIST 的值随着 make 的进行而更新。列表中的最新条目是当前的 makefile,它使列表中的倒数第二个条目成为之前最近包含的 makefile。如果您愿意断言主project/Makefile.reg 只会包含在子目录makefile 中,那么它可以简单地检查MAKEFILE_LIST 中的条目。

    或者,您可以简单地在主 Makefile 中定义一个 canned recipe,然后在每个项目 makefile 中调用它来定义适当的目标。

    不幸的是,使倒数第二个条目比令人愉快的条目更困难一些。但以下应该有效:

    FOO=a b c d e f g
    BAR=h i j k l m n
    BAZ=o p q r s t u
    QUX=v w x y z 1 2
    
    penultimateword = $(wordlist $(words $1),$(words $1), x $1)
    
    REG=FOO
    $(REG)_DIR= $(call penultimateword,$($(REG)))
    $(info REG_DIR=$($(REG)_DIR))
    
    REG=BAR
    $(REG)_DIR= $(call penultimateword,$($(REG)))
    $(info REG_DIR=$($(REG)_DIR))
    
    REG=BAZ
    $(REG)_DIR= $(call penultimateword,$($(REG)))
    $(info REG_DIR=$($(REG)_DIR))
    
    REG=QUX
    $(REG)_DIR= $(call penultimateword,$($(REG)))
    $(info REG_DIR=$($(REG)_DIR))
    
    all: ;
    

    上面的灵感来自奇妙的GMSL 中的chop 函数。

    【讨论】:

    • 问题基本上归结为如何从 MAKEFILE_LIST 中获取last-1 条目,而不仅仅是最后一个条目。
    • @Aggieboy 我意识到您可能没有看到我编辑了我的答案以包含一种获得所需单词的方法。如果是这样,很抱歉。
    • 啊有趣!我在做reverse = $(if $(1),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1)) 然后$(patsubst %/,%,$(dir $(word 2,$(call reverse,$(MAKEFILE_LIST))))),但你的解决方案可能要快得多。让我在接受之前尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多