| CMake | |
|---|---|
| 開発者 | アンディ・セディルニク、ビル・ホフマン、ブラッド・キング、ケン・マーティン、アレクサンダー・ノインドルフ |
| 初回リリース | 2000 (2000年) |
| 安定版リリース | 4.2.1 [ 1 ] |
| リポジトリ | |
| 書かれた | C、C++ [ 2 ] |
| オペレーティング·システム | クロスプラットフォーム |
| タイプ | ソフトウェア開発ツール |
| ライセンス | BSD-3条項 |
| Webサイト | cmake.org |
CMakeは、コンパイラに依存しない命令を用いてアプリケーションを構築するための、無料のクロスプラットフォームソフトウェア開発ツールです。テスト、パッケージング、インストールを自動化することもできます。様々なプラットフォームで動作し、多くのプログラミング言語をサポートしています。[ 3 ]
メタビルドツールであるCMakeは、ネイティブビルドツールを設定し、それらのネイティブビルドツールがコードベースをビルドします。CMakeは、 CMake固有の設定ファイルに基づいて、他のビルドツール用の設定ファイルを生成します。他のツールは、生成されたファイルを用いて、より直接的なビルド処理を行います。CMake固有の設定ファイルを1セット使用することで、複数のプラットフォームのネイティブビルドツールを用いてコードベースをビルドすることができます。[ 4 ]
CMakeでサポートされている注目すべきネイティブビルドツールには、Make、Qt Creator、Ninja、Android Studio、Xcode、Visual Studioなどがあります。[ 4 ]
CMakeは、BSD-3条項ライセンスの下で、無料のオープンソースソフトウェアとして配布されています。[ 5 ]
歴史
最初の開発は1999年にKitwareで、 Visible Human Projectの一環として、米国国立医学図書館の資金提供を受けて開始されました。[ 4 ] CMakeは2000年に初めてリリースされました。
CMakeは、Insight Segmentation and Registration Toolkit (ITK) を複数のプラットフォーム向けにビルドするために開発されました。その目標には、 autoconfやlibtoolといった当時のツールの長所を維持しながら弱点を克服すること、そして当時の最先端のビルド技術(Unixプラットフォーム向けのconfigureスクリプトとMakeファイル、Windows向けのVisual Studioプロジェクトファイル)との整合性を保つことが含まれていました。[ 6 ] [ 4 ]
CMakeは複数の同時代のツールからインスピレーションを得ました。Ken MartinらがVisualization Toolkit (VTK)のビルドをサポートするために開発したpcmakerは、UnixのMakeファイルをWindowsでのビルド用にNMakeファイルに変換しました。[ 4 ] gmakeはUnixとWindowsのコンパイラをサポートしていましたが、その設計は解決困難な問題を引き起こしました。どちらのツールもUnixとWindowsの両方をサポートするビルドツールの実例でしたが、深刻な欠陥がありました。多くの開発者がVisual Studioなどの統合開発環境(IDE)を好むにもかかわらず、Windows開発者はコマンドラインを使用する必要がありました。
CMake は同様のクロスプラットフォーム サポートを提供しますが、各プラットフォームの開発者の好みをよりよく満たすようにすることを目的としていました。
最初のバージョンの設計目標は以下の通りでした: [ 4 ]
- ホスト C++ コンパイラのみに依存し、他のサードパーティのツールやライブラリは必要ありません。
- Visual Studio プロジェクト ファイル (および Unix ファイル) を生成する
- サポートされるビルドターゲット:プログラム、静的ライブラリ、共有ライブラリ
- ビルド時のコードジェネレータを実行する
- ソースファイルとビルドファイル用に別々のディレクトリツリーをサポート
- ホストコンピュータの機能のイントロスペクションをサポート
- C/C++ ヘッダーファイルの自動依存関係スキャンをサポート
- すべての機能は、サポートされているすべてのプラットフォームで一貫して同じように動作する必要があります。
様々な理由から、CMakeの開発者は、当時人気のビルド言語であったTclではなく、CMake用のスクリプト言語を開発することを選択しました。Tclを使用するとホストマシンへの依存性が生じ、コンパイラ以外の依存性を一切排除するという目標に反することになります。また、初期開発当時、TclはWindowsや一部のUnixシステムで十分にサポートされていませんでした。[ 4 ]
その後の開発と改良は、VXLプロジェクト、 Brad King氏によるCABLE [ 7 ]機能の追加、そしてGE Corporate R&DによるDARTサポートなど、開発者自身のシステムへのCMakeの組み込みによって促進されました。VTKがビルド環境とParaViewのサポートのためにCMakeに移行した際にも、追加機能が開発されました。
バージョン3.0は2014年6月にリリースされました。[ 8 ]これは「現代のCMake」の始まりと評されています。[ 9 ]専門家は現在、変数を避け、ターゲットとプロパティを使用するようにアドバイスしています。[ 10 ]add_compile_options CMake 2の中核であった、、、などのコマンドはinclude_directories、ターゲット固有のコマンドに置き換えられるべきです。 link_directorieslink_libraries
名前
CMake 開発者の Brad King 氏は、「CMake の「C」は「クロスプラットフォーム」の略です」と述べています。
特徴
ジェネレータとIDEサポート
CMakeは、 Microsoft Visual Studio、Xcode、Eclipse CDTなどのIDE用のプロジェクトファイルや、Windows上のMSBuildまたはNMake、Linux、macOS、CygwinなどのUnix系プラットフォーム上のUnix Make、そしてプラットフォーム固有のビルドツールのジェネレーターを指定することでWindowsとUnix系プラットフォームの両方でNinja用のビルドスクリプトを生成できる。デフォルトでは、CMakeは実行されるホスト環境のデフォルトのジェネレーターを自動的に決定する。コマンドラインオプションを使用して別のジェネレーターを指定できる。例:make用のビルドスクリプトをCMakeに作成させる。[ 4 ]-G-G Unix Makefiles
CMakeは、CMakeの実装を変更せずにカスタムジェネレーターをサポートすることはできません。ただし、CMakeのソースコードを変更することで、カスタムジェネレーターを組み込むことは可能です。
ビルドターゲット
CMakeは、実行ファイル、ライブラリ(例libxyz:xyz.dllなど)、オブジェクトファイルライブラリ、擬似ターゲット(エイリアスを含む)のビルドをサポートしています。CMakeは、動的(実行時)リンクを回避し、代わりに静的(コンパイル時)リンクを使用することで、実行バイナリ/ライブラリからリンク可能なオブジェクトファイルを生成できます。これにより、様々な最適化を柔軟に設定できます。[ 11 ]
ターゲット生成はターゲットプロパティで設定できます。以前のバージョンでは、CMAKE_-prefixed global variables を使っていましたが、この方法は非推奨です。[ 10 ] [ 12 ]
階層構成
CMakeの設定ファイルは、ソースコードの階層構造、つまりソースツリーに従って構造化できます。CMakeLists.txtルートソースディレクトリ内の は設定のルートとして機能します。 には、それぞれ を含むサブディレクトリを含めることができますCMakeLists.txt。これを繰り返すことで、ソースコードの構造に従った階層構造の設定が作成されます。[ 10 ] [ 12 ]
個別のビルドツリー
CMakeは生成されたファイル(CMakeとネイティブビルドツールの両方によって生成されたファイル)をソースツリーとは別のディレクトリツリーに保存できます。 [ 4 ]
これにより、各ソースツリーのファイルシステム空間が重複しないため、同じソースツリーから複数のビルドが可能になります。この機能は、異なるプラットフォーム向けなど、異なる構成、あるいは互換性のない構成をビルドする際に活用できます。
また、ソースツリー全体から複数のファイルやディレクトリを削除するのではなく、単一のディレクトリツリーを削除するだけで生成ファイルを削除できるため、ファイル管理も簡素化されます。これにより、誤ってソースファイルを削除したり、誤って生成ファイルをソース管理に追加したりすることを防ぐことができます。
依存関係管理
CMakeは、ソースコードが変更またはビルドされたときに下流のコンポーネントが確実に再構築されるようにします。[ 4 ]
柔軟なプロジェクト構造
CMakeは、システム全体およびユーザー指定の実行ファイル、ファイル、ライブラリの場所を特定できます。これらの場所はキャッシュに保存され、ターゲットビルドファイルを生成する前に調整できます。キャッシュは、CMakeに同梱されているグラフィカルエディタで編集できます。
CMakeは、複雑なディレクトリ階層や複数のライブラリに依存するアプリケーションも十分にサポートしています。例えば、複数のツールキットや、それぞれ複数のディレクトリを持つライブラリを含むプロジェクトにも対応できます。さらに、CMakeは、最終アプリケーション用にコンパイルされるコードを生成する前に実行ファイルを作成する必要があるプロジェクトにも対応できます。オープンソースで拡張性の高い設計により、CMakeは特定のプロジェクトに合わせてカスタマイズできます。[ 13 ]
コンパイラ機能検出
CMakeでは、ターゲットプログラムやライブラリをコンパイルするためにコンパイラがサポートする必要がある機能を指定できます。[ 14 ]
コンパイラサポート
CMakeは、Apple Clang、Clang、GNU GCC、MSVC、Oracle Developer Studio、Intel C++ Compilerなど、多くのコンパイラをサポートしています。[ 15 ]
パッケージ
CMakeは、エンドユーザーとサードパーティのCMakeベースのプロジェクトの両方で利用可能なパッケージを生成できます。CPackを介してビルドされたファイルは、ターゲットシステムのパッケージマネージャー(例:dpkg)またはターゲットプラットフォームでサポートされているインストーラ用のアーカイブファイルにパックされます。 [ 16 ]:132、142 [ 17 ] [ 18 ] CMakeは、ビルドプロセスの一部として使用したり、以前にインストールされたCMakeパッケージをリンクしたりするために、リモートサーバーからパッケージを取得するための関数を提供します。[ 18 ]
GUI
Cmake は、コマンドライン インターフェイス経由でプロジェクトを構成するために使用できるncursesプログラムを使用して実行できます。 ccmake
プリコンパイルされたヘッダーとモジュール
CMakeバージョン3.6以降では、プリコンパイル済みヘッダーを生成することが可能です。 [ 19 ]バージョン3.28以降では、CMakeはモジュールのコンパイルも可能になりました。また、ヘッダーユニットの実験的なサポートも存在します。[ 20 ]
JSON文字列
CMakeはJSONデータ文字列から変数に値を抽出する機能をサポートしています(バージョン3.19以降)。[ 21 ]
言語
CMake には、変数、文字列操作、配列、関数とマクロの宣言、モジュールの組み込み (インポート) をサポートする、 比較的単純なカスタム命令型スクリプト言語のインタープリターが含まれています。
インタプリタは、CMakeLists.txtソースファイルとビルド設定を指定するファイルからCMake言語コマンドを読み取ります。CMakeはこの情報を用いてネイティブツール設定ファイルを生成します。さらに、拡張子が..のファイルは.cmake追加のスクリプトを保存するために使用できます。[ 22 ]
コマンド構文
CMake 言語コマンドの形式は次のようになります。
名前(引数...)
引数は空白で区切られ、引数のグループを区切るキーワードを含めることができます。例えば、次のコマンドでは、キーワードがCOMPILE_FLAGSソースファイルのリストとコンパイラフラグを区切っています。[ 23 ]
set_source_file_properties(ファイル名... COMPILE_FLAGS compile_flag ...)
実装
CMake スクリプト言語は、YaccおよびLexジェネレーターを介して実装されます。
実行可能プログラム CMake、CPack、CTest はC++で書かれています。
CMakeの機能の多くはCMake言語で書かれたモジュールで実装されています。[ 24 ]
CMake ドキュメント(リリース 3.0 以降)はreStructuredTextマークアップを使用しています。HTML ページとマニュアルページはSphinxドキュメントジェネレータによって生成されます。
追加ツール
CMakeには.cmake、依存関係(組み込みおよび外部、例えばFindXYZモジュール)の検出、ツールチェーン環境と実行ファイルのテスト、リリースのパッケージ化(CPack)、外部プロジェクトへの依存関係の管理(モジュール)といったタスクを容易にする多数のスクリプトファイルと開発ツールが付属していますExternalProject。その他の開発ツールには、以下のものがあります。[ 25 ] [ 26 ]
- ccmakeと cmake-gui — ネイティブビルドツール用の設定変数を更新します
- CPack — Linux RPM、deb、gzipパッケージ、NSISファイル(Windows用)、macOSパッケージとしてソフトウェアをパッケージ化するためのツール[ 27 ] [ 28 ]
- CTestとCDash — ソフトウェアのテストとレポート作成
採択
CMakeは、商用、オープンソース、そして学術的なソフトウェアプロジェクトにおいて広く採用されています。注目すべきユーザーとしては、 Android NDK、Netflix、Inria、 MySQL、Boost(C++ライブラリ)、KeePassXC、KDE、KiCAD、FreeCAD、Webkit、Blender、[ 29 ] Biicode、ReactOS、Apache Qpid、ATLAS実験、[ 30 ] Second Lifeなどが挙げられます。[ 31 ]
ビルドプロセス
CMakeによるビルドには、主に2つの段階があります。[ 4 ]まず、CMakeスクリプト言語で記述されたCMake設定ファイルから、ネイティブビルドツール設定ファイルが生成されます。コマンドライン構文はcmake <dir><dir>で、<dir>はファイルを含むディレクトリですCMakeLists.txt。次に、CMake()経由、またはネイティブツールのインターフェースから直接、ネイティブビルドツールが呼び出されますcmake --build <dir>。ネイティブビルドツールは、生成されたファイルを使用します。[ 13 ] [ 32 ]
例
こんにちは世界
以下は、C++で記述されたhello worldプログラムをビルドするように CMake を構成し、CMake を使用してプログラムをビルドする方法を示しています。
hello.cpp :
#include <印刷>int main () { std :: println ( "Hello, world!" ); 0を返す; }CMakeLists.txt :
cmake_minimum_required (バージョン3.22 )プロジェクト( HelloWorld CXX ) add_executable ( hello hello.cpp )CMakeでビルドするには、まず上記の2つのファイルを含むディレクトリにcdコマンドで移動します。次に、クロスプラットフォームのCMakeコマンドを使ってネイティブビルド設定ファイルを生成します。
cmake -B出力します。 生成されたすべてのファイルは、 で指定されたとおりにディレクトリout-B outの下に保存されます。
次に、CMake でサポートされているネイティブ ビルド ツールを使用してビルドします。
cmake --ビルドアウト これでプログラムが実行可能になります。Bash の場合、コマンドは のようになります./out/hello。Windows の場合、出力ファイルは で終わります.exe。
含む
この例では、プリプロセッサのインクルード パスの構成を示します。
hello.cpp :
#include <印刷>#include "hello.hpp"int main () { for ( int i = 0 ; i < TIMES ; ++ i ) { std :: println ( "Hello, world!" ); } return 0 ; }hello.hpp :
#プラグマワンスconstexpr int TIMES = 10 ;CMakeLists.txt :
cmake_minimum_required (バージョン3.22 )プロジェクト( HelloWorld CXX ) add_executable ( hello hello.cpp ) target_include_directories ( hello PRIVATE ${ PROJECT_SOURCE_DIR } )参照
参考文献
- ^ 「CMake 4.2.1がダウンロード可能」 2025年12月9日. 2025年12月11日閲覧。
- ^ 「OpenHubのCMakeオープンソースプロジェクト」 OpenHub . 2016年4月9日閲覧。
- ^ 「CMake」。
- ^ a b c d e f g h i j k「オープンソースアプリケーションのアーキテクチャ(第1巻)CMake」 aosabook.org . 2023年6月11日閲覧。
- ^ “Licenses · master · CMake / CMake” . GitLab . 2020年11月13日閲覧。
- ^ 「FLOSS Weekly 111: CMake」 .ポッドキャスト. TWiT Network . 2011年2月27日閲覧。
- ^ “The CABLE” . 2013年6月19日時点のオリジナルよりアーカイブ。2010年11月10日閲覧。
- ^ Maynard, Robert (2014年6月10日). 「[CMake] [ANNOUNCE] CMake 3.0.0 リリース」 .
- ^「効果的な最新のCMake」。Gist 。
- ^ a b cビンナ、マヌエル (2018 年 7 月 22 日)。「効果的な最新の CMake」。
- ^ "cmake-buildsystem(7) — CMake 3.19.0-rc3 ドキュメント" . cmake.org . 2020年11月14日閲覧。
- ^ a b Pfeifer, Daniel (2017年5月19日). Effective Cmake (PDF) . CPPNow.
- ^ a b Neundorf, Alexander (2006年6月21日). 「KDEプロジェクトがCMakeに切り替えた理由とその方法」LWN.net .
- ^ 「CMakeコンパイラ機能の検出」 www.scivision.dev 2020年11月15日. 2022年1月22日閲覧。
- ^ 「サポートされているコンパイラ」 . CMakeドキュメント. 2022年1月22日閲覧。
- ^ Berner, Dominik (2022). CMakeベストプラクティス:CMakeを使ったプログラミングプロジェクトの作成と維持のための実証済みのテクニックを発見する. Mustafa Kemal Gilor. バーミンガム: Packt Publishing, Limited. ISBN 978-1-80324-424-2. OCLC 1319218167 .
- ^ "cmake-packages(7) — CMake 3.24.1 ドキュメント" . cmake.org . 2022年9月11日閲覧。
- ^ a b「モジュールの設定の公開(上級編)— CMakeビルド手順1.0ドキュメント」 . docs.salome-platform.org . 2022年9月11日閲覧。
- ^ "target_precompile_headers — CMake 3.21.20210925-gb818e3c ドキュメント" . cmake.org . 2021年9月25日閲覧。
- ^ "CXX_MODULE_HEADER_UNIT_SETS" . cmake.org . Kitware . 2025年10月31日閲覧。
- ^ 「CMake 3.19 リリースノート — CMake 3.19.7 ドキュメント」 . cmake.org . 2021年3月15日閲覧。
- ^ "cmake-language(7) — CMake 3.19.0-rc2 ドキュメント" . cmake.org . 2020年10月29日閲覧。
- ^ Cedilnik, Andrej (2003年10月30日). 「CMakeソフトウェアを使用したクロスプラットフォームソフトウェア開発」 . Linux Journal . 2021年1月29日閲覧。
- ^ "cmake-language(7) — CMake 3.19.0-rc1 ドキュメント" . cmake.org . 2020年10月25日閲覧。
- ^ "cmake-modules(7) — CMake 3.14.7 ドキュメント" . cmake.org . 2020年10月24日閲覧。
- ^ 「ExternalProject — CMake 3.14.7 ドキュメント」 . cmake.org . 2020年10月24日閲覧。
- ^ 「CPack を使用したパッケージ化」。CMakeコミュニティ Wiki。
- ^ – ManKier.com のLinux一般コマンドマニュアル。
- ^ 「Building Blender - Blender Developer Wiki」 . wiki.blender.org . 2021年7月1日閲覧。
- ^ Elmsheuser, J; Krasznahorkay, A; Obreshkov, E; Undrus, A (2017). 「ATLASにおけるCMakeを用いた大規模ソフトウェア構築」(PDF) . CERN. 2018年7月28日時点のオリジナルよりアーカイブ(PDF) .
- ^ "CMake Success" . cmake.org . Kitware. 2011. 2022年3月12日閲覧。
- ^ "cmake-toolchains(7) — CMake 3.19.0-rc2 ドキュメント" . cmake.org . 2020年10月29日閲覧。