mcpField
C
cmake

cmake

github.com/mohitmishra786開発2691.7k 回インストール18 週間前に更新
リポジトリ

cmake について

C と C++ のプロジェクトで CMake を使うエージェント向けのスキルです。ターゲット中心の設定、依存関係、ビルド、コンパイラーオプション、クロスコンパイル、プリセット、一般的なエラーを扱います。

主な機能

  1. 01モダンなターゲット中心の CMake 手法
  2. 02ソース外ビルドの設定
  3. 03依存関係の検出と取得
  4. 04コンパイラーオプションとサニタイザー
  5. 05クロスコンパイル用ツールチェーン
  6. 06CMake Presets と一般的な修正

活用シーン

  1. 01C または C++ プロジェクトの CMakeLists.txt 作成
  2. 02外部ライブラリの追加とリンク
  3. 03サニタイザービルドやクロスコンパイルの設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill cmake

インストール後、Claude Code で/cmakeを入力して読み込まれたか確認します。

同梱ファイルreferences/templates.md

詳細

CMake

目的

C/C++ プロジェクトでモダンな(ターゲットファーストの)CMake を使用する方法をエージェントに案内します。ソースツリー外でのビルド、依存関係の管理、ジェネレーターの選択、CI および IDE との連携を取り上げます。

トリガー

  • 「プロジェクト用の CMakeLists.txt を作成するにはどうすればよいですか?」
  • 「CMake で外部ライブラリを追加するにはどうすればよいですか?」
  • 「CMake がパッケージ/ライブラリを見つけられません」
  • 「CMake でサニタイザーを有効にするにはどうすればよいですか?」
  • 「CMake でクロスコンパイルするにはどうすればよいですか?」
  • 「CMake Presets を使用するにはどうすればよいですか?」

ワークフロー

1. モダン CMake の原則
  • 変数ではなく、ターゲットを定義します。target_* コマンドを使用します。
  • PUBLIC/PRIVATE/INTERFACE を使用して、プロパティの伝播を制御します。
  • include_directories() や link_libraries() は使用しないでください(レガシーです)。
  • 最小 CMake バージョン:ほとんどの機能では cmake_minimum_required(VERSION 3.20) を指定します。
2. 最小構成のプロジェクト
cmake_minimum_required(VERSION 3.20)
project(MyApp VERSION 1.0 LANGUAGES C CXX)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(myapp
    src/main.c
    src/utils.c
)

target_include_directories(myapp PRIVATE include)
target_compile_options(myapp PRIVATE -Wall -Wextra)
3. 静的ライブラリ/共有ライブラリ
# Static library
add_library(mylib STATIC lib/foo.c lib/bar.c)
target_include_directories(mylib
    PUBLIC  include      # consumers get this include path
    PRIVATE src          # only mylib itself sees this
)

# Shared library
add_library(myshared SHARED lib/foo.c)
set_target_properties(myshared PROPERTIES
    VERSION   1.0.0
    SOVERSION 1
)

# Link executable against library
add_executable(myapp src/main.c)
target_link_libraries(myapp PRIVATE mylib)
4. 構成とビルド
# Out-of-source build (always do this)
cmake -S . -B build
cmake --build build

# With generator
cmake -S . -B build -G Ninja
cmake --build build -- -j$(nproc)

# Debug build
cmake -S . -B build-debug -DCMAKE_BUILD_TYPE=Debug
cmake --build build-debug

# Release
cmake -S . -B build-release -DCMAKE_BUILD_TYPE=Release
cmake --build build-release

# Install
cmake --install build --prefix /usr/local

ビルドタイプ:Debug、Release、RelWithDebInfo、MinSizeRel。

5. 外部依存関係
find_package(システムにインストールされたライブラリ)
find_package(OpenSSL REQUIRED)
target_link_libraries(myapp PRIVATE OpenSSL::SSL OpenSSL::Crypto)

find_package(Threads REQUIRED)
target_link_libraries(myapp PRIVATE Threads::Threads)

find_package(ZLIB REQUIRED)
target_link_libraries(myapp PRIVATE ZLIB::ZLIB)
FetchContent(依存関係をダウンロードしてビルド)
include(FetchContent)

FetchContent_Declare(
    googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG        v1.14.0
)
FetchContent_MakeAvailable(googletest)

add_executable(mytest test/test_foo.cpp)
target_link_libraries(mytest PRIVATE GTest::gtest_main mylib)
pkg-config によるフォールバック
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBFOO REQUIRED libfoo>=1.2)
target_link_libraries(myapp PRIVATE ${LIBFOO_LIBRARIES})
target_include_directories(myapp PRIVATE ${LIBFOO_INCLUDE_DIRS})
6. 構成ごとのコンパイラーオプション
target_compile_options(myapp PRIVATE
    $<$<CONFIG:Debug>:-g -Og -fsanitize=address>
    $<$<CONFIG:Release>:-O2 -DNDEBUG>
    $<$<CXX_COMPILER_ID:GNU>:-fanalyzer>
    $<$<CXX_COMPILER_ID:Clang>:-Weverything>
)

target_link_options(myapp PRIVATE
    $<$<CONFIG:Debug>:-fsanitize=address>
)

ジェネレーター式:$<condition:value> はビルド時に評価されます。

7. サニタイザーを有効にする
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)

if(ENABLE_ASAN)
    target_compile_options(myapp PRIVATE -fsanitize=address -fno-omit-frame-pointer -g -O1)
    target_link_options(myapp PRIVATE -fsanitize=address)
endif()

ビルド:cmake -DENABLE_ASAN=ON -S . -B build-asan && cmake --build build-asan

8. クロスコンパイル用ツールチェーンファイル
# toolchain-aarch64.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER   aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT /opt/aarch64-sysroot)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
cmake -S . -B build-arm -DCMAKE_TOOLCHAIN_FILE=toolchain-aarch64.cmake
9. CMake Presets(CMake 3.20+)
{
  "version": 6,
  "configurePresets": [
    {
      "name": "release",
      "displayName": "Release",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/release",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
      }
    },
    {
      "name": "debug",
      "displayName": "Debug",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "ENABLE_ASAN": "ON"
      }
    }
  ],
  "buildPresets": [
    { "name": "release", "configurePreset": "release" },
    { "name": "debug",   "configurePreset": "debug" }
  ]
}
cmake --preset release
cmake --build --preset release
10. よくあるエラー
エラー原因解決方法
Could not find package Fooパッケージがインストールされていない、またはプレフィックスが正しくありません開発用パッケージをインストールし、CMAKE_PREFIX_PATH を設定します
No CMAKE_CXX_COMPILERC++ コンパイラーが見つかりませんg++/clang++ をインストールし、PATH を確認します
target_link_libraries called with wrong number of argumentsPUBLIC/PRIVATE/INTERFACE がありませんキーワードを追加します
Cannot find source file誤字、または相対パスが間違っていますCMakeLists.txt からの相対パスを確認します
generator expression error$<> の構文が間違っています式名を CMake のドキュメントで確認します

完全な CMakeLists.txt テンプレートについては、references/templates.md を参照してください。

関連スキル

  • Ninja ジェネレーターの詳細については skills/build-systems/ninja を使用します
  • Make ジェネレーターについては skills/build-systems/make を使用します
  • クロスコンパイル用ツールチェーンの設定については skills/compilers/cross-gcc を使用します
  • サニタイザーの連携の詳細については skills/runtimes/sanitizers を使用します

コメント