【シーメイク】

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社が開発したんだ
← 用語集にもどる