【问题标题】:How to write a simple hierarchical Makefile?如何编写一个简单的分层 Makefile?
【发布时间】:2012-07-08 14:43:20
【问题描述】:

几天前,我在堆栈溢出中发布了一个关于如何编写分层 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): 包 = \ 模块1\ 模块2\ 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

谢谢!

【问题讨论】:

  • FLAGS 的分配有效吗?您使用的是哪个版本的 Make?
  • 非递归解决方案:stackoverflow.com/a/7321954/412080
  • 可能对你有用也可能没用,但对于管理复杂的项目,我发现 cmake 更容易。拥有 CMakeLists.txt 的层次结构真的很容易。 Makefile 会自动生成。
  • @Beta: 1) 是的,FLAGS 分配有效...为什么? 2) Makefile 版本为 3.81。

标签: bash build makefile


【解决方案1】:

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

Google,“递归使认为有害”。您将获得非常好的(简单)插图,准确地说明您想要什么(例如,分层制作),以及对陷阱/担忧的良好解释。一些“回应”将讨论可能的“最佳实践”,以及缓解问题的方法。然后,您可以决定提出的问题是否对您的应用程序具有吸引力。

原论文:

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

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多