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

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

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

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

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


person karlphillip    schedule 30.08.2011    source источник
comment
На самом деле пакет должен содержать результат setup.py в виде файлов.   -  person Torsten Bronger    schedule 13.11.2015


Ответы (2)


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

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

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

В какой-то момент вашего main CMakeLists.txt у вас должно получиться что-то вроде этого:

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

Если вы заметили, скрипт postinst входит в /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.

И это почти все!

person karlphillip    schedule 27.10.2011
comment
Не могли бы вы использовать install(DIRECTORY fake_package DESTINATION /usr/share/pyshared/ USE_SOURCE_PERMISSIONS)? - person Charles L.; 15.01.2015
comment
Не знаю, думаю, вам придется поэкспериментировать. - person karlphillip; 15.01.2015

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

person Ross Patterson    schedule 06.09.2011
comment
Спасибо, я читал это раньше, но я не могу использовать эти инструменты, и я должен сделать это с помощью CMake/CPack. - person karlphillip; 06.09.2011
comment
Тогда вам, возможно, придется вручную реализовать политику Debian Python, но я почти уверен, что вы усложняете себе жизнь, не используя существующие инструменты для создания deb-файлов. - person Ross Patterson; 06.09.2011
comment
Я нахожу CPack очень простым и простым в использовании. Но то, что мне нужно сделать, немного сложно. Я опубликую свой подход здесь, чтобы вы, ребята, могли его оценить :) - person karlphillip; 06.09.2011
comment
Думаю, ссылка на обсуждение битая. - person Dilawar; 25.07.2014