Python: move interpreters

Move Python interpreters (CPython, PyPy) to same folder and share
layout.
This commit is contained in:
Frederik Rietdijk
2016-07-07 14:05:05 +02:00
parent 86393cfc20
commit 1da6775775
48 changed files with 26 additions and 23 deletions

View File

@@ -0,0 +1,34 @@
--- origsrc/Lib/ctypes/util.py 2007-09-14 15:05:26.000000000 -0500
+++ src/Lib/ctypes/util.py 2008-11-25 17:54:47.319296200 -0600
@@ -41,6 +41,20 @@
continue
return None
+elif sys.platform == "cygwin":
+ def find_library(name):
+ for libdir in ['/usr/lib', '/usr/local/lib']:
+ for libext in ['lib%s.dll.a' % name, 'lib%s.a' % name]:
+ implib = os.path.join(libdir, libext)
+ if not os.path.exists(implib):
+ continue
+ cmd = "dlltool -I " + implib + " 2>/dev/null"
+ res = os.popen(cmd).read().replace("\n","")
+ if not res:
+ continue
+ return res
+ return None
+
elif os.name == "posix":
# Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump
import re, tempfile, errno
@@ -157,6 +173,10 @@
print cdll.LoadLibrary("libcrypto.dylib")
print cdll.LoadLibrary("libSystem.dylib")
print cdll.LoadLibrary("System.framework/System")
+ elif sys.platform == "cygwin":
+ print cdll.LoadLibrary("cygbz2-1.dll")
+ print find_library("crypt")
+ print cdll.LoadLibrary("cygcrypt-0.dll")
else:
print cdll.LoadLibrary("libm.so")
print cdll.LoadLibrary("libcrypt.so")

View File

@@ -0,0 +1,27 @@
--- origsrc/setup.py 2008-02-04 17:41:02.000000000 -0600
+++ src/setup.py 2008-07-02 02:11:28.671875000 -0500
@@ -1277,12 +1279,6 @@
include_dirs.append('/usr/X11/include')
added_lib_dirs.append('/usr/X11/lib')
- # If Cygwin, then verify that X is installed before proceeding
- if host_platform == 'cygwin':
- x11_inc = find_file('X11/Xlib.h', [], include_dirs)
- if x11_inc is None:
- return
-
# Check for BLT extension
if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
'BLT8.0'):
@@ -1300,9 +1296,8 @@
if host_platform in ['aix3', 'aix4']:
libs.append('ld')
- # Finally, link with the X11 libraries (not appropriate on cygwin)
- if host_platform != "cygwin":
- libs.append('X11')
+ # Finally, link with the X11 libraries
+ libs.append('X11')
ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
define_macros=[('WITH_APPINIT', 1)] + defs,

View File

@@ -0,0 +1,13 @@
--- origsrc/Modules/_ssl.c 2009-01-26 10:55:41.000000000 -0600
+++ src/Modules/_ssl.c 2009-08-20 00:04:59.346816700 -0500
@@ -15,6 +15,10 @@
#include "Python.h"
+#ifdef __CYGWIN__
+#undef WITH_THREAD
+#endif
+
#ifdef WITH_THREAD
#include "pythread.h"
#define PySSL_BEGIN_ALLOW_THREADS { \

View File

@@ -0,0 +1,41 @@
--- Python-2.6.5.orig/Modules/selectmodule.c 2012-02-02 22:35:21.835125000 -0500
+++ Python-2.6.5/Modules/selectmodule.c 2012-02-02 22:41:41.210125000 -0500
@@ -6,6 +6,21 @@
>= 0.
*/
+/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
+ 64 is too small (too many people have bumped into that limit).
+ Here we boost it.
+
+ Cygwin also defines FD_SETSIZE to 64, so also increase the limit on
+ Cygwin. We must do this before sys/types.h is included, which otherwise
+ sets FD_SETSIZE to the default.
+
+ Users who want even more than the boosted limit should #define
+ FD_SETSIZE higher before this; e.g., via compiler /D switch.
+*/
+#if (defined(MS_WINDOWS) || defined(__CYGWIN__)) && !defined(FD_SETSIZE)
+#define FD_SETSIZE 512
+#endif
+
#include "Python.h"
#include <structmember.h>
@@ -16,16 +31,6 @@
#undef HAVE_BROKEN_POLL
#endif
-/* Windows #defines FD_SETSIZE to 64 if FD_SETSIZE isn't already defined.
- 64 is too small (too many people have bumped into that limit).
- Here we boost it.
- Users who want even more than the boosted limit should #define
- FD_SETSIZE higher before this; e.g., via compiler /D switch.
-*/
-#if defined(MS_WINDOWS) && !defined(FD_SETSIZE)
-#define FD_SETSIZE 512
-#endif
-
#if defined(HAVE_POLL_H)
#include <poll.h>
#elif defined(HAVE_SYS_POLL_H)

View File

@@ -0,0 +1,11 @@
--- origsrc/Include/pyerrors.h 2008-06-08 23:58:54.000000000 -0500
+++ src/Include/pyerrors.h 2010-05-12 04:19:31.535297200 -0500
@@ -232,7 +232,7 @@ PyAPI_FUNC(int) PyErr_CheckSignals(void)
PyAPI_FUNC(void) PyErr_SetInterrupt(void);
/* In signalmodule.c */
-int PySignal_SetWakeupFd(int fd);
+PyAPI_FUNC(int) PySignal_SetWakeupFd(int fd);
/* Support for adding program text to SyntaxErrors */
PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int);

View File

@@ -0,0 +1,16 @@
--- origsrc/Include/py_curses.h 2009-09-06 16:23:05.000000000 -0500
+++ src/Include/py_curses.h 2010-04-14 15:21:23.008971400 -0500
@@ -17,6 +17,13 @@
#define NCURSES_OPAQUE 0
#endif /* __APPLE__ */
+#ifdef __CYGWIN__
+/* the following define is necessary for Cygwin; without it, the
+ Cygwin-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python
+ can't get at the WINDOW flags field. */
+#define NCURSES_INTERNALS
+#endif /* __CYGWIN__ */
+
#ifdef __FreeBSD__
/*
** On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards

View File

@@ -0,0 +1,27 @@
--- origsrc/setup.py.orig 2012-11-27 10:20:47.442395900 -0500
+++ src/setup.py 2012-11-27 10:53:15.583020900 -0500
@@ -1141,7 +1141,7 @@
dbm_order = ['gdbm']
# The standard Unix dbm module:
- if host_platform not in ['cygwin']:
+ if host_platform not in ['win32']:
config_args = [arg.strip("'")
for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
dbm_args = [arg for arg in config_args
@@ -1192,6 +1192,15 @@
],
libraries = gdbm_libs)
break
+ if find_file("ndbm.h", inc_dirs, []) is not None:
+ print("building dbm using gdbm")
+ dbmext = Extension(
+ 'dbm', ['dbmmodule.c'],
+ define_macros=[
+ ('HAVE_NDBM_H', None),
+ ],
+ libraries = gdbm_libs)
+ break
elif cand == "bdb":
if db_incs is not None:
print "building dbm using bdb"

View File

@@ -0,0 +1,10 @@
--- origsrc/Lib/distutils/unixccompiler.py.orig 2012-11-27 07:44:15.409993500 -0500
+++ src/Lib/distutils/unixccompiler.py 2012-11-27 08:09:57.801770900 -0500
@@ -141,6 +141,7 @@
static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s"
if sys.platform == "cygwin":
exe_extension = ".exe"
+ dylib_lib_extension = ".dll.a"
def preprocess(self, source,
output_file=None, macros=None, include_dirs=None,

View File

@@ -0,0 +1,31 @@
--- origsrc/Modules/getpath.c.orig 2012-11-27 12:07:56.098645900 -0500
+++ src/Modules/getpath.c 2012-11-27 12:10:11.254895900 -0500
@@ -436,6 +436,28 @@
if (isxfile(progpath))
break;
+#ifdef __CYGWIN__
+ /*
+ * Cygwin automatically removes the ".exe" extension from argv[0]
+ * to make programs feel like they are in a more Unix-like
+ * environment. Unfortunately, this can make it problemmatic for
+ * Cygwin to distinguish between a directory and an executable with
+ * the same name excluding the ".exe" extension. For example, the
+ * Cygwin Python build directory has a "Python" directory and a
+ * "python.exe" executable. This causes isxfile() to erroneously
+ * return false. If isdir() returns true and there is enough space
+ * to append the ".exe" extension, then we try again with the
+ * extension appended.
+ */
+#define EXE ".exe"
+ if (isdir(progpath) && strlen(progpath) + strlen(EXE) <= MAXPATHLEN)
+ {
+ strcat(progpath, EXE);
+ if (isxfile(progpath))
+ break;
+ }
+#endif /* __CYGWIN__ */
+
if (!delim) {
progpath[0] = '\0';
break;

View File

@@ -0,0 +1,11 @@
--- origsrc/setup.py.orig 2012-11-27 09:28:34.051770900 -0500
+++ src/setup.py 2012-11-27 09:28:47.239270900 -0500
@@ -470,7 +470,7 @@
# Check for MacOS X, which doesn't need libm.a at all
math_libs = ['m']
- if host_platform in ['darwin', 'beos']:
+ if host_platform in ['darwin', 'beos', 'cygwin']:
math_libs = []
# XXX Omitted modules: gl, pure, dl, SGI-specific modules

View File

@@ -0,0 +1,284 @@
{ stdenv, fetchurl, self, callPackage, python27Packages
, bzip2, openssl, gettext
, less
, includeModules ? false
, db, gdbm, ncurses, sqlite, readline
, tcl ? null, tk ? null, xlibsWrapper ? null, libX11 ? null, x11Support ? !stdenv.isCygwin
, zlib ? null, zlibSupport ? true
, expat, libffi
, CF, configd
}:
assert zlibSupport -> zlib != null;
assert x11Support -> tcl != null
&& tk != null
&& xlibsWrapper != null
&& libX11 != null;
with stdenv.lib;
let
majorVersion = "2.7";
version = "${majorVersion}.12";
src = fetchurl {
url = "http://www.python.org/ftp/python/${version}/Python-${version}.tar.xz";
sha256 = "0y7rl603vmwlxm6ilkhc51rx2mfj14ckcz40xxgs0ljnvlhp30yp";
};
patches =
[ # Look in C_INCLUDE_PATH and LIBRARY_PATH for stuff.
./search-path.patch
# Python recompiles a Python if the mtime stored *in* the
# pyc/pyo file differs from the mtime of the source file. This
# doesn't work in Nix because Nix changes the mtime of files in
# the Nix store to 1. So treat that as a special case.
./nix-store-mtime.patch
# patch python to put zero timestamp into pyc
# if DETERMINISTIC_BUILD env var is set
./deterministic-build.patch
./properly-detect-curses.patch
] ++ optionals stdenv.isLinux [
# Disable the use of ldconfig in ctypes.util.find_library (since
# ldconfig doesn't work on NixOS), and don't use
# ctypes.util.find_library during the loading of the uuid module
# (since it will do a futile invocation of gcc (!) to find
# libuuid, slowing down program startup a lot).
./no-ldconfig.patch
] ++ optionals stdenv.isCygwin [
./2.5.2-ctypes-util-find_library.patch
./2.5.2-tkinter-x11.patch
./2.6.2-ssl-threads.patch
./2.6.5-export-PySignal_SetWakeupFd.patch
./2.6.5-FD_SETSIZE.patch
./2.6.5-ncurses-abi6.patch
./2.7.3-dbm.patch
./2.7.3-dylib.patch
./2.7.3-getpath-exe-extension.patch
./2.7.3-no-libm.patch
];
preConfigure = ''
# Purity.
for i in /usr /sw /opt /pkg; do
substituteInPlace ./setup.py --replace $i /no-such-path
done
'' + optionalString (stdenv ? cc && stdenv.cc.libc != null) ''
for i in Lib/plat-*/regen; do
substituteInPlace $i --replace /usr/include/ ${stdenv.cc.libc}/include/
done
'' + optionalString stdenv.isDarwin ''
substituteInPlace configure --replace '`/usr/bin/arch`' '"i386"'
substituteInPlace Lib/multiprocessing/__init__.py \
--replace 'os.popen(comm)' 'os.popen("nproc")'
'';
configureFlags = [
"--enable-shared"
"--with-threads"
"--enable-unicode=ucs4"
] ++ optionals stdenv.isCygwin [
"--with-system-ffi"
"--with-system-expat"
"ac_cv_func_bind_textdomain_codeset=yes"
] ++ optionals stdenv.isDarwin [
"--disable-toolbox-glue"
];
postConfigure = if stdenv.isCygwin then ''
sed -i Makefile -e 's,PYTHONPATH="$(srcdir),PYTHONPATH="$(abs_srcdir),'
'' else null;
buildInputs =
optional (stdenv ? cc && stdenv.cc.libc != null) stdenv.cc.libc ++
[ bzip2 openssl ]
++ optionals stdenv.isCygwin [ expat libffi ]
++ optionals includeModules (
[ db gdbm ncurses sqlite readline
] ++ optionals x11Support [ tcl tk xlibsWrapper libX11 ]
)
++ optional zlibSupport zlib
++ optional stdenv.isDarwin CF;
propagatedBuildInputs = [ less ] ++ optional stdenv.isDarwin configd;
mkPaths = paths: {
C_INCLUDE_PATH = makeSearchPathOutput "dev" "include" paths;
LIBRARY_PATH = makeLibraryPath paths;
};
# Build the basic Python interpreter without modules that have
# external dependencies.
python = stdenv.mkDerivation {
name = "python-${version}";
pythonVersion = majorVersion;
inherit majorVersion version src patches buildInputs propagatedBuildInputs
preConfigure configureFlags;
LDFLAGS = stdenv.lib.optionalString (!stdenv.isDarwin) "-lgcc_s";
inherit (mkPaths buildInputs) C_INCLUDE_PATH LIBRARY_PATH;
NIX_CFLAGS_COMPILE = optionalString stdenv.isDarwin "-msse2";
DETERMINISTIC_BUILD = 1;
setupHook = ./setup-hook.sh;
postInstall =
''
# needed for some packages, especially packages that backport
# functionality to 2.x from 3.x
for item in $out/lib/python${majorVersion}/test/*; do
if [[ "$item" != */test_support.py* ]]; then
rm -rf "$item"
else
echo $item
fi
done
touch $out/lib/python${majorVersion}/test/__init__.py
ln -s $out/lib/python${majorVersion}/pdb.py $out/bin/pdb
ln -s $out/lib/python${majorVersion}/pdb.py $out/bin/pdb${majorVersion}
ln -s $out/share/man/man1/{python2.7.1.gz,python.1.gz}
paxmark E $out/bin/python${majorVersion}
${optionalString includeModules "$out/bin/python ./setup.py build_ext"}
rm "$out"/lib/python*/plat-*/regen # refers to glibc.dev
'';
passthru = rec {
inherit zlibSupport;
isPy2 = true;
isPy27 = true;
buildEnv = callPackage ../../wrapper.nix { python = self; };
withPackages = import ../../with-packages.nix { inherit buildEnv; pythonPackages = python27Packages; };
libPrefix = "python${majorVersion}";
executable = libPrefix;
sitePackages = "lib/${libPrefix}/site-packages";
interpreter = "${self}/bin/${executable}";
};
enableParallelBuilding = true;
meta = {
homepage = "http://python.org";
description = "A high-level dynamically-typed programming language";
longDescription = ''
Python is a remarkably powerful dynamic programming language that
is used in a wide variety of application domains. Some of its key
distinguishing features include: clear, readable syntax; strong
introspection capabilities; intuitive object orientation; natural
expression of procedural code; full modularity, supporting
hierarchical packages; exception-based error handling; and very
high level dynamic data types.
'';
license = stdenv.lib.licenses.psfl;
platforms = stdenv.lib.platforms.all;
maintainers = with stdenv.lib.maintainers; [ chaoflow domenkozar ];
};
};
# This function builds a Python module included in the main Python
# distribution in a separate derivation.
buildInternalPythonModule =
{ moduleName
, internalName ? "_" + moduleName
, deps
}:
if includeModules then null else stdenv.mkDerivation rec {
name = "python-${moduleName}-${python.version}";
inherit src patches preConfigure postConfigure configureFlags;
buildInputs = [ python ] ++ deps;
# We need to set this for python.buildEnv
pythonPath = [];
inherit (mkPaths buildInputs) C_INCLUDE_PATH LIBRARY_PATH;
# non-python gdbm has a libintl dependency on i686-cygwin, not on x86_64-cygwin
buildPhase = (if (stdenv.system == "i686-cygwin" && moduleName == "gdbm") then ''
sed -i setup.py -e "s:libraries = \['gdbm'\]:libraries = ['gdbm', 'intl']:"
'' else '''') + ''
substituteInPlace setup.py --replace 'self.extensions = extensions' \
'self.extensions = [ext for ext in self.extensions if ext.name in ["${internalName}"]]'
python ./setup.py build_ext
[ -z "$(find build -name '*_failed.so' -print)" ]
'';
installPhase =
''
dest=$out/lib/${python.libPrefix}/site-packages
mkdir -p $dest
cp -p $(find . -name "*.${if stdenv.isCygwin then "dll" else "so"}") $dest/
'';
};
# The Python modules included in the main Python distribution, built
# as separate derivations.
modules = {
bsddb = buildInternalPythonModule {
moduleName = "bsddb";
deps = [ db ];
};
curses = buildInternalPythonModule {
moduleName = "curses";
deps = [ ncurses ];
};
curses_panel = buildInternalPythonModule {
moduleName = "curses_panel";
deps = [ ncurses modules.curses ];
};
crypt = buildInternalPythonModule {
moduleName = "crypt";
internalName = "crypt";
deps = optional (stdenv ? glibc) stdenv.glibc;
};
gdbm = buildInternalPythonModule {
moduleName = "gdbm";
internalName = "gdbm";
deps = [ gdbm ] ++ stdenv.lib.optional stdenv.isCygwin gettext;
};
sqlite3 = buildInternalPythonModule {
moduleName = "sqlite3";
deps = [ sqlite ];
};
} // optionalAttrs x11Support {
tkinter = if stdenv.isCygwin then null else (buildInternalPythonModule {
moduleName = "tkinter";
deps = [ tcl tk xlibsWrapper libX11 ];
});
} // {
readline = buildInternalPythonModule {
moduleName = "readline";
internalName = "readline";
deps = [ readline ];
};
};
in python // { inherit modules; }

View File

@@ -0,0 +1,36 @@
diff -ur orig/Lib/py_compile.py new/Lib/py_compile.py
--- orig/Lib/py_compile.py
+++ new/Lib/py_compile.py
@@ -122,7 +122,10 @@
cfile = file + (__debug__ and 'c' or 'o')
with open(cfile, 'wb') as fc:
fc.write('\0\0\0\0')
- wr_long(fc, timestamp)
+ if "DETERMINISTIC_BUILD" in os.environ:
+ fc.write('\0\0\0\0')
+ else:
+ wr_long(fc, timestamp)
marshal.dump(codeobject, fc)
fc.flush()
fc.seek(0, 0)
diff -ur orig/Python/import.c new/Python/import.c
--- orig/Python/import.c
+++ new/Python/import.c
@@ -939,10 +939,12 @@
return;
}
/* Now write the true mtime (as a 32-bit field) */
- fseek(fp, 4L, 0);
- assert(mtime <= 0xFFFFFFFF);
- PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
- fflush(fp);
+ if (Py_GETENV("DETERMINISTIC_BUILD") == NULL) {
+ fseek(fp, 4L, 0);
+ assert(mtime <= 0xFFFFFFFF);
+ PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
+ fflush(fp);
+ }
fclose(fp);
if (Py_VerboseFlag)
PySys_WriteStderr("# wrote %s\n", cpathname);

View File

@@ -0,0 +1,12 @@
diff -ru -x '*~' Python-2.7.1-orig/Python/import.c Python-2.7.1/Python/import.c
--- Python-2.7.1-orig/Python/import.c 2010-05-20 20:37:55.000000000 +0200
+++ Python-2.7.1/Python/import.c 2011-01-04 15:55:11.000000000 +0100
@@ -751,7 +751,7 @@
return NULL;
}
pyc_mtime = PyMarshal_ReadLongFromFile(fp);
- if (pyc_mtime != mtime) {
+ if (pyc_mtime != mtime && mtime != 1) {
if (Py_VerboseFlag)
PySys_WriteStderr("# %s has bad mtime\n", cpathname);
fclose(fp);

View File

@@ -0,0 +1,99 @@
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index b2c514d..a6eca81 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -207,31 +207,7 @@ elif os.name == "posix":
else:
def _findSoname_ldconfig(name):
- import struct
- if struct.calcsize('l') == 4:
- machine = os.uname()[4] + '-32'
- else:
- machine = os.uname()[4] + '-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)
- expr = r'\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type)
- f = os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null')
- try:
- data = f.read()
- finally:
- f.close()
- res = re.search(expr, data)
- if not res:
- return None
- return res.group(1)
+ 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 7432032..9829d18 100644
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -437,57 +437,7 @@ def _netbios_getnode():
return ((bytes[0]<<40L) + (bytes[1]<<32L) + (bytes[2]<<24L) +
(bytes[3]<<16L) + (bytes[4]<<8L) + 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.
_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']
- if not sys.platform.startswith('win'):
- _libnames.append('c')
- for libname in _libnames:
- try:
- lib = ctypes.CDLL(ctypes.util.find_library(libname))
- except:
- continue
- if hasattr(lib, 'uuid_generate_time'):
- _uuid_generate_time = lib.uuid_generate_time
- break
- del _libnames
-
- # 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.
- if sys.platform == 'darwin':
- import os
- if int(os.uname()[2].split('.')[0]) >= 9:
- _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
def _unixdll_getnode():
"""Get the hardware address on Unix using ctypes."""

View File

@@ -0,0 +1,116 @@
From 6dc83db69b5e29d25ba6d73646ea2e9a1097848a Mon Sep 17 00:00:00 2001
From: Roumen Petrov <local@example.net>
Date: Sun, 19 Feb 2012 16:13:24 +0200
Subject: [PATCH] CROSS-properly detect WINDOW _flags for different ncurses versions
---
Include/py_curses.h | 5 +++++
configure.ac | 40 ++++++++++++++++++++++++++++++++++++++--
pyconfig.h.in | 6 ++++++
3 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/Include/py_curses.h b/Include/py_curses.h
index f2c08f6..a9b5260 100644
--- a/Include/py_curses.h
+++ b/Include/py_curses.h
@@ -14,7 +14,9 @@
/* the following define is necessary for OS X 10.6; without it, the
Apple-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python
can't get at the WINDOW flags field. */
+/* NOTE configure check if ncurses require such definition
#define NCURSES_OPAQUE 0
+*/
#endif /* __APPLE__ */
#ifdef __FreeBSD__
@@ -57,9 +59,12 @@
#ifdef HAVE_NCURSES_H
/* configure was checking <curses.h>, but we will
use <ncurses.h>, which has all these features. */
+/* NOTE configure check for existence of flags
+ * Also flags are visible only if WINDOW structure is not opaque
#ifndef WINDOW_HAS_FLAGS
#define WINDOW_HAS_FLAGS 1
#endif
+*/
#ifndef MVWDELCH_IS_EXPRESSION
#define MVWDELCH_IS_EXPRESSION 1
#endif
diff --git a/configure.ac b/configure.ac
index 0a3a186..75f5142 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4150,15 +4150,51 @@ then
fi
AC_MSG_CHECKING(whether WINDOW has _flags)
-AC_CACHE_VAL(ac_cv_window_has_flags,
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <curses.h>]], [[
WINDOW *w;
w->_flags = 0;
]])],
[ac_cv_window_has_flags=yes],
-[ac_cv_window_has_flags=no]))
+[ac_cv_window_has_flags=no])
AC_MSG_RESULT($ac_cv_window_has_flags)
+py_curses_window_is_opaque=no
+if test no = $ac_cv_window_has_flags; then
+ AC_MSG_CHECKING([whether WINDOW has _flags in non-opaque structure])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+ #define NCURSES_OPAQUE 0
+ #include <curses.h>
+ ]],[[
+ WINDOW *w;
+ w->_flags = 0;
+ ]])],
+ [py_curses_window_is_opaque=yes])
+ AC_MSG_RESULT([$py_curses_window_is_opaque])
+fi
+if test yes = $py_curses_window_is_opaque; then
+ ac_cv_window_has_flags=yes
+ AC_DEFINE([NCURSES_OPAQUE], [0], [Define to 0 if you have WINDOW _flags in non-opaque structure.])
+fi
+
+py_curses_window_is_internal=no
+if test no = $ac_cv_window_has_flags; then
+ AC_MSG_CHECKING([whether WINDOW has _flags as internal structure])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+ #define NCURSES_INTERNALS 1
+ #include <curses.h>
+ ]],[[
+ WINDOW *w;
+ w->_flags = 0;
+ ]])],
+ [py_curses_window_is_internal=yes])
+ AC_MSG_RESULT([$py_curses_window_is_internal])
+fi
+if test yes = $py_curses_window_is_internal; then
+ ac_cv_window_has_flags=yes
+ AC_DEFINE([NCURSES_INTERNALS], [1], [Define to 1 if you have WINDOW _flags as internal structure.])
+fi
if test "$ac_cv_window_has_flags" = yes
then
diff --git a/pyconfig.h.in b/pyconfig.h.in
index 3ca3a4f..484c817 100644
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
@@ -1130,6 +1130,12 @@
/* Define if mvwdelch in curses.h is an expression. */
#undef MVWDELCH_IS_EXPRESSION
+/* Define to 1 if you have WINDOW _flags as internal structure. */
+#undef NCURSES_INTERNALS
+
+/* Define to 0 if you have WINDOW _flags in non-opaque structure. */
+#undef NCURSES_OPAQUE
+
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
--
1.6.4

View File

@@ -0,0 +1,27 @@
diff -rc Python-2.4.4-orig/setup.py Python-2.4.4/setup.py
*** Python-2.4.4-orig/setup.py 2006-10-08 19:41:25.000000000 +0200
--- Python-2.4.4/setup.py 2007-05-27 16:04:54.000000000 +0200
***************
*** 279,288 ****
# Check for AtheOS which has libraries in non-standard locations
if platform == 'atheos':
lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
- lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
inc_dirs += ['/system/include', '/atheos/autolnk/include']
- inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
# OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
if platform in ['osf1', 'unixware7', 'openunix8']:
lib_dirs += ['/usr/ccs/lib']
--- 279,289 ----
# Check for AtheOS which has libraries in non-standard locations
if platform == 'atheos':
lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
inc_dirs += ['/system/include', '/atheos/autolnk/include']
+ lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
+ inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
+
# OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
if platform in ['osf1', 'unixware7', 'openunix8']:
lib_dirs += ['/usr/ccs/lib']

View File

@@ -0,0 +1,15 @@
addPythonPath() {
addToSearchPathWithCustomDelimiter : PYTHONPATH $1/lib/python2.7/site-packages
}
toPythonPath() {
local paths="$1"
local result=
for i in $paths; do
p="$i/lib/python2.7/site-packages"
result="${result}${result:+:}$p"
done
echo $result
}
envHooks+=(addPythonPath)