这是我们所做的,它可能不是最好的方式,但它对我们非常有用,我们发现维护并不难,也许您觉得它很有趣。
我们的主要平台是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监听器:
- 等待连接
- 得到可选参数(属性表/动作)
- 版本库更新
- 最终运行的批处理脚本与给定参数的属性表
- 启动命令行完全重建+测试,捕获输出文件
- 解析文件包含“错误”行,邮件导致
我也想知道同样的事情,一些公司将VS项目与跨平台构建系统(如CMake或waf)分开维护并不奇怪。我想到的一个解决方案是做一个WAF扩展项目,但这可能不太实际,因为遇到这个问题的大多数人通常忙于实际的项目。这可能就是为什么没人尝试过(我知道的)。我想这会成为一个非常成功的waf扩展项目。 – 2009-12-24 10:58:34