2017-02-20 2 views
1

Знаете ли вы, что вы получаете единую терминологию вывода при получении путей включения и библиотеки из FIND_PACKAGE от CMake?Unifying CMake FIND_PACKAGE

Иногда это FOO_INCLUDE. Иногда это FOO_INCLUDE_PATH. И т. Д.

Например, я хотел бы найти способ гарантировать, что FOO_INCLUDE и FOO_LIB всегда будут определены, когда FOO_FOUND установлено в TRUE после вызова FIND_PACKAGE.

+1

Современная реализация пакета find обеспечивает IMPORTED-цели, такие как Foo :: Foo (чтобы избежать необходимости знать зависимости пути, библиотеки и т. Д. И их переменные обозначения). – Florian

+0

Спасибо, что ответили Флориану. Не могли бы вы привести мне пример такой импортированной цели? Насколько я понимаю документацию CMake для функции FIND_PACKAGE, эти цели должны быть определены в файлах FindFOO.cmake, но это не всегда так (например, FindMPI). Поэтому, говоря, что унификация достижима через импортированные цели, может быть правдой, но в настоящее время ложно утверждать, что она унифицирована. Таким образом, это не решает мою проблему. – Aleph

+1

За исключением 'FOO_FOUND' и некоторых специальных переменных« Найти », CMake ** не применяет скрипты« Найти »для установки определенных переменных **. Поэтому ответ на ваш вопрос будет «Нет, нет единого способа». Однако вы можете написать свою собственную функцию/макрос для результата после процесса 'find_package'. В этой функции вы можете проверить общие шаблоны (* FOO_INCLUDE *, * FOO_INCLUDE_PATH *, * FOO_INCLUDE_DIR * и т. Д.) И установить желаемую переменную в соответствующее значение. – Tsyvarev

ответ

0

Повернувшись моим комментарий в ответ

Чтобы избежать необходимости знать, включают путь, библиотеку и т.д. зависимости и их переменную нотацию современные find_package «ы реализации предоставляют IMPORTED целей как Foo::Foo. Но это - как прокомментировал @ Цыварев - далеко не унифицированный через весь CMake's 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) 

Это должно продемонстрировать только возможную унификацию и может быть продлен на потребности, на основе.

Редактировать: Включение этого в ответ на вики сообщества. Пожалуйста, не стесняйтесь вносить свой вклад.

Код был протестирован в этом примере с результатами поиска MPI.

+0

Thnak вам очень понравилось! Я проведу ваше решение сегодня и отвечу здесь. – Aleph

Смежные вопросы