我举了一个小例子来说明我的问题:
我有几个项目和一个主要的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 $@)
但我确定这不是最佳解决方案!
有什么建议吗?
答案 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只有在其依赖关系已经更新时才会被解析。
这对我有用。