+1 表示“很多,而且很糟糕。”
但是,“最丰富”和“最可扩展”的可能是CMake,它是一个 Makefile 生成器(也生成本机 MSVC++ *.proj
/ *.sln
)。奇怪的语法,但是一旦你学会了它,它就可以让你很好地为不同的平台生成构建。如果我“重新开始”,我可能会使用CMake
. 它应该处理您的列表,尽管您的“代码生成”可能会在构建系统之外承担“自己的生命”,具体取决于您想要做什么。(见下文。)
对于简单的项目,QMake生成器是可以的(你不需要使用 Qt 库来使用 QMake)。但是,您不是在描述“简单”——代码生成和“额外阶段”意味着您可能想要CMake
或具有丰富 API 的东西用于您自己的扩展,例如Scons
(或Waf
)。
我们在工作中使用Scons。它产生“防弹构建”,但它真的很慢。没有其他系统能像Scons
. 但是,它很慢。它是用 Python 编写的,我们扩展了“工作空间组织”的接口(我们只指定模块依赖项),这是Scons
设计意图的一部分(这种通过 Python 进行的扩展)。方便,但构建速度很慢。您获得了防弹构建(任何开发人员框都可以制作最终版本),但速度很慢。而且,速度很慢。但是,不要忘记,如果您使用Scons
,它会很慢。而且,速度很慢。
想到 2000 年后的十年,我们仍然没有飞行汽车,这让我感到恶心。我们可能还得再等一百年才能得到它们。而且,我们都可能会乘坐仍在使用蹩脚构建系统建造的飞行汽车。
是的,他们都很糟糕。
[关于代码生成]
Scons
适用于“阶段”,它们是“有点静态的”。它可以构建作为构建的一部分生成的代码(人们正在以几种不同的方式执行此操作),但这被描述为“非常不像 Scons 的东西”。
如果它是简单的“预处理一些文件并生成源文件”,那么没什么大不了的(你有很多选择,这就是为什么qmake
要写 - 用于文件的moc
预处理*.hpp/*.cpp
)。
但是,如果您以“繁重的方式”执行此操作,则需要编写自己的脚本。例如,我们将查询数据库并生成 C++ 类作为“层”之间的接口(在传统的 3 层应用程序开发中)作为构建脚本的一部分。同样,我们通过 IDL 生成服务器/客户端源代码,并嵌入版本信息以允许多个客户端/服务器以不同版本同时运行(对于相同的“客户端”或“服务器”)。大量生成的源代码。我们可以“假装”那是“构建系统”,但实际上,它是“配置管理”的重要基础设施,其中一部分是“构建系统”。例如,这个系统不得不“删除”和“