将submake的依赖关系链接到其父级

时间:2014-04-09 19:35:59

标签: get makefile dependencies call

我举了一个小例子来说明我的问题:

我有几个项目和一个主要的Makefile来统治它们。

/+
 |+ Makefile
 |+ Project A
 |  + Makefile
 |+ Project B
 |  + Makefile 
 |...

Makefile看起来像这样:

DUMMY := $(shell $(MAKE) -C a deps) $(shell $(MAKE) -C b deps)

.PHONY: all clean

all: out.zip
    @echo Operation Done!

a/a.zip: $(addprefix a/,$(shell cat a/deps))
    $(MAKE) -C a $(notdir $@)

b/b.zip: $(addprefix b/,$(shell cat b/deps))
    $(MAKE) -C b $(notdir $@)

out.zip: a/a.zip b/b.zip
    zip $@ $^ 

clean: 
    $(MAKE) -C a clean
    $(MAKE) -C b clean

这里有一个子makefile(在每个子项目中):

C   = $(notdir $(shell pwd))
SRC = $(addsuffix .c, $(addprefix $(C), 1 2 3 4))
OBJ = $(patsubst %.c, %.o, $(SRC))

all: $(C).zip 

$(SRC): %.c : 
    touch $@

$(OBJ): %.o : %.c  
    cp $< $@

$(C).zip: $(OBJ)
    zip $@ $^

clean: 
    -rm -f *.o *.zip deps
    $(MAKE) $(SRC)
deps: 
    @echo $(SRC) > $@

.PHONY: all clean deps

我的问题很简单:如何避免调用子makefile以获得所有依赖项。实际上,当我修改子项目中的一个源文件时,主Makefile无法知道是否需要重建目标。

我还发现我可以使用选项$(MAKE) -C<dir> -n -s调用make,它允许我编写这样的规则:

a/a.zip: $(if $(shell make -C a -n -s), $(shell rm a/a.zip),)
    $(MAKE) -C a $(notdir $@)

b/b.zip: $(if $(shell make -C b -n -s), $(shell rm b/b.zip),)
    $(MAKE) -C b $(notdir $@) 

但我确定这不是最佳解决方案!

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以在主要Makefile加载的另一个文件(配置文件)中共享子项目源 $(SRCPRJ1) $(SRCPRJ2)太。或者只是在校长中重做它们。

之后,将它们作为主要Makefile中目标的先决条件:

a/a.zip: $(SRCPRJ1)
    $(MAKE) -C a $(notdir $@)

b/b.zip: $(SRCPRJ2)
    $(MAKE) -C b $(notdir $@)

因此,配方a / a.zip和b / b.zip只有在其依赖关系已经更新时才会被解析。

这对我有用。