階層化された複数のCMakeLists.txtで同じコンパイルオプションを共有する方法

ChatGPTさんに質問した情報をメモに残す。
TODO: あとで自分で試して推敲する。

メモ

最も一般的な方法は、最上位のCMakeLists.txtで共通のコンパイルオプションを設定し、それらを下位のディレクトリに伝播させることです。 最上位のCMakeLists.txtで、以下のように共通のコンパイルオプションを設定することができます。

cmake_minimum_required(VERSION 3.2)
project(TopLevelProject)

# 共通のコンパイルオプションを設定
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -std=c++11")

# サブディレクトリを追加
add_subdirectory(subdir1)
add_subdirectory(subdir2)

この方法では、CMAKE_CXX_FLAGS変数にコンパイルオプションを追加し、その後でadd_subdirectoryを使ってサブディレクトリを追加します。これにより、設定されたコンパイルオプションがサブディレクトリのCMakeLists.txtにも適用されます。

また、target_compile_options コマンドを使用して、特定のターゲットに対してコンパイルオプションを設定することもできます。この方法では、最上位のCMakeLists.txtでインターフェイスライブラリを作成し、そのライブラリにコンパイルオプションを設定します。その後、サブディレクトリのターゲットでそのインターフェイスライブラリをリンクすることで、コンパイルオプションを共有できます。

最上位のCMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
project(TopLevelProject)

# インターフェイスライブラリを作成
add_library(common_options INTERFACE)

# 共通のコンパイルオプションを設定
target_compile_options(common_options INTERFACE -Wall -Wextra -std=c++11)

# サブディレクトリを追加
add_subdirectory(subdir1)
add_subdirectory(subdir2)

サブディレクトリのCMakeLists.txt:

# サブディレクトリのターゲットを作成
add_executable(subdir1_target main1.cpp)

# 共通のコンパイルオプションをリンク
target_link_libraries(subdir1_target common_options)

この方法では、common_options インターフェイスライブラリに設定されたコンパイルオプションが、サブディレクトリのターゲットに適用されます。