我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。
关闭 6 年前。
我正在考虑用 C++ 开始一个新项目 - 最初只是在我自己的时间里 - 我正在研究可用的构建系统。答案似乎是“很多,而且都很糟糕”。
为此我特别需要的功能是:
现在,我知道我可以轻松完成其中 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/