Post on 03-Jul-2015
description
Python Empaquetamiento Deb I
Python Madrid14/4/2011
Quién...
eduardo.ferro.aldama@gmail.comeferro@alea-soluciones.com http://www.eferro.net
eferroDrTrucho
Disclaimer online de contenido abierto, es decir, "no me responsabilizo del contenido" voluntaria de personas y grupos "lo que comento aquí
es mi experiencia" que desarrollan conjuntamente una fuente del conocimiento humano."debian/rules" Sus términos de uso permiten a cualquier persona navegador web, modificar "Soy notavo en paquetes deb" el contenido o páginas, por favor tenga presente que la información que encuentre "Soy novato en conferencias" no ha sido expertos profesionales que conozcan los temas "Se aceptan sugerencias de
mejora" de las diferentes materias necesaria para proporcionar aquí y ahora "Ni de lejos una información completa, precisa y fiable".
Manos a la obra...
Indice...
• Introducción• Qué es (un paquete deb)• Cómo se genera (un paquete deb)• Empaquetando Python
odistutils/setup.pyoDirectorio debiano rules (CDBS/Debhelper)
• A construir• Conclusiones• Ejemplos y demos• Referencias
Introducción: Contexto...
• Sistemas GNU/Linux• Distros basadas en paquetes DEB (Debian, Ubuntu, etc)• Distribución / Deploy librerías y módulos creados en Python
Introducción: Por qué empaquetar...
• Control de dependencias• Inventario de software• Gestión común soft de base (distro) y soft propio• Instalador estandarizado• Sistema de repositorios• Utilidades (buscadores, índices, etc...)• Somos gente con estilo :)
Introducción: Qué empaquetar...
• Software de base / infraestructura• Versiones diferentes de software disponible en la distro usada (backports, nuevas versiones, etc...)• Software de aplicación y de librerías
Introducción: Cuánto cuesta empaquetar...
• Si es python y usa distutils (setup.py), casi nada• Hacerlo para un paquete oficial de distro, bastante (cumplir la debian/policy)• Hacerlo para nuestros paquetes, no tanto
Paquetes DebAplicaciones PythonManos a la obra
Qué es: Anatomía de un Deb I
Un fichero deb simplemente son tres ficheros unidos en uno sólo mediante "ar". Ejemplo:
ar -xv <paquete>.deb x - debian-binaryx - control.tar.gzx - data.tar.gz
Qué es: Anatomía de un Deb II
• debian-binary Version del paquete deb (actualmente 2.0)• control.tar.gz
o ./config o ./preinsto ./prermo ./conffileso ./md5sumso ./controlo ....
• data.tar.gz Ficheros incluidos en el paquete (binarios, librerias, etc...)
Cómo se genera: Herramientas I
Herramientas para contruir paquetes • python (incluye distutils)• dpkg-dev / dpkg-buildpackage• debhelper helper programs for debian/rules• fakeroot Gives a fake root environment• cdbs common build system for Debian packages• dh-make tool that converts source archives into Debian package source
Cómo se genera: Creación deb (app/lib Python)
• Partimos de fuentes con app/lib Python • Verificamos/Creamos setup.py (distutils)• Realizamos la debianización inicial• Ponemos a punto:
odebian/rulesodebian/controlodebian/changelogodebian/...
• Construcción del paquete binario
Empaquetando python: setup.py (distutils)
• Buena práctica• Solución estándard (y recomendación oficial de python)
Distribuye tu aplic/lib python con estilohttp://docs.python.org/install/index.htmlhttp://docs.python.org/distutils/index.html
Empaquetando python: setup.py (distutils) I#!/usr/bin/env pythonfrom setuptools import *import aptdaemonsetup(name="aptdaemon", ... packages=["aptdaemon"], scripts=["aptd", "aptdcon"], data_files=[("../etc/dbus-1/system.d/", ["data/org.debian.apt.conf"]), "doc/org.debian.apt.transaction.7"])], platforms = "posix")
Empaquetando python: setup.py (distutils) IIdistutils.core.setup( name='argparse', version=argparse.__version__, author='Steven Bethard', description='Python command-line parsing library', long_description = read_description(), license='Apache 2.0', classifiers=[ 'Topic :: Software Development', ... ], py_modules=['argparse'],)
Empaquetando python: setup.py (distutils) III#!/usr/bin/env pythonfrom distutils.core import setupimport globimport os.pathsetup( name='Boscli-oss', ... package_dir = { '' : 'src' }, packages = ['boscli', ], scripts = ['src/bin/boscli', ], data_files = [ ( '/usr/lib/boscli/', glob.glob( 'src/lib/*.py') ) ],)
Empaquetando python: setup.py (distutils) IV#!/usr/bin/env pythonfrom distutils.core import setup
setup(name = "amqplib", description = "AMQP Client Library", version = "0.6", license = "LGPL", author = "Barry Pederson", author_email = "bp@barryp.org", url = "http://barryp.org/software/py-amqplib/", packages = ['amqplib', 'amqplib.client_0_8'] )
Empaquetando python: Debianización inicial I
• Se crea el directorio debian:oUsando dh_make
• Se adaptan ficheros del directorio debian
Si el código es nuestro: • Si usamos distutils / setup.py tenemos el
95% del trabajo hecho.
Empaquetando python: Debianización inicial II
dh_make [options] -c, --copyright -e, --email <address> -f, --file <file> -r, --createorig -s, --single / -i, --indep / -m, --multi / ... -b, --cdbs -p, --packagename <name> ...
Empaquetando python: Debianización inicial III
Opciones típicas:• dh_make -r -f ../<programa>.tar.gz -p <nombre>_<version> -s• dh_make -r -f ../<programa>.tar.gz -p <nombre>_<version> --cdbs
Empaquetando python: Debianización inicial IV
El directorio debian creado con dh_make contiene los siguientes ficheros: debian/control debian/changelog debian/rulesdebian/docsdebian/compatdebian/copyrightdebian/*.ex y debian/*.EX debian/README.*
Empaquetando python: Fichero Control ISource: python-amqplibSection: bifPriority: extraBuild-Depends: python-support (>= 0.6), debhelper(>= 5)Maintainer: Eduardo Ferro <eferro@alea-soluciones.com>
Package: python-amqplibArchitecture: allDepends: ${python:Depends}Provides: ${python:Provides}Description: amqplib support amqplib support .
Empaquetando python: Fichero Control IISource: gnupginterfaceSection: pythonPriority: optionalMaintainer: ... Build-Depends: cdbs, debhelper (>= 5.0.37.1), python, python-support
Package: python-gnupginterfaceArchitecture: allDepends: ${python:Depends}, gnupg (>= 1.2.1)Provides: ${python:Provides}Description: Python interface to GnuPG (GPG) ...
Empaquetando python: Fichero Changelog I
• Contiene versiones y descripción de los cambios.• Tiene formato definido y se crean entradas con dch (devscripts)
Formato de cada cambio:
[nombre] ([version]) [distro]; urgency=[nivel urg] * [descripción cambio]
-- [nombre] <[email]> [fecha modificación]
Empaquetando python: Fichero Rules I
• aka "La madre del cordero"• Se suelen general con el dh_make• Se suelen hacer con dos estilos:
oUsando dh_* (debhelpers)oUsando cdbs
• Además para python:o dh_python2 (recomendado / muy reciente)o python-support / dh_pysupport (+)o python-central / dh_pycentral
Empaquetando python: Fichero Rules II
• Makefile que dirige la construcción del paquete deb• Tiene diversos objetivos:
o cleanobinaryobinary-archobinary-indepobuild
Empaquetando python: Fichero Rules III python-support /dh_pysupport
• ${python:Depends}• ${python:Versions}• ${python:Provides}• Usa debian/pyversion Ej: 2.5- 2.5,2.6• Crea scripts compilación y registro módulos
Empaquetando python: Fichero Rules (dh I)
Existen gran cantidad de "helpers" para realizar cada una de las tareas necesarias en el rules.... dh_builddeb, dh_clean, dh_compress, dh_fixperms, dh_gencontrol, dh_install,dh_installchangelogs, dh_installcron, dh_installdeb, dh_installdebconf, dh_installdirs, dh_installdocs, dh_installemacsen, dh_installexamples, dh_installinfo ...
Empaquetando python: Fichero Rules (dh II)#!/usr/bin/make -f
export DH_PYCENTRAL=include-links
%:dh --with=python-central $@
override_dh_auto_clean:dh_auto_cleanrm -rf build *.egg-info po/aptdaemon.pot
Empaquetando python: Fichero Rules (dh III)#!/usr/bin/make -fconfigure: configure-stampconfigure-stamp:dh_testdirtouch configure-stampbuild: build-stamppython setup.py build...install: builddh_testdirdh_clean -k python setup.py install --root=$(CURDIR)/debian/python-amqplib...
Empaquetando python: Fichero Rules (cdbs I)Estilo CDBS :• Intenta simplificar el debian/rules• Puede gestionar sin esfuerzo los casos típicos más comunes• Intenta eliminar tareas repetitivas realizadas en los debian/rules• Usa clases (extensibles), que son como partes de Makefile especializadas• Estas clases están bien probadas
Empaquetando python: Fichero Rules (cdbs II)#!/usr/bin/make -fDEB_PYTHON_SYSTEM = pysupportDEB_PYTHON_COMPILE_VERSION = $(shell pyversions -vd 2>/dev/null)
include /usr/share/cdbs/1/rules/debhelper.mkinclude /usr/share/cdbs/1/class/python-distutils.mkinclude /usr/share/cdbs/1/rules/utils.mk
Empaquetando python: Fichero Rules (cdbs III)#!/usr/bin/make -f# -*- mode: makefile; coding: utf-8 -*-
DEB_PYTHON_SYSTEM=pysupport
include /usr/share/cdbs/1/rules/debhelper.mkinclude /usr/share/cdbs/1/rules/simple-patchsys.mkinclude /usr/share/cdbs/1/class/python-distutils.mk
build/python-gnupginterface::pydoc -w ./GnuPGInterface.py
clean::-rm *.pyc *.html
Empaquetando python: Fichero Rules (cdbs IV)#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mkinclude /usr/share/cdbs/1/class/makefile.mk
# Add here any variable or target overrides you need.DEB_MAKE_CLEAN_TARGET = cleanDEB_MAKE_BUILD_TARGET = allDEB_MAKE_INSTALL_TARGET = install DESTDIR=$(CURDIR)/debian/lsm/# no check for this softwareDEB_MAKE_CHECK_TARGET =
Empaquetando python: Otros ficheros en debian/• maintainer scripts:
oprermopostrmopreinstopostinst
• <programa>.1 (manpage)• <programa>.cron.* • <programa>.init.*• menu (entrada para menus gráficos) • compat• ...
A construir...
Construcción I
Recordemos: • Directorio de fuentes (con setup.py)• Directorio debian
odebian/controlodebian/rulesodebian/changelog
En el directorio debian suele haber muchos más ficheros, pero los indicados son los mínimos...
Construcción II
cd dir-paquetedpkg-buildpackage -us -uc -rfakeroot -sa -us, -uc es para indicar que no queremos firmar el paquete ni los fuentes. -rfakeroot es para que se construya simulando que somos root (usará un directorio interno)-sa para que genere los ficheros de paquete fuente
Construcción III
Si queremos probar alguno de los targets del debian/rules podemos ejecutar: fakeroot debian/rules binaryfakeroot debian/rules build fakeroot debian/rules clean
Conclusiones:
• En GNU/linux, empaquetar es lo normal• Usa distutils / setup .py tu vida será mejor• Debs oficiales requiere esfuerzo• Debs para consumo propio muy fácil
Ejemplos y Demos
Referencias I:Empaquetamiento Deb Python
Debian Python Policyhttp://www.debian.org/doc/packaging-manuals/python-policy/
Debian Python FAQhttp://wiki.debian.org/Python/FAQ
Ubuntu Python Packaging Guidehttps://wiki.ubuntu.com/PackagingGuide/Python
Referencias II: Generales Empaquetamiento DebGuía del nuevo desarrollador de Debian http://www.debian.org/doc/manuals/maint-guide/index.es.html
Debian Policy http://www.debian.org/doc/debian-policy/index.html
Ubuntu Packaging Guidehttps://wiki.ubuntu.com/PackagingGuide Manuales del DDP para desarrolladoreshttp://www.debian.org/doc/devel-manuals.es.html
CDBS Documentation http://cdbs-doc.duckcorp.org/en/cdbs-doc.xhtml
Game Over!!!
Hasta aquí hemos llegado¿Preguntas?¿Sugerencias?¿Quejas?¿Insultos?...
Eduardo Ferroeduardo.ferro.aldama@gmail.com