使用父的Makefile编译子目录

时间:2015-10-12 15:38:30

标签: makefile

Makefile的第一行是:

  

包括def.mk

这使我可以灵活地定义def.mk中的依赖项,并使Makefile尽可能通用。

目前我在每个子模块下定义一个def.mk。但我重复整个Makefile。

  • 是否可以在父目录中只有一个Makefile,并且每个子目录只能 def.mk,以便父目录Makefile {{ 1}}用于编译子目录?
  • 或者,是否可以在每个子目录下都有一个最小Makefile,而这些子目录又会使用父Makefile
  • 此外,Makefile需要使用相应目录中定义的def.mk而不是父目录。

PS :不幸的是,我没有权利使用任何automake工具。这些Makefile必须手工制作! :(

PPS :另外,我确实有超过一级深度的子​​目录。

1 个答案:

答案 0 :(得分:1)

有多种方法可以做到。

假设我们有http://mysitee.com/?attachment=my-image-750x500 main/Makefilemain/subOne/def.mkmain/subTwo/def.mk,以及各种源和头文件(main/subOne/subThree/def.mkfoo.cc)。

首先,我们必须决定Make将如何知道在每个目录中构建哪些目标以及要递归到哪些子目录。最安全的方法是将它们列在相应的bar.h文件中。

然后是一个大问题:递归还是非递归?

递归Make(当Make执行Make的另一个实例时)是粗略但有效的。它导致更简单的makefile,但是阻止Make使用其依赖性处理到完全生效,因此构建过程可能效率低下。 (许多人认为Recursive Make因为这个原因而非常糟糕,但我认为它有其用途。)

def.mk

Makefile

请注意,变量SUBDIRS := subOne subTwo -include def.mk all: $(SUBDIRS) .PHONY: $(SUBDIRS) $(SUBDIRS): @make -C $@ -f ../$(STACK)Makefile STACK=../$(STACK) (或任何您想要调用的变量)会跟踪返回到makefile的路径。

STACK

subOne/def.mk

SUBDIRS := subThree all: alpha.o alpha.o: alpha.h

subTwo/def.mk

SUBDIRS := all: beta.o beta.o: beta.h

subOne/subThree/def.mk

非递归版本稍微复杂一点,但如果你是游戏,我会添加它......