Почему foo-config.cmake и foo-config-version.cmake должны быть разделены? - PullRequest
1 голос
/ 17 января 2020

В выступлениях Дэниела Пфайффера ( Effective CMake ) и Дениза Бахадира ( More Modern CMake ) и даже в документации CMake предлагается что (по крайней мере) для .cmake файлов будет сгенерировано использование репозитория с CMake в других проектах: foo-config.cmake и foo-config-version.cmake (для пакета foo; другая возможная схема именования - FooConfig.cmake и FooConfigVersion.cmake).

Это уже кажется мне странным. Почему у foo-config.cmake также не должно быть информации / команд относительно установленной версии?

Редактировать: перерезал остальную часть этот вопрос, для фокуса, и так как я понял что-то не так.

1 Ответ

0 голосов
/ 17 января 2020

Для комментариев, но не для полного ответа:

Типичная последовательность в проектах, которые я генерирую, использует модули CMakePackageConfigHelper и GNUInstallDirs от CMake.

Нет необходимости создавать шаблон foo-config-version.cmake. Просто используйте команду write_basic_package_version_file из этого модуля, чтобы добиться цели.

Команда export пригодится, если вы хотите использовать пакеты конфигурации из каталога сборки без необходимости их установки.

См. Пример:

# Support find_package(Foo NO_MODULE).
set(FOO_DOC_DIR ${CMAKE_INSTALL_DOCDIR})
set(FOO_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
set(FOO_LIB_DIR ${CMAKE_INSTALL_LIBDIR})
set(FOODIR ${CMAKE_INSTALL_PREFIX})

include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

configure_package_config_file(foo-config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/foo-config.cmake"
  INSTALL_DESTINATION ${FOO_CONFIG_PACKAGE_LOCATION}
  PATH_VARS FOODIR FOO_INCLUDE_DIR FOO_LIB_DIR FOO_DOC_DIR
)

write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/foo-config-version.cmake"
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY SameMajorVersion
)

# To make the component usable not only from the install directory but also from the build directory
export(
  TARGETS Foo
  FILE foo-export.cmake
)

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/foo-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/foo-config-version.cmake"
  DESTINATION ${FOO_CONFIG_PACKAGE_LOCATION}
  COMPONENT development
)

install(EXPORT Foo
  DESTINATION ${FOO_CONFIG_PACKAGE_LOCATION}
  NAMESPACE ${PROJECT_NAME}::
  FILE foo-export.cmake
  COMPONENT development
)
...