Recentemente ho eseguito il backport di Python 2.7 su Debian squeeze. Dal momento che Ubuntu 10.10 è più recente di Debian Squeeze, se è possibile farlo su squeeze, si può certamente farlo su Ubuntu. Non ho accesso a un sistema Ubuntu 10.10. Se ne avvio uno, ci provo e aggiorno questa risposta. Quindi, ecco invece un breve abbozzo di ciò che ho fatto su Debian.
In primo luogo, un commento generale e ovvio, ma qualcosa che è facilmente trascurato. Non si dovrebbero prendere sul serio le dipendenze di build elencate di un pacchetto Debian. Possono essere molto più specifici del necessario. Ad esempio, il software come Python, che è stato progettato per essere portabile e correre su una vasta gamma di sistemi, è improbabile che costruire dipendono versioni specifiche del software. Anche le dipendenze del runtime possono essere regolate, ma ciò dovrebbe essere fatto con maggiore cautela. Tuttavia, dipendenze runtime sono per lo più generati in modo dinamico sulla base di un software che è già su questo sistema, in modo che di solito non è un grosso problema.
apt-cache policy python2.7
python2.7:
Installed: 2.7.2-8
Candidate: 2.7.2-8
Version table:
2.7.2-12 0
50 http://debian.csail.mit.edu/debian/ unstable/main i386 Packages
2.7.2-8 0
50 http://debian.csail.mit.edu/debian/ testing/main i386 Packages
*** 2.7.2-8 0
100 /var/lib/dpkg/status
Selezione della versione di prova si ottiene
apt-get source python2.7=2.7.2-8
Guardando debian/control
, vediamo il seguente costruire linee di dipendenza.
Build-Depends: debhelper (> = 5), quilt, autoconf, libreadline-dev, libtinfo-dev, libncursesw5-dev (> = 5.3), tk8.5-dev, zlib1g-dev, blt-dev (> = 2.4z), libssl-dev, libexpat1-dev, sharutils, libbz2-dev, libbluetooth-dev [linux-any], locales [! Armel! Avr32! Hppa! Ia64! Mipsel], libsqlite3-dev, libffi-dev (> = 3.0.5), mime-support, libgpm2 [linux-any], netbase, lsb-release, bzip2, libdb4.8-dev, gdb, python, help2man Build-Depends-Indep: python-sfinge Build -Confetti: tcl8.3-dev, tk8.3-dev, tcl8.4-dev, tk8.4-dev, python2.7-xml, python-xml, autoconf2.13, libncurses5-dev
La maggior parte di questo è facilmente soddisfatto per spremere. Con il programma di utilità pratico apt-show-versions
arriviamo sulla mia macchina
apt-show-versions debhelper quilt autoconf libreadline-dev libtinfo-dev libncursesw5-dev tk8.5-dev zlib1g-dev blt-dev \
libssl-dev libexpat1-dev sharutils libbz2-dev libbluetooth-dev locales libsqlite3-dev \
libffi-dev mime-support libgpm2 netbase lsb-release bzip2 libdb4.8-dev gdb python help2man python-sphinx
autoconf/squeeze uptodate 2.67-2
blt-dev/squeeze uptodate 2.4z-4.2
bzip2/squeeze uptodate 1.0.5-6
debhelper/squeeze-backports uptodate 8.9.13~bpo60+1
gdb/squeeze uptodate 7.0.1-2+b1
help2man/squeeze uptodate 1.38.2
libbluetooth-dev/squeeze uptodate 4.66-3
libbz2-dev/squeeze uptodate 1.0.5-6
libdb4.8-dev/squeeze uptodate 4.8.30-2
libexpat1-dev/squeeze uptodate 2.0.1-7
libffi-dev/squeeze uptodate 3.0.9-3
libgpm2/squeeze uptodate 1.20.4-3.3
libncursesw5-dev/squeeze uptodate 5.7+20100313-5
libreadline-dev/squeeze uptodate 6.1-3
libsqlite3-dev/squeeze uptodate 3.7.3-1
libssl-dev/squeeze uptodate 0.9.8o-4squeeze5
libtinfo-dev not installed
locales/squeeze uptodate 2.11.2-10
lsb-release/squeeze uptodate 3.2-23.2squeeze1
mime-support/squeeze uptodate 3.48-1
netbase/squeeze uptodate 4.45
python/squeeze uptodate 2.6.6-3+squeeze6
python-sphinx/squeeze-backports uptodate 1.0.8+dfsg-2~bpo60+1
quilt/squeeze uptodate 0.48-7
sharutils/squeeze uptodate 1:4.9-1
tk8.5-dev/squeeze uptodate 8.5.8-1
zlib1g-dev/squeeze uptodate 1:1.2.3.4.dfsg-3
vediamo che tutto, tranne libtinfo-dev
è disponibile in squeeze. Ho le versioni di backport di squeeze di debhelper
e python-sphinx
, ma entrambe sono disponibili anche per debian squeeze nelle versioni che soddisfano i requisiti di compilazione.
osservare anche che ho libncurses5-dev installato
apt-show-versions libncurses5-dev
libncurses5-dev/squeeze uptodate 5.7+20100313-5
Entrambi i pacchetti corrispondono al pacchetto sorgente curses 5.7+20100313-5
. Si noti che libtinfo-dev
sostituisce infatti libncurses5-dev
.
apt-cache show libtinfo-dev
Package: libtinfo-dev
Source: ncurses
Version: 5.9-4
Installed-Size: 279
Maintainer: Craig Small <[email protected]>
Architecture: i386
Replaces: libncurses5-dev (<< 5.9-3)
Depends: libtinfo5 (= 5.9-4)
Non ci si aspetterebbe python 2.7 per sviluppare su una versione così specifico di maledizioni, e in effetti non è così. Tuttavia, se si tenta di costruire i pacchetti senza soddisfare la dipendenza si ottiene
debuild -uc -us
dpkg-checkbuilddeps: Unmet build dependencies: libtinfo-dev
dpkg-checkbuilddeps: Build conflicts: libncurses5-dev
debuild: fatal error at line 1289:
You do not appear to have all build dependencies properly met.
You can use mk-build-deps to generate a dummy package which
Depends on all the required packages, or you can install them
manually using dpkg or apt using the error messages just above
this message.
Quindi, è necessario modificare debian/control
. Notare che è necessario modificare il file allo stesso modo debian/control.in
, altrimenti il file verrà rigenerato in modo errato da control.in
. La cosa più semplice da fare è semplicemente rimuovere libncurses5-dev
dalla riga Build-Conflicts
e libtinfo-dev
dalla riga Build-Depends
, quindi eseguire di nuovo debuild -uc -us
. Se avete intenzione di avere il pacchetto installato accanto il default standard di Python 2.6 pacchetti in Debian Squeeze, è inoltre necessario rimuovere le due linee
Conflicts: python-profiler (<= 2.7.1-2)
Replaces: python-profiler (<= 2.7.1-2)
Quelle linee ci sono perché 2.7 include la funzionalità python-profiler
. Se 2.7 è il python predefinito, allora python-profiler
non è più necessario. Tuttavia, se si sta installando 2.7 come Python non predefinito, tale ragionamento non è e python-profiler
è ancora necessario per 2.6.
Questo dovrebbe essere creato correttamente e generare il seguente elenco di pacchetti binari.
ls -lah *.deb
-rw-r--r-- 1 faheem staff 289K Jan 12 02:33 idle-python2.7_2.7.2-8_all.deb
-rw-r--r-- 1 faheem staff 1.1M Jan 12 02:34 libpython2.7_2.7.2-8_i386.deb
-rw-r--r-- 1 faheem staff 2.5M Jan 12 02:34 python2.7_2.7.2-8_i386.deb
-rw-r--r-- 1 faheem staff 12M Jan 12 02:34 python2.7-dbg_2.7.2-8_i386.deb
-rw-r--r-- 1 faheem staff 4.9M Jan 12 02:34 python2.7-dev_2.7.2-8_i386.deb
-rw-r--r-- 1 faheem staff 6.0M Jan 12 02:33 python2.7-doc_2.7.2-8_all.deb
-rw-r--r-- 1 faheem staff 692K Jan 12 02:33 python2.7-examples_2.7.2-8_all.deb
-rw-r--r-- 1 faheem staff 1.7M Jan 12 02:34 python2.7-minimal_2.7.2-8_i386.deb
Infine, si possono installare i pacchetti binari con
dpkg -i python2.7-minimal_2.7.2-8_i386.deb python2.7_2.7.2-8_i386.deb python2.7-dev_2.7.2-8_i386.deb libpython2.7_2.7.2-8_i386.deb
volte dpkg
può essere un po 'difficile di soddisfare le dipendenze quando sono tutti installati in una sola volta, quindi potrebbe essere necessario eseguire apt-get -f install
in seguito se ottieni errori di dipendenza o, in alternativa, installa i pacchetti in piccoli gruppi.
grazie. Ho ottenuto quella parte, ma la mia domanda è più su come passare avanti e indietro tra le due versioni. Con ruby uso RVM per gestire più versioni di Ruby. Esiste un equivalente in Python o non è necessario? – jimdolan
Ma usa "make altinstall" invece di "make install". "make install" configura 2.7 come versione predefinita e non lo vuoi. "make altinstall" lascerà il sistema solo da Python e dovrai solo usare "python2.7" per invocarlo. – casevh
Sì, rendere altinstall è la strada da percorrere. – codeape