CMakeの「CMAKE_EXPORT_NO_PACKAGE_REGISTRY」を使いこなして、開発をもっと効率化しよう!

2024-04-02

CMakeの変数「CMAKE_EXPORT_NO_PACKAGE_REGISTRY」徹底解説

CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、CMake の "Variables" における重要な変数の 1 つです。これは、export(PACKAGE) コマンドの動作を制御し、特定の状況下でパッケージレジストリへの書き込みを抑制するために使用されます。

詳細解説

機能

CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、以下の 2 つの状況で特に役立ちます。

  • パッケージング: パッケージングシステムが独自のレジストリを使用する場合、CMake のレジストリへの書き込みは不要です。
  • システム全体のインストール: システム全体のインストールでは、通常、ユーザーレジストリへの書き込みは望ましくありません。

設定方法

CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、CMakeLists.txt ファイル内で以下の方法で設定できます。

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON)

この設定を有効にすると、export(PACKAGE) コマンドは何も実行せず、パッケージレジストリへの書き込みは行われません。

注意点

  • CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、CMake 3.1 以降でのみ使用できます。
  • この変数を設定すると、find_package() コマンドが正しく動作しなくなる可能性があります。
  • システム全体のインストールでは、CMAKE_INSTALL_PREFIX と組み合わせて使用するのが一般的です。

以下は、CMAKE_EXPORT_NO_PACKAGE_REGISTRY を使用して、システム全体のインストールを行う例です。

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON)
set(CMAKE_INSTALL_PREFIX /usr/local)

install(TARGETS my_target
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

この例では、my_target/usr/local/bin にインストールされ、ライブラリは /usr/local/lib にインストールされます。レジストリへの書き込みは行われません。

CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、特定の状況下でパッケージレジストリへの書き込みを抑制するために使用できる便利な変数です。使用方法を理解することで、CMake の柔軟性をさらに活用することができます。



CMake の CMAKE_EXPORT_NO_PACKAGE_REGISTRY を使ったサンプルコード

基本的なサンプル

# CMakeLists.txt

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON)

add_library(my_library SHARED src/my_library.c)

target_link_libraries(my_library PUBLIC other_library)

install(TARGETS my_library
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

システム全体のインストール

# CMakeLists.txt

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON)
set(CMAKE_INSTALL_PREFIX /usr/local)

add_library(my_library SHARED src/my_library.c)

target_link_libraries(my_library PUBLIC other_library)

install(TARGETS my_library
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

この例では、my_library/usr/local にインストールします。レジストリへの書き込みは行われません。

パッケージングシステムとの連携

# CMakeLists.txt

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

find_package(PkgConfig REQUIRED)

pkg_check_modules(PKG_CONFIG_MODULE pkg-config)

add_library(my_library SHARED src/my_library.c)

target_link_libraries(my_library PUBLIC PKG_CONFIG_MODULE)

install(TARGETS my_library
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

export(PACKAGE my_library)

この例では、PkgConfig を使用して外部ライブラリ pkg-config を検索し、my_library にリンクします。CMAKE_EXPORT_NO_PACKAGE_REGISTRY が設定されているため、レジストリへの書き込みは行われません。

まとめ

CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、特定の状況下でパッケージレジストリへの書き込みを抑制するために使用できる便利な変数です。上記のサンプルコードを参考に、さまざまな状況で活用してみてください。



CMake の CMAKE_EXPORT_NO_PACKAGE_REGISTRY 以外の方法

install(EXPORT) コマンドを使用して、ターゲットの情報をファイルに書き出すことができます。このファイルは、後から find_package() コマンドによって読み込まれます。

# CMakeLists.txt

add_library(my_library SHARED src/my_library.c)

install(TARGETS my_library
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

install(EXPORT my_library
        DESTINATION etc/my_library)

この例では、my_library の情報を /etc/my_library に書き出します。

カスタム CMake モジュールを作成して、レジストリへの書き込みを制御することもできます。

# my_module.cmake

set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON)

function(my_install_target target)
    install(TARGETS ${target}
            RUNTIME DESTINATION bin
            LIBRARY DESTINATION lib
            ARCHIVE DESTINATION lib)
endfunction()

export(TARGETS my_library
        NAMESPACE my::library
        FILE my_module.cmake)

この例では、my_module.cmake という名前のカスタム CMake モジュールを作成し、my_install_target という関数を使用してターゲットをインストールします。

手動によるレジストリの編集

レジストリエディタを使用して、手動でレジストリを編集することもできます。ただし、これは推奨されない方法です。

CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、レジストリへの書き込みを抑制する最も簡単な方法です。ただし、他の方法も存在し、状況に応じて使い分ける必要があります。




CMake include() で効率的なビルドを実現

include() は CMake の重要なコマンドの一つで、他の CMake ファイルやモジュールを読み込むために使用されます。 これにより、コードを分割し、再利用性と保守性を向上させることができます。機能他の CMake ファイルを読み込んで、その中のコマンドを実行する



CMake find_libraryコマンドとfind_packageモジュールの比較

find_library() コマンドは、CMake で外部ライブラリを見つけるために使用されます。これは、プロジェクトに必要なライブラリを自動的に検出して、ビルドプロセスを簡略化するのに役立ちます。コマンドフォーマット<VAR>: 検索結果を格納する変数名


CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。


CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。


CMakeの「Commands」における「cmake_path()」関数

試合形式試合時間は前半40分、後半40分の計80分です。ハーフタイムは15分以内です。試合は2チームで行われ、それぞれ15人の選手がフィールドに出ます。選手は、ボールを持って走る、パスする、キックするなどのプレーができます。相手選手をタックルして倒すこともできます。



CMake の INTERFACE_SYSTEM_INCLUDE_DIRECTORIES とは?

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES は、CMake のターゲットプロパティの一つであり、他のターゲットがこのターゲットを依存関係として使用する際に、コンパイル時に自動的に追加されるシステムヘッダーディレクトリを指定します。これは、ターゲットが提供するインターフェースの一部として公開されるヘッダーファイルへのパスを指定するために使用されます。


CTest ダッシュボードクライアントスクリプトのベストプラクティス:CTEST_SUBMIT_INACTIVITY_TIMEOUT を含めた効率的な設定

設定方法:例:デフォルト値:CTEST_SUBMIT_INACTIVITY_TIMEOUT のデフォルト値は 300秒 (5分) です。詳細:CTest サーバーとの通信が途絶えた場合、クライアントは再接続を試みます。再接続の試行回数は CTEST_SUBMIT_MAX_RETRIES で設定できます。


CMake ディレクトリラベル: コードの整理整頓は CMAKE_DIRECTORY_LABELS にお任せ

CMAKE_DIRECTORY_LABELS は CMake 3.10 以降で導入された変数で、現在のディレクトリにラベルを設定するために使用されます。設定方法CMAKE_DIRECTORY_LABELS は、以下の形式で設定できます。ここで、label1 と label2 は、ディレクトリに関連付けるラベルです。 複数のラベルを設定する場合は、スペースで区切ります。


CMakeでソースファイルの検証:ポリシーCMP0132、その他の方法、サンプルコード

CMake ポリシー CMP0132 は、target_sources コマンドでソースファイルのリストに追加されたファイルが、ターゲットのソースツリー内にあることを検証するオプションです。このポリシーは、誤ったパスや重複するエントリによるビルドエラーを防ぐために役立ちます。


CMakeでテスト実行中に特定の警告メッセージでテストを失敗させる方法

概要目的: 特定の警告メッセージが出力された場合に、テストを失敗させる使用場面: テスト実行中に特定の警告メッセージが出力されることが想定される場合設定方法: CMakeLists. txtファイルでset()コマンドを使用動作: テスト実行中に標準出力または標準エラー出力に指定された警告メッセージが出力された場合、テストが失敗する