CMakeポリシー CMP0097 を使用せずにターゲットのソースツリー内に存在しないファイルをソースファイルリストに追加する方法

2024-04-02

CMakeポリシー CMP0097の詳細解説

CMakeポリシーCMP0097は、target_sources コマンドでソースファイルのリストに追加されたファイルが、ターゲットのソースツリー内に存在することを必須とするポリシーです。このポリシーは、CMakeがソースファイルを見つけるのを容易にし、ビルドエラーを防ぐために役立ちます。

有効化

このポリシーは、CMakeLists.txtファイルで以下のコマンドを使用することで有効化できます。

cmake_policy(CMP0097 NEW)

影響を受けるコマンド

以下のコマンドは、CMP0097ポリシーの影響を受けます。

  • target_sources
  • add_custom_command
  • add_custom_target

動作

CMP0097ポリシーが有効化されている場合、target_sources コマンドでソースファイルのリストに追加されたファイルが、ターゲットのソースツリー内に存在しない場合は、エラーが発生します。

以下の例は、CMP0097ポリシーが有効化されている場合にエラーが発生する例です。

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(myexe
  main.c
)

target_sources(myexe PRIVATE ../otherdir/myfile.c)

この例では、myfile.c ファイルは myexe ターゲットのソースツリー内に存在しないため、エラーが発生します。

回避策

CMP0097ポリシーによるエラーを回避するには、以下の方法があります。

  • ソースファイルをターゲットのソースツリー内に移動する。
  • set_source_files_properties コマンドを使用して、ソースファイルの場所を指定する。
  • CMP0097 ポリシーを無効にする。

無効化

CMP0097ポリシーは、以下のコマンドを使用することで無効化できます。

cmake_policy(CMP0097 OLD)

注意事項

CMP0097ポリシーを無効化すると、CMakeがソースファイルを見つけるのが困難になり、ビルドエラーが発生する可能性が高くなります。



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

サンプルコード 1: ポリシー有効化

cmake_minimum_required(VERSION 3.10)

project(myproject)

cmake_policy(CMP0097 NEW)

add_executable(myexe
  main.c
)

target_sources(myexe PRIVATE ../otherdir/myfile.c)

サンプルコード 2: ポリシー無効化

cmake_minimum_required(VERSION 3.10)

project(myproject)

cmake_policy(CMP0097 OLD)

add_executable(myexe
  main.c
)

target_sources(myexe PRIVATE ../otherdir/myfile.c)

このコードは、CMP0097ポリシーを無効化し、../otherdir/myfile.c ファイルを myexe ターゲットのソースファイルに追加します。このファイルはターゲットのソースツリー内に存在しないため、エラーは発生しません。

サンプルコード 3: set_source_files_properties コマンドの使用

cmake_minimum_required(VERSION 3.10)

project(myproject)

cmake_policy(CMP0097 NEW)

add_executable(myexe
  main.c
)

set_source_files_properties(../otherdir/myfile.c PROPERTIES SOURCE_DIR .)

target_sources(myexe PRIVATE ../otherdir/myfile.c)

このコードは、CMP0097ポリシーを有効化し、../otherdir/myfile.c ファイルを myexe ターゲットのソースファイルに追加します。set_source_files_properties コマンドを使用して、このファイルの場所をターゲットのソースツリー内に設定します。

CMakeポリシー CMP0097は、CMakeがソースファイルを見つけるのを容易にし、ビルドエラーを防ぐために役立ちます。このポリシーを有効化すると、ターゲットのソースツリー内に存在しないファイルをソースファイルリストに追加しようとすると、エラーが発生します。



CMakeでターゲットのソースツリー内に存在しないファイルをソースファイルリストに追加する他の方法

set_source_files_properties コマンドを使用して、ソースファイルの場所をターゲットのソースツリー内に設定できます。

set_source_files_properties(../otherdir/myfile.c PROPERTIES SOURCE_DIR .)

target_sources(myexe PRIVATE ../otherdir/myfile.c)

この例では、../otherdir/myfile.c ファイルの場所をターゲットのソースツリーのルートディレクトリに設定しています。

add_custom_command コマンドを使用して、ソースファイルをターゲットのソースツリー内にコピーするカスタムコマンドを作成できます。

add_custom_command(
  TARGET myexe
  POST_BUILD
  COMMAND cp ../otherdir/myfile.c .
)

target_sources(myexe PRIVATE myfile.c)

この例では、../otherdir/myfile.c ファイルをターゲットのビルドディレクトリにコピーするカスタムコマンドを作成しています。

外部プロジェクトとして追加する

ターゲットのソースツリー内に存在しないファイルは、外部プロジェクトとして追加することもできます。

add_external_project(
  NAME mylib
  SOURCE_DIR ../otherdir
  BUILD_COMMAND cmake -S . -B build
  INSTALL_COMMAND cmake -P cmake_install.cmake
)

target_link_libraries(myexe mylib)

この例では、../otherdir ディレクトリにある mylib プロジェクトを外部プロジェクトとして追加しています。

  • ソースファイルがターゲットのソースツリーの一部としてビルドされる必要がある場合は、set_source_files_properties コマンドを使用するのが最良の方法です。
  • ソースファイルがターゲットのソースツリーの一部としてビルドされる必要がない場合は、add_custom_command コマンドを使用するのが最良の方法です。
  • ソースファイルが複雑なプロジェクトの場合は、外部プロジェクトとして追加するのが最良の方法です。

CMakeでターゲットのソースツリー内に存在しないファイルをソースファイルリストに追加するには、いくつかの方法があります。どの方法を使用するべきかは、状況によって異なります。




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

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



CMakeコマンド「ctest_submit()」でテスト結果をCDashサーバーに送信

ctest_submit()は、CMakeの「Commands」カテゴリに属するコマンドで、テスト結果をCDashなどのダッシュボードサーバーに送信するために使用されます。テスト実行後の結果を可視化、共有したい場合に役立ちます。基本構文オプション解説


CMake: find_library()とtarget_link_directories()の連携

target_link_directories()コマンドは、CMakeプロジェクト内のターゲットに対して、リンカがライブラリを検索するディレクトリを指定するために使用されます。これは、ターゲットがリンクするライブラリが標準の検索パスに存在しない場合に特に重要です。


CMakeにおける"get_target_property()"コマンド: ターゲットの情報を自在に操る

get_target_property()コマンドは、CMakeプロジェクトで定義されたターゲットからプロパティを取得するために使用されます。ターゲットプロパティは、ターゲットのビルド方法や動作を制御するために使用される情報です。構文引数VAR: ターゲットプロパティの値を格納する変数名


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

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



CMake ポリシー CMP0060 とは?

CMake ポリシー CMP0060 は、CMake 3.3 で導入されたポリシーで、ライブラリのリンク方法に影響を与えます。このポリシーは、デフォルトで OLD 動作に設定されていますが、NEW 動作に変更することもできます。OLD 動作と NEW 動作の違い


FindDoxygen 以外の Doxygen の使い道

FindDoxygen は、以下の情報を提供します。Doxygen の実行可能ファイルのパスDoxygen ヘッダーファイルのパスDoxygen 設定ファイルのパスこれらの情報は、CMake の他のモジュールやプロジェクトのビルド設定で使用できます。


CMake ディレクトリラベル: コードの整理整頓は CMAKE_DIRECTORY_LABELS にお任せ

CMAKE_DIRECTORY_LABELS は CMake 3.10 以降で導入された変数で、現在のディレクトリにラベルを設定するために使用されます。設定方法CMAKE_DIRECTORY_LABELS は、以下の形式で設定できます。ここで、label1 と label2 は、ディレクトリに関連付けるラベルです。 複数のラベルを設定する場合は、スペースで区切ります。


CMakeにおける CMAKE_MATCH_COUNT 変数の詳細解説

CMAKE_MATCH_COUNTは、CMakeのVariablesにおいて、正規表現マッチングの成功回数を格納する変数です。string(REGEX)やlist(FILTER)などのコマンドで正規表現を用いた処理を行った際に、マッチングした要素の数を取得できます。


CMake: CTEST_CUSTOM_TESTS_IGNOREを使ってテストを制御する方法

CTEST_CUSTOM_TESTS_IGNORE は、CMake の ctest_test() コマンドで実行されるテストを制御するための変数です。これは、特定のテストをテスト実行から除外したい場合に役立ちます。構文説明<REGULAR_EXPRESSION_LIST> は、除外したいテストの名前を記述する正規表現のリストです。