CMake: 変数 `CMAKE_EXPORT_NO_PACKAGE_REGISTRY` を使って、スマートなパッケージングとテストを実現


CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、CMake の export(PACKAGE) コマンドの動作を制御する変数です。この変数は、CMake 3.1 以降で使用できます。

用途

主に以下の2つの用途で使用されます。

  1. パッケージングとシステムワイドインストール

パッケージングやシステムワイドインストールを行う場合、ユーザーパッケージレジストリへの書き込みが不要な場合があります。そのような場合は、CMAKE_EXPORT_NO_PACKAGE_REGISTRY を設定することで、export(PACKAGE) コマンドが無効化され、レジストリへの書き込みが抑制されます。

  1. テストとデバッグ

テストやデバッグを行う際、一時的なパッケージ情報を作成したい場合があります。そのような場合は、CMAKE_EXPORT_NO_PACKAGE_REGISTRY を設定することで、レジストリへの書き込みを抑制し、一時的な情報のみを生成することができます。

動作

CMAKE_EXPORT_NO_PACKAGE_REGISTRY が設定されると、export(PACKAGE) コマンドは何も実行されなくなります。これは、パッケージ情報がレジストリに書き込まれないことを意味します。

ただし、CMP0090 変数が NEW に設定されている場合は、この変数の設定は無視されます。この場合、CMAKE_EXPORT_PACKAGE_REGISTRY 変数の設定が優先されます。

設定方法

CMAKE_EXPORT_NO_PACKAGE_REGISTRY 変数は、CMakeLists.txt ファイル内で設定できます。以下の例のように、set コマンドを使用して設定します。

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)

注意点

CMAKE_EXPORT_NO_PACKAGE_REGISTRY を設定すると、パッケージ情報がレジストリに書き込まれないため、以下の点に注意が必要です。

  • CMake の一部の機能が利用できなくなる可能性があります。
  • パッケージングツールやシステムワイドインストールツールでパッケージ情報が認識されない可能性があります。
  • 変数を設定する場合は、上記の説明と注意点をご確認ください。
  • この変数は、主にパッケージングとシステムワイドインストール、およびテストとデバッグで使用されます。
  • CMAKE_EXPORT_NO_PACKAGE_REGISTRY 変数は、CMake 3.1 以降で使用できます。
  • 複数の変数を同時に設定するには、set コマンドを複数回使用します。
  • 変数は、CMakeLists.txt ファイル内の任意の場所で設定できます。
  • CMake の変数は、大文字と小文字を区別します。
set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)
set(CMAKE_VERBOSE_OUTPUT TRUE)


# CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project(MyProject)

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)

add_executable(MyProject main.cpp)

install(TARGETS MyProject DESTINATION /usr/local/bin)

この例では、CMAKE_EXPORT_NO_PACKAGE_REGISTRY 変数を設定することで、レジストリへの書き込みを抑制し、パッケージングとシステムワイドインストールに必要なファイルのみを生成しています。

テストとデバッグ

# CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project(MyProject)

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY TRUE)

add_executable(MyProjectTest test/main.cpp)

add_test(MyProjectTest MyProjectTest)

この例では、CMAKE_EXPORT_NO_PACKAGE_REGISTRY 変数を設定することで、レジストリへの書き込みを抑制し、テストに必要な一時的なパッケージ情報のみを生成しています。

  • CMake の詳細については、公式ドキュメントを参照してください。


CMAKE_PACKAGE_USE_DEFAULT 変数を使う

CMAKE_PACKAGE_USE_DEFAULT 変数は、CMake 3.10 以降で使用できます。この変数は、パッケージ情報生成のデフォルト設定を制御します。

set(CMAKE_PACKAGE_USE_DEFAULT OFF)

上記のように設定すると、export(PACKAGE) コマンドは無効化され、レジストリへの書き込みが抑制されます。

export(PACKAGE) コマンドのオプションを使う

export(PACKAGE) コマンドには、REGISTER_LOCATION オプションがあります。このオプションを使用して、レジストリへの書き込み場所を指定することができます。

export(PACKAGE REGISTER_LOCATION <path>)

<path> には、レジストリへの書き込み場所を指定します。空文字列を指定すると、レジストリへの書き込みが抑制されます。

カスタム CMake モジュールを使う

カスタム CMake モジュールを作成して、パッケージ情報生成を制御することもできます。

パッケージングツールを使う

CMake 以外にも、パッケージングツールを使用することができます。これらのツールは、レジストリへの書き込みを制御する機能を提供している場合があります。

それぞれの方法の比較

方法メリットデメリット
CMAKE_EXPORT_NO_PACKAGE_REGISTRYシンプルCMake 3.1 以降でのみ使用可能
CMAKE_PACKAGE_USE_DEFAULT新しい方法CMake 3.10 以降でのみ使用可能
export(PACKAGE) コマンドのオプション柔軟性やや複雑
カスタム CMake モジュール柔軟性開発コストが高い
パッケージングツール使いやすいツールによって機能が異なる

最適な方法の選択

最適な方法は、状況によって異なります。

  • 使いやすさを重視する場合は、パッケージングツールを使用するのが良いでしょう。
  • 複雑なパッケージ情報生成が必要な場合は、カスタム CMake モジュールを使用するのが良いでしょう。
  • CMake 3.1 以降を使用している場合は、CMAKE_EXPORT_NO_PACKAGE_REGISTRY または CMAKE_PACKAGE_USE_DEFAULT 変数を使用するのがおすすめです。