vcpkg を用いた CMake の依存ライブラリ管理

vcpkg を用いた CMake の依存ライブラリ管理#

vcpkg は C++ 用のパッケージマネージャの 1 つ。 Microsoft が作成しており、 Windows、Linux、Mac で使用できる。

特徴#

  • Python の PyPI や Ubuntu の apt などのパッケージマネージャがパッケージ用の専用のサーバを持つのに対し、 vcpkg はパッケージの情報を Git リポジトリで管理・提供する仕組みため、パッケージを提供する専用のサーバが不要となっている。

  • vcpkg の Git リポジトリのバージョンを固定しておけば、ある日急にライブラリのバージョンが更新されて動作に影響が出るということはない。

  • CMakeLists.txt 上ではパッケージマネージャを意識した記載をする必要がない。(下記の使用例を参照。)

インストール#

vcpkg をインストールするには以下のようにする。

  1. vcpkg の GitHub リポジトリ をクローンするか、使用する先の Git リポジトリ内に submodule で追加する。

  2. 以下のコマンドで vcpkg をビルドする。

    • Linux

      ./vcpkg/bootstrap-vcpkg.sh
      
    • Windows

      .\vcpkg\bootstrap-vcpkg.bat
      

    vcpkg リポジトリのディレクトリ直下に vcpkg コマンドが配置される。

使用例#

CMake で vcpkg を使用してみた例を記載する。

vcpkg では、以下のような形式の vcpkg.json ファイルに依存ライブラリを記載する。

{
  "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
  "dependencies": [
    "boost-atomic",
    "bfgroup-lyra",
    "catch2",
    "trompeloeil",
    "fmt"
  ]
}

cmake コマンドの実行時に

cmake -DCMAKE_TOOLCHAIN_FILE=<vcpkgリポジトリのパス>/scripts/buildsystems/vcpkg.cmake <他のオプションやソースディレクトリなど>

のようにオプションを追加すると vcpkg.json 内のライブラリがインストールされる。ライブラリがインストールされる際に CMakeLists.txt でどのようにライブラリを取り込むかがコンソール出力されるため、そのコマンドを CMakeLists.txt にコピー&ペーストする。今回の場合は以下のようになった。

# ライブラリを探索
find_package(lyra CONFIG REQUIRED)
find_package(fmt REQUIRED)
find_package(Boost REQUIRED COMPONENTS atomic)
find_package(Catch2 CONFIG REQUIRED)
find_package(fmt CONFIG REQUIRED)
find_package(trompeloeil CONFIG REQUIRED)

# ライブラリをリンク
target_link_libraries(
    ${PROJECT_NAME} PRIVATE bfg::lyra Boost::atomic Catch2::Catch2 fmt::fmt
                            trompeloeil::trompeloeil)