CMakeLists.txt の基本的な書き方
CMakeポリシー CMP0135 は、CMake 3.29.2 で導入された比較的新しいポリシーです。このポリシーは、CMake がターゲットソースディレクトリ内の CMakeLists.txt
ファイルを処理する方法を制御します。
旧動作 (OLD)
このポリシーが設定されていない場合、または OLD
に設定されている場合は、CMake はターゲットソースディレクトリ内の CMakeLists.txt
ファイルをすべて処理します。これは、サブディレクトリ内の CMakeLists.txt
ファイルも処理することを意味します。
新動作 (NEW)
このポリシーが NEW
に設定されている場合、CMake はターゲットソースディレクトリ内の CMakeLists.txt
ファイルのみを処理します。サブディレクトリ内の CMakeLists.txt
ファイルは処理されません。
利点
CMP0135 ポリシーには、いくつかの利点があります。
- ビルド時間の短縮: サブディレクトリ内の
CMakeLists.txt
ファイルを処理する必要がないため、ビルド時間が短縮されます。 - エラーの削減: サブディレクトリ内の
CMakeLists.txt
ファイルが原因で発生するエラーを削減できます。
設定方法
CMP0135 ポリシーを設定するには、以下のいずれかの方法を使用します。
CMakeLists.txt
ファイルでcmake_policy()
コマンドを使用します。
cmake_policy(CMP0135 NEW)
- コマンドラインで
-DCMAKE_POLICY_CMP0135=NEW
オプションを使用します。
cmake -DCMAKE_POLICY_CMP0135=NEW .
注意事項
CMP0135 ポリシーを使用する前に、以下の点に注意してください。
- サブディレクトリ内の
CMakeLists.txt
ファイルに依存している場合は、そのファイルの内容をターゲットソースディレクトリ内のCMakeLists.txt
ファイルに統合する必要があります。 - サブディレクトリ内の
CMakeLists.txt
ファイルを使用してカスタムモジュールをインストールしている場合は、そのモジュールをターゲットソースディレクトリにインストールする必要があります。
例
以下の例は、CMP0135 ポリシーを使用して、ターゲットソースディレクトリ内の CMakeLists.txt
ファイルのみを処理する方法を示しています。
cmake_policy(CMP0135 NEW)
project(myproject)
add_executable(mytarget mytarget.cpp)
この例では、CMakeLists.txt
ファイル内の add_executable()
コマンドのみが処理されます。サブディレクトリ内の CMakeLists.txt
ファイルは処理されません。
CMP0135 ポリシーの詳細については、CMake ドキュメント: https://cmake.org/cmake/help/latest/policy/CMP0135.html を参照してください。
補足
- CMP0135 ポリシーは、CMake 3.29.2 以降でのみ使用できます。
- このポリシーは、CMake の古いバージョンとの互換性を考慮して導入されました。
- CMP0135 ポリシーを使用すると、ビルドが高速化、簡素化され、エラーが削減されます。
この説明が、CMake ポリシー CMP0135 を理解するのに役立つことを願っています。
CMakeLists.txt のサンプルコード
シンプルなプロジェクト
この例は、main.cpp
という名前のソースファイルからなるシンプルなプロジェクトをビルドする方法を示しています。
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(mytarget main.cpp)
サブディレクトリ
この例は、サブディレクトリにソースファイルがあるプロジェクトをビルドする方法を示しています。
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_subdirectory(src)
src
ディレクトリには、CMakeLists.txt
ファイルと、ビルドするソースファイルが含まれています。
ライブラリ
この例は、ライブラリをビルドする方法を示しています。
cmake_minimum_required(VERSION 3.10)
project(mylibrary)
add_library(mylibrary STATIC src/mylib.cpp)
target_include_directories(mylibrary PUBLIC include)
このライブラリは、src/mylib.cpp
という名前のソースファイルから構成されています。ライブラリヘッダーファイルは、include
ディレクトリにあります。
実行可能プログラム
この例は、ライブラリを使用して実行可能プログラムをビルドする方法を示しています。
cmake_minimum_required(VERSION 3.10)
project(myprogram)
add_executable(myprogram main.cpp)
target_link_libraries(myprogram mylibrary)
このプログラムは、main.cpp
という名前のソースファイルと、mylibrary
ライブラリを使用してビルドされます。
インストール
この例は、プロジェクトをインストールする方法を示しています。
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(mytarget main.cpp)
install(TARGETS mytarget DESTINATION lib)
install(DIRECTORY include DESTINATION include)
このプロジェクトは、/lib
ディレクトリに mytarget
という名前の実行可能ファイルと、/include
ディレクトリにヘッダーファイルをインストールします。
CMakeLists.txt を使用するその他の方法
以下は、その例です。
- オプションと変数
CMakeLists.txt ファイルを使用して、プロジェクトのビルド方法を制御するオプションと変数を設定できます。たとえば、以下のオプションを使用して、デバッグビルドまたはリリースビルドを構成できます。
cmake_minimum_required(VERSION 3.10)
project(myproject)
option(BUILD_DEBUG "Build in debug mode" ON)
if(BUILD_DEBUG)
message(STATUS "Building in debug mode")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
else()
message(STATUS "Building in release mode")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
endif()
add_executable(mytarget main.cpp)
- カスタムターゲット
CMakeLists.txt ファイルを使用して、カスタムターゲットを作成できます。カスタムターゲットは、ファイルの生成、スクリプトの実行、またはその他のタスクを実行するために使用できます。たとえば、以下のカスタムターゲットを使用して、ドキュメントを生成できます。
cmake_minimum_required(VERSION 3.10)
project(myproject)
add_executable(mytarget main.cpp)
add_custom_target(docs
COMMAND doxygen ${CMAKE_SOURCE_DIR}/docs
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/docs
DEPENDS mytarget
)
この例では、doxygen
コマンドを使用してドキュメントが生成され、docs
ディレクトリに配置されます。
- 外部プロジェクト
CMakeLists.txt ファイルを使用して、外部プロジェクトを取り込むことができます。これにより、他のプロジェクトのビルドとリンクを簡単に行うことができます。たとえば、以下の方法で Boost ライブラリを取り込むことができます。
cmake_minimum_required(VERSION 3.10)
project(myproject)
find_package(Boost REQUIRED COMPONENTS system)
add_executable(mytarget main.cpp)
target_link_libraries(mytarget Boost::system)
この例では、find_package()
コマンドを使用して Boost ライブラリが検索され、target_link_libraries()
コマンドを使用してターゲットにリンクされます。
- テスト
CMakeLists.txt ファイルを使用して、プロジェクトのテストを作成できます。CTest テストフレームワークを使用して、単体テスト、統合テスト、およびパフォーマンス テストを実行できます。
上記の例はほんの一例です。CMakeLists.txt ファイルを使用してできることは他にもたくさんあります。
CMake find_file() コマンドの代替方法:もっと柔軟なファイル検索
<variable>: 検索結果を格納する CMake 変数<file_names>: 検索するファイル名のリスト (スペース区切り)<path_list>: 検索するパス名のリスト (スペース区切り)<options>: 検索オプション (後述)
CMakeコマンド mark_as_advanced() の詳細解説
mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。
CMakeコマンド「ctest_submit()」でテスト結果をCDashサーバーに送信
ctest_submit()は、CMakeの「Commands」カテゴリに属するコマンドで、テスト結果をCDashなどのダッシュボードサーバーに送信するために使用されます。テスト実行後の結果を可視化、共有したい場合に役立ちます。基本構文オプション解説
【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める
引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。
CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法
try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。
CMake Modules FindwxWidgets の使い方
FindwxWidgets は、CMake モジュールの一つで、wxWidgets ライブラリのインストール場所を検出して、プロジェクトに必要な情報を設定します。これにより、プロジェクト内で wxWidgets を簡単に使用することができます。
CMakeにおけるターゲットとライブラリのリンク:INTERFACE_LINK_LIBRARIESのすべて
CMakeのターゲットプロパティ「INTERFACE_LINK_LIBRARIES」は、ターゲットをビルドする際に必要なライブラリを指定するために使用されます。これは、ターゲットが依存する他のライブラリとのリンクを確立し、実行に必要な共有オブジェクトや静的ライブラリを指示するために重要です。
CMake の CMAKE_GENERATOR_TOOLSET 変数に関する FAQ
CMAKE_GENERATOR_TOOLSET は CMake の変数であり、特定のジェネレータが使用するネイティブビルドシステムのツールセットを指定します。これは、特定のコンパイラやツールチェーンを選択したり、ビルドプロセスをカスタマイズしたりするために使用できます。
共有ライブラリのリンカーフラグを設定する方法 - CMakeにおけるCMAKE_SHARED_LINKER_FLAGS変数の詳細解説
CMAKE_SHARED_LINKER_FLAGSは、CMakeで共有ライブラリを生成する際に使用されるリンカーフラグを設定する変数です。この変数に設定されたフラグは、すべての共有ライブラリのリンク時に渡されます。設定方法CMAKE_SHARED_LINKER_FLAGS変数は、以下の方法で設定できます。
新しいCMakeポリシー CMP0141:MSVCデバッグ情報フォーマットの互換性を向上
CMakeポリシー CMP0141は、CMake 3.25で導入された新しいポリシーで、MSVCデバッグ情報フォーマットの扱いに関する互換性を提供します。背景CMake 3.24 以前では、デバッグ情報フォーマットフラグは自動的にデフォルトの CMAKE_<LANG>_FLAGS_<CONFIG> キャッシュエントリに追加されていました。しかし、CMake 3.25 以降では、これらのフラグはデフォルト値から除外され、代わりに抽象化された方法で提供されるようになりました。