CMake: variable_requires() コマンドでプロジェクトのコードをより読みやすく、保守しやすくする


variable_requires() コマンドは、CMake プロジェクトにおいて、特定のオプションが有効化されている場合に、必要な変数が設定されていることを確認するために使用されます。オプションが有効化されていない場合、このコマンドは何も実行しません。

構文

variable_requires(
  <TEST_VARIABLE>
  <RESULT_VARIABLE>
  <VARIABLE1>
  ...
  <VARIABLEN>
)

引数

  • <VARIABLE1> ... <VARIABLEN>: 必要な変数の名前。これらの変数が TRUE または NOTFOUND に設定されていない場合、エラーが報告されます。
  • <RESULT_VARIABLE>: すべての必要な変数が設定されている場合に TRUE に設定される変数。
  • <TEST_VARIABLE>: テスト対象のオプションの名前。この変数が FALSE の場合、何も実行されません。

option(MY_OPTION "Enable my option" OFF)

variable_requires(
  MY_OPTION
  MY_OPTION_REQUIRED
  MY_OPTION_VARIABLE1
  MY_OPTION_VARIABLE2
)

if (MY_OPTION_REQUIRED)
  message(STATUS "All required variables for MY_OPTION are set")
else()
  message(STATUS "MY_OPTION is not enabled, so required variables are not checked")
endif()

この例では、MY_OPTION オプションが有効化されている場合、MY_OPTION_REQUIRED 変数が TRUE に設定され、MY_OPTION_VARIABLE1MY_OPTION_VARIABLE2 変数が設定されていることを確認します。MY_OPTION オプションが有効化されていない場合、このコマンドは何も実行しません。

  • variable_requires() コマンドは、オプションが有効化されていない場合にエラーを報告する代わりに、警告メッセージを表示するように設定することもできます。
  • variable_requires() コマンドは、オプションとその必要な変数の関係を明示的に記述することで、CMake プロジェクトのコードをより読みやすく、保守しやすくすることができます。
  • variable_requires() コマンドは、CMake 3.30 以降で使用できます。


option(MY_OPTION "Enable my option" OFF)

variable_requires(
  MY_OPTION
  MY_OPTION_REQUIRED
  MY_OPTION_VARIABLE1
  MY_OPTION_VARIABLE2
)

if (MY_OPTION_REQUIRED)
  message(STATUS "All required variables for MY_OPTION are set")
else()
  message(STATUS "MY_OPTION is not enabled, so required variables are not checked")
endif()

説明

  • MY_OPTION オプションが有効化されていない場合、このコマンドは何も実行しません。
  • この例では、MY_OPTION オプションが有効化されている場合、MY_OPTION_REQUIRED 変数が TRUE に設定され、MY_OPTION_VARIABLE1MY_OPTION_VARIABLE2 変数が設定されていることを確認します。

例2:オプションが有効化されていない場合に警告メッセージを表示する

option(MY_OPTION "Enable my option" OFF)

variable_requires(
  MY_OPTION
  MY_OPTION_REQUIRED
  MY_OPTION_VARIABLE1
  MY_OPTION_VARIABLE2
  WARNING
)

if (MY_OPTION_REQUIRED)
  message(STATUS "All required variables for MY_OPTION are set")
else()
  message(WARNING "MY_OPTION is not enabled, so required variables are not set")
endif()

説明

  • MY_OPTION オプションが有効化されていない場合、このコマンドは警告メッセージを表示します。
  • この例では、MY_OPTION オプションが有効化されていない場合、MY_OPTION_REQUIRED 変数が TRUE に設定され、MY_OPTION_VARIABLE1MY_OPTION_VARIABLE2 変数が設定されていることを確認します。

例3:オプションと必要な変数の関係を関数内で記述する

function(my_option_check)
  option(MY_OPTION "Enable my option" OFF)

  variable_requires(
    MY_OPTION
    MY_OPTION_REQUIRED
    MY_OPTION_VARIABLE1
    MY_OPTION_VARIABLE2
  )

  if (MY_OPTION_REQUIRED)
    message(STATUS "All required variables for MY_OPTION are set")
  else()
    message(STATUS "MY_OPTION is not enabled, so required variables are not checked")
  endif()
endfunction()

my_option_check()
  • my_option_check 関数は、CMakeLists.txt ファイル内の任意の場所から呼び出すことができます。
  • この例では、my_option_check 関数を使用して、MY_OPTION オプションと必要な変数の関係を記述します。


variable_requires() コマンドは、CMake プロジェクトにおいて、特定のオプションが有効化されている場合に、必要な変数が設定されていることを確認するために使用されます。しかし、このコマンドにはいくつかの制限があります。

  • variable_requires() コマンドは、オプションとその必要な変数の関係を明示的に記述する必要があります。
  • variable_requires() コマンドは、CMake 3.30 以降で使用できます。

これらの制限を回避するために、variable_requires() コマンドの代替方法をいくつか紹介します。

代替方法 1:if() ステートメントと set() コマンドを使用する

option(MY_OPTION "Enable my option" OFF)

if (MY_OPTION)
  set(MY_OPTION_REQUIRED TRUE)
  set(MY_OPTION_VARIABLE1 SET)
  set(MY_OPTION_VARIABLE2 SET)
else()
  message(STATUS "MY_OPTION is not enabled, so required variables are not set")
endif()

if (MY_OPTION_REQUIRED)
  message(STATUS "All required variables for MY_OPTION are set")
else()
  message(ERROR "Some required variables for MY_OPTION are not set")
endif()

説明

  • MY_OPTION オプションが有効化されていない場合、このコマンドは警告メッセージを表示します。
  • この例では、if() ステートメントと set() コマンドを使用して、MY_OPTION オプションが有効化されている場合に、MY_OPTION_REQUIRED 変数が TRUE に設定され、MY_OPTION_VARIABLE1MY_OPTION_VARIABLE2 変数が設定されていることを確認します。

代替方法 2:check_variable() コマンドを使用する

option(MY_OPTION "Enable my option" OFF)

check_variable(MY_OPTION_VARIABLE1 REQUIRED)
check_variable(MY_OPTION_VARIABLE2 REQUIRED)

if (MY_OPTION)
  message(STATUS "All required variables for MY_OPTION are set")
else()
  message(STATUS "MY_OPTION is not enabled, so required variables are not checked")
endif()

説明

  • MY_OPTION オプションが有効化されていない場合、このコマンドは何も実行しません。
  • MY_OPTION オプションが有効化されている場合、このコマンドは MY_OPTION_REQUIRED 変数が TRUE に設定されていることを確認します。
  • この例では、check_variable() コマンドを使用して、MY_OPTION_VARIABLE1MY_OPTION_VARIABLE2 変数が設定されていることを確認します。

代替方法 3:カスタム関数を使用する

function(my_option_check)
  option(MY_OPTION "Enable my option" OFF)

  if (MY_OPTION)
    set(MY_OPTION_REQUIRED TRUE)
    check_variable(MY_OPTION_VARIABLE1 REQUIRED)
    check_variable(MY_OPTION_VARIABLE2 REQUIRED)
  else()
    message(STATUS "MY_OPTION is not enabled, so required variables are not checked")
  endif()

  if (MY_OPTION_REQUIRED)
    message(STATUS "All required variables for MY_OPTION are set")
  else()
    message(ERROR "Some required variables for MY_OPTION are not set")
  endif()
endfunction()

my_option_check()

説明

  • my_option_check 関数は、CMakeLists.txt ファイル内の任意の場所から呼び出すことができます。
  • この例では、my_option_check 関数を使用して、MY_OPTION オプションと必要な変数の関係を記述します。

variable_requires() コマンドは、CMake プロジェクトにおいて、特定のオプションが有効化されている場合に、必要な変数が設定されていることを確認するために便利なコマンドです。しかし、このコマンドにはいくつかの制限があります。これらの制限を回避するために、if() ステートメントと set() コマンド、check_variable() コマンド、カスタム関数を使用するなどの代替方法があります。

  • [CMake check_variable command