Skip to content

sumimi/modern-cpp-conan-template

Repository files navigation

Modern C++ Conan Template

GitHub Repo stars GitHub forks GitHub last commit GitHub license

Modern C++ Conan Template は、Conan 2.x による外部パッケージ管理を統合した C++17 プロジェクトテンプレートです。

modern-cpp-template-learnkit をベースに、実務でよく使われる外部ライブラリ(spdlog / libpqxx / cxxopts / nlohmann_json / libsodium)を vendor 化して git で管理する仕組みを追加しています。

クローン直後から Conan 不要でビルドできる自己完結型の環境を実現します。


🎯 このテンプレートが解決すること

C++プロジェクトでの外部ライブラリ管理には、以下のような課題があります:

  • 環境依存の問題: 開発者ごとにライブラリのバージョンや場所が異なりビルドが通らない
  • CI/CD 環境でのセットアップ: 毎回ライブラリをインストールする手間とキャッシュ設定
  • ヘッダオンリーライブラリの手動コピー: git に直接コミットする運用の煩雑さ
  • Conan 習得コスト: チームメンバー全員が Conan を知らなくてもビルドできるようにしたい

このテンプレートでは Conan 2.x の vendor 機能を使って、取得したパッケージを vendor/ に展開し git で管理します。
vendor/ はリポジトリにコミット済みのため、クローン直後から Conan 不要でビルドできます。


📦 管理パッケージ一覧

パッケージ バージョン 種別 用途
spdlog 1.12.0 コンパイル済み (.a) 高速ロギングライブラリ
libpqxx 7.7.5 コンパイル済み (.a) PostgreSQL C++ クライアント
cxxopts 3.1.1 header-only コマンドライン引数パーサ
nlohmann_json 3.11.3 header-only JSON パーサ・シリアライザ
libsodium 1.0.20 コンパイル済み (.a) 暗号化・署名・ハッシュライブラリ

全パッケージは shared=False(スタティックリンク)で埋め込まれるため、実行バイナリ単体で動作します。


⚠️ 前提条件

必須

ツール バージョン 用途
CMake 3.15 以上 ビルドシステム
GCC 11 以上 C++17 コンパイル
Google Test 1.14(/opt/gtest/gtest-1.14 ユニットテスト

初回セットアップ時のみ必要(インターネット接続環境)

ツール バージョン 用途
Python 3.9 以上 Conan 実行環境
pip 21 以上 Conan インストール

注意: 本リポジトリをクローンしてビルドする場合は不要です(vendor/ がリポジトリに含まれているため)。パッケージを追加・更新する場合のみ必要です。


🚀 クイックスタート

パターン A:リポジトリをクローンしてビルド(Conan 不要)

vendor/ はリポジトリに含まれているため、Conan のセットアップは不要です。

git clone https://github.com/sumimi/modern-cpp-conan-template.git
cd modern-cpp-conan-template

# cmake 構成(vendor/conan_toolchain.cmake を指定)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake

# ビルド
cmake --build build

# 実行
./build/bin/main

# テスト
cmake --build build --target run_tests

パターン B:パッケージの追加・更新時(Conan 必要)

conanfile.txt を変更した後、以下の手順で vendor/ を再生成してコミットします。

# Conan セットアップ(パッケージ取得 + vendor/ 再展開)
bash tools/conan_setup.sh

# vendor/ の変更をコミット
git add vendor/ CMakeUserPresets.json conanfile.txt
git commit -m "build: :package: Conan vendor パッケージを更新"

# ビルド
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
cmake --build build

詳細な手順は docs/CONAN_SETUP.md を参照してください。

パターン C:既存プロジェクトへの Conan 統合(modern-cpp-template-learnkit の例)

modern-cpp-template-learnkit のような既存の CMake プロジェクトに後から Conan を追加する手順です。

⚠️ テンプレートの全ファイルをコピーすると既存のソースコードや CMake 設定が上書きされます。
Conan 関連ファイルのみを選択的にコピーしてください。

1. Conan 関連ファイルをコピー

まず、このテンプレートを一時領域にクローンし、Conan 関連ファイルのみを既存プロジェクトにコピーします。

# テンプレートを一時領域にクローン
git clone https://github.com/sumimi/modern-cpp-conan-template.git /tmp/conan-template

# 既存プロジェクトに移動(例: modern-cpp-template-learnkit)
cd /path/to/modern-cpp-template-learnkit

# Conan 関連ファイルをコピー
cp /tmp/conan-template/conanfile.txt .
cp /tmp/conan-template/requirements.txt .
cp -r /tmp/conan-template/profiles/ .
cp /tmp/conan-template/tools/conan_setup.sh tools/

# vendor/ ディレクトリ(Conan 展開先)を作成
mkdir -p vendor
touch vendor/.gitkeep

コピーするファイル / ディレクトリ:

ファイル 用途
conanfile.txt パッケージ依存定義(必要に応じてカスタマイズ)
requirements.txt Conan バージョン固定
profiles/linux-rhel9 Conan ビルドプロファイル
tools/conan_setup.sh Conan セットアップスクリプト

コピーしてはいけないファイル / ディレクトリ:

ファイル / ディレクトリ 理由
CMakeLists.txt 既存プロジェクトの設定が上書きされる(手動で変更する)
src/ 既存のソースコードが上書きされる
include/ 既存のヘッダファイルが上書きされる
test/ 既存のテストコードが上書きされる
README.md / LICENSE プロジェクト固有ファイル

2. CMakeLists.txt を修正

既存の CMakeLists.txt に Conan 関連の設定を追加します。

(a)Conan 関連設定を一括追加project(...) 宣言の直後):

設定を1か所にまとめることで、マージ作業が1ステップで完了します。
CMAKE_BUILD_TYPE は Conan CMakeDeps が必須とするため、project() の直後に設定します。

# -----------------------------------------------------------------------------
# CMAKE_BUILD_TYPE のデフォルト設定
# Conan CMakeDeps が生成するファイルは CMAKE_BUILD_TYPE の設定を必須とする。
# 未指定の場合は Release をデフォルトとして設定する。
# -----------------------------------------------------------------------------
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()

# -----------------------------------------------------------------------------
# ライブラリ形式の選択肢:STATIC or SHARED(デフォルトは STATIC)
#
# SHARED を選択すると、動的ライブラリ(DLL)としてビルドされます。
# cmake -DBUILD_SHARED_LIBS=ON -S . -B build_shared
# -----------------------------------------------------------------------------
option(BUILD_SHARED_LIBS "Build libraries as shared (DLL) or static" OFF)

# -----------------------------------------------------------------------------
# IntelliSense 向け compile_commands.json の生成
# -----------------------------------------------------------------------------
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# =============================================================================
# Conan vendor パッケージ設定
#
# vendor/conan_toolchain.cmake を使用して find_package を解決する。
# cmake 構成時にツールチェーンファイルを指定すること:
#   cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
# 初回セットアップ: bash tools/conan_setup.sh を実行後、vendor/ を git commit。
# 以降のビルドでは Conan 不要(詳細: docs/CONAN_SETUP.md)。
# =============================================================================
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/vendor/conan_toolchain.cmake")
    message(FATAL_ERROR
        "[Conan] vendor/conan_toolchain.cmake が見つかりません。\n"
        "以下のコマンドで初回セットアップを行ってください:\n"
        "  bash tools/conan_setup.sh\n"
        "詳細は docs/CONAN_SETUP.md を参照してください。"
    )
endif()

find_package(spdlog REQUIRED)
find_package(cxxopts REQUIRED)
find_package(libpqxx REQUIRED)
find_package(nlohmann_json REQUIRED)
find_package(libsodium REQUIRED)

(b)test/CMakeLists.txttarget_link_libraries に Conan パッケージを追加

target_link_libraries(unit_tests PRIVATE
    GTest::gtest
    GTest::gtest_main
    GTest::gmock
    GTest::gmock_main
    sampleapp
    spdlog::spdlog
    cxxopts::cxxopts
    libpqxx::pqxx
    nlohmann_json::nlohmann_json
    libsodium::libsodium
)

3. .vscode/c_cpp_properties.json を作成・更新

IntelliSense が Conan パッケージのヘッダを認識するには、cmake が生成する compile_commands.json を参照する設定が必要です。

.vscode/c_cpp_properties.json が存在しない場合は以下の内容で作成し、存在する場合は compileCommands 設定を確認・追加します:

{
    "configurations": [
        {
            "name": "Linux",
            "compileCommands": "${workspaceFolder}/build/compile_commands.json",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

compile_commands.json は cmake 構成後(cmake -S . -B build ...)に build/ ディレクトリに生成されます。VS Code を開き直すと IntelliSense が Conan パッケージのヘッダを自動認識します。

💡 Tip: cmake 構成後もインクルードエラーや警告が消えない場合は、VS Code のウィンドウを再読み込みしてください。
コマンドパレット(Ctrl+Shift+P)→ Developer: Reload Window

4. .gitignore を更新

.gitignore に以下を追加します(vendor/full_deploy/ は意図的に git 管理するため除外しないこと):

# Conan 2.x パッケージマネージャ
# ※ vendor/full_deploy/ は意図的に git 管理対象(vendor 化)
.conan/
.conan2/
graph_info.json
conaninfo.txt
conanbuildinfo.cmake

⚠️ 既存の .gitignorevendor/ を除外するルール(例: vendor/)がある場合は削除してください。

5.(learnkit の場合)手動コピーしていたヘッダを削除

modern-cpp-template-learnkit では include/cxxopts/ に cxxopts ヘッダを直接コミットしていました。
Conan での管理に切り替えた後は vendor/ に展開されるため、手動コピーしたものは不要になります:

# include/cxxopts/ を削除(Conan が vendor/ 経由で提供するため)
git rm -r include/cxxopts/

6. Conan セットアップの実行とコミット

# Conan セットアップ(初回のみ・インターネット接続が必要)
bash tools/conan_setup.sh

# 変更ファイルをステージ(vendor/ のコミットで以降 Conan 不要になる)
git add vendor/ CMakeUserPresets.json conanfile.txt requirements.txt profiles/ tools/conan_setup.sh .gitignore CMakeLists.txt .vscode/c_cpp_properties.json
git commit -m "build: :package: Conan vendor パッケージを追加"

# cmake 構成(Conan toolchain を指定)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
cmake --build build

# 動作確認
./build/bin/main
cmake --build build --target run_tests

🔧 ビルドコマンド一覧

# 初期構成(Conan toolchain を指定)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake

# ビルド
cmake --build build

# 実行
./build/bin/main

# テスト実行
cmake --build build --target run_tests

# カバレッジ測定(要 ENABLE_COVERAGE=ON)
cmake -DENABLE_COVERAGE=ON -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
cmake --build build --target coverage

📁 ディレクトリ構造

modern-cpp-conan-template/
├── conanfile.txt             # パッケージ依存定義(git 管理)★
├── requirements.txt          # Conan バージョン固定(git 管理)★
├── CMakeLists.txt            # CMake ビルド設定
├── profiles/
│   └── linux-rhel9           # Conan ビルドプロファイル(git 管理)★
├── vendor/                   # Conan 展開先(git 管理)★
│   ├── .gitkeep
│   ├── conan_toolchain.cmake # Conan 生成ツールチェーン
│   └── full_deploy/
│       └── host/
│           ├── spdlog/1.12.0/
│           ├── libpqxx/7.7.5/
│           ├── cxxopts/3.1.1/
│           ├── nlohmann_json/3.11.3/
│           └── libsodium/1.0.20/
├── include/
│   └── sampleapp/            # ヘッダファイル
├── src/
│   ├── main.cpp
│   └── sampleapp/            # 実装ファイル
├── test/
│   └── unit/
│       ├── sampleapp/        # サンプルアプリのテスト
│       └── packages/
│           └── ConanPackagesTest.cpp  # 全パッケージ動作確認テスト★
├── tools/
│   ├── conan_setup.sh        # Conan セットアップスクリプト★
│   └── ...                   # その他ビルド補助スクリプト
└── docs/
    ├── CONAN_SETUP.md        # Conan 運用ガイド★
    └── SETUP_GUIDE.md        # 環境構築ガイド

★ = このテンプレートで追加した Conan 関連ファイル


🏗️ Conan 統合の仕組み

conanfile.txt
    │
    ▼
bash tools/conan_setup.sh
    │
    ├─ pip install conan==2.7.1 (requirements.txt 固定)
    ├─ conan install --deployer=full_deploy
    │       │
    │       ├─ vendor/conan_toolchain.cmake  ← CMAKE_PREFIX_PATH を設定
    │       ├─ vendor/*Config.cmake          ← find_package 解決用
    │       └─ vendor/full_deploy/host/      ← headers + .a ライブラリ
    │
    └─ git add vendor/ && git commit
            │
            ▼
    cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=vendor/conan_toolchain.cmake
            │
            ├─ find_package(spdlog)
            ├─ find_package(cxxopts)
            ├─ find_package(libpqxx)
            ├─ find_package(nlohmann_json)
            └─ find_package(libsodium)
                    │
                    ▼
            cmake --build build  →  実行バイナリ(全パッケージ静的リンク)

🧪 動作確認テスト

各パッケージが正しくリンク・動作することを確認するスモークテストが含まれています。

cmake --build build --target run_tests
テスト名 内容
SpdlogTest.LogsToOstreamSink spdlog のストリームシンクへの出力
SpdlogTest.LogLevelFilteringWorks ログレベルフィルタリング
CxxoptsTest.ParsesStringOption コマンドライン引数のパース
CxxoptsTest.DefaultValueUsedWhenOptionOmitted デフォルト値の適用
NlohmannJsonTest.ParsesJsonObject JSON オブジェクトのパース
NlohmannJsonTest.SerializesJsonObject JSON シリアライズ
NlohmannJsonTest.ThrowsOnInvalidJson 不正 JSON の例外処理
LibsodiumTest.InitializeSucceeds libsodium の初期化
LibsodiumTest.RandomBytesGeneratesNonZeroOutput 乱数生成
LibsodiumTest.Sha256HashIsConsistent SHA-256 ハッシュの再現性
LibpqxxTest.ZViewLinksAndWorks libpqxx ヘッダリンク確認(DB接続不要)

📦 パッケージの追加方法

  1. conanfile.txt[requires] にパッケージを追加する:

    [requires]
    spdlog/1.12.0
    newpackage/x.y.z   ← 追加
  2. CMakeLists.txtfind_package を追加する:

    find_package(newpackage REQUIRED)
  3. セットアップスクリプトを再実行して vendor/ を更新する:

    bash tools/conan_setup.sh
    git add vendor/ CMakeUserPresets.json conanfile.txt CMakeLists.txt
    git commit -m "build: :package: newpackage を Conan で追加"

詳細は docs/CONAN_SETUP.md を参照してください。


📘 関連資料

公式ドキュメント

プロジェクト固有ドキュメント

関連リポジトリ


📄 ライセンス

MIT License — 詳細は LICENSE を参照してください。

本テンプレートは自由に利用・改変・再配布が可能です。商用プロジェクトでも無償で使用できます。


About

Conan 2.x で外部ライブラリを vendor 化した C++17 プロジェクトテンプレート。vendor を git 管理するためクローン直後から Conan 不要でビルド可能。

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors