4

有一些构建系统能够在 OS X 下生成特定于平台的项目文件,如 Visual Studio、、sln文件或项目。vcprojvcxprojXCode xcodeproj

其中之一是 CMake,但我发现对此的支持非常有限,有缺陷,而且很难保持更新版本(如 VS 2010)。

此外,至少 CMake 缺少对 Visual Studio 属性页的支持,这使得管理和更改项目范围的配置变得更加困难 - 例如为所有项目启用/禁用代码分析。

上述问题的一种解决方法是为每个平台手动创建项目文件——在我的例子中只有两个,但即使有更多,数量也不应该那么大。

将特定于平台的构建命令调用到通用构建自动化脚本中非常容易。例如,我使用waf(Python) 在几个项目中自动执行此操作,而无需使用其自己的构建部分。

我想看看您会选择什么:尝试修复/维护项目生成器或保留单独的项目文件?

4

3 回答 3

3

这就是我们所做的,它可能不是最好的方式,但它对我们非常有用,我们发现它并不难维护,也许你会觉得它很有趣。

我们的主要平台是windows,几乎所有的开发都是在VS IDE中完成的。对于其他平台(目前只有一些 linux 版本),我们只使用 CMake。基本上我们选择了“尝试修复/维护项目生成器”的方式,但以 Visual Studio 项目文件为起点。

  • 我们使用 Visual Studio 项目文件作为项目中所有文件的容器
  • 所有构建选项都在属性表中设置,每个项目都有一个标准集,最终还有一些额外的表来拉入某些库等
  • 我们有一些简单的脚本允许批量添加/删除属性表
  • 所有属性表都有一个 cmake 对应项;两者都保存在同一个目录中,如果我们更新一个,我们也会更新对应的,总是。这不是通过脚本完成的,我承认这是“复杂”的部分:虽然我们非常依赖宏,但总是有一些选项在一个平台上可用,而在另一个平台上却没有。
  • 我们有一个将 vcproj 文件转换为 cmake 文件的脚本,它基本上创建了一个 cmake 文件,其中包括相应的 cmake 属性表并包含 vcproj 拥有的所有源文件。
  • 最后但同样重要的是,我编写了一个在我们使用的所有平台上运行的构建服务器。它使用 msbuild 或 cmake 进行构建,它是保持该系统正常工作的关键:我们所做的每次更改都会触发至少两台机器上的构建+测试,因此我们可以立即知道一切是否还好。

我们最近开始使用 VS2010,迁移只用了大约一天时间:首先我们让 VS 转换我们所有的项目和属性表,然后我们对脚本进行了一些调整以处理新的 xml 文件格式。

编辑

抱歉,我无法发布脚本、公司政策,希望您能理解。一点伪代码虽然没有问题。在 VS2008 项目文件中添加/删除属性表如下:

foreach proj in projectfiles //list of vcproj files
  foreach config in configuration //configurations eg 'Debug|Win32, Debug|x64'
    f = OpenFile( proj );
      //find start of Configuration element, then get what's after InheritedPropertySheets=
    propsheets = GetPropSheetsForConfig( f, config );
    propsheets = DoAction( action, args, propsheets ); //action is add/remove/.. with argument args
    SetPropSheetsForConfig( f, propsheets );

对于 CMakeLists 文件,这几乎是相同的,除了脚本在 'include(..)' 行上工作。

从 vcproj 转换为 CMakeLists:

f = OpenFile( proj );
projname = GetProjectName( f );
sources = GetSourceFiles( f ); //all File/RelativePath elements under Filter 'Source Files'
sources = CheckFilter( sources ); //apply rules to include/exclude platform specific files
propsheets[] = GetPropSheetsForConfig( f, configs[] );

fout = CreateCMakeFromProj( proj ); //CMakeLists.txt in corresponding directory
WriteCMakeHeader( fout, projname );
WriteCMakeSources( sources );
WriteCMakeIncludes( configs[], propsheets[] ); //write includes, conditional on CMAKE_BUILD_TYPE

构建服务器现在是相当高级的材料,但一开始它只是一个 TCP 监听器:

  • 等待连接
  • 获取可选参数(属性表/动作)
  • 存储库的更新
  • 最终使用给定的参数运行属性表的批处理脚本
  • 启动命令行完全重建+测试,在文件中捕获输出
  • 解析文件中包含“错误”的行,邮件结果
于 2009-12-24T09:11:02.373 回答
0

我所有的项目都是跨平台的,我的偏好是解决方法。使用 Scons 维护跨平台项目几乎没有工作。一个良好定义的环境适用于大多数项目,并为每个项目/子项目使用一个模板。您还可以完全控制构建过程,让您可以轻松地使用特定领域的语言、进行代码生成、管理源代码控制。

当您了解 python 时,学习 Scons 非常简单,不了解 python,您正在发现两种伟大的技术,而不是一种;)

于 2010-01-11T09:47:30.677 回答
0

我们将boost.build用于我们的平台项目。它适用于 C++ 库项目。我们喜欢它,因为我们只需要维护一个脚本,并且它与 Boost.Test 很好地集成。

它确实有一个非常陡峭的学习曲线,而且文档也很差。但它在我们工作的两个平台 Windows 和 Linux 上运行良好。

于 2010-01-11T16:15:46.633 回答