From cf00c432ae13759319ff235858000c17e26ecb8b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra <eelco.dolstra@logicblox.com> Date: Wed, 6 Apr 2011 21:57:30 +0000 Subject: [PATCH] * By popular demand, restore Python 2.6. svn path=/nixpkgs/trunk/; revision=26726 --- .../interpreters/python/2.6/default.nix | 179 ++++++++++++++++++ .../python/2.6/nix-store-mtime.patch | 12 ++ .../interpreters/python/2.6/search-path.patch | 27 +++ .../interpreters/python/2.6/setup-hook.sh | 15 ++ pkgs/top-level/all-packages.nix | 7 + 5 files changed, 240 insertions(+) create mode 100644 pkgs/development/interpreters/python/2.6/default.nix create mode 100644 pkgs/development/interpreters/python/2.6/nix-store-mtime.patch create mode 100644 pkgs/development/interpreters/python/2.6/search-path.patch create mode 100644 pkgs/development/interpreters/python/2.6/setup-hook.sh diff --git a/pkgs/development/interpreters/python/2.6/default.nix b/pkgs/development/interpreters/python/2.6/default.nix new file mode 100644 index 000000000000..4a3c292412f1 --- /dev/null +++ b/pkgs/development/interpreters/python/2.6/default.nix @@ -0,0 +1,179 @@ +{ stdenv, fetchurl, zlib ? null, zlibSupport ? true, bzip2 +, sqlite, tcl, tk, x11, openssl, readline, db4, ncurses, gdbm +, darwinArchUtility ? null, darwinSwVersUtility ? null +}: + +assert zlibSupport -> zlib != null; +assert stdenv.isDarwin -> darwinArchUtility != null; +assert stdenv.isDarwin -> darwinSwVersUtility != null; + +with stdenv.lib; + +let + + majorVersion = "2.6"; + version = "${majorVersion}.6"; + + src = fetchurl { + url = "http://www.python.org/ftp/python/${version}/Python-${version}.tar.bz2"; + md5 = "cf4e6881bb84a7ce6089e4a307f71f14"; + }; + + 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 + ]; + + buildInputs = + optional (stdenv ? gcc && stdenv.gcc.libc != null) stdenv.gcc.libc ++ + [ bzip2 ] + ++ optional zlibSupport zlib + ++ optionals stdenv.isDarwin [ darwinArchUtility darwinSwVersUtility ]; + + + # Build the basic Python interpreter without modules that have + # external dependencies. + python = stdenv.mkDerivation { + name = "python-${version}"; + + inherit majorVersion version src patches buildInputs; + + C_INCLUDE_PATH = concatStringsSep ":" (map (p: "${p}/include") buildInputs); + LIBRARY_PATH = concatStringsSep ":" (map (p: "${p}/lib") buildInputs); + + configureFlags = "--enable-shared --with-threads --enable-unicode --with-wctype-functions"; + + preConfigure = + '' + # Purity. + for i in /usr /sw /opt /pkg; do + substituteInPlace ./setup.py --replace $i /no-such-path + done + ''; + + NIX_CFLAGS_COMPILE = optionalString stdenv.isDarwin "-msse2"; + + setupHook = ./setup-hook.sh; + + postInstall = + '' + rm -rf "$out/lib/python${majorVersion}/test" + ''; + + passthru = { + inherit zlibSupport; + libPrefix = "python${majorVersion}"; + }; + + enableParallelBuilding = true; + + meta = { + homepage = "http://python.org"; + description = "Python -- 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 = "GPLv2"; + platforms = stdenv.lib.platforms.all; + maintainers = [ stdenv.lib.maintainers.simons ]; + }; + }; + + + # This function builds a Python module included in the main Python + # distribution in a separate derivation. + buildInternalPythonModule = + { moduleName + , internalName ? "_" + moduleName + , deps + }: + stdenv.mkDerivation rec { + name = "python-${moduleName}-${python.version}"; + + inherit src patches; + + buildInputs = [ python ] ++ deps; + + C_INCLUDE_PATH = concatStringsSep ":" (map (p: "${p}/include") buildInputs); + LIBRARY_PATH = concatStringsSep ":" (map (p: "${p}/lib") buildInputs); + + configurePhase = "true"; + + buildPhase = + '' + # Fake the build environment that setup.py expects. + ln -s ${python}/include/python*/pyconfig.h . + ln -s ${python}/lib/python*/config/Setup Modules/ + ln -s ${python}/lib/python*/config/Setup.local Modules/ + + 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 + ''; + + 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 = [ db4 ]; + }; + + curses = buildInternalPythonModule { + moduleName = "curses"; + deps = [ ncurses ]; + }; + + gdbm = buildInternalPythonModule { + moduleName = "gdbm"; + internalName = "gdbm"; + deps = [ gdbm ]; + }; + + sqlite3 = buildInternalPythonModule { + moduleName = "sqlite3"; + deps = [ sqlite ]; + }; + + ssl = buildInternalPythonModule { + moduleName = "ssl"; + deps = [ openssl ]; + }; + + tkinter = buildInternalPythonModule { + moduleName = "tkinter"; + deps = [ tcl tk x11 ]; + }; + + readline = buildInternalPythonModule { + moduleName = "readline"; + internalName = "readline"; + deps = [ readline ]; + }; + + }; + +in python // { inherit modules; } diff --git a/pkgs/development/interpreters/python/2.6/nix-store-mtime.patch b/pkgs/development/interpreters/python/2.6/nix-store-mtime.patch new file mode 100644 index 000000000000..83f3fea1931b --- /dev/null +++ b/pkgs/development/interpreters/python/2.6/nix-store-mtime.patch @@ -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); diff --git a/pkgs/development/interpreters/python/2.6/search-path.patch b/pkgs/development/interpreters/python/2.6/search-path.patch new file mode 100644 index 000000000000..2e7b7526c0ce --- /dev/null +++ b/pkgs/development/interpreters/python/2.6/search-path.patch @@ -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'] diff --git a/pkgs/development/interpreters/python/2.6/setup-hook.sh b/pkgs/development/interpreters/python/2.6/setup-hook.sh new file mode 100644 index 000000000000..290525c35713 --- /dev/null +++ b/pkgs/development/interpreters/python/2.6/setup-hook.sh @@ -0,0 +1,15 @@ +addPythonPath() { + addToSearchPathWithCustomDelimiter : PYTHONPATH $1/lib/python2.6/site-packages +} + +toPythonPath() { + local paths="$1" + local result= + for i in $paths; do + p="$i/lib/python2.6/site-packages" + result="${result}${result:+:}$p" + done + echo $result +} + +envHooks=(${envHooks[@]} addPythonPath) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index eee8e986b68a..13a781768785 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2371,6 +2371,8 @@ let python = python27; + python26 = callPackage ../development/interpreters/python/2.6 { }; + python27 = callPackage ../development/interpreters/python/2.7 { }; python3 = callPackage ../development/interpreters/python/3.1 { @@ -4418,6 +4420,11 @@ let pythonPackages = python27Packages; + python26Packages = recurseIntoAttrs (import ./python-packages.nix { + inherit pkgs; + python = python26; + }); + python27Packages = recurseIntoAttrs (import ./python-packages.nix { inherit pkgs; python = python27;