CMake: 親スコープから変数を削除する方法 - "unset()"コマンドと"PARENT_SCOPE"オプション

2024-07-04

CMakeにおける"unset()"コマンドの解説

unset()コマンドは、CMakeにおいて変数、キャッシュ変数、環境変数を削除するために使用されます。これらの変数は、プロジェクトの設定やビルドプロセスを制御するために使用されます。

構文

unset(VARIABLE_NAME [CACHE] [PARENT_SCOPE])

引数

  • VARIABLE_NAME: 削除する変数の名前
  • CACHE: オプション。このオプションが指定されると、キャッシュ変数が削除されます。指定されない場合は、通常の変数が削除されます。
  • PARENT_SCOPE: オプション。このオプションが指定されると、変数が親スコープから削除されます。

# 通常の変数を削除
unset(MY_VARIABLE)

# キャッシュ変数を削除
unset(MY_CACHE_VARIABLE CACHE)

# 親スコープから変数を削除
unset(MY_VARIABLE PARENT_SCOPE)

補足

  • 変数が存在しない場合は、unset()コマンドはエラーを発生しません。
  • unset()コマンドは、変数がどこで定義されたかに関係なく、その変数を削除します。
  • キャッシュ変数を削除すると、その変数はCMake Cacheから削除されます。これは、その変数が次回CMakeが実行されるときに再評価されることを意味します。

"unset()"コマンドのユースケース

  • 特定の条件下でのみ使用される変数を初期化解除する
  • 不要になった変数をクリーンアップする
  • 親スコープから継承された変数をオーバーライドする

"unset()"コマンドに関する注意点

  • unset()コマンドを使用する前に、変数が存在していることを確認してください。
  • キャッシュ変数を削除すると、その変数の値が失われます。
  • unset()コマンドは、変数が使用されているかどうかを確認しません。変数が使用されている場合、その変数を削除すると予期しない結果が生じる可能性があります。


    例1:通常の変数の初期化解除

    この例では、MY_VARIABLEという変数を定義し、その後unset()コマンドを使用して削除します。

    # MY_VARIABLEという変数を定義する
    set(MY_VARIABLE "Hello, world!")
    
    # MY_VARIABLEを削除する
    unset(MY_VARIABLE)
    
    # MY_VARIABLEの値を出力する
    message(STATUS "MY_VARIABLE: ${MY_VARIABLE}")
    

    このコードを実行すると、次の出力が得られます。

    -- Build finished successfully --
    

    MY_VARIABLE変数が削除されたため、message()コマンドは空の文字列を出力します。

    例2:キャッシュ変数の削除

    # MY_CACHE_VARIABLEというキャッシュ変数を定義する
    set(MY_CACHE_VARIABLE "Hello, world!" CACHE STRING "My Cache Variable")
    
    # MY_CACHE_VARIABLEを削除する
    unset(MY_CACHE_VARIABLE CACHE)
    
    # MY_CACHE_VARIABLEの値を出力する
    message(STATUS "MY_CACHE_VARIABLE: ${MY_CACHE_VARIABLE}")
    
    -- Build finished successfully --
    

    例3:親スコープから変数を削除

    # 親スコープでMY_VARIABLEを定義する
    set(MY_VARIABLE "Hello, world!")
    
    # 現在のスコープでMY_VARIABLEを削除する
    unset(MY_VARIABLE PARENT_SCOPE)
    
    # MY_VARIABLEの値を出力する
    message(STATUS "MY_VARIABLE: ${MY_VARIABLE}")
    
    -- Build finished successfully --
    

    MY_VARIABLE変数が親スコープで定義されているため、message()コマンドは"Hello, world!"を出力します。



    "unset()"コマンドの代替方法

    代替方法

    1. 変数を再定義する

    最も単純な代替方法は、変数を再定義して空の文字列を設定することです。

    # 変数を空の文字列に再定義する
    set(MY_VARIABLE "")
    

    この方法は、キャッシュ変数と通常の変数の両方に使用できます。

    1. if() ステートメントを使用する

    変数が使用されていないことがわかっている場合は、if() ステートメントを使用して変数の設定をスキップすることができます。

    if(NOT DEFINED MY_VARIABLE)
      # MY_VARIABLEは未定義なので、設定しない
    else()
      # MY_VARIABLEは定義されているので、削除する
      unset(MY_VARIABLE)
    endif()
    

    この方法は、変数がまだ初期化されていない可能性がある場合に役立ちます。

    1. カスタムコマンドを使用する

    より複雑なロジックが必要な場合は、カスタムコマンドを作成して変数を削除することができます。

    register_command(MY_UNSET_COMMAND
      "MY_VARIABLEの説明"
      REQUIRED_ARGS 1
      OPTIONS NONE
      )
    
    command(MY_UNSET_COMMAND
      "MY_VARIABLEを削除する"
      MY_VARIABLE
      )
    

    この方法は、unset()コマンドよりも柔軟性がありますが、より複雑なコードを書く必要があります。

    "unset()"コマンドの代替方法を選択する際の考慮事項

    • シンプルさ: 最も単純な方法は、変数を空の文字列に再定義することです。
    • 柔軟性: より複雑なロジックが必要な場合は、カスタムコマンドを使用する必要があります。
    • パフォーマンス: パフォーマンスが重要な場合は、if() ステートメントを使用して変数の設定をスキップすることを検討してください。

    補足

    • CMake 3.18 以降では、unset()コマンドの代わりに remove_cache_entry()コマンドを使用することができます。このコマンドは、キャッシュ変数を削除する際に、より多くのオプションと制御を提供します。
    • CMakeLists.txt ファイルで変数を定義する代わりに、プロジェクトのビルド設定で変数を定義することもできます。この場合、unset()コマンドを使用して変数を削除することはできません。