【发布时间】:2015-08-11 18:34:55
【问题描述】:
我想知道在带有子目录的项目中使用 Make 有哪些不同的方法,它们的优点/缺点是什么,但从来没有看到好的总结或食谱。
我在研究中主要看到了“递归”和“单个 makefile”方法,但还有其他方法吗?
我还假设不仅有一种“递归”或“单个 makefile”方法,而且有几种,所以有人可以总结一下吗?
对于我的特殊情况,我想要一个如下所示的目录架构:
.
├── build
│ ├── *.d
│ ├── *.o
| ├── subdir1
| │ ├── *.d
| │ └── *.o
| └── subdir2
| ├── *.d
| ├── *.o
| └── subdir3
| ├── *.d
| └── *.o
├── include
│ ├── *.h
│ └── *.h
├── Makefile
└── src
├── *.c
├── *.h
├── subdir1
│ ├── *.c
│ └── *.h
└── subdir2
├── *.c
├── *.h
└── subdir3
├── *.c
└── *.h
我应该选择哪种解决方案?可能是允许同名的源文件?
【问题讨论】:
-
反对递归 make 的基本论点在 Recursive Make Considered Harmful(pdf) 论文中列出。 This page 与 Painless non-recursive Make 文章一样讨论了实现非递归 make 系统。我相信Multi-Architecture Builds 文章也有一些相关的事情要说。
-
递归和单makefile几乎涵盖了它,但当然你可以混合使用它们——让主makefile调用
src/Makefile,然后它自己处理整个src/树。跨度> -
两种方式都有争论。使用非递归 make 的启动时间可能会很昂贵(当我第一次构建 glibc 时,需要将近一个小时才能启动)。提倡非递归的论文使这个问题不予考虑或完全忘记提及它。鉴于此,这个问题是题外话。