Зачем включать (CPack) идти после конфигурации пакета для проекта? - PullRequest
1 голос
/ 26 апреля 2019

Я экспериментирую с CPack модулем CMake и получил несколько запутанное поведение. У меня CpackMylib.cmake, который входит в корень CMakeLists.txt. Это выглядит следующим образом:

include(CPack)             #included on top
install (TARGETS mylib
          LIBRARY
          DESTINATION /usr/lib
          COMPONENT mylib-all
)

install (DIRECTORY include/
          DESTINATION /usr/include/mylib 
          COMPONENT mylib-all)
set(CPACK_PACKAGE_NAME "mylib")
set(CPACK_GENERATOR "DEB")

А при запуске make package не удается создать пакет со следующей трассировкой:

Run CPack packaging tool...
CPack: Create package using STGZ
CPack: Install projects
CPack: - Run preinstall target for: mylib
CPack: - Install project: mylib
CMake Error at /home/krjoff/mylib/cmake_install.cmake:55 (file):
  file INSTALL cannot copy file "/home/krjoff/mylib/libmylib.so" to
  "/usr/lib/mylib.so".


CMake Error at /home/krjoff/mylib/cmake_install.cmake:73 (file):
  file INSTALL cannot set permissions on "/usr/include/mylib"


CPack Error: Error when generating package: mylib
Makefile:129: recipe for target 'package' failed
make: *** [package] Error 1

Похоже, он просто игнорирует все переменные, которые я поставил после include(CPack), и пытается собрать какой-то пакет STGZ и установить его немедленно. Но если я поставлю include(CPack) в конце CpackMylib.cmake после того, как все настройки будут выполнены, он будет работать отлично.

Может кто-нибудь объяснить, зачем ставить include(CPack) после всех настроек конфигурации?

1 Ответ

1 голос
/ 26 апреля 2019

Так должно работать CPack.Когда вы include записываете его в CMakeLists.txt, он читает все переменные, перечисленные в его документации , например CPACK_GENERATOR или CPACK_PACKAGE_NAME, и создает цель package, которую вы затем вызываете с помощью make package.

Если вы включите его перед установкой этих переменных, их значение будет проигнорировано.

Перед включением этого модуля CPack в ваш файл CMakeLists.txt, существует множество переменныхэто может быть установлено для настройки результирующих установщиков.Наиболее часто используемые переменные:

  • CPACK_PACKAGE_NAME
    Имя пакета (или приложения).Если он не указан, по умолчанию используется имя проекта.

  • CPACK_PACKAGE_VENDOR
    Имя поставщика пакета.(например, «Kitware»).По умолчанию установлено значение «Человечество».

  • CPACK_PACKAGE_DIRECTORY
    Каталог, в котором CPack выполняет упаковку.Если он не установлен, то по умолчанию (внутренне) будет установлен каталог сборки.Эта переменная может быть определена в файле конфигурации CPack или в опции командной строки cpack -B.Если установлено, опция командной строки переопределяет значение, найденное в файле конфигурации.

  • ...

Источник: CPack --- CMake

...