CMake: ターゲットプロパティ設定の落とし穴 - set_target_properties()を使いこなすための注意点


set_target_properties()コマンドは、CMakeにおいてターゲットプロパティを設定するために使用されます。ターゲットプロパティは、ターゲットのビルド方法や動作を制御する情報です。このコマンドを使用することで、ターゲットの出力名、ライブラリの種類、依存関係、コンパイルフラグなどを設定することができます。

構文

set_target_properties(TARGETS target1 target2 ... PROPERTIES property1 value1 property2 value2 ...)

引数

  • PROPERTIES: 設定するプロパティとその値を指定します。プロパティ名と値はペアで指定する必要があります。複数のプロパティを指定する場合は、スペース区切りで指定します。
  • TARGETS: プロパティを設定するターゲットを指定します。複数のターゲットをカンマ区切りで指定することができます。

以下の例では、myprogramというターゲットの出力名をmyprogram.exeに設定しています。

set_target_properties(myprogram PROPERTIES OUTPUT_NAME myprogram.exe)

以下の例では、mylibraryというターゲットを共有ライブラリとして設定しています。

set_target_properties(mylibrary PROPERTIES TYPE SHARED_LIBRARY)

以下の例では、myprogramというターゲットがmylibraryというターゲットに依存するように設定しています。

set_target_properties(myprogram PROPERTIES LINK_LIBRARIES mylibrary)

以下の例では、myprogramというターゲットをコンパイルする際に、-Wallというコンパイルフラグを指定しています。

set_target_properties(myprogram PROPERTIES COMPILE_FLAGS -Wall)

set_target_properties()コマンドの詳細については、CMakeの公式ドキュメントを参照してください。

  • ターゲットプロパティの値は、後でget_target_property()コマンドを使用して取得することができます。
  • ターゲットプロパティの中には、CMakeによって自動的に設定されるものもあります。
  • set_target_properties()コマンドは、ターゲットが生成される前にのみ呼び出すことができます。


cmake_minimum_required(VERSION 3.0)

project(myproject)

add_executable(myprogram main.cpp)
set_target_properties(myprogram PROPERTIES OUTPUT_NAME myprogram.exe)

add_library(mylibrary library.cpp)
set_target_properties(mylibrary PROPERTIES TYPE SHARED_LIBRARY)

例2:依存関係を設定

この例では、myprogramというプログラムがmylibraryというライブラリに依存するように設定します。

cmake_minimum_required(VERSION 3.0)

project(myproject)

add_executable(myprogram main.cpp)
add_library(mylibrary library.cpp)

target_link_libraries(myprogram mylibrary)

例3:コンパイルフラグを設定

この例では、myprogramというプログラムをコンパイルする際に、-Wallというコンパイルフラグを指定します。

cmake_minimum_required(VERSION 3.0)

project(myproject)

add_executable(myprogram main.cpp)
set_target_properties(myprogram PROPERTIES COMPILE_FLAGS -Wall)

例4:インストールディレクトリを設定

この例では、myprogramというプログラムとmylibraryというライブラリを、/usr/localディレクトリにインストールするように設定します。

cmake_minimum_required(VERSION 3.0)

project(myproject)

add_executable(myprogram main.cpp)
set_target_properties(myprogram PROPERTIES INSTALL_DIR /usr/local)

add_library(mylibrary library.cpp)
set_target_properties(mylibrary PROPERTIES INSTALL_DIR /usr/local)


ターゲットプロパティファイルを使用する

ターゲットプロパティファイルは、cmake_minimum_required()コマンドよりも前に読み込まれるファイルで、ターゲットプロパティを設定するために使用することができます。この方法を使用する利点は、コードをより読みやすく、整理しやすいことです。

# ターゲットプロパティファイル (mytarget.cmake)

set(MYTARGET_OUTPUT_NAME mytarget.exe)
set(MYTARGET_TYPE SHARED_LIBRARY)
set(MYTARGET_LINK_LIBRARIES mylibrary)
set(MYTARGET_COMPILE_FLAGS -Wall)
# CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(myproject)

include(mytarget.cmake)

add_executable(mytarget main.cpp)

ターゲットコマンドを使用する

ターゲットコマンドは、ターゲットに関するさまざまな操作を実行するために使用することができます。これらのコマンドの中には、ターゲットプロパティを設定するためのものもあります。

# ターゲットコマンドを使用する

cmake_minimum_required(VERSION 3.0)

project(myproject)

add_executable(myprogram main.cpp)

target_link_libraries(myprogram mylibrary)
target_compile_flags(myprogram PUBLIC -Wall)

target_properties(myprogram PROPERTIES OUTPUT_NAME myprogram.exe TYPE SHARED_LIBRARY)

ターゲットスコープを使用する

ターゲットスコープは、特定のターゲットにのみ適用されるプロパティを設定するために使用することができます。

# ターゲットスコープを使用する

cmake_minimum_required(VERSION 3.0)

project(myproject)

add_executable(myprogram main.cpp)

target_link_libraries(myprogram mylibrary)
target_compile_flags(myprogram PUBLIC -Wall)

target_properties(myprogram PROPERTIES OUTPUT_NAME myprogram.exe)
target_properties(mylibrary PROPERTIES TYPE SHARED_LIBRARY)

CMakeの変数を使用する

CMakeの変数は、さまざまな値を格納するために使用することができます。ターゲットプロパティを設定するために、CMake変数を使用することもできます。

# CMake変数を使用する

cmake_minimum_required(VERSION 3.0)

project(myproject)

set(MYTARGET_OUTPUT_NAME myprogram.exe)
set(MYTARGET_TYPE SHARED_LIBRARY)
set(MYTARGET_LINK_LIBRARIES mylibrary)
set(MYTARGET_COMPILE_FLAGS -Wall)

add_executable(myprogram main.cpp)

target_link_libraries(myprogram ${MYTARGET_LINK_LIBRARIES})
target_compile_flags(myprogram PUBLIC ${MYTARGET_COMPILE_FLAGS})

target_properties(myprogram PROPERTIES OUTPUT_NAME ${MYTARGET_OUTPUT_NAME} TYPE ${MYTARGET_TYPE})

どの方法を使用すべきか

どの方法を使用するかは、状況によって異なります。コードの可読性や保守性を重視する場合は、ターゲットプロパティファイルを使用するのが良いでしょう。シンプルな設定であれば、ターゲットコマンドを使用する方が簡潔で済みます。ターゲットスコープは、特定のターゲットにのみ適用されるプロパティを設定する必要がある場合に役立ちます。CMake変数は、柔軟性と再利用性を求める場合に適しています。