CMake ポリシー CMP0007 とは? 空要素の扱いと設定方法

2024-04-07

CMakeポリシー CMP0007 は、CMakeLists.txt ファイルにおける空要素の扱いに関する互換性維持のためのポリシーです。このポリシーは CMake 2.4 で導入されました。

旧挙動 (OLD)

CMake 2.4 以前では、; で区切られたリストにおいて、空要素は無視されていました。例えば、以下のリストは長さ 3 となります。

a;b;;c

新挙動 (NEW)

CMake 3.0 以降では、空要素もリスト要素としてカウントされます。そのため、上記のリストは長さ 4 となります。

影響を受けるコード

以下のコードは、CMake 2.4 以前と CMake 3.0 以降で異なる挙動を示します。

set(list "a;b;;c")
list(LENGTH list length)
message("リストの長さは ${length} です")
  • CMake 2.4 以前: length は 3 となります。

ポリシーの使用方法

CMP0007 ポリシーは、以下の方法で設定できます。

個別に設定

cmake_policy(SET CMP0007 OLD)

上記のコマンドは、CMP0007 ポリシーを旧挙動に設定します。

CMake バージョンで指定

cmake_policy(VERSION 3.0)

上記のコマンドは、CMake 3.0 までのすべてのポリシーを新挙動に設定します。

推奨事項

CMake 3.0 以降を使用している場合は、CMP0007 ポリシーを新挙動に設定することを推奨します。

補足

  • CMakeLists.txt ファイルで空要素を意図的に使用している場合は、CMP0007 ポリシーを旧挙動に設定する必要があります。
  • CMP0007 ポリシーは、CMake のバージョンによってデフォルトの挙動が異なります。詳細は、CMake ドキュメントを参照してください。


CMake ポリシー CMP0007 サンプルコード

cmake_minimum_required(VERSION 3.0)

set(list "a;b;;c")
list(LENGTH list length)
message("リストの長さは ${length} です")

出力

リストの長さは 4 です

解説

このサンプルコードは、CMake 3.0 以降で動作します。list 変数には 4 つの要素が格納されます。

cmake_minimum_required(VERSION 2.8)

set(list "a;b;;c")
list(LENGTH list length)
message("リストの長さは ${length} です")

出力

リストの長さは 3 です

解説

このサンプルコードは、CMake 2.8 で動作します。list 変数には 3 つの要素が格納されます。

cmake_minimum_required(VERSION 3.0)

cmake_policy(SET CMP0007 OLD)

set(list "a;b;;c")
list(LENGTH list length)
message("リストの長さは ${length} です")

出力

リストの長さは 3 です

解説

このサンプルコードは、CMake 3.0 以降で動作します。CMP0007 ポリシーを旧挙動に設定しているので、list 変数には 3 つの要素が格納されます。

cmake_minimum_required(VERSION 3.0)

# 空要素を削除

list(REMOVE_ITEM list "")

list(LENGTH list length)
message("リストの長さは ${length} です")

出力

リストの長さは 3 です

解説

このサンプルコードは、CMake 3.0 以降で動作します。list 変数から空要素を削除してから長さを取得しているので、length は 3 となります。

CMP0007 ポリシーは、CMakeLists.txt ファイルにおける空要素の扱いに関する互換性維持のためのポリシーです。CMake 3.0 以降を使用している場合は、CMP0007 ポリシーを新挙動に設定することを推奨します。



CMakeLists.txt ファイルにおける空要素の扱い

空要素を無視する

set(list "a;b;;c")

# 空要素を無視して処理
foreach(item IN LISTS list)
  message(${item})
endforeach()

出力

a
b
c

空要素を削除する

set(list "a;b;;c")

# 空要素を削除
list(REMOVE_ITEM list "")

foreach(item IN LISTS list)
  message(${item})
endforeach()

出力

a
b
c

空要素を別の文字列に置き換える

set(list "a;b;;c")

# 空要素を "-" に置き換える
list(FOREACH item IN LISTS list
  IF(item STREQUAL "")
    set(item "-")
  ENDIF()
ENDFOREACH())

foreach(item IN LISTS list)
  message(${item})
endforeach()

出力

a
b
-
c

空要素を要素として扱う

set(list "a;b;;c")

# 空要素を要素として扱う
cmake_policy(SET CMP0007 NEW)

foreach(item IN LISTS list)
  message(${item})
endforeach()

出力

a
b
;
c
  • 空要素を無視したい場合は、1. の方法を使用します。
  • 空要素を別の文字列に置き換えた



【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める

引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。



CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。


CMakeコマンド mark_as_advanced() の詳細解説

mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。


CMakeの"Commands"における"fltk_wrap_ui()"プログラミングを徹底解説!

この解説では、CMakeの"Commands"における"fltk_wrap_ui()"プログラミングについて、分かりやすく説明します。"fltk_wrap_ui()"は、CMakeでFLTK GUIアプリケーションをビルドするために使用されるマクロです。このマクロは、FLTK GUI定義ファイルをC++コードに変換し、プロジェクトに組み込みます。


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

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



CTestでテストケースを効率的に実行するためのベストプラクティス

CTEST_CHANGE_ID は、以下の方法で設定できます。CMakeLists. txtファイル内で直接設定する:テストケースのソースファイル内で設定する:CTEST_CHANGE_ID は、以下の方法で使用されます。ctest コマンドを実行する際に、--ctest-change-id オプションを指定することで、特定の変更IDを持つテストケースのみを実行することができます。


CMakeの環境変数:LD_LIBRARY_PATH、CPATH、CMAKE_PREFIX_PATHの役割と設定方法

CMAKE_PREFIX_PATHの概要CMAKE_PREFIX_PATHは、find_package()、find_program()、find_library()、find_file()、**find_path()**などのコマンドが、必要なライブラリやヘッダーファイルなどを検索する際に使用するディレクトリを指定します。これは、複数のディレクトリに分散してインストールされたライブラリやヘッダーファイルを、一括して検索できるようにするためのものです。


CMake ModulesでOSG Viewerを簡単に見つける: FindosgViewer徹底解説

本解説では、FindosgViewer の仕組み、使い方、設定オプション、およびその他の関連情報について詳しく説明します。FindosgViewer は以下の役割を担います。OSG Viewer ライブラリの自動検出 パス指定なしでOSG Viewer ライブラリを見つけられるようにします。 異なるOSやプラットフォームにおけるビルドを簡略化します。


CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES とは?メモリ管理の誤りを検出する Xcode の機能

CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES は CMake の変数で、Xcode プロジェクトで生成されるスキームの「診断」セクションで「Malloc Guard Edges」機能を有効にするかどうかを制御します。


Objective-C++コンパイラフラグチェックのサンプルコード

CheckOBJCXXCompilerFlag は、CMake の Modules に含まれるマクロで、C++ コンパイラが特定の Objective-C++ コンパイラフラグをサポートするかどうかを検出するために使用されます。これは、プロジェクトが特定の機能を使用するかどうかを判断したり、コンパイル時に適切なフラグを設定したりするために役立ちます。