2013/10/04

VisualStudio開発環境下でのサードパーティライブラリの管理方法

VisualStudio開発環境下でのサードパーティライブラリの管理方法

開発環境
Microsoft Windows XP SP3
Microsoft Visual Studio 2005

TortoiseSVN 1.7.4 or TortoiseHg 1.2.1


 単純明快に結論を先に書くと、「ソリューションに3rdparty製ライブラリを含めておいて、リビルドしたら一緒にサードパーティライブラリもリビルドする」という方法を紹介します。
 管理方法といっても大した内容ではありませんが。
 複数プロジェクトから同一3rdparty製ライブラリのプロジェクトを参照するためにSVN・Mercurialのいずれかを使用します。
 また、このサイトではWindows向けのGUIクライアントツールであるTortoiseシリーズを使用します。





 本稿のポイントを先にまとめると以下の通りです。
  • 3rdparty製ライブラリは同一ルートディレクトリ化に配置する
  • 参照する各プロジェクトは相対位置で3rdparty製ライブラリ群のパスを指定できる位置にあることが好ましい。
  • VisualStudioのプロパティファイルを使用してプロジェクトの設定を使い回す。


 この管理方式はどこかのVisualStudioでの開発を中心にしている割と規模が大きめのwindows向けフリーウェアプロジェクトで採用ケースがある方式を参考にしています。詳しいプロジェクト名は忘れてしまいました。
 
 本稿はzlibやlibpng等、ソースコードをダウンロードして、プロジェクト単体でライブラリを生成して必要なソースコードとヘッダーファイルのみ導入したいプロジェクトに放り投げる説明を行うサイトが散見されたので、SVN,Mercurial等のバージョン管理ツールを使用している場合のライブラリを含めてプロジェクトの管理方法を紹介してみようと思い投稿してみました。
 正直プロジェクト毎に3rdparty製のライブラリのアップデートを行うというのはかなり苦痛なので、一括で更新できるようにしたいんですよね。
 また、特定プロジェクトだけアップデートしたくない時の対応やアップデートは見送ったけど必要に迫られたので、やはり最新版に合流したいという時も対応できるようにしたい。


単体プロジェクト管理方式


 まず、管理するに当たりルートディレクトリを策定します。
 これはどこでも構いませんが、それなりに空き容量を圧迫するので10GB以上空いている場所をお勧めします。
 ここでは簡単にD:\Developにルートディレクトリを配置したとします。

 次は管理レイアウトフォルダを配置します。
 暫定的にまずは下記のように配置し、必要がでてこれば配置転換を行う方針でいっても大丈夫でしょう。
 
  • D:\Develop\
    • 3rdparty - サードパーティー製ライブラリプロジェクト群
    • common - 共通管理フォルダ
    • lib - 自作ライブラリプロジェクト群
    • deps - ライブラリの出力先。名前は任意でよし。
    • Projects - 開発プロジェクト群


さて、ここにまずはlibpng(+zlib)プロジェクトを追加してみます。
  • D:\Develop\
    • 3rdparty
      • zlib
      • libpng

    • common
    • lib
    • deps
    • Projects



この状態で、zlibとlibpngのプロパティファイルを生成してdepsにlibファイルを出力するように設定します。

3rdparty.vsprop
(画像)

プロパティファイル


 プロパティファイルとはVisualStudioのプロジェクト管理設定項目を外部ファイル化したもので拡張子はvsprop(2008以降はprop,vxprop等)です。
 主な使用用途として、特定ライブラリをプロジェクトに導入しようとした場合に、インクルードディレクトリの追加、依存するライブラリファイルの指定を省略することができます。
 また、参照しているプロジェクトが複数ある場合は、一つのプロジェクトで修正・追加した項目が全プロジェクトに反映されます。
 他に、ユーザーマクロが指定でき、独自の環境変数マクロを設定することができます。

 このプロパティファイルを有効に扱うために、上記で示したようにルートディレクトリを作成し、相対パスで管理できる構造を推奨した訳です。

プロジェクトにサードパーティライブラリを取り込む


 次にlibpngを使用してpngファイルを読み込むプロジェクトを作成します。


 D:\Develop\
   3rdparty
     zlib
     libpng
     [3rdparty.vsprop]
   common
     vsprop
       [3rdpartydepencies.vsprop]
   lib
   deps
   Projects
     PNGLoader
       PNGLoader.sln
       PNGLoader.vcproj
       Main.cpp
       Main.h


 ソリューションエクスプローラーのツリーにサードパーティライブラリが氾濫すると見づらいので、一つにまとめることをお勧めします。
 ソリューションエクスプローラーからソリューションから「新しいソリューションフォルダを追加」を選択してください。
 追加されたソリューションフォルダに「追加 - 既存のプロジェクト」からlibpngのvcprojファイルを指定してlibpngプロジェクトを追加してください。

 これで、リビルド時にlibpngプロジェクトも同時にリビルドされるようになりました。
 しかし、この状態ではPNGLoaderプロジェクト側でpng.h等、ライブラリに必要な関数群を参照できないので、includeできる設定を行う必要があります。
 
 新規作成したPNGLoaderプロジェクトに対して、3rdpartyライブラリを読み込むプロパティファイル3rdpartydepenciesをcommon/vspropに作成します。
 ここで注意してほしいのは、以降作成するプロジェクトに配置されるプロジェクトファイル(vcproj)の階層は同じように設定してください。
 相対パスで指定する場合、このプロジェクトファイルを基準に階層をたどるので、プロジェクト毎に位置が異なると、その都度プロパティファイルを作成し、変更があるたびに他のファイルを変更しなくてはならなくなります。


 これで、PNGLoaderはlibpngのソースコードが更新されれば、PNGLoaderプロジェクトをリビルドするだけで最新版のlibpngでリビルドできるようになりました。



 また、ほかのプロジェクトでlibpngを使用したい場合も、プロジェクトのプロパティにcommon/vsprop/3rdpartydepencies.vspropを追加するだけでlibpngに対する参照を行うことが可能になりました。
 (※ランタイムライブラリの設定・使用文字コードの設定が同じになるように注意してください)

 新たに3rdpartyライブラリを追加したとしても、common/vsprop/3rdpartydepencies.vspropに追記するか、ファイルをコピーして新ライブラリ用のプロパティファイルを作成すれば、他のプロジェクトに再利用しやすくなるでしょう。

複数プロジェクト管理方式


前項の単体プロジェクト管理方式では同一構成内で管理している分には問題ないですが、バージョン管理システムを導入している場合、外部から接続するユーザーにはセキュリティ面を考えると同じ構成で管理できないケースということがあるかと思います。その場合には別々の構成に分けて各構成毎に管理することになりますが、共通ライブラリを別々に分けてしまうと、一か所で更新すると共通ライブラリのバージョンが別々になり定期的にマージしなければならなくなります。これはとてつもなく面倒です。
これを解消するためにバージョン管理システムを導入して解消させます。


バージョン管理システム


 昔はソースコードのバージョン管理といえばVisualSourceSafe(VSS)の一択だった気がしますが、昨今の開発現場ではSVN,Mercurial,Gitがプロジェクト管理において諸兄の努力により一般化(普及率の向上)してきたことにより、有名どころの各サードパーティ製ライブラリ(zlib,libpng,bzip2,SDL等)も各バージョン管理ツールを使用して開発するようになってきました。
 また、SVNの外部参照プロパティ(svn:externals)、Mercurial(Hg)のSubRepos機能を使用して参照するライブラリプロジェクト位置を同じにすることにより、一つの更新で複数のプロジェクトを更新させることができます。
(筆者はGitを使用したことがありませんが、機能を見る限りでは使えそうです)

 SVNの外部参照プロパティやMercurialのSubReposの設定方法については本稿では割愛し別の記事にてご紹介します。

0 件のコメント:

コメントを投稿