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ライセンスで公開しているので自由に使ってください。
スポンサーサイト



コメント

コメントの投稿

非公開コメント

プロフィール

Cdec

Author:Cdec
情報系修士出身のIT系企業会社員。趣味で変なゲームを作ったり、気まぐれにゲームしたりしています。

■メインPC
Win10Pro, Ryzen7-5800X, DDR4-3600 16GB*2, SSD 512GB, HDD 2TB*2, RTX2060
■サブPC
Win10Pro, Corei5-8250U, DDR4 4GB*2, SSD 256GB
■ファイルサーバー
WinServer2016Standard, DDR4-2133 2GB*2, Corei5-6500, SSD 128GB, HDD 1TB*2+2TB
■趣味制作
ゲームを作ってます。
・C#(Unity):
・C++(DXライブラリ)
・Python
■仕事
主にWebサービス開発をしてます。
・JavaScript/TypeScript