CMake: LOCATION プロパティの代わりに何を使うべき? バージョンごとの適切な方法を解説


CMakeポリシー CMP0026 は、CMake 3.0 で導入されたもので、ビルドターゲットの LOCATION プロパティの使用を禁止 するものです。このプロパティは、ターゲットの出力ファイルの場所を取得するために使用されていましたが、非推奨となり、将来のバージョンで削除される可能性があります。

旧動作と新動作

  • 新動作(CMake 3.0 以降): LOCATION プロパティの使用は警告され、代わりに以下の方法でターゲットの出力ファイルの場所を取得する必要があります。
    • <TARGET_FILE> ジェネレータ式を使用する
    • GET_TARGET_PROPERTY コマンドと FILEPATH プロパティを使用する
  • 旧動作(CMake 3.0 以前): LOCATION プロパティを使用して、ターゲットの出力ファイルの場所を取得することができました。

警告の抑制

以下の方法で、CMP0026 ポリシーによる警告を抑制することができます。

  • -Wno-dev オプションを cmake コマンドに渡す
  • cmake_policy コマンドを使用して、ポリシーを CMP0026_NEW または CMP0026_OLD に設定する

影響を受けるコード

LOCATION プロパティを明示的に使用している CMake コードは、このポリシーの影響を受けます。影響を受けるコードを特定するには、CMake の警告メッセージを確認する必要があります。

修正方法

影響を受けるコードは、以下のいずれかの方法で修正する必要があります。

  • GET_TARGET_PROPERTY コマンドと FILEPATH プロパティを使用する
  • <TARGET_FILE> ジェネレータ式を使用する

以下のコードは、LOCATION プロパティを使用してターゲットの出力ファイルの場所を取得しています。

get_target_property(MY_TARGET_LOCATION MyTarget LOCATION)

このコードは、以下のいずれかの方法で修正する必要があります。

# `<TARGET_FILE>` ジェネレータ式を使用する
add_custom_command(TARGET MyTarget COMMAND ${MY_TARGET_LOCATION})

# `GET_TARGET_PROPERTY` コマンドと `FILEPATH` プロパティを使用する
get_target_property(MY_TARGET_FILEPATH MyTarget FILEPATH)
add_custom_command(TARGET MyTarget COMMAND ${MY_TARGET_FILEPATH})


cmake_minimum_required(VERSION 3.0)

project(MyProject)

add_executable(MyTarget mytarget.cpp)

# ターゲットの出力ファイルの場所を取得する
get_target_property(MyTarget_Location MyTarget FILEPATH)

# ターゲットの出力ファイルの場所を出力する
message(STATUS "MyTarget output location: ${MyTarget_Location}")

例2:ターゲットの出力ファイルを使用してカスタムコマンドを実行する

以下のコードは、<TARGET_FILE> ジェネレータ式を使用して、ターゲットの出力ファイルを使用してカスタムコマンドを実行する方法を示しています。

cmake_minimum_required(VERSION 3.0)

project(MyProject)

add_executable(MyTarget mytarget.cpp)

# ターゲットの出力ファイルを使用してカスタムコマンドを実行する
add_custom_command(
    TARGET MyTarget
    COMMAND ${MyTarget} # ターゲットの名前を使用する
)

例3:LOCATION プロパティの使用を抑制する

以下のコードは、cmake_policy コマンドを使用して、CMP0026 ポリシーを CMP0026_OLD に設定し、LOCATION プロパティの使用に関する警告を抑制する方法を示しています。

cmake_minimum_required(VERSION 3.0)

project(MyProject)

cmake_policy(SET CMP0026_OLD)

add_executable(MyTarget mytarget.cpp)

# LOCATION プロパティを使用してターゲットの出力ファイルの場所を取得する
get_target_property(MyTarget_Location MyTarget LOCATION)

# ターゲットの出力ファイルの場所を出力する
message(STATUS "MyTarget output location: ${MyTarget_Location}")
  • 実際のプロジェクトでは、CMake のベストプラクティスに従ってコードを書くことが重要です。
  • これらの例は、単なる例であり、実際のプロジェクトで使用されるコードとは異なる場合があります。


CMakeポリシー CMP0026 は、CMake 3.0 で導入されたもので、ビルドターゲットの LOCATION プロパティの使用を禁止 するものです。このプロパティは、ターゲットの出力ファイルの場所を取得するために使用されていましたが、非推奨となり、将来のバージョンで削除される可能性があります。

代替方法

LOCATION プロパティの代替方法として、以下の方法を使用することができます。

  • ターゲットのインストールディレクトリを使用する
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY 変数を使用する
  • CMAKE_EXE_LINK_DIRECTORIES 変数を使用する
  • GET_TARGET_PROPERTY コマンドと FILEPATH プロパティを使用する
  • <TARGET_FILE> ジェネレータ式を使用する

各方法の詳細

  • <TARGET_FILE> ジェネレータ式: この方法は、ターゲットの出力ファイルの場所を直接取得することができます。以下の例のように、ターゲットの名前と出力ファイルの拡張子を指定するだけで使用できます。
add_custom_command(
    TARGET MyTarget
    COMMAND ${MyTarget} # ターゲットの名前を使用する
)
  • GET_TARGET_PROPERTY コマンドと FILEPATH プロパティ: この方法は、より汎用的な方法でターゲットの出力ファイルの場所を取得することができます。以下の例のように、ターゲットの名前と FILEPATH プロパティを指定する必要があります。
get_target_property(MyTarget_Location MyTarget FILEPATH)
add_custom_command(
    TARGET MyTarget
    COMMAND ${MyTarget_Location} # ターゲットの出力ファイルの場所を使用する
)
  • CMAKE_EXE_LINK_DIRECTORIES 変数: この方法は、実行可能ファイルターゲットの場合にのみ使用することができます。この変数は、ターゲットの実行可能ファイルがリンクされるディレクトリの一覧を格納しています。以下の例のように、list(GET) コマンドを使用して、最初のディレクトリを取得することができます。
list(GET CMAKE_EXE_LINK_DIRECTORIES 0 MyTarget_Location)
add_custom_command(
    TARGET MyTarget
    COMMAND ${MyTarget_Location} # ターゲットの出力ファイルの場所を使用する
)
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY 変数: この方法は、共有ライブラリターゲットの場合にのみ使用することができます。この変数は、ターゲットの共有ライブラリが配置されるディレクトリを格納しています。以下の例のように、直接使用することができます。
add_custom_command(
    TARGET MyTarget
    COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/MyTarget # ターゲットの出力ファイルの場所を使用する
)
  • ターゲットのインストールディレクトリ: ターゲットがインストールされる場合、ターゲットのインストールディレクトリを使用して、出力ファイルの場所を取得することができます。以下の例のように、CMAKE_INSTALL_PREFIX 変数とターゲットの名前を使用して、インストールディレクトリを取得することができます。
get_target_property(MyTarget_InstallDir MyTarget INSTALL_DIRECTORY)
add_custom_command(
    TARGET MyTarget
    COMMAND ${MyTarget_InstallDir}/bin/MyTarget # ターゲットの出力ファイルの場所を使用する
)

推奨される方法

どの方法を使用するかは、状況によって異なります。一般的には、以下の方法が推奨されます。

  • GET_TARGET_PROPERTY コマンドと FILEPATH プロパティ: より汎用的な方法が必要な場合に使用します。
  • <TARGET_FILE> ジェネレータ式: 最も簡潔でわかりやすい方法です。
  • 実際のプロジェクトでは、CMake のベストプラクティスに従ってコードを書くことが重要です。
  • 代替方法を使用する場合は、CMake の最新バージョンを使用していることを確認してください。
  • LOCATION プロパティは、CMake 3.0 以降では非推奨であり、将来のバージョンで削除される可能性があります。