C++ 构建系统 - 使用什么?

我正在考虑用 C++ 开始一个新项目 - 最初只是在我自己的时间里 - 我正在研究可用的构建系统。答案似乎是“很多,而且都很糟糕”。

为此我特别需要的功能是:

  1. C++11 支持
  2. 跨平台(Linux 作为主要目标,但至少也可以在 Windows 上构建)
  3. 体面的单元测试支持
  4. 支持多个模块分离代码
  5. 支持代码生成(使用 asn1c 或 protobuf - 尚未 100% 确定)
  6. 易于维护

现在,我知道我可以轻松完成其中 1-4 次使用 CMake 和 Autotools 的任务。可能还有 SCons 和 Waf 以及其他几个。问题是我从来没有弄清楚如何使用它们正确地进行代码生成——即在构建过程首次运行之前不存在的源文件,因此构建系统必须能够转换为可执行代码的源文件但实际上直到构建开始才知道......(特别是 ASN1C 会生成数十个必须能够一起工作的头文件和源文件,而实际生成的文件集取决于您的 asn 文件的内容)还有一个事实是,这些都不是特别容易维护的——CMake 和 Autotools 有它们自己的大量脚本,你需要管理它们才能使它们工作,而 Waf 和 Scons 要求任何使用它们的人都对 python 有相当的了解(我不要)与他们合作......

那么 - 推荐什么样的构建系统用于这样的事情?还是我现在会被 make 文件和 shell 脚本困住?

最佳答案

+1 表示“很多,而且很糟糕。”

但是,“最富有”和“最可扩展”的可能是 CMake ,它是一个 Makefile 生成器(也生成 native MSVC++ *.proj/*.sln)。奇怪的语法,但是一旦你学会了它,它就可以让你很好地为不同的平台生成构建。如果我“重新开始”,我可能会使用 CMake。它应该处理您的列表,尽管您的“代码生成”可能会在构建系统之外承担“自己的生命”,具体取决于您想要做什么。 (见下文。)

对于简单的项目,QMake生成器没问题(你不需要使用 Qt 库来使用 QMake)。但是,你不是在描述“简单”——代码生成和“额外阶段”意味着你可能想要 CMake 或者为你自己的扩展提供丰富 API 的东西,比如 Scons(或 Waf)。

我们使用 Scons在工作。它产生“防弹构建”,但它真的很慢。没有其他系统能像 Scons 一样防弹。但是,它很慢。它是用 Python 编写的,我们扩展了“工作空间组织”的接口(interface)(我们只指定模块依赖项),这是 Scons 设计意图的一部分(这种类型的扩展通过Python)。方便,但构建速度很慢。您获得了防弹构建(任何开发人员框都可以制作最终版本),但速度很慢。而且,速度很慢。但是不要忘记,如果你使用 Scons,它会很慢。而且,速度很慢。

想到 2000 年后的十年,我们仍然没有飞行汽车,这让我感到恶心。我们可能还得再等一百年才能得到它们。而且,我们可能都将乘坐我们的飞行汽车飞来飞去,而这些汽车仍在用蹩脚的构建系统构建。

是的,它们都很糟糕。

[关于代码生成]

Scons 适用于“阶段”,它们是“有点静态的”。它可以构建作为构建的一部分生成的代码(人们以几种不同的方式执行此操作),但这被描述为“非常不像 Scons”。

如果它是简单的“预处理一些文件并生成源文件”,那么没什么大不了的(你有很多选择,这就是 qmake 被编写的原因——为 moc *.hpp/*.cpp 文件的预处理)。

但是,如果您以“繁重的方式”执行此操作,则需要编写自己的脚本。例如,我们将查询数据库并生成 C++ 类作为“层”之间的接口(interface)(在传统的 3 层应用程序开发中)作为构建脚本的一部分。同样,我们通过 IDL 生成服务器/客户端源代码,并嵌入版本信息以允许多个客户端/服务器以不同版本同时运行(对于相同的“客户端”或“服务器”)。大量生成的源代码。我们可以“假装”那是“构建系统”,但实际上,它是“配置管理”的重要基础设施,其中一部分是“构建系统”。例如,该系统必须将“关闭”和“启动”服务器作为此过程的一部分。同样,回归测试是作为这个过程的一部分执行的,在版本之间有大量的“报告”和“差异测试”——所有这些都是我们“构建脚本”的一部分。

https://stackoverflow.com/questions/12017580/

相关文章:

java - Java 项目的构建和版本编号(ant、cvs、hudson)

java - 使用 gradle 的多项目测试依赖项

configuration - 在 Xcode 中添加构建配置

Xcode - 但是......我们的文件在哪里?

java - 如何在 Maven 中读取外部属性文件

java - 构建与编译 (Java)

visual-studio - 发生代码更改时,Visual Studio 2010 不会在运行前构

iphone - 重新签署 IPA (iPhone)

javascript - `npm build` 没有在 package.json 中构建 't r

security - Docker 和保护密码