如何编写简单的分层Makefile?

时间:2012-07-09 07:54:57

标签: bash build makefile

前几天我在堆栈溢出中发布了关于如何编写分层make(http://stackoverflow.com/questions/1498213/make-hierarchical-make-file)的答案。答案被删除了,因此我认为这是完全错误的或偏离主题(或两者兼而有之)。

我想知道如何编写分层Makefile。这是一个Makefile,可以在子目录中调用多个Makefile。我假设一个目录结构,如:

- project
  |--module1
      |--Makefile
      |--...
  |--module2
     |--Makefile
     |--module2.1
     |--module2.2  
     |--...
  |--module3
     |--Makefile
     |--...
  |--etc

我还假设项目成员只同意了一组最小的makefile目标,例如:all(默认),clean,install等等。因此,包括make标志在内的以下命令将传播到模块:

cd project
make clean  
make -k
make install
#etc

以下项目Makefile有什么问题:

PACKAGES = \
    module1 \
    module2 \
    emodule3

VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES})

TARGETS=clean install all

.PHONY: $(TARGETS)
default: all

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))

$(TARGETS): $(VIRTUAL_PACKAGES)

$(VIRTUAL_PACKAGES): 
    $(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS)

是的,Makefile中的$ VIRTUAL_PACKAGES看起来很奇怪。混合for循环的替代方案有点短,但我不确定它是否更好(因为我需要依赖bash):     套餐=         module1 \         module2 \         emodule3

TARGETS=clean install all

.PHONY: $(TARGETS)
default: all

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p $@ || break; done

谢谢!

1 个答案:

答案 0 :(得分:8)

这里有“龙”。它可以做到,但其含义可能很棘手。

Google,“Recursive Make Considered Harmful”。您将获得非常好(简单)的插图,说明您想要的内容(例如,层次结构 - 制作),以及对陷阱/问题的良好解释。一些“回应”将讨论可能的“最佳实践”以及缓解问题的方法。然后,您可以决定所提出的问题是否对您的申请有吸引力。

原始论文:

http://miller.emu.id.au/pmiller/books/rmch/

其他一些链接:

http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful

http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html