aboutsummaryrefslogtreecommitdiffstats
path: root/community
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2017-10-27 07:04:54 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2017-10-27 16:49:59 +0000
commit6f4cca64ba524f3bb7b076776e940befef11390e (patch)
treef85ed725ef9d95fcf877d8898ee248b4ab56cfa4 /community
parent63e2605b9bfa963e05166f5a1631fd9164600698 (diff)
downloadaports-6f4cca64ba524f3bb7b076776e940befef11390e.tar.bz2
aports-6f4cca64ba524f3bb7b076776e940befef11390e.tar.xz
main/python3: fix cyclic dependency for tkinter
Add a separate apkbuild for tkinter to avoid the cyclic buildtime dependency: python3 -> tk -> libX11 -> libxcb -> xcb-proto -> python3
Diffstat (limited to 'community')
-rw-r--r--community/python3-tkinter/APKBUILD114
-rw-r--r--community/python3-tkinter/bpo-30353.patch133
-rw-r--r--community/python3-tkinter/fix-xattrs-glibc.patch15
-rw-r--r--community/python3-tkinter/musl-find_library.patch45
4 files changed, 307 insertions, 0 deletions
diff --git a/community/python3-tkinter/APKBUILD b/community/python3-tkinter/APKBUILD
new file mode 100644
index 0000000000..c8db42763d
--- /dev/null
+++ b/community/python3-tkinter/APKBUILD
@@ -0,0 +1,114 @@
+# Maintainer: Ɓukasz Jendrysik <scadu@yandex.com>
+# Contributor: Kiyoshi Aman <kiyoshi.aman@gmail.com>
+
+pkgname=python3-tkinter
+pkgver=3.6.3
+_basever="${pkgver%.*}"
+pkgrel=0
+pkgdesc="A graphical user interface for the Python"
+url="https://wiki.python.org/moin/TkInter"
+arch="all"
+license="custom"
+provides="py3-pip"
+subpackages="$pkgname-tests python3-idle:_idle"
+makedepends="expat-dev libressl-dev zlib-dev ncurses-dev bzip2-dev xz-dev
+ sqlite-dev libffi-dev tcl-dev linux-headers gdbm-dev readline-dev
+ tk tk-dev python3"
+source="http://www.python.org/ftp/python/$pkgver/Python-$pkgver.tar.xz
+ musl-find_library.patch
+ fix-xattrs-glibc.patch
+ bpo-30353.patch
+ "
+builddir="$srcdir/Python-$pkgver"
+
+prepare() {
+ local _pyapkbuild="$startdir"/../python3/APKBUILD
+ if [ -e "$_pyapkbuild" ]; then
+ _pver=$(. "$_pyapkbuild" ; echo $pkgver)
+ if [ "$_pver" != "$pkgver" ]; then
+ error "python version mismatch ($_pver). Set pkgver=$_pver"
+ return 1
+ fi
+ fi
+ default_prepare
+ cd "$builddir"
+
+ # force system libs
+ rm -r Modules/expat \
+ Modules/zlib \
+ Modules/_ctypes/darwin* \
+ Modules/_ctypes/libffi*
+}
+
+build() {
+ cd "$builddir"
+
+ # --enable-optimizations is not enabled because it
+ # is very, very slow as many tests are ran sequentially
+ # for profile guided optimizations. additionally it
+ # seems some of the training tests hang on certain
+ # e.g. architectures (x86) possibly due to grsec or musl.
+
+ ./configure \
+ --prefix=/usr \
+ --disable-rpath \
+ --enable-ipv6 \
+ --enable-loadable-sqlite-extensions \
+ --enable-shared \
+ --with-lto \
+ --with-computed-gotos \
+ --with-dbmliborder=gdbm:ndbm \
+ --with-system-expat \
+ --with-system-ffi \
+ --with-threads
+
+ make EXTRA_CFLAGS="$CFLAGS"
+}
+
+package() {
+ cd "$builddir"
+ # we only care about idle, and tkinter
+ make DESTDIR="$builddir"/tmpinstall sharedinstall libinstall \
+ || return 1
+
+ mkdir -p "$pkgdir"/usr/lib/python${_basever}/lib-dynload \
+ "$pkgdir"/usr/bin
+
+ for lib in idlelib; do
+ mv "$builddir"/tmpinstall/usr/lib/python${_basever}/$lib \
+ "$pkgdir"/usr/lib/python${_basever}/
+ done
+
+ mv "$builddir"/tmpinstall/usr/lib/python${_basever}/lib-dynload/_tkinter*.so \
+ "$pkgdir"/usr/lib/python${_basever}/lib-dynload/
+
+ mv "$builddir"/tmpinstall/usr/bin/idle* \
+ "$pkgdir"/usr/bin/
+}
+
+_mv_files() {
+ local i
+ for i in "$@"; do
+ mkdir -p "$subpkgdir"/${i%/*}
+ mv "$pkgdir"/$i "$subpkgdir"/$i
+ done
+}
+
+tests() {
+ pkgdesc="The test modules from the main python package for tkinter"
+ replaces="python3-tests"
+ cd "$pkgdir"
+ _mv_files usr/lib/python*/*/*_test
+}
+
+_idle() {
+ pkgdesc="IDE for Python3 using Tkinter"
+ depends="$pkgname=$pkgver-r$pkgrel"
+ cd "$pkgdir"
+ _mv_files usr/bin
+}
+
+sha512sums="32f24a3adcb7880003c7ecdc5e53e838e774adda76b308961d8215e28db630b2fa2828097817924c76afa4212b2df3362eb64d4e10f37c0147f512ec5aa8662b Python-3.6.3.tar.xz
+ab8eaa2858d5109049b1f9f553198d40e0ef8d78211ad6455f7b491af525bffb16738fed60fc84e960c4889568d25753b9e4a1494834fea48291b33f07000ec2 musl-find_library.patch
+37b6ee5d0d5de43799316aa111423ba5a666c17dc7f81b04c330f59c1d1565540eac4c585abe2199bbed52ebe7426001edb1c53bd0a17486a2a8e052d0f494ad fix-xattrs-glibc.patch
+df54032e66171483aad24f9f370e185072dcb2d6981210a8dd79b5fa51c2c7aa64da2501aa96bb5009bfb658387851068bc82f23c515f739672722495c2c98dd bpo-30353.patch"
diff --git a/community/python3-tkinter/bpo-30353.patch b/community/python3-tkinter/bpo-30353.patch
new file mode 100644
index 0000000000..28fc93eef0
--- /dev/null
+++ b/community/python3-tkinter/bpo-30353.patch
@@ -0,0 +1,133 @@
+https://github.com/python/cpython/commit/9ba3aa4d02a110d1a1ea464a8aff3be7dd9c63c3.patch
+
+From 9ba3aa4d02a110d1a1ea464a8aff3be7dd9c63c3 Mon Sep 17 00:00:00 2001
+From: Erik Bray <erik.m.bray@gmail.com>
+Date: Wed, 7 Jun 2017 18:42:24 +0100
+Subject: [PATCH] bpo-30353: Fix pass by value for structs on 64-bit
+ Cygwin/MinGW (GH-1559)
+
+---
+ Lib/ctypes/test/test_as_parameter.py | 4 ++++
+ Lib/ctypes/test/test_structures.py | 22 ++++++++++++++++++++++
+ Modules/_ctypes/_ctypes_test.c | 18 ++++++++++++++++++
+ Modules/_ctypes/callproc.c | 23 +++++++++++++++++++++--
+ 4 files changed, 65 insertions(+), 2 deletions(-)
+
+diff --git a/Lib/ctypes/test/test_as_parameter.py b/Lib/ctypes/test/test_as_parameter.py
+index 2a3484bec01..a2640575a07 100644
+--- a/Lib/ctypes/test/test_as_parameter.py
++++ b/Lib/ctypes/test/test_as_parameter.py
+@@ -169,6 +169,10 @@ class S2H(Structure):
+ s2h = dll.ret_2h_func(self.wrap(inp))
+ self.assertEqual((s2h.x, s2h.y), (99*2, 88*3))
+
++ # Test also that the original struct was unmodified (i.e. was passed by
++ # value)
++ self.assertEqual((inp.x, inp.y), (99, 88))
++
+ def test_struct_return_8H(self):
+ class S8I(Structure):
+ _fields_ = [("a", c_int),
+diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
+index 2e778fb1b43..d90c71144c9 100644
+--- a/Lib/ctypes/test/test_structures.py
++++ b/Lib/ctypes/test/test_structures.py
+@@ -417,6 +417,28 @@ class X(Structure):
+ self.assertEqual(s.second, 0xcafebabe)
+ self.assertEqual(s.third, 0x0bad1dea)
+
++ def test_pass_by_value_in_register(self):
++ class X(Structure):
++ _fields_ = [
++ ('first', c_uint),
++ ('second', c_uint)
++ ]
++
++ s = X()
++ s.first = 0xdeadbeef
++ s.second = 0xcafebabe
++ dll = CDLL(_ctypes_test.__file__)
++ func = dll._testfunc_reg_struct_update_value
++ func.argtypes = (X,)
++ func.restype = None
++ func(s)
++ self.assertEqual(s.first, 0xdeadbeef)
++ self.assertEqual(s.second, 0xcafebabe)
++ got = X.in_dll(dll, "last_tfrsuv_arg")
++ self.assertEqual(s.first, got.first)
++ self.assertEqual(s.second, got.second)
++
++
+ class PointerMemberTestCase(unittest.TestCase):
+
+ def test(self):
+diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c
+index fe0015c8013..2255e573393 100644
+--- a/Modules/_ctypes/_ctypes_test.c
++++ b/Modules/_ctypes/_ctypes_test.c
+@@ -57,6 +57,24 @@ _testfunc_large_struct_update_value(Test in)
+ ((volatile Test *)&in)->third = 0x0badf00d;
+ }
+
++typedef struct {
++ unsigned int first;
++ unsigned int second;
++} TestReg;
++
++
++EXPORT(TestReg) last_tfrsuv_arg;
++
++
++EXPORT(void)
++_testfunc_reg_struct_update_value(TestReg in)
++{
++ last_tfrsuv_arg = in;
++ ((volatile TestReg *)&in)->first = 0x0badf00d;
++ ((volatile TestReg *)&in)->second = 0x0badf00d;
++}
++
++
+ EXPORT(void)testfunc_array(int values[4])
+ {
+ printf("testfunc_array %d %d %d %d\n",
+diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
+index 0b6faf96c68..5439b939dc4 100644
+--- a/Modules/_ctypes/callproc.c
++++ b/Modules/_ctypes/callproc.c
+@@ -1039,6 +1039,13 @@ GetComError(HRESULT errcode, GUID *riid, IUnknown *pIunk)
+ }
+ #endif
+
++#if (defined(__x86_64__) && (defined(__MINGW64__) || defined(__CYGWIN__))) || \
++ defined(__aarch64__)
++#define CTYPES_PASS_BY_REF_HACK
++#define POW2(x) (((x & ~(x - 1)) == x) ? x : 0)
++#define IS_PASS_BY_REF(x) (x > 8 || !POW2(x))
++#endif
++
+ /*
+ * Requirements, must be ensured by the caller:
+ * - argtuple is tuple of arguments
+@@ -1136,8 +1143,20 @@ PyObject *_ctypes_callproc(PPROC pProc,
+ }
+ for (i = 0; i < argcount; ++i) {
+ atypes[i] = args[i].ffi_type;
+- if (atypes[i]->type == FFI_TYPE_STRUCT
+- )
++#ifdef CTYPES_PASS_BY_REF_HACK
++ size_t size = atypes[i]->size;
++ if (IS_PASS_BY_REF(size)) {
++ void *tmp = alloca(size);
++ if (atypes[i]->type == FFI_TYPE_STRUCT)
++ memcpy(tmp, args[i].value.p, size);
++ else
++ memcpy(tmp, (void*)&args[i].value, size);
++
++ avalues[i] = tmp;
++ }
++ else
++#endif
++ if (atypes[i]->type == FFI_TYPE_STRUCT)
+ avalues[i] = (void *)args[i].value.p;
+ else
+ avalues[i] = (void *)&args[i].value;
diff --git a/community/python3-tkinter/fix-xattrs-glibc.patch b/community/python3-tkinter/fix-xattrs-glibc.patch
new file mode 100644
index 0000000000..57a8fb73ab
--- /dev/null
+++ b/community/python3-tkinter/fix-xattrs-glibc.patch
@@ -0,0 +1,15 @@
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+index 8f8ba25..72b92da 100644
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -103,8 +103,9 @@ corresponding Unix manual entries for more information on calls.");
+ #undef HAVE_SCHED_SETAFFINITY
+ #endif
+
+-#if defined(HAVE_SYS_XATTR_H) && defined(__GLIBC__) && !defined(__FreeBSD_kernel__) && !defined(__GNU__)
++#if defined(HAVE_SYS_XATTR_H) && defined(__linux__) && !defined(__FreeBSD_kernel__) && !defined(__GNU__)
+ #define USE_XATTRS
++#include <linux/limits.h>
+ #endif
+
+ #ifdef USE_XATTRS
diff --git a/community/python3-tkinter/musl-find_library.patch b/community/python3-tkinter/musl-find_library.patch
new file mode 100644
index 0000000000..7899abb736
--- /dev/null
+++ b/community/python3-tkinter/musl-find_library.patch
@@ -0,0 +1,45 @@
+diff -ru Python-2.7.12.orig/Lib/ctypes/util.py Python-2.7.12/Lib/ctypes/util.py
+--- Python-2.7.12.orig/Lib/ctypes/util.py 2016-06-26 00:49:30.000000000 +0300
++++ Python-2.7.12/Lib/ctypes/util.py 2016-11-03 16:05:46.954665040 +0200
+@@ -204,6 +204,41 @@
+ def find_library(name, is64 = False):
+ return _get_soname(_findLib_crle(name, is64) or _findLib_gcc(name))
+
++ elif True:
++
++ # Patched for Alpine Linux / musl - search manually system paths
++ def _is_elf(filepath):
++ try:
++ with open(filepath, 'rb') as fh:
++ return fh.read(4) == b'\x7fELF'
++ except:
++ return False
++
++ def find_library(name):
++ from glob import glob
++ # absolute name?
++ if os.path.isabs(name):
++ return name
++ # special case for libm, libcrypt and libpthread and musl
++ if name in ['m', 'crypt', 'pthread']:
++ name = 'c'
++ elif name in ['libm.so', 'libcrypt.so', 'libpthread.so']:
++ name = 'libc.so'
++ # search in standard locations (musl order)
++ paths = ['/lib', '/usr/local/lib', '/usr/lib']
++ if 'LD_LIBRARY_PATH' in os.environ:
++ paths = os.environ['LD_LIBRARY_PATH'].split(':') + paths
++ for d in paths:
++ f = os.path.join(d, name)
++ if _is_elf(f):
++ return os.path.basename(f)
++
++ prefix = os.path.join(d, 'lib'+name)
++ for suffix in ['.so', '.so.*']:
++ for f in glob('{0}{1}'.format(prefix, suffix)):
++ if _is_elf(f):
++ return os.path.basename(f)
++
+ else:
+
+ def _findSoname_ldconfig(name):