CMake&vcpkgでつまずいた点
最近、自作のライブラリが依存しているライブラリをvcpkgに管理させようと、vcpkgに標準では含まれていないライブラリ用のPortファイルを作成しています。vcpkgはマイクロソフトがオープンソースで開発しているWindows用C++パッケージマネージャです。
vcpkgのPortファイルはcmake形式となっており、Portファイルを作成する中でいくつかつまずいた点があったので、書いておきます。
CMake
CMakeについてつまずいた点です。
file(GLOB 変数名 検索パターン)
検索パターンには正規表現とにた文字の範囲指定([a-z])を用いることができますが、正規表現とは異なりCMakeでは大文字小文字が区別されません。
vcpkgのportファイル
vcpkgやPortファイルの作成においてつまずいた点です。
lib内のライブラリファイルは全てリンクされる
インストールされたlibディレクトリ内にあるライブラリファイルは全て(ヘッダファイルで#pragma comment(lib,"yabai_lib.lib"))されているかいないかにかかわらず)リンクされます。
このため、同じ関数を含むライブラリファイルを複数インストールフォルダに配置すると、プログラムのリンク時に重複定義エラーLNK2005が発生してしまいます。
これはオリジナルのPortファイルを作成する時に注意が必要です。同じソースコードを条件を変えてコンパイルし、出力されたライブラリファイルを同じlibディレクトリに置くことはできません。
vcpkg_apply_patchesで用いるパッチファイルの文字コードに注意する
vcpkg_apply_patchesで使用するパッチファイルの文字コードはパッチを当てるソースコードの文字コードと一致させるのが好ましいです。
マルチバイト文字がソースコードに含まれていない場合は文字コードを気にする必要はありませんが、ソースコードに日本語コメントなどのマルチバイト文字が入っている場合、パッチファイルと対象のソースファイルの文字コードが異なっているとパッチ適用に失敗します。
vcpkg_apply_patchesのソースコードを見たところ、vcpkg_apply_patchesは内部でgitのapplyコマンドを用いており、パッチ部分の照合時に文字コードが異なるマルチバイト文字を等しくないと判断し、パッチ適用部分が見つからずにエラーになっている様子でした。
vcpkgの公式マニュアルによるとPowerShellを用いて以下のコマンドによりパッチファイルを作成しています。
git diff | out-file -enc ascii [パッチファイル名]
このコマンドでは文字コードがASCIIとして出力されるため、マルチバイト文字は文字化けします。そのため、対象のソースコードの文字コードがShift-JISなどで、かつdiffの結果にマルチバイト文字部分が含まれる場合、上記の理由でパッチの適用に失敗します。
out-fileコマンドの公式マニュアルによると、-encオプションで出力ファイルの文字コードを変更することができます。
上記コマンドでは"ascii"を指定していますが、パッチ対象の文字コードがUTF8なら"-enc utf8"を、Shift-JISな"default"(マニュアルにthe system's current ANSI code pageと書いてありますが、Windowsの標準設定はShift-JISのようです)を設定することで、文字コードの不一致によるパッチ適用の失敗を防ぐことができます。
最後に
需要があるかは分かりませんが、Vcpkgに標準では含まれていないパッケージを追加するためのPortファイルなどを置いたリポジトリを公開しました。
今のところは
- DXライブラリ
- Effekseer
- EffekseerForDXライブラリ
- LuaIntf
の4つのファイルを置いています。MITライセンスで公開しているので自由に使ってください。
スポンサーサイト
コメント
コメントの投稿