Makefile-如何调用具有依赖项的其他Makefile

Makefile-如何调用具有依赖项的其他Makefile,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 $@; .PHONY: $(LIB_B) $(LIB_B): @$(MAKE) -C $@; .

嘿,我有一个简单的“主”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 $@;

.PHONY: $(LIB_B)
$(LIB_B):
    @$(MAKE) -C $@;

.PHONY: $(LIB_C)
$(LIB_C): $(LIB_A) $(LIB_B)
    @$(MAKE) -C $@;

.PHONY: all 
all: $(MY_TARGETS)
然而,当我制作时,只生成LIB_A

(我甚至没有收到文件夹中的最新消息或任何东西)


有什么提示吗?

您需要将
all
设为默认值。您可以通过以下任一方式执行此操作:

  • 将其移动为文件中的第一个目标
  • 添加
    。默认目标:=all

或者,您可以运行
make all
,而不是只运行
make

Neil Butterworth解决了这个问题,但您也可以使这个make文件更简洁一些:

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 $@;

$(LIB_C): $(LIB_A) $(LIB_B)

巴特沃斯:真的。这完全解决了问题。我不知道目标的顺序有什么影响。@turbo一般来说,顺序并不重要,只是默认值是第一个。您还可以使用我忘记的一些语法指定默认值:-),您当然可以说
make all
,并且您的原始make文件应该可以工作。如果将来有人阅读此文件,您要查找的语法是
。default\u GOAL:=all
(或者您的目标是什么)。在本例中,如何定义clean来清除所有模块?@nilo:我将命令更改为
@$(MAKE)-C$@$(TARG)
,然后添加
clean
规则:
clean:TARG=cleanclean:all