2009-12-24 39 views
4

有一些能够产生特定于平台的项目文件如Visual Studio slnvcprojvcxproj文件或OS X下XCodexcodeproj项目通过使用平台特定的项目文件或使用项目生成器来构建自动化?

其中之一是CMake的一些构建系统,但我发现的支持这是相当有限的,越野车,这是很难保持更新版本(如VS 2010)。

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

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

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

我想看看你会选择什么:试图修复/维护项目生成器或保持分离的项目文件?

+1

我也想知道同样的事情,一些公司将VS项目与跨平台构建系统(如CMake或waf)分开维护并不奇怪。我想到的一个解决方案是做一个WAF扩展项目,但这可能不太实际,因为遇到这个问题的大多数人通常忙于实际的项目。这可能就是为什么没人尝试过(我知道的)。我想这会成为一个非常成功的waf扩展项目。 – 2009-12-24 10:58:34

回答

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文件,这是几乎相同的,除了剧本的作品在“包括(..)”行。

Convertig从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监听器:

  • 等待连接
  • 得到可选参数(属性表/动作)
  • 版本库更新
  • 最终运行的批处理脚本与给定参数的属性表
  • 启动命令行完全重建+测试,捕获输出文件
  • 解析文件包含“错误”行,邮件导致
+0

如果你可以分享一些脚本,这可能是非常好的。我认为这可以成为我的Synergy +项目的有效解决方案。 – sorin 2009-12-24 09:18:58

+0

由于违反公司政策要求发布脚本,因此开始一个新的FOSS项目可能是一个好主意...... – 2009-12-24 10:59:54

0

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

学习使用SCons是死的简单,当你知道蟒蛇,不知道蟒蛇,你disconvering两个伟大的技术,而不是一个;)

0

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

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

相关问题