Как создать пакет debian с помощью CPack для выполнения setup.py?

до сих пор, мой проект был только .cpp файлы, которые были скомпилированы в разные двоичные файлы, и мне удалось настроить CPack правильно пакет debian без каких-либо проблем.

недавно я написал несколько приложений python и добавил их в проект, а также некоторые пользовательские модули, которые я также хотел бы включить в пакет.

после написания setup.py скрипт, мне интересно, как добавить эти файлы CPack настройки таким образом, что setup.py get выполняется автоматически, когда пользователь устанавливает пакет в системе с помощью dpkg -i package.deb.

Я изо всех сил пытаюсь найти соответствующую информацию о том, как настроить CPack для установки пользовательских приложений/модулей python. Кто-нибудь пробовал это?

2 ответов


Я нашел способ сделать это, но это не очень удобно. Я сделаю все возможное, чтобы объяснить процедуру, поэтому, пожалуйста, будьте терпеливы.

идея этого подхода заключается в использовании послеустановочных и также полезен для установки и удаления приложения python из системы.

на CMakeLists.txt это определяет проект, вам нужно заявить, что CPACK будет использоваться для создания .deb пакет. Есть некоторые переменные, которые необходимо заполнить информацией, связанной с самим пакетом, но с именем CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA очень важно, потому что он используется для указания местоположения послеустановочных и также полезен, которые являются стандартными сценарии система упаковки debian автоматически выполняются команды dpkg когда пакет установлен/удален.

в какой-то момент вашей main CMakeLists.txt вы должны были что-то вроде этого:--10-->

add_subdirectory(name_of_python_app)

set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE 1)

set(CPACK_PACKAGE_NAME "fake-package")
set(CPACK_PACKAGE_VENDOR "ACME")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "fake-package - brought to you by ACME")
set(CPACK_PACKAGE_VERSION "1.0.2")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "2")
SET(CPACK_SYSTEM_NAME "i386")

set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ACME Technology")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6), libgcc1 (>= 1:3.4.2-12), python2.6, libboost-program-options1.40.0 (>= 1.40.0)")
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/name_of_python_app/postinst;${CMAKE_SOURCE_DIR}/name_of_python_app/prerm;")
set(CPACK_SET_DESTDIR "ON")

include(CPack)

некоторые из этих переменных дополнительно, но я заполняю их информацией для образовательных целей.

теперь давайте посмотрим на Скрипты:

послеустановочных:

#!/bin/sh
# postinst script for fake_python_app

set -e

cd /usr/share/pyshared/fake_package
sudo python setup.py install

также полезен:

#!/bin/sh
# prerm script
#
# Removes all files installed by: ./setup.py install
sudo rm -rf /usr/share/pyshared/fake_package
sudo rm /usr/local/bin/fake_python_app

если вы заметили, скрипт послеустановочных входит в /usr/share/pyshared/fake_package и выполняет setup.py это лежит там, чтобы установить приложение в системе. Откуда взялся этот файл и как он там оказался? Этот файл создается вами и будет скопирован в это место, когда ваш пакет будет установлен в системе. Это действие настроено в name_of_python_app/CMakeLists.txt:

install(FILES setup.py
        DESTINATION "/usr/share/pyshared/fake_package"
)

install(FILES __init__.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_python_app
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_module_1.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_module_2.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

как вы, вероятно, можете сказать, помимо приложения python, которое я хочу установить, есть также 2 пользовательских модуля python, которые я написал, которые также необходимо установить. Ниже я опишу содержание наиболее важных файлы:

setup.py:

#!/usr/bin/env python
from distutils.core import setup

setup(name='fake_package',
      version='1.0.5',
      description='Python modules used by fake-package',
      py_modules=['fake_package.fake_module_1', 'fake_package.fake_module_2'],
      scripts=['fake_package/fake_python_app']
     )

_init_.py: является пустым файлом.

fake_python_app: ваше приложение python, которое будет установлено в /usr/local/bin

и этого достаточно!


A эквивалентно configure && make && make install танец для стандартного исходного дистрибутива unix и как таковой нецелесообразно запускать как часть процесса установки пакета дистрибутивов. См.эта дискуссия различных способов включения модулей Python в .deb пакета.