【シーメイク】

CMake とは?

💡 「どの環境でもビルドできる」を実現する、Makefileの翻訳者
📌 このページのポイント
CMake: メタビルドシステム CMakeLists.txt project(MyApp) add_executable() find_package() 1つの設定ファイル cmake Linux → Makefile make で ビルド Windows → .sln/.vcxproj Visual Studio macOS → .xcodeproj Xcode で ビルド 同じCMakeLists.txtから各OS向けのビルド設定を生成
CMakeのクロスプラットフォームビルド生成のイメージ
ひよこ ひよこ

CMakeってMakeと何が違うの?名前が似てるけど…

ペンギン先生 ペンギン先生

Makeはビルドを実行するツールだけど、CMakeは「ビルド設定を生成する」ツールなんだ。CMakeが設計図を描いて、実際の工事はMakeやNinjaが担当する…という2段階の仕組みだよ

ひよこ ひよこ

なんでわざわざ2段階にするの?直接ビルドすればいいのに

ペンギン先生 ペンギン先生

クロスプラットフォーム対応のためだよ。LinuxではMakefile、WindowsではVisual Studioプロジェクト、macOSではXcodeプロジェクト…と、同じCMakeLists.txtから各OS向けの設定を生成できるんだ。開発者が環境ごとに設定を書き直す手間が省けるよ

ひよこ ひよこ

CMakeLists.txtってどんなことを書くの?

ペンギン先生 ペンギン先生

プロジェクト名、使うソースファイル、リンクするライブラリ、コンパイルオプションなんかだね。add_executable()でビルド対象を指定して、target_link_libraries()でライブラリを紐付ける感じ。Makefileより宣言的で読みやすいよ

ひよこ ひよこ

C/C++以外でも使えるの?

ペンギン先生 ペンギン先生

一応CUDAやFortranにも対応してるけど、主戦場はC/C++だね。PythonJavaScriptの世界ではまず使わない。逆にC/C++のプロジェクトでは、CMakeがないとビルドが始まらないレベルで浸透してるよ

ひよこ ひよこ

find_packageって何?

ペンギン先生 ペンギン先生

システムにインストールされたライブラリを自動で探してくれる機能だよ。たとえばfind_package(OpenCV)って書くだけで、OpenCVのヘッダファイルやライブラリのパスを勝手に見つけてくれる。手動でパスを指定する地獄から解放してくれるんだ

ひよこ ひよこ

CMakeって難しいイメージがあるんだけど…

ペンギン先生 ペンギン先生

正直、独自の構文に慣れるまでは戸惑うかもね。でもmodern CMake(3.x系)では「ターゲットベース」の書き方が主流になって、かなり整理されたよ。古い書き方のチュートリアルに惑わされないように、公式ドキュメントを参照するのがコツだね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「CMake」って出てきたら「どのOSでもビルドできるようにMakefileを自動生成してくれるツール」と思えればだいたいOK!
📖 おまけ:英語の意味
「Cross-platform Make」 = クロスプラットフォーム対応のMake
💬 「どのプラットフォームでもmakeできる」という意味のCross-platform Makeの略だよ。2000年にKitware社が開発したんだ
← 用語集にもどる