diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2017-10-27 07:04:54 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2017-10-27 16:49:59 +0000 |
commit | 6f4cca64ba524f3bb7b076776e940befef11390e (patch) | |
tree | f85ed725ef9d95fcf877d8898ee248b4ab56cfa4 /community | |
parent | 63e2605b9bfa963e05166f5a1631fd9164600698 (diff) | |
download | aports-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/APKBUILD | 114 | ||||
-rw-r--r-- | community/python3-tkinter/bpo-30353.patch | 133 | ||||
-rw-r--r-- | community/python3-tkinter/fix-xattrs-glibc.patch | 15 | ||||
-rw-r--r-- | community/python3-tkinter/musl-find_library.patch | 45 |
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): |