最善の方法ではないかもしれませんが、これは私たちにとって非常にうまく機能し、維持するのはそれほど難しくないことがわかりました。
私たちの主なプラットフォームは Windows で、ほぼすべての開発は VS IDE で行われます。他のプラットフォーム (現時点では一部の Linux フレーバーのみ) では、CMake のみを使用します。基本的に、「プロジェクト ジェネレーターを修復/維持しようとする」方法を選択しましたが、Visual Studio プロジェクト ファイルを出発点として使用しました。
- プロジェクト内のすべてのファイルのコンテナーとして Visual Studio プロジェクト ファイルを使用します。
- すべてのビルド オプションはプロパティ シートで設定され、各プロジェクトには標準セットがあり、最終的には特定のライブラリを取り込むためのいくつかの追加シートがあります。
- 1 回のバッチでプロパティ シートを追加/削除できる簡単なスクリプトがいくつかあります。
- すべてのプロパティ シートには、対応する cmake があります。両方とも同じディレクトリに保持され、一方を更新すると、常に他方も更新されます。これはスクリプトでは行われません。これが「複雑な」部分であることは認めます。私たちはマクロに重点を置いていますが、あるプラットフォームでは利用できるオプションがあり、他のプラットフォームでは利用できないオプションが常にあります。
- vcproj ファイルを cmake ファイルに変換するスクリプトがあります。基本的には、対応する cmake プロパティ シートを含み、vcproj が持つすべてのソース ファイルを含む cmake ファイルを作成します。
- 最後になりましたが、私たちが使用するすべてのプラットフォームで実行されるビルド サーバーを作成しました。msbuild または cmake を使用してビルドします。これは、このシステムを機能させ続けるための鍵です。変更を加えるたびに、少なくとも 2 台のマシンでビルドとテストがトリガーされるため、問題がないかどうかがすぐにわかります。
私たちは最近 VS2010 を使い始めましたが、移行には約 1 日しかかかりませんでした。最初に 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 リスナーでした。
- 接続を待つ
- オプションの引数を取得 (プロパティ シート/アクション)
- リポジトリの更新
- 最終的に、指定された引数でプロパティ シートのバッチ スクリプトを実行します。
- コマンド ラインのフル リビルド + テストを開始し、出力をファイルにキャプチャします
- 「エラー」を含む行の解析ファイル、メール結果