メジャーバージョンアップをスマートに!CMakeで`CMAKE_PROJECT_VERSION_MAJOR`変数を使いこなす


CMAKE_PROJECT_VERSION_MAJORは、CMakeプロジェクトのバージョン情報の一部を構成する変数です。具体的には、プロジェクトのメジャーバージョンを表します。

バージョン番号の構成

CMakeプロジェクトのバージョン情報は、以下の3つのコンポーネントで構成されます。

  • パッチバージョン (CMAKE_PROJECT_VERSION_PATCH): マイナーバージョン内の細かな修正を表します。
  • マイナーバージョン (CMAKE_PROJECT_VERSION_MINOR): メジャーバージョン内のマイナーな変更を表します。
  • メジャーバージョン (CMAKE_PROJECT_VERSION_MAJOR): プロジェクトの主要な変更を表します。

設定方法

CMAKE_PROJECT_VERSION_MAJOR変数は、プロジェクトのトップレベルCMakeLists.txtファイル内のproject()コマンドで設定します。

project(MyProject VERSION 1.2.3)

上記の例では、MyProjectという名前のプロジェクトのバージョン情報が1.2.3に設定されます。この場合、CMAKE_PROJECT_VERSION_MAJOR1CMAKE_PROJECT_VERSION_MINOR2CMAKE_PROJECT_VERSION_PATCH3となります。

使用方法

CMAKE_PROJECT_VERSION_MAJOR変数は、プロジェクトのバージョン情報をビルドプロセスやアプリケーションコードに組み込むために使用できます。

以下の例では、CMAKE_PROJECT_VERSION_MAJOR変数を用いて、アプリケーションのバージョン情報を出力するコードを示します。

#include <iostream>

int main() {
  std::cout << "Version: " << CMAKE_PROJECT_VERSION_MAJOR << "." << CMAKE_PROJECT_VERSION_MINOR << "." << CMAKE_PROJECT_VERSION_PATCH << std::endl;
  return 0;
}
  • CMAKE_PROJECT_VERSION_MAJOR変数は、CMAKE_PROJECT_VERSION変数の一部として使用されます。
  • CMAKE_PROJECT_VERSION_MAJOR変数は、プロジェクトのトップレベルCMakeLists.txtファイルで一度だけ設定する必要があります。
  • CMAKE_PROJECT_VERSION_MAJOR変数は、CMake 3.12以降で使用可能です。
  • CMakeのバージョンによって、仕様が変更される可能性があります。
  • 上記の情報は、CMake 3.24.1時点のものです。


cmake_minimum_required(VERSION 3.12)

project(MyProject VERSION 1.2.3)

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)

バージョン情報を出力するアプリケーション

#include <iostream>

int main() {
  std::cout << "Version: " << CMAKE_PROJECT_VERSION_MAJOR << "." << CMAKE_PROJECT_VERSION_MINOR << "." << CMAKE_PROJECT_VERSION_PATCH << std::endl;
  return 0;
}

ヘッダーファイルでバージョン情報マクロを定義

#ifndef PROJECT_VERSION_H
#define PROJECT_VERSION_H

#define PROJECT_NAME "MyProject"
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 2
#define PROJECT_VERSION_PATCH 3

#endif

アプリケーションコードでバージョン情報マクロを使用

#include "project_version.h"

#include <iostream>

int main() {
  std::cout << PROJECT_NAME << " Version: " << PROJECT_VERSION_MAJOR << "." << PROJECT_VERSION_MINOR << "." << PROJECT_VERSION_PATCH << std::endl;
  return 0;
}

CMakeLists.txtファイルでバージョン情報を出力するターゲットを設定

add_executable(version_info main.cpp)
target_sources(version_info main.cpp)

target_link_libraries(version_info ${CMAKE_THREAD_LIBS})

add_test(version_info_test version_info COMMAND ${CMAKE_BINARY_DIR}/version_info)

ビルドと実行

mkdir build
cd build
cmake ..
make
./version_info

出力例

MyProject Version: 1.2.3

説明

  1. project()コマンドでプロジェクトの名前とバージョン情報を設定します。
  2. アプリケーションコードでCMAKE_PROJECT_VERSION_MAJOR変数を使用して、バージョン情報を出力します。
  3. ヘッダーファイルでバージョン情報マクロを定義します。
  4. アプリケーションコードでバージョン情報マクロを使用して、バージョン情報を出力します。
  5. CMakeLists.txtファイルでバージョン情報を出力するターゲットを設定します。
  6. ビルドと実行を行い、バージョン情報を出力します。
  • 実際のプロジェクトでは、必要に応じてコードを修正する必要があります。
  • CMakeのバージョンによって、仕様が変更される可能性があります。
  • 上記の情報は、CMake 3.24.1時点のものです。


CMake GUIを使用する

CMake GUIを使用すると、CMAKE_PROJECT_VERSION_MAJOR変数を視覚的に設定することができます。

手順

  1. CMake GUIを開きます。
  2. プロジェクトのCMakeLists.txtファイルを選択します。
  3. 左側のツリービューでProjectノードを選択します。
  4. 右側のペインでVersionフィールドにバージョン情報を入力します。
  5. Generateボタンをクリックして、CMakeプロジェクトを生成します。

CMakeLists.txtファイルを手動で編集する

CMakeLists.txtファイルを手動で編集して、CMAKE_PROJECT_VERSION_MAJOR変数を設定することもできます。

set(CMAKE_PROJECT_VERSION_MAJOR 1)

CMAKE_SET_VERSION_INFORMATIONコマンドを使用する

CMAKE_SET_VERSION_INFORMATIONコマンドを使用すると、プロジェクトのバージョン情報を詳細に設定することができます。

cmake_minimum_required(VERSION 3.15)

project(MyProject VERSION 1.2.3)

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)

cmake_set_version_information(
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY ${PROJECT_VERSION}
  SODIUM ${PROJECT_VERSION})

外部スクリプトを使用する

外部スクリプトを使用して、CMAKE_PROJECT_VERSION_MAJOR変数を設定することもできます。

import sys

version_major = 1
version_minor = 2
version_patch = 3

print("CMAKE_PROJECT_VERSION_MAJOR:{}".format(version_major))
print("CMAKE_PROJECT_VERSION_MINOR:{}".format(version_minor))
print("CMAKE_PROJECT_VERSION_PATCH:{}".format(version_patch))

このスクリプトをversion.pyという名前で保存し、CMakeLists.txtファイルで以下のように呼び出します。

include(version.py)
  • 外部スクリプトを使用する場合は、スクリプトのセキュリティに注意する必要があります。
  • 上記の方法を使用する場合は、CMakeのバージョン要件を確認する必要があります。