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


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

構文

unset(VARIABLE_NAME [CACHE] [PARENT_SCOPE])

引数

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

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

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

# 親スコープから変数を削除
unset(MY_VARIABLE PARENT_SCOPE)
  • キャッシュ変数を削除すると、その変数はCMake Cacheから削除されます。これは、その変数が次回CMakeが実行されるときに再評価されることを意味します。
  • unset()コマンドは、変数がどこで定義されたかに関係なく、その変数を削除します。
  • 変数が存在しない場合は、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というキャッシュ変数を定義し、その後unset()コマンドを使用して削除します。

# 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 --

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

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

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

# 親スコープで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 --


代替方法

  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()コマンドよりも柔軟性がありますが、より複雑なコードを書く必要があります。

  • パフォーマンス: パフォーマンスが重要な場合は、if() ステートメントを使用して変数の設定をスキップすることを検討してください。
  • 柔軟性: より複雑なロジックが必要な場合は、カスタムコマンドを使用する必要があります。
  • シンプルさ: 最も単純な方法は、変数を空の文字列に再定義することです。
  • CMakeLists.txt ファイルで変数を定義する代わりに、プロジェクトのビルド設定で変数を定義することもできます。この場合、unset()コマンドを使用して変数を削除することはできません。
  • CMake 3.18 以降では、unset()コマンドの代わりに remove_cache_entry()コマンドを使用することができます。このコマンドは、キャッシュ変数を削除する際に、より多くのオプションと制御を提供します。