如何避免代码重复调用递归Makefile?

时间:2014-11-14 11:07:55

标签: makefile gnu-make

是否可以简化以下表单的Makefile以避免代码重复:

dir1/foo:
    make -C dir1 foo

dir1/bar:
    make -C dir1 bar

dir2/baz:
    make -C dir2 baz

...

clean: 
    make -C dir1 clean
    make -C dir2 clean
    ...

我想我只能指定:

MY_TARGETS=dir1/foo dir1/bar dir2/baz ...

并且有一些一般规则来派生目标,如上面的Makefile中所示。

1 个答案:

答案 0 :(得分:2)

您没有向我们提供太多信息。如果你的主makefile和你的例子一样简单(我怀疑),Recursive Make可以是一个很好的解决方案。

你可以这样做:

%:
    $(MAKE) -C $(dir $@) $(notdir $@)

clean:
    $(MAKE) -C dir1 clean
    $(MAKE) -C dir2 clean
    ...

如果clean配方太长,您可以简化它:

DIRS := dir1 dir2 ...

clean:
    @for x in $(DIRS); do $(MAKE) -C $$x clean; done

或者如果你不喜欢那里有DIRS列表,你可以让Make生成它,具体取决于你是否要在所有子目录中make clean,或者所有符合dir*模式的,或者......你没有给我们足够的信息。