包括Makefile';父目录

包括Makefile';父目录,makefile,gnu-make,Makefile,Gnu Make,我想在顶级Makefile可以包含的文件中描述每个子对象的依赖关系。这是为了允许递归make设置(具有实例化变量和相对路径的所有功能),但具有顶级make中描述的所有依赖项,以提高编译速度和并行性 例如,假设我们有一个如下所示的目录树: project/ |-- lib1 | |-- Makefile | `-- Makefile.reg |-- lib2 | |-- Makefile | `-- Makefile.reg |-- Makefile `-- Makefile.re

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

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

project/
|-- lib1
|   |-- Makefile
|   `-- Makefile.reg
|-- lib2
|   |-- Makefile
|   `-- Makefile.reg
|-- Makefile
`-- Makefile.reg
REG := lib1
include ../Makefile.reg
REG := lib2
DEP := lib1
include ../Makefile.reg
$(REG)_DIR = ????
$(REG): $(DEP)
  $(MAKE) -C $($@_DIR)
include $(shell find . -name "Makefile.reg")
project/lib1/Makefile.reg
文件的文件可能如下所示:

project/
|-- lib1
|   |-- Makefile
|   `-- Makefile.reg
|-- lib2
|   |-- Makefile
|   `-- Makefile.reg
|-- Makefile
`-- Makefile.reg
REG := lib1
include ../Makefile.reg
REG := lib2
DEP := lib1
include ../Makefile.reg
$(REG)_DIR = ????
$(REG): $(DEP)
  $(MAKE) -C $($@_DIR)
include $(shell find . -name "Makefile.reg")
project/lib2/Makefile.reg
文件的文件可能如下所示:

project/
|-- lib1
|   |-- Makefile
|   `-- Makefile.reg
|-- lib2
|   |-- Makefile
|   `-- Makefile.reg
|-- Makefile
`-- Makefile.reg
REG := lib1
include ../Makefile.reg
REG := lib2
DEP := lib1
include ../Makefile.reg
$(REG)_DIR = ????
$(REG): $(DEP)
  $(MAKE) -C $($@_DIR)
include $(shell find . -name "Makefile.reg")
文件
project/Makefile.reg
如下所示:

project/
|-- lib1
|   |-- Makefile
|   `-- Makefile.reg
|-- lib2
|   |-- Makefile
|   `-- Makefile.reg
|-- Makefile
`-- Makefile.reg
REG := lib1
include ../Makefile.reg
REG := lib2
DEP := lib1
include ../Makefile.reg
$(REG)_DIR = ????
$(REG): $(DEP)
  $(MAKE) -C $($@_DIR)
include $(shell find . -name "Makefile.reg")
最后,顶级的
项目/Makefile
如下所示:

project/
|-- lib1
|   |-- Makefile
|   `-- Makefile.reg
|-- lib2
|   |-- Makefile
|   `-- Makefile.reg
|-- Makefile
`-- Makefile.reg
REG := lib1
include ../Makefile.reg
REG := lib2
DEP := lib1
include ../Makefile.reg
$(REG)_DIR = ????
$(REG): $(DEP)
  $(MAKE) -C $($@_DIR)
include $(shell find . -name "Makefile.reg")
现在,顶级的
Makefile
拥有每个目标的所有依赖关系信息,可以智能地调用递归make并利用完全并行性,同时保持依赖关系树的完整性

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


是否有办法将目录路径发现包含在公共
项目/Makefile.reg
中,而不是在每个子项目
Makefile.reg
中添加新行?换句话说,包含的makefile能否推断父makefile的目录?我在对
MAKEFILE\u LIST
变量的不同解析中看到了潜力。

正如链接票据答案中包含的文档片段所示。
MAKEFILE\u LIST
的值会随着make的进行而更新。列表中最新的条目是当前的makefile,它使列表中倒数第二个条目成为在此之前最近包含的makefile。如果您愿意断言主
项目/Makefile.reg
将只包含在子目录Makefile中,那么它可以在
Makefile\u列表中检查该条目

或者,您可以简单地在main
Makefile
中定义一个,并在每个项目Makefile中调用它来定义适当的目标

不幸的是,make确实使获得倒数第二个条目变得有点困难,而不是令人愉快。但以下措施应该奏效:

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: ;

上述内容的灵感来源于奇妙的
chop
函数。

问题基本上归结为如何从MAKEFILE_列表中获取
last-1
条目,而不仅仅是最后一个条目。@Aggieboy我意识到您可能没有看到我编辑了答案,以包含一种获取所需单词的方法。如果是这样,很抱歉。啊,很有趣!我在做
reverse=$(如果$(1),$(调用reverse,$(单词列表2,$(单词$(1)),$(1)))$(第一个单词$(1))
,然后再做
$(patsubst%/,%,$(dir$(单词2,$(调用reverse,$(MAKEFILE_LIST);)
,但是你的解决方案可能要快得多。在接受之前让我试一下。