這是我們所做的,它可能不是最好的方式,但它對我們非常有用,我們發現維護並不難,也許您覺得它很有趣。
我們的主要平臺是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