cmake get find_package для поиска переменных, специфичных для пакета - PullRequest
0 голосов
/ 18 апреля 2019

Итак, я хочу создать библиотеку C, которую можно установить таким образом, чтобы ее можно было легко использовать в других проектах с помощью функции find_package в cmake. В частности, я хочу, чтобы проект, скажем, под названием foo, был доступен следующим образом:

find_package (foo-1.0 REQUIRED)

message ("!--   foo found version \"${FOO_VERSION}\"")
message ("!--   foo include path \"${FOO_INCLUDE_DIRS}\"")
message ("!--   foo libraries \"${FOO_LIBRARIES}\"")

Затем эти переменные могут использоваться с целями в других проектах cmake, например:

add_executable (example example.c)
target_include_directories (example PRIVATE "${FOO_INCLUDE_DIRS}")
target_link_libraries (example PRIVATE "${FOO_LIBRARIES}")

Хотя мой вопрос:

  1. Каким образом должна быть установлена ​​статическая или совместно используемая библиотека c, чтобы ее можно было найти по find_package (то есть, какое место назначения нужно).
  2. Как мне выставить переменные типа FOO_LIBRARIES, чтобы функция find_package выставляла их в проекте, вызывая find_package?

1 Ответ

0 голосов
/ 19 апреля 2019

Я понял, как это сделать. По сути, вы должны иметь .cmake.in файлы, которые действуют как шаблон для файла конфигурации и файл версии конфигурации для конечного пакета. find_package будет искать следующие места для файлов конфигурации и версии cmake:

${CMAKE_INSTALL_PREFIX}/include/${LIBKOF_NAMED_VERSION}
${CMAKE_INSTALL_PREFIX}/lib/${LIBKOF_NAMED_VERSION}

Где LIBKOF_NAMED_VERSION - папка пакета, например foo-1.2

libkof - это имя моего пакета, и вы можете увидеть, как это делается ниже:

# This cmake is responsible for installing cmake config and other version
# files.

# This sets the package specific versioning
set(LIBKOF_MAJOR_VERSION 1)
set(LIBKOF_MINOR_VERSION 0)
set(LIBKOF_PATCH_VERSION 0)

# This allows easy creation of the directories within /usr/local or another install
# prefix
set(LIBKOF_NAMED_VERSION libkof-${LIBKOF_MAJOR_VERSION}.${LIBKOF_MINOR_VERSION})

# These statements will create the directories needed for installs
install(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIBKOF_NAMED_VERSION})
install(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIBKOF_NAMED_VERSION})

# This tracks the name of the in files used to generate the package cmake files
set(LIBKOF_CONFIG_FILE libkof-config.cmake.in)
set(LIBKOF_CONFIG_VERSION_FILE libkof-config-version.cmake.in)

# The configure_file statements will exchange the variables for the values in this cmake file.
configure_file(${LIBKOF_CONFIG_FILE} libkof-config.cmake @ONLY)
configure_file(${LIBKOF_CONFIG_VERSION_FILE} libkof-config-version.cmake @ONLY)

# Installs to the output locations so they can be found with find_package()
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libkof-config-version.cmake DESTINATION include/${LIBKOF_NAMED_VERSION})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libkof-config.cmake DESTINATION lib/${LIBKOF_NAMED_VERSION})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...