【シーメイク】

CMake とは?

最終更新:
💡 「どの環境でもビルドできる」を実現する、Makefileの翻訳者

クロスプラットフォーム対応のビルドシステム生成ツール。CMakeLists.txtに設定を書くと、OS やコンパイラに合わせた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段階にするの?直接ビルドすればいいのに
ペンギン先生 ペンギン先生
クロスプラットフォーム対応のためだよ。「ジェネレーター」を選ぶと、同じCMakeLists.txtから、Makefile、Ninja用のファイル、Visual StudioやXcodeのプロジェクトなどを生成できるんだ。使えるジェネレーターはOSによって違うけど、開発者が環境ごとにビルド設定を書き直す手間が省けるよ
ひよこ ひよこ
CMakeLists.txtってどんなことを書くの?
ペンギン先生 ペンギン先生
プロジェクト名、使うソースファイル、リンクするライブラリ、コンパイルオプションなんかだね。add_executable()でビルド対象を指定して、target_link_libraries()でライブラリを紐付ける感じだよ
ひよこ ひよこ
C/C++以外でも使えるの?
ペンギン先生 ペンギン先生
project()で指定できる言語には、CとC++のほかにC#、CUDA、Fortran、Objective-C、Swift、アセンブリなどがあるよ。何も指定しなければCとC++が有効になるから、中心はやっぱりC/C++だね
ひよこ ひよこ
find_packageって何?
ペンギン先生 ペンギン先生
インストール済みのライブラリを探して、その情報を読み込む機能だよ。find_package(OpenCV REQUIRED)のように書くと、見つかればヘッダーやライブラリの場所がわかり、見つからなければ設定の段階でエラーになって止まる。ライブラリを新しくインストールしてくれるわけではないから、先に入れておく必要があるんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「CMake」って出てきたら「どのOSでもビルドできるようにMakefileなどを生成してくれるツール」と思えればだいたいOK!
📖 おまけ:英語の意味
「CMake」 = シーメイク(ビルド設定を生成するツールの名前)
💬 2000年に、医療画像処理ツールキットITKのビルドのためにKitware社で作られたよ。名前は「Cross-platform Make」の略と説明されることが多いけれど、公式サイトの沿革ページには名前の由来の説明はないんだ

参考資料

← 用語集にもどる