TODO:py3 packages: Difference between revisions

From Alpine Linux
(Declare common dependencies inside _py() function)
(23 intermediate revisions by 2 users not shown)
Line 38: Line 38:
arch="noarch"
arch="noarch"
license="MIT"
license="MIT"
depends="py-bar"
makedepends="python2-dev python3-dev py-setuptools"
makedepends="python2-dev python3-dev py-setuptools"
subpackages="py2-${pkgname#py-}:_py2 py3-${pkgname#py-}:_py3"
subpackages="py2-${pkgname#py-}:_py2 py3-${pkgname#py-}:_py3"
Line 45: Line 46:
build() {
build() {
cd "$builddir"
cd "$builddir"
python2 setup.py build || return 1
python2 setup.py build
python3 setup.py build || return 1
python3 setup.py build
}
}


Line 55: Line 56:
_py2() {
_py2() {
replaces="$pkgname"
replaces="$pkgname"
depends="py2-bar"
depends="${depends//py-/py2-}"
_py python2
_py python2
}
}


_py3() {
_py3() {
depends="py3-bar"
depends="${depends//py-/py3-}"
_py python3
_py python3
}
}
Line 67: Line 68:
local python="$1"
local python="$1"
pkgdesc="$pkgdesc (for $python)"
pkgdesc="$pkgdesc (for $python)"
depends="$python"
depends="$depends $python"
install_if="$pkgname=$pkgver-r$pkgrel $python"
install_if="$pkgname=$pkgver-r$pkgrel $python"


Line 77: Line 78:
* If the package contains some compiled code (native extensions), then add <tt>arch="all"</tt> into the <tt>_py()</tt> function (between pkgdesc and depends).
* If the package contains some compiled code (native extensions), then add <tt>arch="all"</tt> into the <tt>_py()</tt> function (between pkgdesc and depends).
* If the package doesn’t have any dependencies, then omit <tt>depends=""</tt> in the <tt>_py2()</tt> and <tt>_py3()</tt> functions.
* If the package doesn’t have any dependencies, then omit <tt>depends=""</tt> in the <tt>_py2()</tt> and <tt>_py3()</tt> functions.
* If both subpackages (''py2-'' and ''py3-'') have some common (runtime) dependencies, then add them to the <tt>depends</tt> inside the <tt>_py()</tt> function (e.g. <tt>depends="$python libgit2"</tt>).
* If the package uses variable <tt>_builddir</tt>, then replace it with <tt>builddir</tt> (the former is older format).
* If the package uses variable <tt>_builddir</tt>, then replace it with <tt>builddir</tt> (the former is older format).


Notes:
Notes:
* _pkgname is the package’s real name on PyPI.
* _pkgname is the package’s real name on PyPI.


== List of abuilds without Python 3 support ==
== List of abuilds without Python 3 support ==
Line 102: Line 101:
|-
|-
| py-backports.ssl_match_hostname
| py-backports.ssl_match_hostname
|
| Not needed for >=py3.4
|-
| py-backports_abc
|
|-
|-
| py-bluez
| py-bluez
Line 114: Line 110:
|-
|-
| py-cairo
| py-cairo
|
|-
| py-certifi
|
|
|-
|-
Line 126: Line 119:
|-
|-
| py-country
| py-country
|
|-
| py-curl
|
|-
| py-dateutil
|
|
|-
|-
Line 180: Line 167:
|-
|-
| py-egenix-mx-base
| py-egenix-mx-base
|
| doesn’t support py3
|-
|-
| py-exifread
| py-exifread
Line 195: Line 182:
|-
|-
| py-feedparser
| py-feedparser
|
|-
| py-flask
|
|
|-
|-
| py-flask-assets
| py-flask-assets
|
|-
| py-flask-oauthlib
|
|
|-
|-
Line 300: Line 281:
|-
|-
| py-irc-scripts
| py-irc-scripts
|
|-
| py-itsdangerous
|
|
|-
|-
Line 363: Line 341:
|-
|-
| py-oauth2client
| py-oauth2client
|
|-
| py-oauthlib
|
|
|-
|-
Line 384: Line 359:
|-
|-
| py-pillow
| py-pillow
|
|-
| py-psycopg2
|
|
|-
|-
Line 411: Line 383:
|-
|-
| py-samba
| py-samba
|
|-
| py-simplejson
|
|
|-
|-
Line 420: Line 389:
|-
|-
| py-singledispatch
| py-singledispatch
|
| Not needed for >=py3.3
|-
|-
| py-snowballstemmer
| py-snowballstemmer
Line 444: Line 413:
|-
|-
| py-tevent
| py-tevent
|
|-
| py-tornado
|
|
|-
|-
Line 459: Line 425:
|-
|-
| py-twitter
| py-twitter
|
|-
| py-tz
|
|
|-
|-
Line 483: Line 446:
|-
|-
| py-urwid-examples
| py-urwid-examples
|
|-
| py-virtualenv
|
|
|-
|-
Line 492: Line 452:
|-
|-
| py-webassets
| py-webassets
|
|-
| py-werkzeug
|
|
|-
|-
Line 501: Line 458:
|-
|-
| py-xml
| py-xml
|
|-
| py-zope-interface
|
|
|-
|-
Line 602: Line 556:
|-
|-
| py-rencode
| py-rencode
|
|-
| py-rfc3339
|
|
|-
|-
Line 652: Line 603:
|-
|-
|}
|}
[[Category:Python]]

Revision as of 07:43, 9 October 2019

Most of the Python packages in Alpine don’t support Python 3, although the packaged module supports it. We would like to support Python 3 wherever it’s possible and would be happy if you can help us with it!

Explanation

Python 2 and 3 installs modules into different directories, the compiled bytecode (*.pyc files) is different and native extensions are linked against different Python shared library. Therefore to support both versions, we need to build two packages. Since the source is the same, we do it as one APKBUILD that provides two subpackages: py2- and py3-. Base package py- is then a metapackage that pulls py2- subpackage if python2 is installed or py3- subpackage if python3 is installed.

How to do it

Before you start, prepare your environment for building packages (Creating an Alpine package).

  1. Take some package from the list below. Higher priority have packages with some compiled code (those have arch="all").
  2. Check if the Python package is compatible with Python 3. Tip: When you look into the package’s setup.py file, there are usually declared some classifiers like Programming Language :: Python :: 2 and Programming Language :: Python :: 3.
    1. If it’s not compatible with Python 3, then write it into the table below as a note.
    2. If it’s compatible with Python 3, then continue with next steps.
  3. Check if requirements in the package’s setup.py corresponds with the abuild’s depends. Some Python packages have additional dependencies depending on the Python version (for Alpine is relevant just 2.7 and 3.5).
  4. Adjust the APKBUILD (see below).
  5. Try to build it.
  6. If everything is okay, commit the change (use commit message like <repo>/<pkgname>: add py2/py3 subpackages).
  7. Send pull request to https://github.com/alpinelinux/aports.

If you have any questions, then don’t hesitate to ask on IRC #alpine-devel!

APKBUILD

APKBUILD for a package supporting both Python 2 and Python 3 should look like this:

pkgname=py-foo
_pkgname=PyFoo
pkgver=1.0.0
pkgrel=1
pkgdesc="A package description"
url="https://github.com/example/foo"
arch="noarch"
license="MIT"
depends="py-bar"
makedepends="python2-dev python3-dev py-setuptools"
subpackages="py2-${pkgname#py-}:_py2 py3-${pkgname#py-}:_py3"
source="https://files.pythonhosted.org/packages/source/${_pkgname:0:1}/$_pkgname/$_pkgname-$pkgver.tar.gz"
builddir="$srcdir/$_pkgname-$pkgver"

build() {
	cd "$builddir"
	python2 setup.py build
	python3 setup.py build
}

package() {
	mkdir -p "$pkgdir"
}

_py2() {
	replaces="$pkgname"
	depends="${depends//py-/py2-}"
	_py python2
}

_py3() {
	depends="${depends//py-/py3-}"
	_py python3
}

_py() {
	local python="$1"
	pkgdesc="$pkgdesc (for $python)"
	depends="$depends $python"
	install_if="$pkgname=$pkgver-r$pkgrel $python"

	cd "$builddir"
	$python setup.py install --prefix=/usr --root="$subpkgdir"
}
  • If the package contains some compiled code (native extensions), then add arch="all" into the _py() function (between pkgdesc and depends).
  • If the package doesn’t have any dependencies, then omit depends="" in the _py2() and _py3() functions.
  • If the package uses variable _builddir, then replace it with builddir (the former is older format).

Notes:

  • _pkgname is the package’s real name on PyPI.

List of abuilds without Python 3 support

main

Pkgname Notes
py-alabaster
py-avahi
py-babel
py-backports.ssl_match_hostname Not needed for >=py3.4
py-bluez
py-boto
py-cairo
py-cliapp
py-configshell
py-country
py-dbus
py-django
py-django-contact-form
py-django-djblets
py-django-extra-views
py-django-haystack
py-django-oscar
py-django-pipeline
py-django-registation
py-django-simple-captcha
py-django-sorl-thumbnail
py-django-tables2
py-django-treebeard
py-django-widget-tweaks
py-ediarpc
py-egenix-mx-base doesn’t support py3
py-exifread
py-eyed3
py-factory-boy
py-farstream0.1
py-feedparser
py-flask-assets
py-flask-script
py-flask-wtf
py-flup
py-funcsigs
py-fuse
py-gamin
py-gdbm
py-genshi
py-gflags
py-gnome
py-gnome-bonobo
py-gnome-gconf
py-gnome-gnomevfs
py-gnome-libgnome
py-gnutls
py-gobject
py-gobject3
py-google-api-python-client
py-gst0.10
py-gtk
py-gtk-demo
py-gunicorn
py-gv
py-hgtools
py-hiredis
py-hoedown
py-httplib2
py-icu
py-imagesize
py-imaging
py-irc
py-irc-scripts
py-jwt
py-larch
py-ldb
py-libmount
py-libproxy
py-libxml2
py-libxslt
py-lockfile
py-mako
py-mccabe
py-meld3
py-mock
py-munkres
py-musicbrainzngs
py-mutagen
py-mysqldb
py-newt
py-nose
py-oauth2
py-oauth2client
py-parsing
py-pbr
py-pep8
py-pgen
py-phonenumbers
py-pillow
py-purl
py-pygments
py-pylast
py-redis
py-roman
py-rrd
py-rsa
py-samba
py-simpleparse
py-singledispatch Not needed for >=py3.3
py-snowballstemmer
py-sphinx
py-sphinx_rtd_theme
py-subversion
py-talloc
py-tdb
py-templayer
py-tevent
py-tracing
py-ttystatus
py-twisted
py-twitter
py-unbound
py-unidecode
py-uritemplate
py-urlgrabber
py-urlnorm
py-urwid
py-urwid-examples
py-vobject
py-webassets
py-wtforms
py-xml

community

Pkgname Notes
py-acme
py-argh
py-configargparse
py-crcmod
py-dialog
py-distutils-extra
py-django-appconf
py-django-compressor
py-django1.5 unmaintained version
py-ethtool
py-gammu
py-gpiozero
py-graphviz
py-gtkglext
py-impacket
py-ipaddr
py-jellyfish
py-libplist
py-libteam
py-livereload
py-lz4
py-mechanize
py-ndg_httpsclient
py-numpy
py-opencl
py-opengl-accelerate
py-parsedatetime
py-pathtools
py-pysqlite
py-rencode
py-rpigpio
py-rpm
py-rtslib
py-sensehat
py-skywriter-hat
py-slowaes
py-sphinx-autobuild
py-tempita
py-udev
py-watchdog
py-zope-component
py-zope-event
py2-impacket
py2-pysqlite
py2-tempita