2011-05-25 113 views
7

嘿,我有一个简单的“主”Makefile谁只是调用其他makefile。我试图按照以下顺序构建组件:Makefile - 如何调用具有依赖关系的其他makefile

LIB_A = folder_a 
LIB_B = folder_b 
LIB_C = folder_c 

MY_TARGETS = $(LIB_A) $(LIB_B) $(LIB_C) 

.PHONY: $(LIB_A) 
$(LIB_A): 
    @$(MAKE) -C [email protected]; 

.PHONY: $(LIB_B) 
$(LIB_B): 
    @$(MAKE) -C [email protected]; 

.PHONY: $(LIB_C) 
$(LIB_C): $(LIB_A) $(LIB_B) 
    @$(MAKE) -C [email protected]; 

.PHONY: all 
all: $(MY_TARGETS) 

但是,当我创建时,只有LIB_A被构建。

(我什至没有得到一个folder_b的最新消息或其他)。

任何提示?

回答

8

您需要使all为默认值。您可以通过以下两种方式做到这一点:

  • 移动它是第一目标文件中
  • 添加.DEFAULT_GOAL := all

或者,你可以运行make all,而不是仅仅make

+0

巴特沃思:确实是这样。这完全解决了它。我不知道目标的顺序有什么影响.. – vdsf 2011-05-25 22:02:51

+1

@turbo一般来说顺序并不重要,只是默认是第一个。你也可以使用我已经忘记的一些语法来指定默认值:-) – 2011-05-25 22:05:03

+0

你当然可以说'make all',你原来的makefile应该可以工作。 – 2011-05-25 22:15:16

8

尼尔·巴特沃思解决了这个问题,但你也可以做这个Makefile一点更简洁:

LIB_A = folder_a 
LIB_B = folder_b 
LIB_C = folder_c 

MY_TARGETS = $(LIB_A) $(LIB_B) $(LIB_C) 

.PHONY: all $(MY_TARGETS) 
all: $(MY_TARGETS) 

$(MY_TARGETS): 
    @$(MAKE) -C [email protected]; 

$(LIB_C): $(LIB_A) $(LIB_B) 
+0

在这个例子中,你将如何定义clean来清理所有模块? – nilo 2016-01-08 20:24:02

+0

@nilo:我将命令更改为'@ $(MAKE)-C $ @ $(TARG)',然后添加'clean'规则:'clean:TARG = clean clean:all' – Beta 2016-01-09 00:08:25