【问题标题】:Recursive make in subdirectories子目录中的递归生成
【发布时间】:2012-03-04 05:16:09
【问题描述】:

如何在 Makefile 中命令 make 命令在所有子目录中递归执行 make 命令(在子目录中的 Makefile 中定义)?

【问题讨论】:

    标签: recursion directory makefile subdirectory


    【解决方案1】:
    1. 阅读Recursive Use of Make GNU Make 手册章节。
    2. 了解 Peter Miller 的 Recursive Make Considered Harmful 文章。
    3. ...
    4. 利润!!!

    附:从my answer 到一个不同但相关的问题的代码 sn-p 可以用作粗略的近似值。

    【讨论】:

    • @Mali 值得一读,当然!很久以前我也对这个主题进行了一些实验,仅供参考:abusalimov.blogspot.ru/2009/12/…
    • @wil93 感谢您提出的编辑建议!我添加了指向另一个答案的链接,该链接建议了与您类似的解决方案。
    • 米勒的文章认真提出了解决“我有一个项目之间共享一个模块”的问题来“将项目合二为一”?这显然是荒谬的。仅仅因为我想在我的存储库中包含一些第三方代码的快照作为子模块并不意味着我想与他们协调开发。
    • 此答案中的方法完全无法用于管理多个依赖项。如果我有一个应用程序依赖于 3 个具有复杂 makefile 的库,我应该如何将它们组合成一个?这是不可能维持的。
    • @Quimby 我猜你是对的,这确实更多是关于构建组织到多个目录中的单个项目,而不是构建依赖项目。
    【解决方案2】:

    @eldar-abusalimov,您发布的第一个链接假定 makefile 知道子文件夹是什么。这并不总是正确的,我想这就是@tyranitar 想知道的。在这种情况下,这样的解决方案可以完成这项工作: (花了我一些时间,但我也需要它)

    SHELL=/bin/bash
    
    all:
        @for a in $$(ls); do \
            if [ -d $$a ]; then \
                echo "processing folder $$a"; \
                $(MAKE) -C $$a; \
            fi; \
        done;
        @echo "Done!"
    

    【讨论】:

    • 可以在纯Make中实现:SUBDIRS := $(wildcard */.)。然后遍历SUBDIRS 并调用子制作。
    • @Eldar Abusalimov:听起来不错。我很感兴趣,您能否详细说明一下并发布示例 make sn-p ? (“迭代”是什么意思?)
    • 我的意思是使用我在另一个答案中提出的解决方案:stackoverflow.com/a/11206700/545027
    【解决方案3】:

    我将在这里提交我的特定解决方案。 假设我们有一个包含许多子目录的目录,它们都有自己的 makefile:

    root-dir\
        +----subdir1
        +----subdir2
        ...
        +----subdirn
    

    然后,只需将这个 Makefile 复制到根目录中:

    SUBDIRS = $(shell ls -d */)
    all:
        for dir in $(SUBDIRS) ; do \
            make -C  $$dir ; \
        done
    

    【讨论】:

      【解决方案4】:

      当所有子目录都有 Makefile 时,上述答案效果很好。只在包含 Makefile 的目录上运行 make 并不难,限制递归的级别数也不难。在我的示例代码中,我将 makefile 的搜索限制在父目录正下方的子目录中。 filter-out 语句(第 2 行)阻止此 Makefile 包含在递归 make 中。

      MAKEFILES = $(shell find . -maxdepth 2 -type f -name Makefile)
      SUBDIRS   = $(filter-out ./,$(dir $(MAKEFILES)))
      
      all:
          for dir in $(SUBDIRS); do \
              make -C $$dir all; \
          done
      

      【讨论】:

      • 您可以使用 find 命令的-mindepth 选项过滤掉根 Makefile。
      • 如果您使用MAKEFILES 作为变量,make 将解析所有这些文件并抱怨它们是否有重复的目标。如果这不是您想要的,您应该使用不同的变量名。
      • @NedBatchelder ++ 你的评论很中肯,谢谢。否则可以得到这个Makefile:24: warning: overriding recipe for target
      猜你喜欢
      • 2018-11-06
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2011-06-19
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多