Closed. 此问题正在寻求书籍、工具、软件库等的推荐。不满足堆栈溢出指南 /help/closed-questions 。目前不接受答案。
我正在考虑用 C++ 启动一个新项目 - 最初是在我自己的时间 - 并且我正在研究可用的构建系统。答案似乎是“很多,而且都很糟糕”。
我为此特别需要的功能是:
C++11 支持
跨平台(Linux 作为主要目标,但至少也可以在 Windows 上构建)
体面的单元测试支持
支持多个模块以分离代码
支持代码生成(使用 asn1c 或 protobuf - 尚未 100% 确定)
易于维护
现在,我知道我可以使用 CMake 和 Autotools 轻松完成其中的 1-4 项工作。可能还有 SCons 和 Waf 以及其他几个。问题是我从来没有弄清楚如何使用它们正确地进行代码生成 - 也就是说,在第一次运行构建过程之前,源文件并不存在,因此构建系统必须能够将源文件转换为可执行代码但实际上直到构建开始才知道...(ASN1C 特别生成了数十个必须能够协同工作的头文件和源文件,并且实际生成的文件集取决于 asn 文件的内容)事实上,这些都不是特别容易维护 - CMake 和 Autotools 有自己的大量脚本,您需要管理这些脚本才能工作,而 Waf 和 Scons 要求任何使用它们的人都具有相当的 Python 知识(我不要)与他们一起工作......
那么 - 对于这样的事情推荐什么构建系统呢?或者我现在会被 make 文件和 shell 脚本困住吗?
+1表示“很多,而且很糟糕。”
但是,“最富有”和“最具规模化”的可能是CMake http://www.cmake.org/ ,这是一个 Makefile 生成器(还生成本机 MSVC++*.proj
/*.sln
)。奇怪的语法,但是一旦你学会了它,它可以让你很好地为不同平台生成构建。如果我“重新开始”,我可能会使用CMake
。它应该处理您的列表,尽管您的“代码生成”可能会在构建系统之外呈现出“自己的生命”,具体取决于您想要做什么。 (见下文。)
对于简单的项目,QMake http://en.wikipedia.org/wiki/Qmake 生成器就可以了(您不需要使用 Qt 库来使用 QMake)。但是,您没有描述“简单”——代码生成和“额外阶段”意味着您可能想要CMake
或者为您自己的扩展提供丰富的 API,例如Scons
(or Waf
).
We use Scons http://www.scons.org/ 在上班。它产生“防弹构建”,但速度非常慢。没有其他系统能像它一样防弹Scons
。但是,它很慢。它是用 Python 编写的,我们扩展了“工作空间组织”的接口(我们仅指定模块依赖项),这是Scons
设计意图(通过 Python 进行的此类扩展)。方便,但构建速度很慢。您可以获得防弹构建(任何开发人员盒子都可以发布最终版本),但速度很慢。而且,它很慢。不要忘记,如果您使用Scons
不过,它很慢。而且,它很慢。
一想到 2000 年过去了十年,我们仍然没有飞行汽车,我就感到不舒服。我们可能还得再等一百年才能得到它们。而且,我们可能都会乘坐我们的飞行汽车四处飞行still 是用蹩脚的构建系统构建的。
是的,他们都很糟糕。
[关于代码生成]
Scons
作用于“阶段”,并且它们是“有些静态的”。它可以构建作为构建的一部分生成的代码(人们以几种不同的方式执行此操作),但这已被描述为“非常不像 Scons 的东西”。
如果它很简单“预处理一些文件并生成源文件”,那么没什么大不了的(你有很多选择,这就是为什么qmake
是为moc
的预处理*.hpp/*.cpp
files).
但是,如果您以“繁重的方式”执行此操作,则需要编写自己的脚本。例如,我们有作为构建脚本的一部分,用于查询数据库并生成 C++ 类以在“层”之间进行交互(在传统的 3 层应用程序开发中)。同样,我们通过 IDL 生成服务器/客户端源代码,并嵌入版本信息,以允许多个客户端/服务器以不同版本同时运行(对于相同的“客户端”或“服务器”)。很多生成的源代码。我们可以“假装”这是“构建系统”,但实际上,它是一个不平凡的“配置管理”基础设施,其中一部分是“构建系统”。例如,该系统必须“关闭”和“启动”服务器作为此过程的一部分。同样,回归测试是作为此过程的一部分执行的,版本之间有大量的“报告”和“差异测试”——所有这些都是我们“构建脚本”的一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)