使用特定于平台的项目文件还是使用项目生成器来实现构建自动化?

4
有一些构建系统可以生成特定平台的项目文件,例如Visual Studio的sln、vcproj、vcxproj文件或者OS X下的XCode xcodeproj项目文件。
其中之一是CMake,但我发现它对此的支持非常有限、存在bug,并且很难跟上更新版本(如VS 2010)。
此外,至少CMake缺少对Visual Studio的属性页的支持,这使得管理和更改整个项目的配置变得更加困难——例如启用/禁用所有项目的代码分析。
解决上述问题的方法是手动为每个平台创建项目文件——在我的情况下,只有两个,但即使有更多,数量也不应该太大。
将特定于平台的构建命令调用到通用构建自动化脚本中非常容易。例如,我使用了waf(Python)来自动化几个项目的构建,而没有使用其自己的构建部分。
我想知道您会选择什么:尝试修复/维护项目生成器还是保持分开的项目文件?

1
我也曾经想过同样的问题,一些公司将VS项目与跨平台构建系统(如CMake或waf)分开维护并不奇怪。我想到的一个解决方案是创建一个waf扩展项目,但这可能并不实际,因为大多数遇到这个问题的人通常都忙于实际项目。这可能就是为什么没有其他人尝试过它的原因(至少我不知道)。我想这将成为一个非常成功的waf扩展项目。 - Nick Bolton
3个回答

3
以下是我们的做法,可能不是最好的方式,但对我们来说效果非常好,我们发现它很容易维护,也许你会觉得有趣。
我们的主要平台是Windows,几乎所有的开发都在VS IDE中完成。对于其他平台(目前只有一些Linux版本),我们专门使用CMake。基本上,我们选择了“尝试修复/维护项目生成器”的方式,但以Visual Studio项目文件作为起点。
- 我们将Visual Studio项目文件用作项目中所有文件的容器。 - 所有构建选项都在属性表中设置,每个项目都有一个标准集和一些额外的表格,以引入某些库等。 - 我们有一些简单的脚本,可以批量添加/删除属性表。 - 所有属性表都有一个CMake对应物;两者保存在同一个目录中,如果我们更新一个,我们也会始终更新对应的物品。这不是用脚本完成的,我承认这是“复杂”的部分:虽然我们非常依赖宏,但总会有一些选项在一个平台上可用而在另一个平台上不可用。 - 我们有一个脚本,将vcproj文件转换为cmake文件,它基本上创建一个包含相应cmake属性表并包含vcproj具有的所有源文件的cmake文件。 - 最后,我编写了一个构建服务器,在我们使用的所有平台上运行。它使用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侦听器:

  • 等待连接
  • 获取可选参数(属性表/操作)
  • 更新存储库
  • 使用给定的参数运行属性表的批处理脚本
  • 启动命令行进行完整的重建+测试,将输出捕获到文件中
  • 解析包含“错误”的行的文件,邮件结果

如果您能分享一些脚本,那就太好了。我认为这可能是我Synergy+项目的有效解决方案。 - sorin
既然公司政策禁止他发布脚本,也许开展一个新的自由开源软件项目是个好主意…… - Nick Bolton

0

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

当您了解Python时,学习Scons非常简单。如果不知道Python,则是发现两种伟大技术而不是一种技术;)


0
我们在平台项目中使用boost.build。它适用于C++库项目。我们喜欢它,因为我们只需要维护一个脚本,并且它与Boost.Test很好地集成。
它确实有一个非常陡峭的学习曲线,文档也相当差。但是它能够在Windows和Linux上很好地工作,这是我们工作的两个平台。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接