CMakeは、ソフトウェアのビルドプロセスを管理するためのクロスプラットフォーム対応のビルドシステムです。ソースコードから実行可能なバイナリやライブラリを生成するためのビルド手順を定義し、さまざまな環境でビルド作業を容易にします。

Wikipedia
Wikipedia
ウィキペディアCMakeの記事があります。

CMakeの主な特徴と利点

編集

CMakeの重要性と利点は、以下のようにまとめられます:

クロスプラットフォーム性
CMakeは、UNIX、Windows、macOS、Linuxなど多様なプラットフォームで動作し、一貫したビルドプロセスを提供します。異なるプラットフォームに依存するコードを管理するための便利な仕組みを備えています。
ビルドの抽象化と自動化
CMakeはビルドプロセスを抽象化し、開発者がプロジェクトの複雑さに応じて柔軟にカスタマイズできるようにします。これにより、繰り返し行うビルド作業の自動化や、複数の異なる環境でのビルドの簡略化が可能になります。
モジュール性と再利用性
CMakeはモジュール化されたコンポーネントやライブラリの管理を容易にします。共通のビルド設定や手順を再利用可能なモジュールとして作成し、他のプロジェクトで簡単に適用できます。
複数のビルドターゲットのサポート
CMakeは実行ファイル、静的ライブラリ、共有ライブラリなど、さまざまなビルドターゲットをサポートします。これにより、大規模なプロジェクトにおいて複数のターゲットの同時ビルドや管理が効率的に行えます。
カスタマイズ性と拡張性
CMakeはカスタムビルド手順や環境依存の設定をサポートし、特定のプロジェクト要件に応じた拡張が可能です。外部ツールの統合やビルドフローのカスタマイズなども柔軟に対応できます。

これらの特性により、CMakeはビルドプロセスの複雑さを軽減し、プロジェクト全体のメンテナンス性や移植性の向上に寄与しています。

単一のソースからのビルド

編集

以下は、単一のソースからのビルドをCMakeを使って行う例です。

プロジェクトディレクトリの作成

編集

まず、新しいディレクトリを作成し、その中にプロジェクトを設定します。

% mkdir my_project
% cd my_project

CMakeLists.txtファイルの作成

編集

プロジェクトルートディレクトリに CMakeLists.txt ファイルを作成します。このファイルには、プロジェクトの設定やビルド手順が含まれます。

CMakeLists.txt
# CMakeのバージョンを指定
cmake_minimum_required(VERSION 3.0...3.5)

# プロジェクト名を指定
project(MyProject)

# 実行ファイルの生成
add_executable(my_app main.cpp)

ソースコードの作成

編集

プロジェクトルートに main.cpp ファイルを作成し、簡単なC++コードを追加します。

main.cpp
// main.cpp
#include <iostream>

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.cpphelper.cpp を含むプロジェクトを考えます。

ディレクトリ構造の作成

編集

プロジェクトディレクトリを作成し、ソースファイルを配置します。

my_project/
    ├── CMakeLists.txt
    ├── main.cpp
    ├── helper.cpp
    └── helper.h


CMakeLists.txtの設定

編集

プロジェクトのルートにある 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.cpphelper.cpp) を以下のように記述します。

main.cpp
#include <iostream>
#include "helper.h"

int main() {
    sayHello();
    return 0;
}
helper.cpp
// helper.cpp
#include <iostream>

void sayHello() {
    std::cout << "Hello from helper!" << std::endl;
}

ヘッダーファイルの作成

編集

関数のプロトタイプを含むヘッダーファイル helper.h を作成します。

helper.h
// helper.h
#ifndef HELPER_H
#define HELPER_H

void sayHello();

#endif // HELPER_H

ビルド

編集

ビルドを行うために、ビルドディレクトリを作成してCMakeを実行します。

% mkdir build
% cd build
% cmake ..
% cmake --build .

これで、main.cpphelper.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
* Unix Makefiles               = Generates standard UNIX makefiles.
  Ninja                        = Generates build.ninja files.
  Ninja Multi-Config           = Generates build-<Config>.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 です。