diff --git a/pkgs/development/interpreters/python/cpython/3.4/default.nix b/pkgs/development/interpreters/python/cpython/3.4/default.nix index 5799e319ba04..d00b91f316ff 100644 --- a/pkgs/development/interpreters/python/cpython/3.4/default.nix +++ b/pkgs/development/interpreters/python/cpython/3.4/default.nix @@ -64,6 +64,10 @@ in stdenv.mkDerivation { substituteInPlace configure --replace '-Wl,-stack_size,1000000' ' ' ''; + patches = [ + ./no-ldconfig.patch + ]; + postPatch = '' # Determinism substituteInPlace "Lib/py_compile.py" --replace "source_stats['mtime']" "(1 if 'DETERMINISTIC_BUILD' in os.environ else source_stats['mtime'])" diff --git a/pkgs/development/interpreters/python/cpython/3.4/no-ldconfig.patch b/pkgs/development/interpreters/python/cpython/3.4/no-ldconfig.patch new file mode 100644 index 000000000000..3cb77a107254 --- /dev/null +++ b/pkgs/development/interpreters/python/cpython/3.4/no-ldconfig.patch @@ -0,0 +1,147 @@ +From 81bd99ad9058feb1d0361bc8862e8567c21a6142 Mon Sep 17 00:00:00 2001 +From: Frederik Rietdijk +Date: Mon, 28 Aug 2017 09:24:06 +0200 +Subject: [PATCH] Don't use ldconfig and speed up uuid load + +--- + Lib/ctypes/util.py | 52 ++-------------------------------------------------- + Lib/uuid.py | 50 ++------------------------------------------------ + 2 files changed, 4 insertions(+), 98 deletions(-) + +diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py +index 595113bffd..780cd5d21b 100644 +--- a/Lib/ctypes/util.py ++++ b/Lib/ctypes/util.py +@@ -88,28 +88,7 @@ elif os.name == "posix": + import re, tempfile + + def _findLib_gcc(name): +- expr = r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name) +- fdout, ccout = tempfile.mkstemp() +- os.close(fdout) +- cmd = 'if type gcc >/dev/null 2>&1; then CC=gcc; elif type cc >/dev/null 2>&1; then CC=cc;else exit 10; fi;' \ +- 'LANG=C LC_ALL=C $CC -Wl,-t -o ' + ccout + ' 2>&1 -l' + name +- try: +- f = os.popen(cmd) +- try: +- trace = f.read() +- finally: +- rv = f.close() +- finally: +- try: +- os.unlink(ccout) +- except FileNotFoundError: +- pass +- if rv == 10: +- raise OSError('gcc or cc command not found') +- res = re.search(expr, trace) +- if not res: +- return None +- return res.group(0) ++ return None + + + if sys.platform == "sunos5": +@@ -200,34 +179,7 @@ elif os.name == "posix": + else: + + def _findSoname_ldconfig(name): +- import struct +- if struct.calcsize('l') == 4: +- machine = os.uname().machine + '-32' +- else: +- machine = os.uname().machine + '-64' +- mach_map = { +- 'x86_64-64': 'libc6,x86-64', +- 'ppc64-64': 'libc6,64bit', +- 'sparc64-64': 'libc6,64bit', +- 's390x-64': 'libc6,64bit', +- 'ia64-64': 'libc6,IA-64', +- } +- abi_type = mach_map.get(machine, 'libc6') +- +- # XXX assuming GLIBC's ldconfig (with option -p) +- regex = os.fsencode( +- '\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type)) +- try: +- with subprocess.Popen(['/sbin/ldconfig', '-p'], +- stdin=subprocess.DEVNULL, +- stderr=subprocess.DEVNULL, +- stdout=subprocess.PIPE, +- env={'LC_ALL': 'C', 'LANG': 'C'}) as p: +- res = re.search(regex, p.stdout.read()) +- if res: +- return os.fsdecode(res.group(1)) +- except OSError: +- pass ++ return None + + def find_library(name): + return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) +diff --git a/Lib/uuid.py b/Lib/uuid.py +index 1061bffc43..846f5819f5 100644 +--- a/Lib/uuid.py ++++ b/Lib/uuid.py +@@ -451,57 +451,11 @@ def _netbios_getnode(): + return ((bytes[0]<<40) + (bytes[1]<<32) + (bytes[2]<<24) + + (bytes[3]<<16) + (bytes[4]<<8) + bytes[5]) + +-# Thanks to Thomas Heller for ctypes and for his help with its use here. + +-# If ctypes is available, use it to find system routines for UUID generation. +-# XXX This makes the module non-thread-safe! + _uuid_generate_random = _uuid_generate_time = _UuidCreate = None +-try: +- import ctypes, ctypes.util + +- # The uuid_generate_* routines are provided by libuuid on at least +- # Linux and FreeBSD, and provided by libc on Mac OS X. +- for libname in ['uuid', 'c']: +- try: +- lib = ctypes.CDLL(ctypes.util.find_library(libname)) +- except: +- continue +- if hasattr(lib, 'uuid_generate_random'): +- _uuid_generate_random = lib.uuid_generate_random +- if hasattr(lib, 'uuid_generate_time'): +- _uuid_generate_time = lib.uuid_generate_time +- if _uuid_generate_random is not None: +- break # found everything we were looking for +- +- # The uuid_generate_* functions are broken on MacOS X 10.5, as noted +- # in issue #8621 the function generates the same sequence of values +- # in the parent process and all children created using fork (unless +- # those children use exec as well). +- # +- # Assume that the uuid_generate functions are broken from 10.5 onward, +- # the test can be adjusted when a later version is fixed. +- import sys +- if sys.platform == 'darwin': +- import os +- if int(os.uname().release.split('.')[0]) >= 9: +- _uuid_generate_random = _uuid_generate_time = None +- +- # On Windows prior to 2000, UuidCreate gives a UUID containing the +- # hardware address. On Windows 2000 and later, UuidCreate makes a +- # random UUID and UuidCreateSequential gives a UUID containing the +- # hardware address. These routines are provided by the RPC runtime. +- # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last +- # 6 bytes returned by UuidCreateSequential are fixed, they don't appear +- # to bear any relationship to the MAC address of any network device +- # on the box. +- try: +- lib = ctypes.windll.rpcrt4 +- except: +- lib = None +- _UuidCreate = getattr(lib, 'UuidCreateSequential', +- getattr(lib, 'UuidCreate', None)) +-except: +- pass ++_uuid_generate_time = _UuidCreate = None ++ + + def _unixdll_getnode(): + """Get the hardware address on Unix using ctypes.""" +-- +2.14.1 + diff --git a/pkgs/development/interpreters/python/cpython/3.5/no-ldconfig.patch b/pkgs/development/interpreters/python/cpython/3.5/no-ldconfig.patch index c96de5d0e914..9718b1d8dceb 100644 --- a/pkgs/development/interpreters/python/cpython/3.5/no-ldconfig.patch +++ b/pkgs/development/interpreters/python/cpython/3.5/no-ldconfig.patch @@ -1,12 +1,12 @@ -From f0ed87f4066296b7aa3c095d04672c138506fa45 Mon Sep 17 00:00:00 2001 +From 590c46bb04f79ab611b2f8fd682dd7e43a01f268 Mon Sep 17 00:00:00 2001 From: Frederik Rietdijk -Date: Sat, 29 Jul 2017 20:33:56 +0200 +Date: Mon, 28 Aug 2017 09:24:06 +0200 Subject: [PATCH] Don't use ldconfig and speed up uuid load --- Lib/ctypes/util.py | 70 ++---------------------------------------------------- - Lib/uuid.py | 52 ---------------------------------------- - 2 files changed, 2 insertions(+), 120 deletions(-) + Lib/uuid.py | 49 -------------------------------------- + 2 files changed, 2 insertions(+), 117 deletions(-) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 7684eab81d..e9957d7951 100644 @@ -97,22 +97,22 @@ index 7684eab81d..e9957d7951 100644 def find_library(name): return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) diff --git a/Lib/uuid.py b/Lib/uuid.py -index e96e7e034c..a099ab4b4a 100644 +index e96e7e034c..31160ace95 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py -@@ -455,58 +455,6 @@ def _netbios_getnode(): +@@ -455,58 +455,9 @@ def _netbios_getnode(): continue return int.from_bytes(bytes, 'big') -# Thanks to Thomas Heller for ctypes and for his help with its use here. -- + -# If ctypes is available, use it to find system routines for UUID generation. -# XXX This makes the module non-thread-safe! --_uuid_generate_time = _UuidCreate = None + _uuid_generate_time = _UuidCreate = None -try: - import ctypes, ctypes.util - import sys -- + - # The uuid_generate_* routines are provided by libuuid on at least - # Linux and FreeBSD, and provided by libc on Mac OS X. - _libnames = ['uuid'] @@ -160,5 +160,5 @@ index e96e7e034c..a099ab4b4a 100644 def _unixdll_getnode(): """Get the hardware address on Unix using ctypes.""" -- -2.13.3 +2.14.1 diff --git a/pkgs/development/interpreters/python/cpython/3.6/no-ldconfig.patch b/pkgs/development/interpreters/python/cpython/3.6/no-ldconfig.patch index da6afe04d6e7..0f829860a5b7 100644 --- a/pkgs/development/interpreters/python/cpython/3.6/no-ldconfig.patch +++ b/pkgs/development/interpreters/python/cpython/3.6/no-ldconfig.patch @@ -1,12 +1,12 @@ -From a831df344ec1c883a0ef04d8cc8f5c53a942f6de Mon Sep 17 00:00:00 2001 +From 105621b99cc30615c79b5aa3d12d6732e14b0d59 Mon Sep 17 00:00:00 2001 From: Frederik Rietdijk -Date: Sat, 29 Jul 2017 20:17:40 +0200 +Date: Mon, 28 Aug 2017 09:24:06 +0200 Subject: [PATCH] Don't use ldconfig and speed up uuid load --- Lib/ctypes/util.py | 70 ++---------------------------------------------------- - Lib/uuid.py | 51 --------------------------------------- - 2 files changed, 2 insertions(+), 119 deletions(-) + Lib/uuid.py | 48 ------------------------------------- + 2 files changed, 2 insertions(+), 116 deletions(-) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 339ae8aa8a..2944985c30 100644 @@ -97,22 +97,22 @@ index 339ae8aa8a..2944985c30 100644 def _findLib_ld(name): # See issue #9998 for why this is needed diff --git a/Lib/uuid.py b/Lib/uuid.py -index 200c800b34..a099ab4b4a 100644 +index 200c800b34..31160ace95 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py -@@ -455,57 +455,6 @@ def _netbios_getnode(): +@@ -455,57 +455,9 @@ def _netbios_getnode(): continue return int.from_bytes(bytes, 'big') -# Thanks to Thomas Heller for ctypes and for his help with its use here. -- + -# If ctypes is available, use it to find system routines for UUID generation. -# XXX This makes the module non-thread-safe! --_uuid_generate_time = _UuidCreate = None + _uuid_generate_time = _UuidCreate = None -try: - import ctypes, ctypes.util - import sys -- + - # The uuid_generate_* routines are provided by libuuid on at least - # Linux and FreeBSD, and provided by libc on Mac OS X. - _libnames = ['uuid'] @@ -159,5 +159,5 @@ index 200c800b34..a099ab4b4a 100644 def _unixdll_getnode(): """Get the hardware address on Unix using ctypes.""" -- -2.13.3 +2.14.1