使用特定于平台的项目文件或使用项目生成器构建自动化?

时间:2009-12-24 07:32:29

标签: c++ build-automation cmake scons waf

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

其中一个是CMake,但我发现对此的支持非常有限,错误,并且很难用新版本(如VS 2010)更新它。

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

上述问题的解决方法是为每个平台手动创建项目文件 - 在我的情况下只有两个,但即使有更多,这个数字也不应该那么大。

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

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

3 个答案:

答案 0 :(得分: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侦听器:

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

答案 1 :(得分:0)

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

当你了解python时,学习Scons很简单,不知道python,你就是两种伟大的技术而不是一种技术;)

答案 2 :(得分:0)

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

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