CMake

CMakeは、コンパイラに依存しないビルド自動化のためのフリーソフトウェアであり、様々なオペレーティングシステムで動作させることができる。CMakeは階層化ディレクトリや複数のライブラリを利用するアプリケーションをサポートするよう設計されている。実際のビルドにおいては、make、Xcode、Visual Studioのようなネイティブのビルド環境が利用される。CMake自身は最小限の依存関係を持つよう設計されており、ビルドするにはC++コンパイラのみを必要とする。
歴史.
CMakeは1999年に開発が始まった。その目的はInsight Segmentation and Registration Toolkit (ITK) のクロスプラットフォームなビルド環境の要求に答えるためのものだった。このプロジェクトは可視化人間プロジェクト（）の一部として、アメリカ国立医学図書館の支援を受けた。CMakeは、可視化ソフトウェアであるVisualization Toolkit (VTK) のサポートのためにKen Martinらによって開発されたpcmakerを一部参考にしている。Kitware社のBill Hoffmanはこのpcmakerの要素に、Unixのconfigureスクリプトの代替品を作るという彼のアイディアを組み合わせた。2000年には最初の実装が作られ、2001年にはさらに開発が進められた。その後、CMakeは下に示すようなCMake開発者達自身が関与するシステムに組み込まれることによって開発や改善が加速された。
いくつかの機能は、VTKがビルドシステムをCMakeに切り替えたときや、同じく可視化ソフトウェアであるParaViewに対応するために追加されたものである。
機能.
CMakeはインプレースおよびアウトオブプレースでのビルドの双方に対応しており、同じソースツリーから複数のビルド結果を生成でき、またクロスコンパイルにも対応している。この、ソースツリーの外側にビルド結果を生成する仕組みはCMakeの重要な特徴で、ビルドツリーが削除されてもソースファイルには影響しない。
CMakeは必要な実行ファイルやその他のファイル、ライブラリの場所を探し出すことができる。その結果はキャッシュに保存され、またそれはビルドの前に調整することができる。調整には、プロジェクトに付属するグラフィカルエディタを使うことができる。
複雑なディレクトリ階層や、いくつものライブラリに依存したアプリケーションにもCMakeは対応している。例えば、依存しているツールキットやライブラリがそれぞれに複数のディレクトリを持つような場合でも処理が可能である。加えて、最終的なアプリケーションのコンパイルに必要なコードを生成する実行ファイルを事前に生成しておくことが求められるような複雑なビルドにも対応できる。CMakeはオープンソースであり、拡張も容易なため、必要に応じて特定のプロジェクト向けに改変することもできる。
CMakeはUNIX、Windows、macOS、OS/2といった様々なプラットフォームやMicrosoft Visual C++、Cygwin、MinGW、XcodeといったIDEに対応したmakefileを生成することが可能である。
ビルドプロセス.
CMakeのビルドプロセスは2段階からなる。まず、CMake用の設定ファイルから通常のビルド環境用のビルドファイルを生成する。次に、プラットフォームネイティブのビルドツールがそれを利用して実際のビルドを行う。
各プロジェクトは、ディレクトリ毎にビルドプロセスを制御するためのファイルcodice_1を持つ。同ファイルには一つ以上のコマンドが、codice_2の形式で記述される。ここでcodice_3はコマンドを表す名前で、codice_4は空白で区切られた引数のリストが記述される。CMakeには静的/動的ライブラリや実行ファイルをコンパイルするための様々な組み込みルールが豊富に用意されているが、ユーザーがルールを追加するための仕組みも提供されている。ビルドに関する依存関係の一部は自動的に解決される。高度な使い方としては、特殊なコンパイラやOSに対応するためのmakefile生成器を組み込むことが可能である。
内部構成.
CMake、CPack、CTestの実行ファイルは、C++プログラミング言語で書かれている。
CMakeの機能の多くはCMake言語で書かれたモジュールの中で実装されている。
リリース3.0から、CMakeのドキュメントにはreStructuredTextマークアップが使用されているようになった。HTMLページとmanページは、ドキュメント・ジェネレータであるSphinxから自動生成されている。
CPack.
CPackは、CMakeと密に統合されているソフトウェア配布のためのパッケージングシステムである。しかし、CMakeがなくても動作するように作られている。
一般には、以下のような用途に利用できる。