about summary refs log tree commit diff
path: root/pkgs/development/interpreters/python
diff options
context:
space:
mode:
authorFrederik Rietdijk <fridh@fridh.nl>2017-08-28 09:42:59 +0200
committerFrederik Rietdijk <fridh@fridh.nl>2017-08-28 09:42:59 +0200
commita7ddca6e3dce865a6a07cbdaea3963026b7bb3d3 (patch)
tree0c710b634d7770192cab9caa3e774182014a234a /pkgs/development/interpreters/python
parentaa1e535b1be7ecba807244ce90f5a1d4b2c492cf (diff)
downloadnixlib-a7ddca6e3dce865a6a07cbdaea3963026b7bb3d3.tar
nixlib-a7ddca6e3dce865a6a07cbdaea3963026b7bb3d3.tar.gz
nixlib-a7ddca6e3dce865a6a07cbdaea3963026b7bb3d3.tar.bz2
nixlib-a7ddca6e3dce865a6a07cbdaea3963026b7bb3d3.tar.lz
nixlib-a7ddca6e3dce865a6a07cbdaea3963026b7bb3d3.tar.xz
nixlib-a7ddca6e3dce865a6a07cbdaea3963026b7bb3d3.tar.zst
nixlib-a7ddca6e3dce865a6a07cbdaea3963026b7bb3d3.zip
python 3.4, 3.5, 3.6: Don't use ldconfig and speed up uuid load, fixes #28349
These patches had already been merged for 3.5 and 3.6 but not yet for
3.4. However, they did contain a mistake as explained in #28349.
Diffstat (limited to 'pkgs/development/interpreters/python')
-rw-r--r--pkgs/development/interpreters/python/cpython/3.4/default.nix4
-rw-r--r--pkgs/development/interpreters/python/cpython/3.4/no-ldconfig.patch147
-rw-r--r--pkgs/development/interpreters/python/cpython/3.5/no-ldconfig.patch20
-rw-r--r--pkgs/development/interpreters/python/cpython/3.6/no-ldconfig.patch20
4 files changed, 171 insertions, 20 deletions
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 <fridh@fridh.nl>
+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 <fridh@fridh.nl>
-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 <fridh@fridh.nl>
-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