summary refs log tree commit diff
path: root/pkgs/development/interpreters/python/2.6/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/interpreters/python/2.6/default.nix')
-rw-r--r--pkgs/development/interpreters/python/2.6/default.nix238
1 files changed, 160 insertions, 78 deletions
diff --git a/pkgs/development/interpreters/python/2.6/default.nix b/pkgs/development/interpreters/python/2.6/default.nix
index 53428de33f45..4a3c292412f1 100644
--- a/pkgs/development/interpreters/python/2.6/default.nix
+++ b/pkgs/development/interpreters/python/2.6/default.nix
@@ -1,97 +1,179 @@
 { stdenv, fetchurl, zlib ? null, zlibSupport ? true, bzip2
-, gdbmSupport ? true, gdbm ? null
-, sqlite ? null
-, db4 ? null
-, readline ? null
-, openssl ? null
-, tk ? null
-, tcl ? null
-, libX11 ? null
-, xproto ? null
-, arch ? null
-, sw_vers ? null
-, ncurses ? null
+, sqlite, tcl, tk, x11, openssl, readline, db4, ncurses, gdbm
+, darwinArchUtility ? null, darwinSwVersUtility ? null
 }:
 
 assert zlibSupport -> zlib != null;
-assert gdbmSupport -> gdbm != null;
-assert stdenv.isDarwin -> arch != null;
-assert stdenv.isDarwin -> sw_vers != null;
+assert stdenv.isDarwin -> darwinArchUtility != null;
+assert stdenv.isDarwin -> darwinSwVersUtility != null;
 
 with stdenv.lib;
 
 let
 
   majorVersion = "2.6";
-  version = "${majorVersion}.5";
-
-  buildInputs =
-    optional (stdenv ? gcc && stdenv.gcc.libc != null) stdenv.gcc.libc ++
-    [bzip2]
-    ++ optional zlibSupport zlib
-    ++ optional gdbmSupport gdbm
-    ++ optional (sqlite != null) sqlite
-    ++ optional (db4 != null) db4
-    ++ optional (readline != null) readline
-    ++ optional (openssl != null) openssl
-    ++ optional (tk != null) tk
-    ++ optional (tcl != null) tcl
-    ++ optional (libX11 != null) libX11
-    ++ optional (xproto != null) xproto
-    ++ optional (arch != null) arch
-    ++ optional (sw_vers != null) sw_vers
-    ++ optional (ncurses != null) ncurses
-    ;
-
-in
-
-stdenv.mkDerivation ( {
-  name = "python-${version}";
-  inherit majorVersion version;
+  version = "${majorVersion}.6";
 
   src = fetchurl {
     url = "http://www.python.org/ftp/python/${version}/Python-${version}.tar.bz2";
-    sha256 = "62da62eb685621ede2be1275f11b89fa0e0be578db8daa5320d0a7855c0a9ebc";
+    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
+    ];
 
-  patches = [
-    # Look in C_INCLUDE_PATH and LIBRARY_PATH for stuff.
-    ./search-path.patch
-  ];
-
-  inherit 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
-  '' + (if readline != null then ''
-    export NIX_LDFLAGS="$NIX_LDFLAGS -lncurses"
-  '' else "");
-
-  setupHook = ./setup-hook.sh;
-
-  postInstall = ''
-    rm -rf "$out/lib/python${majorVersion}/test"
-  '';
-
-  passthru = {
-    inherit zlibSupport;
-    sqliteSupport = sqlite != null;
-    db4Support = db4 != null;
-    readlineSupport = readline != null;
-    opensslSupport = openssl != null;
-    tkSupport = (tk != null) && (tcl != null);
-    libPrefix = "python${majorVersion}";
+  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 ];
+    };
   };
 
-  enableParallelBuilding = true;
 
-  meta = {
-    platforms = stdenv.lib.platforms.all;
+  # 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 ];
+    };
+
   };
-} // (if stdenv.isDarwin then { NIX_CFLAGS_COMPILE = "-msse2" ; patches = [./search-path.patch]; } else {} ) )
+  
+in python // { inherit modules; }