Как создавать пакеты с CMake - PullRequest
0 голосов
/ 11 апреля 2019
.
+-- MyPack
|   +-- Lib1
|   |   +-- include
|   |   |   +-- Lib1.h
|   |   +-- src
|   |   |   +-- Lib2.cpp
|   |   +-- CMakeLists.txt
|   +-- Lib2
|   |   +-- include
|   |   |   +-- Lib2.h
|   |   +-- src
|   |   |   +-- Lib2.cpp
|   |   +-- CMakeLists.txt
|   +-- CMakeLists.txt
+-- SubProject1
|   +-- CMakeLists.txt
+-- SubProject2
|   +-- CMakeLists.txt
+-- CMakeLists.txt

Привет всем.

Я новичок в CMake и пытаюсь получить что-то вроде следующего.Учитывая приведенное выше дерево каталогов моего проекта C ++:

У меня есть каталог (скажем, «MyPack»), который содержит несколько подкаталогов (Lib1, Lib2 ...), и каждый из них представляет библиотеку C ++, которую я написал.

Как мне все настроить, чтобы я мог написать find_package(MyPack) в других подпроектах?

Каждый подпроект является отдельным проектом и не зависит от других подпроектов, а только от библиотек в «MyPack».

1 Ответ

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

Ваш рисунок немного сбивает с толку, потому что после Lib2 есть CMakeLists.txt, который не принадлежит ни одной папке ... В любом случае: MyPack

  • Lib1 и Lib2?
  • Lib1 / Lib2 / Subproj1 / Subproj2?

во 2-м случае:

Верхний каталог CMakeLists.txt предоставляет вам доступ к целям Lib1 и Lib2, которые вы можете использовать в SubProject1 и SubProject2, если у вас есть что-то вроде этого:

project(MyPack)
add_subdirectory(Lib1) # Building Lib1
add_subdirectory(Lib2) # Building Lib2
add_subdirectory(SubProject1) # you can use Lib1 & Lib2 targets here
add_subdirectory(SubProject2) # you can use Lib1 & Lib2 targets here

Если это 1-й случай, MyPack - это только Lib1 и Lib2:

Использование find_package (MyPack) означает, что вам нужно создать файл конфигурации и установить () ваш проект:

project(MyPack)
add_subdirectory(Lib1)
add_subdirectory(Lib2)

в Lib1 / CMakeLists.txt:

add_library(lib1 "")
add_library(MyPack::lib1 ALIAS lib1)
[...]
include(GNUInstallDirs)
install( 
  TARGET lib1
  EXPORT MyPackTargets
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  )

в Lib2 / CMakeLists.txt:

add_library(lib2 "")
add_library(MyPack::lib2 ALIAS lib2)
[...]
include(GNUInstallDirs)
install( 
  TARGET lib2
  EXPORT MyPackTargets
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  )

Теперь у вас есть lib1 и lib2 в экспорте MyPackTargets. Вы также должны установить этот экспорт.

в любом месте после выше:

install(
  EXPORT MyPackTargets
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyPack
  NAMESPACE MyPack::
  FILE MyPackTargets.cmake # Not sure if this is still needed
  )

include(CMakePackageConfigHelpers)
configure_package_config_file( 
  "Config.cmake.in" 
  "MyPackConfig.cmake"
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyPack
  PATH_VARS
    CMAKE_INSTALL_LIBDIR
  )

write_basic_package_version_file(
  ${CMAKE_CURRENT_BINARY_DIR}/MyPackConfigVersion.cmake
  VERSION 1.0.0
  COMPATIBILITY SameMajorVersion
  )

### Install Config and ConfigVersion files
install(
  FILES "${CMAKE_CURRENT_BINARY_DIR}/MyPackConfig.cmake"
        "${CMAKE_CURRENT_BINARY_DIR}/MyPackConfigVersion.cmake"
  DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MyPack"
  )

создать файл Config.cmake.in с:

@PACKAGE_INIT@
include( "${CMAKE_CURRENT_LIST_DIR}/MyPackTargets.cmake" )

Теперь, если вы собираете и устанавливаете свой проект MyPack, find_package (MyPack) из другого проекта должен найти его и импортировать созданные вами цели.

Вот некоторая документация: https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html

https://blog.kitware.com/cmake-superbuilds-git-submodules/

Надеюсь, это поможет

...