2017-02-20 6 views
1

CMakeのFIND_PACKAGEからのインクルードパスとライブラリパスを取得する際に統一された出力用語を得るための秘訣はありますか?CMakeのFIND_PACKAGEの統一

時にはFOO_INCLUDEです。時にはFOO_INCLUDE_PATHです。など

たとえば、FOO_INCLUDEとFOO_LIBが、FIND_PACKAGEの呼び出し後にFOO_FOUNDがTRUEに設定されているときに常に定義されるようにする方法を探したいと思います。

+1

最新のfindパッケージの実装は、 'Foo :: Foo'のようなIMPORTEDターゲットを提供しています(インクルードパス、ライブラリなどの依存関係とその変数の表記を知る必要性を避けるため)。 – Florian

+0

フロリアンにお返事ありがとうございます。このような輸入目標の例を教えてください。限り、私はCMakeのFIND_PACKAGE関数のドキュメントを理解する限り、これらのターゲットはFindFOO.cmakeファイルで定義されているはずですが、必ずしもそうではありません(例えばFindMPI)。したがって、輸入された目標によって統一が達成可能であると言うことは正しいかもしれないが、統一されていると主張するのは現在のところ誤っている。したがって、私の問題は解決しません。 – Aleph

+1

'FOO_FOUND'といくつかの特別な" find "変数を除いて、CMake **は特定の変数を設定する' Find'スクリプトを強制しません**。ですから、あなたの質問に対する答えは 'いいえ、統一された方法はありません。 'ですが、' find_package'の後処理結果のための独自の関数/マクロを書くことができます。その関数では、共通パターン(* FOO_INCLUDE *、* FOO_INCLUDE_PATH *、* FOO_INCLUDE_DIR *など)をチェックし、目的の変数を適切な値に設定することができます。 – Tsyvarev

答えて

0

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モジュールの検索結果でテストされました。

+0

あなたは非常にThnak!私はあなたの解決策を今日テストし、ここで回答します。 – Aleph

関連する問題