CMakeのFIND_PACKAGEからのインクルードパスとライブラリパスを取得する際に統一された出力用語を得るための秘訣はありますか?CMakeのFIND_PACKAGEの統一
時にはFOO_INCLUDEです。時にはFOO_INCLUDE_PATHです。など
たとえば、FOO_INCLUDEとFOO_LIBが、FIND_PACKAGEの呼び出し後にFOO_FOUNDがTRUEに設定されているときに常に定義されるようにする方法を探したいと思います。
CMakeのFIND_PACKAGEからのインクルードパスとライブラリパスを取得する際に統一された出力用語を得るための秘訣はありますか?CMakeのFIND_PACKAGEの統一
時にはFOO_INCLUDEです。時にはFOO_INCLUDE_PATHです。など
たとえば、FOO_INCLUDEとFOO_LIBが、FIND_PACKAGEの呼び出し後にFOO_FOUNDがTRUEに設定されているときに常に定義されるようにする方法を探したいと思います。
はFoo::Foo
のようなIMPORTED
標的を提供行うインクルードパス、ライブラリなどの依存関係とその変数表記現代find_package
の実装を知る必要性を避けるために答え
に私のコメントを回します。しかし、これは - @ Tsyvarevがコメントしたように - CMakeのfind modulesのすべてを通して統一されたものとは限りません。だから、一般化
CMake's Sample Find Module implementation次のように上書きfind_package()
マクロバージョンを使用して
find_package()
通話を統一することができます:
cmake_minimum_required(VERSION 3.2)
project(UnifiedFindPackage)
macro(unify_vars _result)
set(${_result} "")
foreach(_i IN ITEMS ${ARGN})
if (${_i})
list(APPEND ${_result} "${${_i}}")
endif()
endforeach()
endmacro()
macro(find_package _name)
_find_package(${_name} ${ARGN})
if (${_name}_FOUND AND NOT TARGET ${_name}::${_name})
add_library(${_name}::${_name} STATIC IMPORTED GLOBAL)
unify_vars(_var ${_name}_LIBRARY ${_name}_LIB)
if (_var)
set_target_properties(${_name}::${_name} PROPERTIES IMPORTED_LOCATION "${_var}")
endif()
if (${_name}_LIBRARY_RELEASE)
set_property(TARGET ${_name}::${_name} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(${_name}::${_name} PROPERTIES IMPORTED_LOCATION_RELEASE "${${_name}_LIBRARY_RELEASE}")
endif()
if (${_name}_LIBRARY_DEBUG)
set_property(TARGET ${_name}::${_name} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
set_target_properties(${_name}::${_name} PROPERTIES IMPORTED_LOCATION_DEBUG "${${_name}_LIBRARY_DEBUG}")
endif()
if (${_name}_LIBRARIES)
set_property(TARGET ${_name}::${_name} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${${_name}_LIBRARIES}")
endif()
unify_vars(_var ${_name}_INCLUDE_DIRS ${_name}_INCLUDE_PATH)
if (_var)
set_property(TARGET ${_name}::${_name} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${_var}")
endif()
unify_vars(_var ${_name}_COMPILE_FLAGS ${_name}_DEFINITIONS)
if (_var)
set_property(TARGET ${_name}::${_name} APPEND PROPERTY INTERFACE_COMPILE_OPTIONS "${_var}")
endif()
endif()
endmacro()
find_package(MPI REQUIRED)
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} MPI::MPI)
これが唯一の可能な統一を実証しなければならないし、上の根拠が必要-によって拡張することができます。
編集:これをコミュニティのWiki回答に変えてください。気軽に投稿してください。
コードはこの例ではMPI
モジュールの検索結果でテストされました。
あなたは非常にThnak!私はあなたの解決策を今日テストし、ここで回答します。 – Aleph
最新のfindパッケージの実装は、 'Foo :: Foo'のようなIMPORTEDターゲットを提供しています(インクルードパス、ライブラリなどの依存関係とその変数の表記を知る必要性を避けるため)。 – Florian
フロリアンにお返事ありがとうございます。このような輸入目標の例を教えてください。限り、私はCMakeのFIND_PACKAGE関数のドキュメントを理解する限り、これらのターゲットはFindFOO.cmakeファイルで定義されているはずですが、必ずしもそうではありません(例えばFindMPI)。したがって、輸入された目標によって統一が達成可能であると言うことは正しいかもしれないが、統一されていると主張するのは現在のところ誤っている。したがって、私の問題は解決しません。 – Aleph
'FOO_FOUND'といくつかの特別な" find "変数を除いて、CMake **は特定の変数を設定する' Find'スクリプトを強制しません**。ですから、あなたの質問に対する答えは 'いいえ、統一された方法はありません。 'ですが、' find_package'の後処理結果のための独自の関数/マクロを書くことができます。その関数では、共通パターン(* FOO_INCLUDE *、* FOO_INCLUDE_PATH *、* FOO_INCLUDE_DIR *など)をチェックし、目的の変数を適切な値に設定することができます。 – Tsyvarev