CMakeLists.txt の基本的な書き方

2024-04-17

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 以降では、これらのフラグはデフォルト値から除外され、代わりに抽象化された方法で提供されるようになりました。