CMakeポリシー CMP0097 を使用せずにターゲットのソースツリー内に存在しないファイルをソースファイルリストに追加する方法
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> は、除外したいテストの名前を記述する正規表現のリストです。