CMakeのコードをよりクリーンで保守しやすいものにする:CMP0140ポリシー


CMakeポリシー「CMP0140」は、return()コマンドの引数処理に関する動作を制御するために使用されます。このポリシーはCMake 3.25で導入され、古い動作との互換性を保つためにデフォルトで無効化されています。

旧動作

このポリシーが設定されていない場合、return()コマンドは渡された引数を無視し、以前の動作と互換性を保ちます。

新動作

このポリシーが設定されている場合、return()コマンドは渡された引数をチェックし、引数が存在する場合は警告を出力します。これは、意図せずに渡された可能性のある余分な引数を検出するのに役立ちます。

設定方法

このポリシーを設定するには、CMakeLists.txtファイルで次の行を追加します。

cmake_policy(SET CMP0140 NEW)

cmake_minimum_required(VERSION 3.25)

cmake_policy(SET CMP0140 NEW)

project(myproject)

add_executable(myprogram myprogram.cpp)

上記の例では、CMP0140ポリシーがNEWに設定されているため、return()コマンドは渡された引数をチェックし、引数が存在する場合は警告を出力します。

注意事項

このポリシーは、CMake 3.25以降でのみ使用できます。古いバージョンのCMakeを使用している場合は、このポリシーを使用できません。

利点

  • コードの可読性と保守性を向上させることができます。
  • 意図せずに渡された可能性のある余分な引数を検出するのに役立ちます。
  • 既存のCMakeプロジェクトでこのポリシーを使用すると、警告が発生する可能性があります。


cmake_minimum_required(VERSION 3.25)

cmake_policy(SET CMP0140 NEW)

project(myproject)

add_executable(myprogram myprogram.cpp)

target_link_libraries(myprogram some_library)

# 警告は発生しません。
return()

例2:return()コマンドに引数あり

cmake_minimum_required(VERSION 3.25)

cmake_policy(SET CMP0140 NEW)

project(myproject)

add_executable(myprogram myprogram.cpp)

target_link_libraries(myprogram some_library)

# 警告が発生します。
return(1)

例3:return()コマンドに複数の引数あり

cmake_minimum_required(VERSION 3.25)

cmake_policy(SET CMP0140 NEW)

project(myproject)

add_executable(myprogram myprogram.cpp)

target_link_libraries(myprogram some_library)

# 警告が発生します。
return(1 2 3)

上記の例では、CMP0140ポリシーがNEWに設定されているため、return()コマンドに引数が渡されると警告が出力されます。

  • 警告を抑制するには、CMAKE_RETURN_ARGS_COUNT変数を0に設定できます。
  • 警告メッセージには、渡された引数の数と内容が表示されます。
set(CMAKE_RETURN_ARGS_COUNT 0)
  • 警告をエラーに変換するには、CMAKE_RETURN_ARGS_CHECK_FATAL_STYLE変数をTRUEに設定できます。
set(CMAKE_RETURN_ARGS_CHECK_FATAL_STYLE TRUE)

これらのオプションは、target_link_libraries()などのCMakeコマンド内でも使用できます。

target_link_libraries(myprogram some_library
  SET_RETURN_ARGS_COUNT 0)


このポリシーの代替方法はいくつかあります。

警告メッセージを抑制する

最も簡単な方法は、CMAKE_RETURN_ARGS_COUNT変数を0に設定して、警告メッセージを抑制することです。

set(CMAKE_RETURN_ARGS_COUNT 0)

独自のチェックを実装する

return()コマンドが呼び出されたときに独自のチェックを実装することもできます。これにより、より詳細な制御と柔軟性を提供できます。

macro(check_return_args)
  if(NOT ARGV0)
    message(WARNING "return() command called with no arguments.")
  else()
    message(WARNING "return() command called with unexpected arguments: ${ARGV0}")
  endif()
endmacro()

add_executable(myprogram myprogram.cpp)

target_link_libraries(myprogram some_library)

# 独自のチェックを実行します。
check_return_args()

return()

CMakeLists.txtファイルにコメントを追加する

return()コマンドが呼び出された場所にコメントを追加することで、意図を明確にすることもできます。

add_executable(myprogram myprogram.cpp)

target_link_libraries(myprogram some_library)

# 意図を明確にするためのコメント。
# このコマンドは意図的に引数なしで呼び出されます。
return()

C++の例外を使用する

C++の例外を使用して、意図しない引数処理を検出することもできます。

#include <stdexcept>

int main() {
  try {
    // 処理を行う
    return 0;
  } catch (const std::exception& e) {
    std::cerr << "Unexpected exception: " << e.what() << std::endl;
    return 1;
  }
}

何もしない

このポリシーを無視して、古い動作を使用することもできます。ただし、これは推奨されません。

これらの代替方法は、状況に応じて使用できます。最も適切な方法は、特定のニーズと要件によって異なります。

  • C++の例外を使用すると、コードが冗長になる可能性があります。
  • コメントを追加すると、コードの可読性が向上しますが、問題を解決するものではありません。
  • 独自のチェックを実装すると、コードが複雑になる可能性があります。
  • 警告メッセージを抑制すると、潜在的な問題を見逃す可能性があります。
  • CMP0140ポリシーは、CMake 3.25以降でのみ使用できます。古いバージョンのCMakeを使用している場合は、このポリシーを使用できません。