2009-12-24 65 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上運行良好,這是我們工作的兩個平臺。

相關問題