CMakeは、ソフトウェアのビルドプロセスを管理するためのクロスプラットフォームなビルドシステムです。ソースコードから実行可能なバイナリやライブラリを生成するためのビルド手順を定義し、異なる環境でのビルドを容易にします。
CMakeの重要性と利点は以下のように要約されます:
クロスプラットフォーム性:CMakeは、UNIX、Windows、Mac、Linuxなどのさまざまなプラットフォームで動作し、一貫したビルドプロセスを提供します。プラットフォーム依存のコードを管理するための便利な仕組みを提供します。
ビルドの抽象化と自動化:CMakeは、ビルドプロセスを抽象化し、開発者がプロジェクトの複雑さに応じて柔軟にカスタマイズできるようにします。これにより、繰り返し行うビルド作業の自動化や、異なる環境でのビルドの簡略化が可能になります。
モジュール性と再利用性:CMakeは、モジュール化されたコンポーネントやライブラリの管理を容易にします。プロジェクト全体で使用される共通の設定やビルド手順を再利用可能なモジュールとして作成し、他のプロジェクトで簡単に適用できます。
複数のビルドターゲットのサポート:CMakeは、実行可能ファイルや静的/共有ライブラリなどのさまざまなビルドターゲットをサポートし、複数のターゲットの同時ビルドを管理できます。これにより、大規模なプロジェクトでの効率的なビルドが可能になります。
カスタム機能と拡張性:CMakeはカスタムビルド手順や環境依存の設定をサポートし、プロジェクトの特定のニーズに合わせて拡張できます。外部ツールの統合や特定のビルドフローのカスタマイズなどが可能です。
このような特性により、CMakeはソフトウェア開発におけるビルドプロセスの複雑さを抑え、プロジェクト全体のメンテナンス性と移植性を向上させます。
以下は、単一のソースからのビルドをCMakeを使って行う例です。
まず、新しいディレクトリを作成し、その中にプロジェクトを設定します。
% mkdir my_project
% cd my_project
プロジェクトルートディレクトリに CMakeLists.txt ファイルを作成します。このファイルには、プロジェクトの設定やビルド手順が含まれます。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.0...3.5)
project(MyProject)
add_executable(my_app main.cpp)
プロジェクトルートに main.cpp ファイルを作成し、簡単なC++コードを追加します。
main.cpp:
// main.cpp
int main() {
  std::cout << "Hello, CMake!" << std::endl;
  return 0;
}
プロジェクトルートディレクトリ外でビルドディレクトリを作成し、そこでCMakeを使用してプロジェクトをビルドします。
% mkdir build
% cd build
% cmake ..
-- The C compiler identification is Clang 16.0.6
-- The CXX compiler identification is Clang 16.0.6
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.7s)
-- Generating done (0.0s)
-- Build files have been written to: /home/USERNAME/my_project/build
% cmake --build .
[ 50%] Building CXX object CMakeFiles/my_app.dir/main.cpp.o
[100%] Linking CXX executable my_app
[100%] Built target my_app
ビルドが成功したら、生成された実行ファイルを実行できます。
% ./my_app
Hello, CMake!
 
 
これで、簡単なCMakeプロジェクトの作成ができました！
これは基本的な例ですが、複雑なプロジェクトではさらに多くの機能や設定が必要になることがあります。
以下は、複数のソースからのビルドをCMakeを使って行う例です。
複数のソースファイルを含むプロジェクトをCMakeで設定する方法を示します。例として、2つのソースファイル main.cpp と helper.cpp を含むプロジェクトを考えます。
プロジェクトディレクトリを作成し、ソースファイルを配置します。
my_project/
    ├── CMakeLists.txt
    ├── main.cpp
    ├── helper.cpp
    └── helper.h
 
プロジェクトのルートにある CMakeLists.txt ファイルを以下のように設定します。
cmake_minimum_required(VERSION 3.0...3.5)
project(MyProject)
set(SOURCES
    main.cpp
    helper.cpp
)
add_executable(my_app ${SOURCES})
この例では、set コマンドを使ってソースファイルのリストを作成し、add_executable コマンドでそれらのファイルを含む実行ファイルを生成しています。
それぞれのソースファイル (main.cpp と helper.cpp) を以下のように記述します。
main.cpp:
int main() {
    sayHello();
    return 0;
}
helper.cpp:
// helper.cpp
void sayHello() {
    std::cout << "Hello from helper!" << std::endl;
}
関数のプロトタイプを含むヘッダーファイル helper.h を作成します。
 
helper.h:
// helper.h
void sayHello();
ビルドを行うために、ビルドディレクトリを作成してCMakeを実行します。
 
% mkdir build
% cd build
% cmake ..
% cmake --build .
これで、main.cpp と helper.cpp を含むCMakeプロジェクトがビルドされます。
CMakeは、ジェネレーター（生成するビルドシステムや開発環境）を-Gオプションで指定することができます。
以下は-Gオプションの一部の一般的な使用例です：
Unix Makefiles: -G "Unix Makefiles" このオプションは、Unix系システム（Linuxを含む）でMakefileを生成します。これにより、通常のmakeコマンドを使用してビルドを実行できます。
Ninja: -G "Ninja" このオプションは、Ninjaのビルドファイルを生成します。NinjaはMakeよりも高速で効率的なビルドを提供します。
Visual Studio: -G "Visual Studio {version}" このオプションは、Visual Studioのソリューションファイルを生成します。{version}には、使用したいVisual Studioのバージョンが入ります（例："Visual Studio 16 2019"）。
Xcode: -G "Xcode" このオプションは、Xcodeのプロジェクトを生成します。XcodeはmacOSやiOSなどのApple製品向けの開発環境です。
この-Gオプションを使用することで、CMakeは特定のビルドシステムや開発環境向けの構成ファイルを生成します。これにより、プロジェクトをビルドするための準備が整います。
生成可能なジェネレターの一覧は、cmake -G で確認できます。
% cmake -G
CMake Error: No generator specified for -G
Generators
  Ninja                        = Generates build.ninja files.
  Ninja Multi-Config           = Generates build-.ninja files.
  CodeBlocks - Ninja           = Generates CodeBlocks project files
                                 (deprecated).
  CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files
                                 (deprecated).
  CodeLite - Ninja             = Generates CodeLite project files
                                 (deprecated).
  CodeLite - Unix Makefiles    = Generates CodeLite project files
                                 (deprecated).
  Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files
                                 (deprecated).
  Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files
                                 (deprecated).
  Kate - Ninja                 = Generates Kate project files (deprecated).
  Kate - Ninja Multi-Config    = Generates Kate project files (deprecated).
  Kate - Unix Makefiles        = Generates Kate project files (deprecated).
  Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files
                                 (deprecated).
  Sublime Text 2 - Unix Makefiles
                               = Generates Sublime Text 2 project files
                                 (deprecated).
デフォルトのジェネレターには先頭に * が付き、上記の例では Unix Makefiles です。