Повернувшись моим комментарий в ответ
Чтобы избежать необходимости знать, включают путь, библиотеку и т.д. зависимости и их переменную нотацию современные 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
.
Современная реализация пакета find обеспечивает IMPORTED-цели, такие как Foo :: Foo (чтобы избежать необходимости знать зависимости пути, библиотеки и т. Д. И их переменные обозначения). – Florian
Спасибо, что ответили Флориану. Не могли бы вы привести мне пример такой импортированной цели? Насколько я понимаю документацию CMake для функции FIND_PACKAGE, эти цели должны быть определены в файлах FindFOO.cmake, но это не всегда так (например, FindMPI). Поэтому, говоря, что унификация достижима через импортированные цели, может быть правдой, но в настоящее время ложно утверждать, что она унифицирована. Таким образом, это не решает мою проблему. – Aleph
За исключением 'FOO_FOUND' и некоторых специальных переменных« Найти », CMake ** не применяет скрипты« Найти »для установки определенных переменных **. Поэтому ответ на ваш вопрос будет «Нет, нет единого способа». Однако вы можете написать свою собственную функцию/макрос для результата после процесса 'find_package'. В этой функции вы можете проверить общие шаблоны (* FOO_INCLUDE *, * FOO_INCLUDE_PATH *, * FOO_INCLUDE_DIR * и т. Д.) И установить желаемую переменную в соответствующее значение. – Tsyvarev