Makefile
的第一行是:
包括def.mk
这使我可以灵活地定义def.mk
中的依赖项,并使Makefile
尽可能通用。
目前我在每个子模块下定义一个def.mk。但我重复整个Makefile。
Makefile
,并且每个子目录只能 def.mk
,以便父目录Makefile
{{ 1}}用于编译子目录?Makefile
,而这些子目录又会使用父Makefile
Makefile
需要使用相应目录中定义的def.mk
而不是父目录。 PS :不幸的是,我没有权利使用任何automake
工具。这些Makefile必须手工制作! :(
PPS :另外,我确实有超过一级深度的子目录。
答案 0 :(得分:1)
有多种方法可以做到。
假设我们有http://mysitee.com/?attachment=my-image-750x500
,main/Makefile
,main/subOne/def.mk
和main/subTwo/def.mk
,以及各种源和头文件(main/subOne/subThree/def.mk
和foo.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
非递归版本稍微复杂一点,但如果你是游戏,我会添加它......