Merge pull request #53123 from FRidh/singlecpython

Python: merge expressions of interpreters
This commit is contained in:
Frederik Rietdijk 2019-01-04 12:22:07 +01:00 committed by GitHub
commit 29ee864e93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 529 additions and 824 deletions

View File

@ -31,7 +31,7 @@ stdenv.mkDerivation rec {
for program in ingenams ingenish for program in ingenams ingenish
do do
wrapProgram $out/bin/$program \ wrapProgram $out/bin/$program \
--prefix PYTHONPATH : $out/lib/python${python.majorVersion}/site-packages:$PYTHONPATH --prefix PYTHONPATH : $out/${python.sitePackages}:$PYTHONPATH
done done
''; '';

View File

@ -51,10 +51,10 @@ stdenv.mkDerivation rec {
"-DWITH_SYSTEM_OPENJPEG=ON" "-DWITH_SYSTEM_OPENJPEG=ON"
"-DWITH_PLAYER=ON" "-DWITH_PLAYER=ON"
"-DWITH_OPENSUBDIV=ON" "-DWITH_OPENSUBDIV=ON"
"-DPYTHON_LIBRARY=python${python.majorVersion}m" "-DPYTHON_LIBRARY=${python.libPrefix}"
"-DPYTHON_LIBPATH=${python}/lib" "-DPYTHON_LIBPATH=${python}/lib"
"-DPYTHON_INCLUDE_DIR=${python}/include/python${python.majorVersion}m" "-DPYTHON_INCLUDE_DIR=${python}/include/${python.libPrefix}"
"-DPYTHON_VERSION=${python.majorVersion}" "-DPYTHON_VERSION=${python.pythonVersion}"
"-DWITH_PYTHON_INSTALL=OFF" "-DWITH_PYTHON_INSTALL=OFF"
"-DWITH_PYTHON_INSTALL_NUMPY=OFF" "-DWITH_PYTHON_INSTALL_NUMPY=OFF"
] ]
@ -66,7 +66,7 @@ stdenv.mkDerivation rec {
] ]
++ optional colladaSupport "-DWITH_OPENCOLLADA=ON"; ++ optional colladaSupport "-DWITH_OPENCOLLADA=ON";
NIX_CFLAGS_COMPILE = "-I${ilmbase.dev}/include/OpenEXR -I${python}/include/${python.libPrefix}m"; NIX_CFLAGS_COMPILE = "-I${ilmbase.dev}/include/OpenEXR -I${python}/include/${python.libPrefix}";
# Since some dependencies are built with gcc 6, we need gcc 6's # Since some dependencies are built with gcc 6, we need gcc 6's
# libstdc++ in our RPATH. Sigh. # libstdc++ in our RPATH. Sigh.
@ -77,7 +77,7 @@ stdenv.mkDerivation rec {
postInstall = optionalString enableNumpy postInstall = optionalString enableNumpy
'' ''
wrapProgram $out/bin/blender \ wrapProgram $out/bin/blender \
--prefix PYTHONPATH : ${pythonPackages.numpy}/lib/python${python.majorVersion}/site-packages --prefix PYTHONPATH : ${pythonPackages.numpy}/${python.sitePackages}
''; '';
meta = with stdenv.lib; { meta = with stdenv.lib; {

View File

@ -62,7 +62,7 @@ stdenv.mkDerivation rec {
++ optionals pythonPluginSupport [ "-I${python}/include/${python.libPrefix}" ]; ++ optionals pythonPluginSupport [ "-I${python}/include/${python.libPrefix}" ];
LDFLAGS = [ ] LDFLAGS = [ ]
++ optionals pythonPluginSupport [ "-L${python}/lib" "-lpython${python.majorVersion}m" ]; ++ optionals pythonPluginSupport [ "-L${python}/lib" "-l${python.libPrefix}" ];
meta = { meta = {
description = "A console based XMPP client"; description = "A console based XMPP client";

View File

@ -4,7 +4,7 @@
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "golly-${version}"; pname = "golly";
version = "2.8.99.2.20161122"; version = "2.8.99.2.20161122";
#src = fetchurl { #src = fetchurl {
# url="mirror://sourceforge/project/golly/golly/golly-2.8/golly-2.8-src.tar.gz"; # url="mirror://sourceforge/project/golly/golly/golly-2.8/golly-2.8-src.tar.gz";
@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
makeFlags=[ makeFlags=[
"AM_LDFLAGS=" "AM_LDFLAGS="
]; ];
NIX_LDFLAGS="-lpython${python2.majorVersion} -lperl"; NIX_LDFLAGS="-l${python2.libPrefix} -lperl";
preConfigure='' preConfigure=''
export NIX_LDFLAGS="$NIX_LDFLAGS -L$(dirname "$(find ${perl} -name libperl.so)")" export NIX_LDFLAGS="$NIX_LDFLAGS -L$(dirname "$(find ${perl} -name libperl.so)")"
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE

View File

@ -1,8 +1,7 @@
{stdenv, fetchurl, wxGTK, perl, python2, zlib, libGLU_combined, libX11}: {stdenv, fetchurl, wxGTK, perl, python2, zlib, libGLU_combined, libX11}:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
baseName="golly"; pname = "golly";
version = "3.2"; version = "3.2";
name="${baseName}-${version}";
src = fetchurl { src = fetchurl {
sha256 = "0cg9mbwmf4q6qxhqlnzrxh9y047banxdb8pd3hgj3smmja2zf0jd"; sha256 = "0cg9mbwmf4q6qxhqlnzrxh9y047banxdb8pd3hgj3smmja2zf0jd";
@ -21,7 +20,7 @@ stdenv.mkDerivation rec {
makeFlags=[ makeFlags=[
"AM_LDFLAGS=" "AM_LDFLAGS="
]; ];
NIX_LDFLAGS="-lpython${python2.majorVersion} -lperl"; NIX_LDFLAGS="-l${python2.libPrefix} -lperl";
preConfigure='' preConfigure=''
export NIX_LDFLAGS="$NIX_LDFLAGS -L$(dirname "$(find ${perl} -name libperl.so)")" export NIX_LDFLAGS="$NIX_LDFLAGS -L$(dirname "$(find ${perl} -name libperl.so)")"
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE

View File

@ -1,7 +1,6 @@
# This function provides generic bits to install a Python wheel. # This function provides generic bits to install a Python wheel.
{ python { python
, bootstrapped-pip
}: }:
{ buildInputs ? [] { buildInputs ? []
@ -10,7 +9,7 @@
, ... } @ attrs: , ... } @ attrs:
attrs // { attrs // {
buildInputs = buildInputs ++ [ bootstrapped-pip ]; buildInputs = buildInputs ++ [ python.pythonForBuild.pkgs.bootstrapped-pip ];
configurePhase = attrs.configurePhase or '' configurePhase = attrs.configurePhase or ''
runHook preConfigure runHook preConfigure
@ -24,7 +23,7 @@ attrs // {
export PYTHONPATH="$out/${python.sitePackages}:$PYTHONPATH" export PYTHONPATH="$out/${python.sitePackages}:$PYTHONPATH"
pushd dist pushd dist
${bootstrapped-pip}/bin/pip install *.whl --no-index --prefix=$out --no-cache ${toString installFlags} --build tmpbuild ${python.pythonForBuild.pkgs.bootstrapped-pip}/bin/pip install *.whl --no-index --prefix=$out --no-cache ${toString installFlags} --build tmpbuild
popd popd
runHook postInstall runHook postInstall

View File

@ -2,7 +2,6 @@
{ lib { lib
, python , python
, bootstrapped-pip
}: }:
{ {
@ -26,13 +25,13 @@ in attrs // {
buildPhase = attrs.buildPhase or '' buildPhase = attrs.buildPhase or ''
runHook preBuild runHook preBuild
cp ${setuppy} nix_run_setup cp ${setuppy} nix_run_setup
${python.interpreter} nix_run_setup ${lib.optionalString (setupPyBuildFlags != []) ("build_ext " + (lib.concatStringsSep " " setupPyBuildFlags))} bdist_wheel ${python.pythonForBuild.interpreter} nix_run_setup ${lib.optionalString (setupPyBuildFlags != []) ("build_ext " + (lib.concatStringsSep " " setupPyBuildFlags))} bdist_wheel
runHook postBuild runHook postBuild
''; '';
installCheckPhase = attrs.checkPhase or '' installCheckPhase = attrs.checkPhase or ''
runHook preCheck runHook preCheck
${python.interpreter} nix_run_setup test ${python.pythonForBuild.interpreter} nix_run_setup test
runHook postCheck runHook postCheck
''; '';
@ -47,9 +46,9 @@ in attrs // {
if test -e setup.py; then if test -e setup.py; then
tmp_path=$(mktemp -d) tmp_path=$(mktemp -d)
export PATH="$tmp_path/bin:$PATH" export PATH="$tmp_path/bin:$PATH"
export PYTHONPATH="$tmp_path/${python.sitePackages}:$PYTHONPATH" export PYTHONPATH="$tmp_path/${python.pythonForBuild.sitePackages}:$PYTHONPATH"
mkdir -p $tmp_path/${python.sitePackages} mkdir -p $tmp_path/${python.pythonForBuild.sitePackages}
${bootstrapped-pip}/bin/pip install -e . --prefix $tmp_path >&2 ${python.pythonForBuild.pkgs.bootstrapped-pip}/bin/pip install -e . --prefix $tmp_path >&2
fi fi
${postShellHook} ${postShellHook}
''; '';

View File

@ -10,17 +10,16 @@
, ensureNewerSourcesForZipFilesHook , ensureNewerSourcesForZipFilesHook
, toPythonModule , toPythonModule
, namePrefix , namePrefix
, bootstrapped-pip
, flit , flit
, writeScript , writeScript
, update-python-libraries , update-python-libraries
}: }:
let let
setuptools-specific = import ./build-python-package-setuptools.nix { inherit lib python bootstrapped-pip; }; setuptools-specific = import ./build-python-package-setuptools.nix { inherit lib python; };
flit-specific = import ./build-python-package-flit.nix { inherit python flit; }; flit-specific = import ./build-python-package-flit.nix { inherit python flit; };
wheel-specific = import ./build-python-package-wheel.nix { }; wheel-specific = import ./build-python-package-wheel.nix { };
common = import ./build-python-package-common.nix { inherit python bootstrapped-pip; }; common = import ./build-python-package-common.nix { inherit python; };
mkPythonDerivation = import ./mk-python-derivation.nix { mkPythonDerivation = import ./mk-python-derivation.nix {
inherit lib config python wrapPython setuptools unzip ensureNewerSourcesForZipFilesHook; inherit lib config python wrapPython setuptools unzip ensureNewerSourcesForZipFilesHook;
inherit toPythonModule namePrefix writeScript update-python-libraries; inherit toPythonModule namePrefix writeScript update-python-libraries;

View File

@ -1,7 +1,9 @@
{ stdenv, buildPackages, fetchurl { stdenv, fetchurl, fetchpatch
, bzip2 , bzip2
, expat
, libffi
, gdbm , gdbm
, fetchpatch , db
, ncurses , ncurses
, openssl , openssl
, readline , readline
@ -10,15 +12,16 @@
, zlib , zlib
, callPackage , callPackage
, self , self
, db
, expat
, libffi
, CF, configd, coreutils , CF, configd, coreutils
, python-setup-hook , python-setup-hook
# Some proprietary libs assume UCS2 unicode, especially on darwin :( # Some proprietary libs assume UCS2 unicode, especially on darwin :(
, ucsEncoding ? 4 , ucsEncoding ? 4
# For the Python package set # For the Python package set
, packageOverrides ? (self: super: {}) , packageOverrides ? (self: super: {})
, buildPackages
, sourceVersion
, sha256
, passthruFun
}: }:
assert x11Support -> tcl != null assert x11Support -> tcl != null
@ -29,16 +32,26 @@ assert x11Support -> tcl != null
with stdenv.lib; with stdenv.lib;
let let
majorVersion = "2.7";
minorVersion = "15"; pythonForBuild = buildPackages.${"python${sourceVersion.major}${sourceVersion.minor}"};
minorVersionSuffix = "";
version = "${majorVersion}.${minorVersion}${minorVersionSuffix}"; passthru = passthruFun rec {
libPrefix = "python${majorVersion}"; inherit self sourceVersion packageOverrides;
implementation = "cpython";
libPrefix = "python${pythonVersion}";
executable = libPrefix;
pythonVersion = with sourceVersion; "${major}.${minor}";
sitePackages = "lib/${libPrefix}/site-packages"; sitePackages = "lib/${libPrefix}/site-packages";
inherit pythonForBuild;
} // {
inherit ucsEncoding;
};
version = with sourceVersion; "${major}.${minor}.${patch}${suffix}";
src = fetchurl { src = fetchurl {
url = "https://www.python.org/ftp/python/${majorVersion}.${minorVersion}/Python-${version}.tar.xz"; url = with sourceVersion; "https://www.python.org/ftp/python/${major}.${minor}.${patch}/Python-${version}.tar.xz";
sha256 = "0x2mvz9dp11wj7p5ccvmk9s0hzjk2fa1m462p395l4r6bfnb3n92"; inherit sha256;
}; };
hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false); hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false);
@ -191,12 +204,11 @@ let
# Build the basic Python interpreter without modules that have # Build the basic Python interpreter without modules that have
# external dependencies. # external dependencies.
in stdenv.mkDerivation ({ in with passthru; stdenv.mkDerivation ({
name = "python-${version}"; pname = "python";
pythonVersion = majorVersion; inherit version;
inherit majorVersion version src patches buildInputs nativeBuildInputs inherit src patches buildInputs nativeBuildInputs preConfigure configureFlags;
preConfigure configureFlags;
LDFLAGS = stdenv.lib.optionalString (!stdenv.isDarwin) "-lgcc_s"; LDFLAGS = stdenv.lib.optionalString (!stdenv.isDarwin) "-lgcc_s";
inherit (mkPaths buildInputs) C_INCLUDE_PATH LIBRARY_PATH; inherit (mkPaths buildInputs) C_INCLUDE_PATH LIBRARY_PATH;
@ -215,7 +227,7 @@ in stdenv.mkDerivation ({
'' ''
# needed for some packages, especially packages that backport # needed for some packages, especially packages that backport
# functionality to 2.x from 3.x # functionality to 2.x from 3.x
for item in $out/lib/python${majorVersion}/test/*; do for item in $out/lib/${libPrefix}/test/*; do
if [[ "$item" != */test_support.py* if [[ "$item" != */test_support.py*
&& "$item" != */test/support && "$item" != */test/support
&& "$item" != */test/regrtest.py* ]]; then && "$item" != */test/regrtest.py* ]]; then
@ -224,9 +236,9 @@ in stdenv.mkDerivation ({
echo $item echo $item
fi fi
done done
touch $out/lib/python${majorVersion}/test/__init__.py touch $out/lib/${libPrefix}/test/__init__.py
ln -s $out/lib/python${majorVersion}/pdb.py $out/bin/pdb ln -s $out/lib/${libPrefix}/pdb.py $out/bin/pdb
ln -s $out/lib/python${majorVersion}/pdb.py $out/bin/pdb${majorVersion} ln -s $out/lib/${libPrefix}/pdb.py $out/bin/pdb${sourceVersion.major}.${sourceVersion.minor}
ln -s $out/share/man/man1/{python2.7.1.gz,python.1.gz} ln -s $out/share/man/man1/{python2.7.1.gz,python.1.gz}
# Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484 # Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484
@ -249,21 +261,7 @@ in stdenv.mkDerivation ({
cp libpython2.7.dll.a $out/lib cp libpython2.7.dll.a $out/lib
''; '';
passthru = let inherit passthru;
pythonPackages = callPackage ../../../../../top-level/python-packages.nix {
python = self;
overrides = packageOverrides;
};
in rec {
inherit libPrefix sitePackages x11Support hasDistutilsCxxPatch ucsEncoding;
executable = libPrefix;
buildEnv = callPackage ../../wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; };
withPackages = import ../../with-packages.nix { inherit buildEnv pythonPackages;};
pkgs = pythonPackages;
isPy2 = true;
isPy27 = true;
interpreter = "${self}/bin/${executable}";
};
enableParallelBuilding = true; enableParallelBuilding = true;

View File

@ -1,212 +0,0 @@
{ stdenv, fetchurl, fetchpatch
, bzip2
, expat
, libffi
, gdbm
, lzma
, ncurses
, openssl
, readline
, sqlite
, tcl ? null, tk ? null, tix ? null, libX11 ? null, xproto ? null, x11Support ? false
, zlib
, callPackage
, self
, CF, configd
, python-setup-hook
# For the Python package set
, packageOverrides ? (self: super: {})
}:
assert x11Support -> tcl != null
&& tk != null
&& xproto != null
&& libX11 != null;
with stdenv.lib;
let
majorVersion = "3.5";
minorVersion = "6";
minorVersionSuffix = "";
version = "${majorVersion}.${minorVersion}${minorVersionSuffix}";
libPrefix = "python${majorVersion}";
sitePackages = "lib/${libPrefix}/site-packages";
buildInputs = filter (p: p != null) [
zlib bzip2 expat lzma libffi gdbm sqlite readline ncurses openssl ]
++ optionals x11Support [ tcl tk libX11 xproto ]
++ optionals stdenv.isDarwin [ CF configd ];
hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false);
in stdenv.mkDerivation {
name = "python3-${version}";
pythonVersion = majorVersion;
inherit majorVersion version;
inherit buildInputs;
src = fetchurl {
url = "https://www.python.org/ftp/python/${majorVersion}.${minorVersion}/Python-${version}.tar.xz";
sha256 = "0pqmf51zy2lzhbaj4yya2py2qr653j9152d0rg3p7wi1yl2dwp7m";
};
NIX_LDFLAGS = optionalString stdenv.isLinux "-lgcc_s";
# Determinism: The interpreter is patched to write null timestamps when compiling python files.
# This way python doesn't try to update them when we freeze timestamps in nix store.
DETERMINISTIC_BUILD=1;
# Determinism: We fix the hashes of str, bytes and datetime objects.
PYTHONHASHSEED=0;
prePatch = optionalString stdenv.isDarwin ''
substituteInPlace configure --replace '`/usr/bin/arch`' '"i386"'
substituteInPlace configure --replace '-Wl,-stack_size,1000000' ' '
'';
patches = [
./no-ldconfig.patch
./ld_library_path.patch
] ++ optionals stdenv.isDarwin [
# Fix for https://bugs.python.org/issue24658
(fetchpatch {
url = "https://bugs.python.org/file45178/issue24658-3-3.6.diff";
sha256 = "1x060hs80nl34mcl2ji2i7l4shxkmxwgq8h8lcmav8rjqqz1nb4a";
})
] ++ optionals (x11Support && stdenv.isDarwin) [
./use-correct-tcl-tk-on-darwin.patch
] ++ optionals hasDistutilsCxxPatch [
# Fix for http://bugs.python.org/issue1222585
# Upstream distutils is calling C compiler to compile C++ code, which
# only works for GCC and Apple Clang. This makes distutils to call C++
# compiler when needed.
(fetchpatch {
url = "https://bugs.python.org/file47046/python-3.x-distutils-C++.patch";
sha256 = "0dgdn9k2kmw4wh90vdnjcrnn97ylxgx7mbn9l87fwz6j501jqvk8";
extraPrefix = "";
})
];
postPatch = ''
# Determinism
substituteInPlace "Lib/py_compile.py" --replace "source_stats['mtime']" "(1 if 'DETERMINISTIC_BUILD' in os.environ else source_stats['mtime'])"
# Determinism. This is done unconditionally
substituteInPlace "Lib/importlib/_bootstrap_external.py" --replace "source_mtime = int(st['mtime'])" "source_mtime = 1"
'' + optionalString (x11Support && (tix != null)) ''
substituteInPlace "Lib/tkinter/tix.py" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'"
'';
CPPFLAGS="${concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs)}";
LDFLAGS="${concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs)}";
LIBS="${optionalString (!stdenv.isDarwin) "-lcrypt"} ${optionalString (ncurses != null) "-lncurses"}";
configureFlags = [
"--enable-shared"
"--with-threads"
"--without-ensurepip"
"--with-system-expat"
"--with-system-ffi"
]
# Never even try to use lchmod on linux,
# don't rely on detecting glibc-isms.
++ optional stdenv.hostPlatform.isLinux "ac_cv_func_lchmod=no";
preConfigure = ''
for i in /usr /sw /opt /pkg; do # improve purity
substituteInPlace ./setup.py --replace $i /no-such-path
done
${optionalString stdenv.isDarwin ''
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -msse2"
export MACOSX_DEPLOYMENT_TARGET=10.6
''
+ optionalString stdenv.hostPlatform.isMusl ''
export NIX_CFLAGS_COMPILE+=" -DTHREAD_STACK_SIZE=0x100000"
''}
'';
setupHook = python-setup-hook sitePackages;
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*
&& "$item" != */test/support
&& "$item" != */test/libregrtest
&& "$item" != */test/regrtest.py* ]]; then
rm -rf "$item"
else
echo $item
fi
done
touch $out/lib/python${majorVersion}/test/__init__.py
ln -s "$out/include/python${majorVersion}m" "$out/include/python${majorVersion}"
# Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484
echo "manylinux1_compatible=False" >> $out/lib/${libPrefix}/_manylinux.py
# Determinism: Windows installers were not deterministic.
# We're also not interested in building Windows installers.
find "$out" -name 'wininst*.exe' | xargs -r rm -f
# Use Python3 as default python
ln -s "$out/bin/idle3" "$out/bin/idle"
ln -s "$out/bin/pydoc3" "$out/bin/pydoc"
ln -s "$out/bin/python3" "$out/bin/python"
ln -s "$out/bin/python3-config" "$out/bin/python-config"
ln -s "$out/lib/pkgconfig/python3.pc" "$out/lib/pkgconfig/python.pc"
# Get rid of retained dependencies on -dev packages, and remove
# some $TMPDIR references to improve binary reproducibility.
# Note that the .pyc file of _sysconfigdata.py should be regenerated!
for i in $out/lib/python${majorVersion}/_sysconfigdata.py $out/lib/python${majorVersion}/config-${majorVersion}m/Makefile; do
sed -i $i -e "s|-I/nix/store/[^ ']*||g" -e "s|-L/nix/store/[^ ']*||g" -e "s|$TMPDIR|/no-such-path|g"
done
# Determinism: rebuild all bytecode
# We exclude lib2to3 because that's Python 2 code which fails
# We rebuild three times, once for each optimization level
find $out -name "*.py" | $out/bin/python -m compileall -q -f -x "lib2to3" -i -
find $out -name "*.py" | $out/bin/python -O -m compileall -q -f -x "lib2to3" -i -
find $out -name "*.py" | $out/bin/python -OO -m compileall -q -f -x "lib2to3" -i -
'';
passthru = let
pythonPackages = callPackage ../../../../../top-level/python-packages.nix {
python = self;
overrides = packageOverrides;
};
in rec {
inherit libPrefix sitePackages x11Support hasDistutilsCxxPatch;
executable = "${libPrefix}m";
buildEnv = callPackage ../../wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; };
withPackages = import ../../with-packages.nix { inherit buildEnv pythonPackages;};
pkgs = pythonPackages;
isPy3 = true;
isPy35 = true;
interpreter = "${self}/bin/${executable}";
};
enableParallelBuilding = true;
doCheck = false; # expensive, and fails
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 = licenses.psfl;
platforms = with platforms; linux ++ darwin;
maintainers = with maintainers; [ fridh ];
};
}

View File

@ -1,228 +0,0 @@
{ stdenv, fetchurl, fetchpatch, buildPackages
, bzip2
, expat
, libffi
, gdbm
, lzma
, ncurses
, openssl
, readline
, sqlite
, tcl ? null, tk ? null, tix ? null, libX11 ? null, xproto ? null, x11Support ? false
, zlib
, callPackage
, self
, CF, configd
, python-setup-hook
# For the Python package set
, packageOverrides ? (self: super: {})
}:
assert x11Support -> tcl != null
&& tk != null
&& xproto != null
&& libX11 != null;
with stdenv.lib;
let
majorVersion = "3.6";
minorVersion = "8";
minorVersionSuffix = "";
version = "${majorVersion}.${minorVersion}${minorVersionSuffix}";
libPrefix = "python${majorVersion}";
sitePackages = "lib/${libPrefix}/site-packages";
buildInputs = filter (p: p != null) [
zlib bzip2 expat lzma libffi gdbm sqlite readline ncurses openssl ]
++ optionals x11Support [ tcl tk libX11 xproto ]
++ optionals stdenv.isDarwin [ CF configd ];
nativeBuildInputs =
optional (stdenv.hostPlatform != stdenv.buildPlatform) buildPackages.python3;
hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false);
in stdenv.mkDerivation {
name = "python3-${version}";
pythonVersion = majorVersion;
inherit majorVersion version;
inherit buildInputs nativeBuildInputs;
src = fetchurl {
url = "https://www.python.org/ftp/python/${majorVersion}.${minorVersion}/Python-${version}.tar.xz";
sha256 = "14qi6n5gpcjnwy165wi9hkfcmbadc95ny6bxxldknxwmx50n4i1m";
};
NIX_LDFLAGS = optionalString stdenv.isLinux "-lgcc_s";
# Determinism: The interpreter is patched to write null timestamps when compiling python files.
# This way python doesn't try to update them when we freeze timestamps in nix store.
DETERMINISTIC_BUILD=1;
# Determinism: We fix the hashes of str, bytes and datetime objects.
PYTHONHASHSEED=0;
prePatch = optionalString stdenv.isDarwin ''
substituteInPlace configure --replace '`/usr/bin/arch`' '"i386"'
substituteInPlace configure --replace '-Wl,-stack_size,1000000' ' '
'';
patches = [
./no-ldconfig.patch
] ++ optionals (x11Support && stdenv.isDarwin) [
./use-correct-tcl-tk-on-darwin.patch
] ++ optionals hasDistutilsCxxPatch [
# Fix for http://bugs.python.org/issue1222585
# Upstream distutils is calling C compiler to compile C++ code, which
# only works for GCC and Apple Clang. This makes distutils to call C++
# compiler when needed.
(fetchpatch {
url = "https://bugs.python.org/file48016/python-3.x-distutils-C++.patch";
sha256 = "1h18lnpx539h5lfxyk379dxwr8m2raigcjixkf133l4xy3f4bzi2";
})
];
postPatch = ''
# Determinism
substituteInPlace "Lib/py_compile.py" --replace "source_stats['mtime']" "(1 if 'DETERMINISTIC_BUILD' in os.environ else source_stats['mtime'])"
# Determinism. This is done unconditionally
substituteInPlace "Lib/importlib/_bootstrap_external.py" --replace "source_mtime = int(st['mtime'])" "source_mtime = 1"
'' + optionalString (x11Support && (tix != null)) ''
substituteInPlace "Lib/tkinter/tix.py" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'"
'';
CPPFLAGS="${concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs)}";
LDFLAGS="${concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs)}";
LIBS="${optionalString (!stdenv.isDarwin) "-lcrypt"} ${optionalString (ncurses != null) "-lncurses"}";
configureFlags = [
"--enable-shared"
"--with-threads"
"--without-ensurepip"
"--with-system-expat"
"--with-system-ffi"
] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
"ac_cv_buggy_getaddrinfo=no"
# Assume little-endian IEEE 754 floating point when cross compiling
"ac_cv_little_endian_double=yes"
"ac_cv_big_endian_double=no"
"ac_cv_mixed_endian_double=no"
"ac_cv_x87_double_rounding=yes"
"ac_cv_tanh_preserves_zero_sign=yes"
# Generally assume that things are present and work
"ac_cv_posix_semaphores_enabled=yes"
"ac_cv_broken_sem_getvalue=no"
"ac_cv_wchar_t_signed=yes"
"ac_cv_rshift_extends_sign=yes"
"ac_cv_broken_nice=no"
"ac_cv_broken_poll=no"
"ac_cv_working_tzset=yes"
"ac_cv_have_long_long_format=yes"
"ac_cv_have_size_t_format=yes"
"ac_cv_computed_gotos=yes"
"ac_cv_file__dev_ptmx=yes"
"ac_cv_file__dev_ptc=yes"
]
# Never even try to use lchmod on linux,
# don't rely on detecting glibc-isms.
++ optional stdenv.hostPlatform.isLinux "ac_cv_func_lchmod=no";
preConfigure = ''
for i in /usr /sw /opt /pkg; do # improve purity
substituteInPlace ./setup.py --replace $i /no-such-path
done
${optionalString stdenv.isDarwin ''
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -msse2"
export MACOSX_DEPLOYMENT_TARGET=10.6
''
+ optionalString stdenv.hostPlatform.isMusl ''
export NIX_CFLAGS_COMPILE+=" -DTHREAD_STACK_SIZE=0x100000"
''}
'';
setupHook = python-setup-hook sitePackages;
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*
&& "$item" != */test/support
&& "$item" != */test/libregrtest
&& "$item" != */test/regrtest.py* ]]; then
rm -rf "$item"
else
echo $item
fi
done
touch $out/lib/python${majorVersion}/test/__init__.py
ln -s "$out/include/python${majorVersion}m" "$out/include/python${majorVersion}"
# Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484
echo "manylinux1_compatible=False" >> $out/lib/${libPrefix}/_manylinux.py
# Determinism: Windows installers were not deterministic.
# We're also not interested in building Windows installers.
find "$out" -name 'wininst*.exe' | xargs -r rm -f
# Use Python3 as default python
ln -s "$out/bin/idle3" "$out/bin/idle"
ln -s "$out/bin/pydoc3" "$out/bin/pydoc"
ln -s "$out/bin/python3" "$out/bin/python"
ln -s "$out/bin/python3-config" "$out/bin/python-config"
ln -s "$out/lib/pkgconfig/python3.pc" "$out/lib/pkgconfig/python.pc"
# Get rid of retained dependencies on -dev packages, and remove
# some $TMPDIR references to improve binary reproducibility.
# Note that the .pyc file of _sysconfigdata.py should be regenerated!
for i in $out/lib/python${majorVersion}/_sysconfigdata*.py $out/lib/python${majorVersion}/config-${majorVersion}m*/Makefile; do
sed -i $i -e "s|-I/nix/store/[^ ']*||g" -e "s|-L/nix/store/[^ ']*||g" -e "s|$TMPDIR|/no-such-path|g"
done
'' + optionalString (stdenv.hostPlatform == stdenv.buildPlatform) ''
# Determinism: rebuild all bytecode
# We exclude lib2to3 because that's Python 2 code which fails
# We rebuild three times, once for each optimization level
find $out -name "*.py" | $out/bin/python -m compileall -q -f -x "lib2to3" -i -
find $out -name "*.py" | $out/bin/python -O -m compileall -q -f -x "lib2to3" -i -
find $out -name "*.py" | $out/bin/python -OO -m compileall -q -f -x "lib2to3" -i -
'';
passthru = let
pythonPackages = callPackage ../../../../../top-level/python-packages.nix {
python = self;
overrides = packageOverrides;
};
in rec {
inherit libPrefix sitePackages x11Support hasDistutilsCxxPatch;
executable = "${libPrefix}m";
buildEnv = callPackage ../../wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; };
withPackages = import ../../with-packages.nix { inherit buildEnv pythonPackages;};
pkgs = pythonPackages;
isPy3 = true;
isPy36 = true;
is_py3k = true; # deprecated
interpreter = "${self}/bin/${executable}";
};
enableParallelBuilding = true;
doCheck = false; # expensive, and fails
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 = licenses.psfl;
platforms = with platforms; linux ++ darwin;
maintainers = with maintainers; [ fridh kragniz ];
};
}

View File

@ -18,6 +18,10 @@
# For the Python package set # For the Python package set
, packageOverrides ? (self: super: {}) , packageOverrides ? (self: super: {})
, buildPackages , buildPackages
, sourceVersion
, sha256
, passthruFun
, bash
}: }:
assert x11Support -> tcl != null assert x11Support -> tcl != null
@ -27,12 +31,25 @@ assert x11Support -> tcl != null
with stdenv.lib; with stdenv.lib;
let let
majorVersion = "3.7";
minorVersion = "2"; passthru = passthruFun rec {
minorVersionSuffix = ""; inherit self sourceVersion packageOverrides;
version = "${majorVersion}.${minorVersion}${minorVersionSuffix}"; implementation = "cpython";
libPrefix = "python${majorVersion}"; libPrefix = "python${pythonVersion}";
executable = libPrefix;
pythonVersion = with sourceVersion; "${major}.${minor}";
sitePackages = "lib/${libPrefix}/site-packages"; sitePackages = "lib/${libPrefix}/site-packages";
inherit pythonForBuild;
};
version = with sourceVersion; "${major}.${minor}.${patch}${suffix}";
nativeBuildInputs = [
nukeReferences
] ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
buildPackages.stdenv.cc
pythonForBuild
];
buildInputs = filter (p: p != null) [ buildInputs = filter (p: p != null) [
zlib bzip2 expat lzma libffi gdbm sqlite readline ncurses openssl ] zlib bzip2 expat lzma libffi gdbm sqlite readline ncurses openssl ]
@ -40,44 +57,46 @@ let
++ optionals stdenv.isDarwin [ CF configd ]; ++ optionals stdenv.isDarwin [ CF configd ];
hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false); hasDistutilsCxxPatch = !(stdenv.cc.isGNU or false);
pythonForBuild = if stdenv.hostPlatform == stdenv.buildPlatform then
pythonForBuild = buildPackages.${"python${sourceVersion.major}${sourceVersion.minor}"};
pythonForBuildInterpreter = if stdenv.hostPlatform == stdenv.buildPlatform then
"$out/bin/python" "$out/bin/python"
else else pythonForBuild.interpreter;
buildPackages.python37.interpreter;
in stdenv.mkDerivation {
name = "python3-${version}";
pythonVersion = majorVersion;
inherit majorVersion version;
inherit buildInputs; in with passthru; stdenv.mkDerivation {
pname = "python3";
inherit version;
nativeBuildInputs = [ nukeReferences ] ++ inherit buildInputs nativeBuildInputs;
optionals (stdenv.hostPlatform != stdenv.buildPlatform)
[ buildPackages.stdenv.cc buildPackages.python37 ];
src = fetchurl { src = fetchurl {
url = "https://www.python.org/ftp/python/${majorVersion}.${minorVersion}/Python-${version}.tar.xz"; url = with sourceVersion; "https://www.python.org/ftp/python/${major}.${minor}.${patch}/Python-${version}.tar.xz";
sha256 = "1fzi9d2gibh0wzwidyckzbywsxcsbckgsl05ryxlifxia77fhgyq"; inherit sha256;
}; };
NIX_LDFLAGS = optionalString stdenv.isLinux "-lgcc_s";
# Determinism: We fix the hashes of str, bytes and datetime objects.
PYTHONHASHSEED=0;
prePatch = optionalString stdenv.isDarwin '' prePatch = optionalString stdenv.isDarwin ''
substituteInPlace configure --replace '`/usr/bin/arch`' '"i386"' substituteInPlace configure --replace '`/usr/bin/arch`' '"i386"'
substituteInPlace configure --replace '-Wl,-stack_size,1000000' ' ' substituteInPlace configure --replace '-Wl,-stack_size,1000000' ' '
''; '';
patches = [ patches = [
./no-ldconfig.patch # 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).
(./. + "/${sourceVersion.major}.${sourceVersion.minor}/no-ldconfig.patch")
] ++ optionals isPy35 [
# Backports support for LD_LIBRARY_PATH from 3.6
./3.5/ld_library_path.patch
] ++ optionals isPy37 [
# Fix darwin build https://bugs.python.org/issue34027 # Fix darwin build https://bugs.python.org/issue34027
(fetchpatch { (fetchpatch {
url = https://bugs.python.org/file47666/darwin-libutil.patch; url = https://bugs.python.org/file47666/darwin-libutil.patch;
sha256 = "0242gihnw3wfskl4fydp2xanpl8k5q7fj4dp7dbbqf46a4iwdzpa"; sha256 = "0242gihnw3wfskl4fydp2xanpl8k5q7fj4dp7dbbqf46a4iwdzpa";
}) })
] ++ optionals hasDistutilsCxxPatch [ ] ++ optionals (isPy3k && hasDistutilsCxxPatch) [
# Fix for http://bugs.python.org/issue1222585 # Fix for http://bugs.python.org/issue1222585
# Upstream distutils is calling C compiler to compile C++ code, which # Upstream distutils is calling C compiler to compile C++ code, which
# only works for GCC and Apple Clang. This makes distutils to call C++ # only works for GCC and Apple Clang. This makes distutils to call C++
@ -96,6 +115,9 @@ in stdenv.mkDerivation {
CPPFLAGS = "${concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs)}"; CPPFLAGS = "${concatStringsSep " " (map (p: "-I${getDev p}/include") buildInputs)}";
LDFLAGS = "${concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs)}"; LDFLAGS = "${concatStringsSep " " (map (p: "-L${getLib p}/lib") buildInputs)}";
LIBS = "${optionalString (!stdenv.isDarwin) "-lcrypt"} ${optionalString (ncurses != null) "-lncurses"}"; LIBS = "${optionalString (!stdenv.isDarwin) "-lcrypt"} ${optionalString (ncurses != null) "-lncurses"}";
NIX_LDFLAGS = optionalString stdenv.isLinux "-lgcc_s";
# Determinism: We fix the hashes of str, bytes and datetime objects.
PYTHONHASHSEED=0;
configureFlags = [ configureFlags = [
"--enable-shared" "--enable-shared"
@ -125,16 +147,25 @@ in stdenv.mkDerivation {
"ac_cv_computed_gotos=yes" "ac_cv_computed_gotos=yes"
"ac_cv_file__dev_ptmx=yes" "ac_cv_file__dev_ptmx=yes"
"ac_cv_file__dev_ptc=yes" "ac_cv_file__dev_ptc=yes"
] ++ optionals stdenv.hostPlatform.isLinux [
# Never even try to use lchmod on linux,
# don't rely on detecting glibc-isms.
"ac_cv_func_lchmod=no"
]; ];
preConfigure = '' preConfigure = ''
for i in /usr /sw /opt /pkg; do # improve purity for i in /usr /sw /opt /pkg; do # improve purity
substituteInPlace ./setup.py --replace $i /no-such-path substituteInPlace ./setup.py --replace $i /no-such-path
done done
${optionalString stdenv.isDarwin '' '' + optionalString stdenv.isDarwin ''
export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -msse2" export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -msse2"
export MACOSX_DEPLOYMENT_TARGET=10.6 export MACOSX_DEPLOYMENT_TARGET=10.6
''} '' + optionalString (isPy3k && pythonOlder "3.7") ''
# Determinism: The interpreter is patched to write null timestamps when compiling python files.
# This way python does not try to update them when we freeze timestamps in nix store.
export DETERMINISTIC_BUILD=1;
'' + optionalString stdenv.hostPlatform.isMusl ''
export NIX_CFLAGS_COMPILE+=" -DTHREAD_STACK_SIZE=0x100000"
''; '';
setupHook = python-setup-hook sitePackages; setupHook = python-setup-hook sitePackages;
@ -142,7 +173,7 @@ in stdenv.mkDerivation {
postInstall = '' postInstall = ''
# needed for some packages, especially packages that backport functionality # needed for some packages, especially packages that backport functionality
# to 2.x from 3.x # to 2.x from 3.x
for item in $out/lib/python${majorVersion}/test/*; do for item in $out/lib/${libPrefix}/test/*; do
if [[ "$item" != */test_support.py* if [[ "$item" != */test_support.py*
&& "$item" != */test/support && "$item" != */test/support
&& "$item" != */test/libregrtest && "$item" != */test/libregrtest
@ -152,9 +183,9 @@ in stdenv.mkDerivation {
echo $item echo $item
fi fi
done done
touch $out/lib/python${majorVersion}/test/__init__.py touch $out/lib/${libPrefix}/test/__init__.py
ln -s "$out/include/python${majorVersion}m" "$out/include/python${majorVersion}" ln -s "$out/include/${executable}m" "$out/include/${executable}"
# Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484 # Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484
echo "manylinux1_compatible=False" >> $out/lib/${libPrefix}/_manylinux.py echo "manylinux1_compatible=False" >> $out/lib/${libPrefix}/_manylinux.py
@ -173,45 +204,40 @@ in stdenv.mkDerivation {
# Get rid of retained dependencies on -dev packages, and remove # Get rid of retained dependencies on -dev packages, and remove
# some $TMPDIR references to improve binary reproducibility. # some $TMPDIR references to improve binary reproducibility.
# Note that the .pyc file of _sysconfigdata.py should be regenerated! # Note that the .pyc file of _sysconfigdata.py should be regenerated!
for i in $out/lib/python${majorVersion}/_sysconfigdata*.py $out/lib/python${majorVersion}/config-${majorVersion}m*/Makefile; do for i in $out/lib/${libPrefix}/_sysconfigdata*.py $out/lib/${libPrefix}/config-${sourceVersion.major}${sourceVersion.minor}*/Makefile; do
sed -i $i -e "s|$TMPDIR|/no-such-path|g" sed -i $i -e "s|$TMPDIR|/no-such-path|g"
nuke-refs $i
done done
# Further get rid of references. https://github.com/NixOS/nixpkgs/issues/51668 # Further get rid of references. https://github.com/NixOS/nixpkgs/issues/51668
find $out/lib/python*/config-*-* -type f -print -exec nuke-refs '{}' + find $out/lib/python*/config-* -type f -print -exec nuke-refs '{}' +
find $out/lib -name '_sysconfigdata_m*.py*' -print -exec nuke-refs '{}' + find $out/lib -name '_sysconfigdata*.py*' -print -exec nuke-refs '{}' +
# Determinism: rebuild all bytecode # Determinism: rebuild all bytecode
# We exclude lib2to3 because that's Python 2 code which fails # We exclude lib2to3 because that's Python 2 code which fails
# We rebuild three times, once for each optimization level # We rebuild three times, once for each optimization level
# Python 3.7 implements PEP 552, introducing support for deterministic bytecode. # Python 3.7 implements PEP 552, introducing support for deterministic bytecode.
# This is automatically used when `SOURCE_DATE_EPOCH` is set. # This is automatically used when `SOURCE_DATE_EPOCH` is set.
find $out -name "*.py" | ${pythonForBuild} -m compileall -q -f -x "lib2to3" -i - find $out -name "*.py" | ${pythonForBuildInterpreter} -m compileall -q -f -x "lib2to3" -i -
find $out -name "*.py" | ${pythonForBuild} -O -m compileall -q -f -x "lib2to3" -i - find $out -name "*.py" | ${pythonForBuildInterpreter} -O -m compileall -q -f -x "lib2to3" -i -
find $out -name "*.py" | ${pythonForBuild} -OO -m compileall -q -f -x "lib2to3" -i - find $out -name "*.py" | ${pythonForBuildInterpreter} -OO -m compileall -q -f -x "lib2to3" -i -
'';
preFixup = stdenv.lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
# Ensure patch-shebangs uses shebangs of host interpreter.
export PATH=${stdenv.lib.makeBinPath [ "$out" bash ]}:$PATH
''; '';
# Enforce that we don't have references to the OpenSSL -dev package, which we # Enforce that we don't have references to the OpenSSL -dev package, which we
# explicitly specify in our configure flags above. # explicitly specify in our configure flags above.
disallowedReferences = [ openssl.dev ]; disallowedReferences = [
openssl.dev
] ++ stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
# Ensure we don't have references to build-time packages.
# These typically end up in shebangs.
pythonForBuild buildPackages.bash
];
passthru = let inherit passthru;
pythonPackages = callPackage ../../../../../top-level/python-packages.nix {
python = self;
overrides = packageOverrides;
};
in rec {
inherit libPrefix sitePackages x11Support hasDistutilsCxxPatch;
executable = "${libPrefix}m";
buildEnv = callPackage ../../wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; };
withPackages = import ../../with-packages.nix { inherit buildEnv pythonPackages;};
pkgs = pythonPackages;
isPy3 = true;
isPy37 = true;
is_py3k = true; # deprecated
interpreter = "${self}/bin/${executable}";
};
enableParallelBuilding = true; enableParallelBuilding = true;
@ -229,6 +255,6 @@ in stdenv.mkDerivation {
''; '';
license = licenses.psfl; license = licenses.psfl;
platforms = with platforms; linux ++ darwin; platforms = with platforms; linux ++ darwin;
maintainers = with maintainers; [ fridh kragniz ]; maintainers = with maintainers; [ fridh ];
}; };
} }

View File

@ -0,0 +1,154 @@
{ pkgs, lib }:
with pkgs;
(let
# Common passthru for all Python interpreters.
passthruFun =
{ implementation
, libPrefix
, executable
, sourceVersion
, pythonVersion
, packageOverrides
, sitePackages
, pythonForBuild
, self
}: let
pythonPackages = callPackage ../../../top-level/python-packages.nix {
python = self;
overrides = packageOverrides;
};
in rec {
isPy27 = pythonVersion == "2.7";
isPy33 = pythonVersion == "3.3"; # TODO: remove
isPy34 = pythonVersion == "3.4"; # TODO: remove
isPy35 = pythonVersion == "3.5";
isPy36 = pythonVersion == "3.6";
isPy37 = pythonVersion == "3.7";
isPy3k = lib.strings.substring 0 1 pythonVersion == "3";
isPyPy = interpreter == "pypy";
buildEnv = callPackage ./wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; };
withPackages = import ./with-packages.nix { inherit buildEnv pythonPackages;};
pkgs = pythonPackages;
interpreter = "${self}/bin/${executable}";
inherit executable implementation libPrefix pythonVersion sitePackages;
inherit sourceVersion;
pythonAtLeast = lib.versionAtLeast pythonVersion;
pythonOlder = lib.versionOlder pythonVersion;
inherit pythonForBuild;
};
in {
python27 = callPackage ./cpython/2.7 {
self = python27;
sourceVersion = {
major = "2";
minor = "7";
patch = "15";
suffix = "";
};
sha256 = "0x2mvz9dp11wj7p5ccvmk9s0hzjk2fa1m462p395l4r6bfnb3n92";
inherit (darwin) CF configd;
inherit passthruFun;
};
python35 = callPackage ./cpython {
self = python35;
sourceVersion = {
major = "3";
minor = "5";
patch = "6";
suffix = "";
};
sha256 = "0pqmf51zy2lzhbaj4yya2py2qr653j9152d0rg3p7wi1yl2dwp7m";
inherit (darwin) CF configd;
inherit passthruFun;
};
python36 = callPackage ./cpython {
self = python36;
sourceVersion = {
major = "3";
minor = "6";
patch = "8";
suffix = "";
};
sha256 = "14qi6n5gpcjnwy165wi9hkfcmbadc95ny6bxxldknxwmx50n4i1m";
inherit (darwin) CF configd;
inherit passthruFun;
};
python37 = callPackage ./cpython {
self = python37;
sourceVersion = {
major = "3";
minor = "7";
patch = "2";
suffix = "";
};
sha256 = "1fzi9d2gibh0wzwidyckzbywsxcsbckgsl05ryxlifxia77fhgyq";
inherit (darwin) CF configd;
inherit passthruFun;
};
pypy27 = callPackage ./pypy {
self = pypy27;
sourceVersion = {
major = "6";
minor = "0";
patch = "0";
};
sha256 = "1qjwpc8n68sxxlfg36s5vn1h2gdfvvd6lxvr4lzbvfwhzrgqahsw";
pythonVersion = "2.7";
db = db.override { dbmSupport = true; };
python = python27;
inherit passthruFun;
};
pypy35 = callPackage ./pypy {
self = pypy35;
sourceVersion = {
major = "6";
minor = "0";
patch = "0";
};
sha256 = "0lwq8nn0r5yj01bwmkk5p7xvvrp4s550l8184mkmn74d3gphrlwg";
pythonVersion = "3.5";
db = db.override { dbmSupport = true; };
python = python27;
inherit passthruFun;
};
pypy27_prebuilt = callPackage ./pypy/prebuilt.nix {
# Not included at top-level
self = pythonInterpreters.pypy27_prebuilt;
sourceVersion = {
major = "6";
minor = "0";
patch = "0";
};
sha256 = "0rxgnp3fm18b87ln8bbjr13g2fsf4ka4abkaim6m03y9lwmr9gvc"; # linux64
pythonVersion = "2.7";
inherit passthruFun;
ncurses = ncurses5;
};
pypy35_prebuilt = callPackage ./pypy/prebuilt.nix {
# Not included at top-level
self = pythonInterpreters.pypy35_prebuilt;
sourceVersion = {
major = "6";
minor = "0";
patch = "0";
};
sha256 = "0j3h08s7wpglghasmym3baycpif5jshvmk9rpav4pwwy5clzmzsc"; # linux64
pythonVersion = "3.5";
inherit passthruFun;
ncurses = ncurses5;
};
})

View File

@ -77,7 +77,7 @@ let self = toPythonModule (python.stdenv.mkDerivation (builtins.removeAttrs attr
buildInputs = [ wrapPython ] buildInputs = [ wrapPython ]
++ lib.optional (lib.hasSuffix "zip" (attrs.src.name or "")) unzip ++ lib.optional (lib.hasSuffix "zip" (attrs.src.name or "")) unzip
++ lib.optional catchConflicts setuptools # If we no longer propagate setuptools # ++ lib.optional catchConflicts setuptools # If we no longer propagate setuptools
++ buildInputs ++ buildInputs
++ pythonPath; ++ pythonPath;
@ -100,9 +100,12 @@ let self = toPythonModule (python.stdenv.mkDerivation (builtins.removeAttrs attr
# Check if we have two packages with the same name in the closure and fail. # Check if we have two packages with the same name in the closure and fail.
# If this happens, something went wrong with the dependencies specs. # If this happens, something went wrong with the dependencies specs.
# Intentionally kept in a subdirectory, see catch_conflicts/README.md. # Intentionally kept in a subdirectory, see catch_conflicts/README.md.
${python.interpreter} ${./catch_conflicts}/catch_conflicts.py ${python.pythonForBuild.interpreter} ${./catch_conflicts}/catch_conflicts.py
'' + attrs.postFixup or ''''; '' + attrs.postFixup or '''';
# Python packages built through cross-compilation are always for the host platform.
disallowedReferences = lib.optionals (python.stdenv.hostPlatform != python.stdenv.buildPlatform) [ python.pythonForBuild ];
meta = { meta = {
# default to python's platforms # default to python's platforms
platforms = python.meta.platforms; platforms = python.meta.platforms;

View File

@ -1,136 +0,0 @@
{ stdenv, substituteAll, fetchurl
, zlib ? null, zlibSupport ? true, bzip2, pkgconfig, libffi
, sqlite, openssl, ncurses, python, expat, tcl, tk, tix, xlibsWrapper, libX11
, makeWrapper, callPackage, self, gdbm, db
, python-setup-hook
# For the Python package set
, packageOverrides ? (self: super: {})
}:
assert zlibSupport -> zlib != null;
let
version = "6.0.0";
pythonVersion = "2.7";
libPrefix = "pypy${pythonVersion}";
sitePackages = "site-packages";
pythonForPypy = python.withPackages (ppkgs: [ ppkgs.pycparser ]);
in stdenv.mkDerivation rec {
name = "pypy-${version}";
inherit version pythonVersion;
src = fetchurl {
url = "https://bitbucket.org/pypy/pypy/get/release-pypy${pythonVersion}-v${version}.tar.bz2";
sha256 = "1qjwpc8n68sxxlfg36s5vn1h2gdfvvd6lxvr4lzbvfwhzrgqahsw";
};
nativeBuildInputs = [ pkgconfig makeWrapper ];
buildInputs = [
bzip2 openssl pythonForPypy libffi ncurses expat sqlite tk tcl xlibsWrapper libX11 gdbm db
] ++ stdenv.lib.optional (stdenv ? cc && stdenv.cc.libc != null) stdenv.cc.libc
++ stdenv.lib.optional zlibSupport zlib;
hardeningDisable = stdenv.lib.optional stdenv.isi686 "pic";
C_INCLUDE_PATH = stdenv.lib.makeSearchPathOutput "dev" "include" buildInputs;
LIBRARY_PATH = stdenv.lib.makeLibraryPath buildInputs;
LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath (stdenv.lib.filter (x : x.outPath != stdenv.cc.libc.outPath or "") buildInputs);
patches = [
(substituteAll {
src = ./tk_tcl_paths.patch;
inherit tk tcl;
tk_dev = tk.dev;
tcl_dev = tcl;
tk_libprefix = tk.libPrefix;
tcl_libprefix = tcl.libPrefix;
})
];
postPatch = ''
substituteInPlace "lib-python/2.7/lib-tk/Tix.py" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'"
# hint pypy to find nix ncurses
substituteInPlace pypy/module/_minimal_curses/fficurses.py \
--replace "/usr/include/ncurses/curses.h" "${ncurses.dev}/include/curses.h" \
--replace "ncurses/curses.h" "${ncurses.dev}/include/curses.h" \
--replace "ncurses/term.h" "${ncurses.dev}/include/term.h" \
--replace "libraries=['curses']" "libraries=['ncurses']"
sed -i "s@libraries=\['sqlite3'\]\$@libraries=['sqlite3'], include_dirs=['${sqlite.dev}/include'], library_dirs=['${sqlite.out}/lib']@" lib_pypy/_sqlite3_build.py
'';
buildPhase = ''
${pythonForPypy.interpreter} rpython/bin/rpython \
--make-jobs="$NIX_BUILD_CORES" \
-Ojit \
--batch pypy/goal/targetpypystandalone.py
'';
setupHook = python-setup-hook sitePackages;
doCheck = true;
checkPhase = ''
export TERMINFO="${ncurses.out}/share/terminfo/";
export TERM="xterm";
export HOME="$TMPDIR";
# disable shutils because it assumes gid 0 exists
# disable socket because it has two actual network tests that fail
# disable test_urllib2net, test_urllib2_localnet, and test_urllibnet because they require networking (example.com)
./pypy-c ./pypy/test_all.py --pypy=./pypy-c -k 'not ( test_urllib2net or test_urllibnet or test_urllib2_localnet or test_socket or test_shutil )' lib-python
'';
installPhase = ''
mkdir -p $out/{bin,include,lib,pypy-c}
cp -R {include,lib_pypy,lib-python,pypy-c} $out/pypy-c
cp libpypy-c.so $out/lib/
ln -s $out/pypy-c/pypy-c $out/bin/pypy
chmod +x $out/bin/pypy
# other packages expect to find stuff according to libPrefix
ln -s $out/pypy-c/include $out/include/${libPrefix}
ln -s $out/pypy-c/lib-python/${pythonVersion} $out/lib/${libPrefix}
# We must wrap the original, not the symlink.
# PyPy uses argv[0] to find its standard library, and while it knows
# how to follow symlinks, it doesn't know about wrappers. So, it
# will think the wrapper is the original. As long as the wrapper has
# the same path as the original, this is OK.
wrapProgram "$out/pypy-c/pypy-c" \
--set LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:$out/lib" \
--set LIBRARY_PATH "${LIBRARY_PATH}:$out/lib"
# verify cffi modules
$out/bin/pypy -c "import Tkinter;import sqlite3;import curses"
# Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484
echo "manylinux1_compatible=False" >> $out/lib/${libPrefix}/_manylinux.py
'';
passthru = let
pythonPackages = callPackage ../../../../../top-level/python-packages.nix {python=self; overrides=packageOverrides;};
in rec {
inherit zlibSupport libPrefix sitePackages;
executable = "pypy";
isPypy = true;
isPy2 = true;
isPy27 = true;
buildEnv = callPackage ../../wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; };
interpreter = "${self}/bin/${executable}";
withPackages = import ../../with-packages.nix { inherit buildEnv pythonPackages;};
pkgs = pythonPackages;
};
enableParallelBuilding = true; # almost no parallelization without STM
meta = with stdenv.lib; {
homepage = http://pypy.org/;
description = "Fast, compliant alternative implementation of the Python language (2.7.13)";
license = licenses.mit;
platforms = [ "i686-linux" "x86_64-linux" ];
maintainers = with maintainers; [ ];
};
}

View File

@ -1,17 +0,0 @@
--- pypy-pypy-84a2f3e6a7f8.org/lib_pypy/_tkinter/tklib_build.py 2017-10-03 11:49:20.000000000 +0100
+++ pypy-pypy-84a2f3e6a7f8/lib_pypy/_tkinter/tklib_build.py 2017-11-21 13:20:51.398607530 +0000
@@ -24,11 +24,11 @@
else:
# On some Linux distributions, the tcl and tk libraries are
# stored in /usr/include, so we must check this case also
- libdirs = []
+ libdirs = ["@tcl@/lib", "@tk@/lib"]
found = False
for _ver in ['', '8.6', '8.5']:
- incdirs = ['/usr/include/tcl' + _ver]
- linklibs = ['tcl' + _ver, 'tk' + _ver]
+ incdirs = ['@tcl_dev@/include', '@tk_dev@/include']
+ linklibs = ['@tcl_libprefix@', '@tk_libprefix@']
if os.path.isdir(incdirs[0]):
found = True
break

View File

@ -5,38 +5,54 @@
, python-setup-hook , python-setup-hook
# For the Python package set # For the Python package set
, packageOverrides ? (self: super: {}) , packageOverrides ? (self: super: {})
, sourceVersion
, pythonVersion
, sha256
, passthruFun
}: }:
assert zlibSupport -> zlib != null; assert zlibSupport -> zlib != null;
let with stdenv.lib;
version = "6.0.0";
pythonVersion = "3.5";
libPrefix = "pypy${pythonVersion}";
sitePackages = "site-packages";
let
isPy3k = substring 0 1 pythonVersion == "3";
passthru = passthruFun rec {
inherit self sourceVersion pythonVersion packageOverrides;
implementation = "pypy";
libPrefix = "pypy${pythonVersion}";
executable = "pypy${if isPy3k then "3" else ""}";
pythonForBuild = self; # No cross-compiling for now.
sitePackages = "site-packages";
};
pname = passthru.executable;
version = with sourceVersion; "${major}.${minor}.${patch}";
pythonForPypy = python.withPackages (ppkgs: [ ppkgs.pycparser ]); pythonForPypy = python.withPackages (ppkgs: [ ppkgs.pycparser ]);
in stdenv.mkDerivation rec { in with passthru; stdenv.mkDerivation rec {
name = "pypy3-${version}"; inherit pname version;
inherit version pythonVersion;
src = fetchurl { src = fetchurl {
url = "https://bitbucket.org/pypy/pypy/get/release-pypy${pythonVersion}-v${version}.tar.bz2"; url = "https://bitbucket.org/pypy/pypy/get/release-pypy${pythonVersion}-v${version}.tar.bz2";
sha256 = "0lwq8nn0r5yj01bwmkk5p7xvvrp4s550l8184mkmn74d3gphrlwg"; inherit sha256;
}; };
nativeBuildInputs = [ pkgconfig makeWrapper ]; nativeBuildInputs = [ pkgconfig makeWrapper ];
buildInputs = [ buildInputs = [
bzip2 openssl pythonForPypy libffi ncurses expat sqlite tk tcl xlibsWrapper libX11 gdbm db lzma bzip2 openssl pythonForPypy libffi ncurses expat sqlite tk tcl xlibsWrapper libX11 gdbm db
] ++ stdenv.lib.optional (stdenv ? cc && stdenv.cc.libc != null) stdenv.cc.libc ] ++ optionals isPy3k [
++ stdenv.lib.optional zlibSupport zlib; lzma
] ++ optionals (stdenv ? cc && stdenv.cc.libc != null) [
stdenv.cc.libc
] ++ optionals zlibSupport [
zlib
];
hardeningDisable = stdenv.lib.optional stdenv.isi686 "pic"; hardeningDisable = optional stdenv.isi686 "pic";
C_INCLUDE_PATH = stdenv.lib.makeSearchPathOutput "dev" "include" buildInputs; C_INCLUDE_PATH = makeSearchPathOutput "dev" "include" buildInputs;
LIBRARY_PATH = stdenv.lib.makeLibraryPath buildInputs; LIBRARY_PATH = makeLibraryPath buildInputs;
LD_LIBRARY_PATH = stdenv.lib.makeLibraryPath (stdenv.lib.filter (x : x.outPath != stdenv.cc.libc.outPath or "") buildInputs); LD_LIBRARY_PATH = makeLibraryPath (filter (x : x.outPath != stdenv.cc.libc.outPath or "") buildInputs);
patches = [ patches = [
(substituteAll { (substituteAll {
@ -50,7 +66,7 @@ in stdenv.mkDerivation rec {
]; ];
postPatch = '' postPatch = ''
substituteInPlace "lib-python/3/tkinter/tix.py" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'" substituteInPlace "lib-python/${if isPy3k then "3/tkinter/tix.py" else "2.7/lib-tk/Tix.py"}" --replace "os.environ.get('TIX_LIBRARY')" "os.environ.get('TIX_LIBRARY') or '${tix}/lib'"
# hint pypy to find nix ncurses # hint pypy to find nix ncurses
substituteInPlace pypy/module/_minimal_curses/fficurses.py \ substituteInPlace pypy/module/_minimal_curses/fficurses.py \
@ -72,60 +88,63 @@ in stdenv.mkDerivation rec {
setupHook = python-setup-hook sitePackages; setupHook = python-setup-hook sitePackages;
doCheck = true; doCheck = true;
checkPhase = '' checkPhase = let
disabledTests = [
# disable shutils because it assumes gid 0 exists
"test_shutil"
# disable socket because it has two actual network tests that fail
"test_socket"
] ++ optionals (!isPy3k) [
# disable test_urllib2net, test_urllib2_localnet, and test_urllibnet because they require networking (example.com)
"test_urllib2net"
"test_urllibnet"
"test_urllib2_localnet"
] ++ optionals isPy3k [
# disable asyncio due to https://github.com/NixOS/nix/issues/1238
"test_asyncio"
# disable os due to https://github.com/NixOS/nixpkgs/issues/10496
"test_os"
# disable pathlib due to https://bitbucket.org/pypy/pypy/pull-requests/594
"test_pathlib"
# disable tarfile because it assumes gid 0 exists
"test_tarfile"
];
in ''
export TERMINFO="${ncurses.out}/share/terminfo/"; export TERMINFO="${ncurses.out}/share/terminfo/";
export TERM="xterm"; export TERM="xterm";
export HOME="$TMPDIR"; export HOME="$TMPDIR";
# disable asyncio due to https://github.com/NixOS/nix/issues/1238
# disable os due to https://github.com/NixOS/nixpkgs/issues/10496 ${pythonForPypy.interpreter} ./pypy/test_all.py --pypy=./${executable}-c -k 'not (${concatStringsSep " or " disabledTests})' lib-python
# disable pathlib due to https://bitbucket.org/pypy/pypy/pull-requests/594
# disable shutils because it assumes gid 0 exists
# disable socket because it has two actual network tests that fail
# disable tarfile because it assumes gid 0 exists
${pythonForPypy.interpreter} ./pypy/test_all.py --pypy=./pypy3-c -k 'not ( test_asyncio or test_os or test_pathlib or test_shutil or test_socket or test_tarfile )' lib-python
''; '';
installPhase = '' installPhase = ''
mkdir -p $out/{bin,include,lib,pypy3-c} mkdir -p $out/{bin,include,lib,${executable}-c}
cp -R {include,lib_pypy,lib-python,pypy3-c} $out/pypy3-c cp -R {include,lib_pypy,lib-python,${executable}-c} $out/${executable}-c
cp libpypy3-c.so $out/lib/ cp lib${executable}-c.so $out/lib/
ln -s $out/pypy3-c/pypy3-c $out/bin/pypy3 ln -s $out/${executable}-c/${executable}-c $out/bin/${executable}
# other packages expect to find stuff according to libPrefix # other packages expect to find stuff according to libPrefix
ln -s $out/pypy3-c/include $out/include/${libPrefix} ln -s $out/${executable}/include $out/include/${libPrefix}
ln -s $out/pypy3-c/lib-python/3 $out/lib/${libPrefix} ln -s $out/${executable}-c/lib-python/${if isPy3k then "3" else pythonVersion} $out/lib/${libPrefix}
# We must wrap the original, not the symlink. # We must wrap the original, not the symlink.
# PyPy uses argv[0] to find its standard library, and while it knows # PyPy uses argv[0] to find its standard library, and while it knows
# how to follow symlinks, it doesn't know about wrappers. So, it # how to follow symlinks, it doesn't know about wrappers. So, it
# will think the wrapper is the original. As long as the wrapper has # will think the wrapper is the original. As long as the wrapper has
# the same path as the original, this is OK. # the same path as the original, this is OK.
wrapProgram "$out/pypy3-c/pypy3-c" \ wrapProgram "$out/${executable}-c/${executable}-c" \
--set LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:$out/lib" \ --set LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:$out/lib" \
--set LIBRARY_PATH "${LIBRARY_PATH}:$out/lib" --set LIBRARY_PATH "${LIBRARY_PATH}:$out/lib"
# verify cffi modules # verify cffi modules
$out/bin/pypy3 -c "import tkinter;import sqlite3;import curses;import lzma" $out/bin/${executable} -c ${if isPy3k then "'import tkinter;import sqlite3;import curses;import lzma'" else "'import Tkinter;import sqlite3;import curses'"}
# Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484 # Python on Nix is not manylinux1 compatible. https://github.com/NixOS/nixpkgs/issues/18484
echo "manylinux1_compatible=False" >> $out/lib/${libPrefix}/_manylinux.py echo "manylinux1_compatible=False" >> $out/lib/${libPrefix}/_manylinux.py
''; '';
passthru = let inherit passthru;
pythonPackages = callPackage ../../../../../top-level/python-packages.nix {python=self; overrides=packageOverrides;};
in rec {
inherit zlibSupport libPrefix sitePackages;
executable = "pypy3";
isPypy = true;
isPy3 = true;
isPy35 = true;
buildEnv = callPackage ../../wrapper.nix { python = self; inherit (pythonPackages) requiredPythonModules; };
interpreter = "${self}/bin/${executable}";
withPackages = import ../../with-packages.nix { inherit buildEnv pythonPackages;};
pkgs = pythonPackages;
};
enableParallelBuilding = true; # almost no parallelization without STM enableParallelBuilding = true; # almost no parallelization without STM
meta = with stdenv.lib; { meta = with stdenv.lib; {

View File

@ -0,0 +1,123 @@
{ stdenv
, fetchurl
, python-setup-hook
, self
, which
# Dependencies
, bzip2
, zlib
, openssl
, expat
, libffi
, ncurses
, tcl
, tk
# For the Python package set
, packageOverrides ? (self: super: {})
, sourceVersion
, pythonVersion
, sha256
, passthruFun
}:
# This version of PyPy is primarily added to speed-up translation of
# our PyPy source build when developing that expression.
with stdenv.lib;
let
isPy3k = majorVersion == "3";
passthru = passthruFun rec {
inherit self sourceVersion pythonVersion packageOverrides;
implementation = "pypy";
libPrefix = "pypy${pythonVersion}";
executable = "pypy${if isPy3k then "3" else ""}";
pythonForBuild = self; # Not possible to cross-compile with.
sitePackages = "site-packages";
};
pname = "${passthru.executable}_prebuilt";
version = with sourceVersion; "${major}.${minor}.${patch}";
majorVersion = substring 0 1 pythonVersion;
setupHook = python-setup-hook sitePackages;
deps = [
bzip2
zlib
openssl
expat
libffi
ncurses
tcl
tk
];
in with passthru; stdenv.mkDerivation {
inherit pname version;
src = fetchurl {
url= "https://bitbucket.org/pypy/pypy/downloads/pypy${majorVersion}-v${version}-linux64.tar.bz2";
inherit sha256;
};
buildInputs = [ which ];
installPhase = ''
mkdir -p $out/lib
echo "Moving files to $out"
mv -t $out bin include lib-python lib_pypy site-packages
mv $out/bin/libpypy*-c.so $out/lib/
rm $out/bin/*.debug
echo "Patching binaries"
interpreter=$(patchelf --print-interpreter $(readlink -f $(which patchelf)))
patchelf --set-interpreter $interpreter \
--set-rpath $out/lib \
$out/bin/pypy*
pushd $out
find {lib,lib_pypy*} -name "*.so" -exec patchelf --replace-needed "libbz2.so.1.0" "libbz2.so.1" {} \;
find {lib,lib_pypy*} -name "*.so" -exec patchelf --set-rpath ${stdenv.lib.makeLibraryPath deps} {} \;
echo "Removing bytecode"
find . -name "__pycache__" -type d -depth -exec rm -rf {} \;
popd
'';
doInstallCheck = true;
# Check whether importing of (extension) modules functions
installCheckPhase = let
modules = [
"ssl"
"sys"
"curses"
] ++ optionals (!isPy3k) [
"Tkinter"
] ++ optionals isPy3k [
"tkinter"
];
imports = concatMapStringsSep "; " (x: "import ${x}") modules;
in ''
echo "Testing whether we can import modules"
$out/bin/${executable} -c '${imports}'
'';
setupHook = python-setup-hook sitePackages;
donPatchElf = true;
dontStrip = true;
inherit passthru;
meta = with stdenv.lib; {
homepage = http://pypy.org/;
description = "Fast, compliant alternative implementation of the Python language (3.5.3)";
license = licenses.mit;
platforms = [ "x86_64-linux" ];
};
}

View File

@ -9,7 +9,8 @@ makeSetupHook {
deps = makeWrapper; deps = makeWrapper;
substitutions.sitePackages = python.sitePackages; substitutions.sitePackages = python.sitePackages;
substitutions.executable = python.interpreter; substitutions.executable = python.interpreter;
substitutions.python = python; substitutions.python = python.pythonForBuild;
substitutions.pythonHost = python;
substitutions.magicalSedExpression = let substitutions.magicalSedExpression = let
# Looks weird? Of course, it's between single quoted shell strings. # Looks weird? Of course, it's between single quoted shell strings.
# NOTE: Order DOES matter here, so single character quotes need to be # NOTE: Order DOES matter here, so single character quotes need to be

View File

@ -16,8 +16,8 @@ buildPythonPath() {
declare -A pythonPathsSeen=() declare -A pythonPathsSeen=()
program_PYTHONPATH= program_PYTHONPATH=
program_PATH= program_PATH=
pythonPathsSeen["@python@"]=1 pythonPathsSeen["@pythonHost@"]=1
addToSearchPath program_PATH @python@/bin addToSearchPath program_PATH @pythonHost@/bin
for path in $pythonPath; do for path in $pythonPath; do
_addToPythonPath $path _addToPythonPath $path
done done
@ -56,6 +56,12 @@ wrapPythonProgramsIn() {
sed -i "$f" -e "1 s^.*/env[ ]*\(python\|pypy\)[^ ]*^#!@executable@^" sed -i "$f" -e "1 s^.*/env[ ]*\(python\|pypy\)[^ ]*^#!@executable@^"
fi fi
if head -n1 "$f" | grep -q '#!.*'; then
# Cross-compilation hack: ensure shebangs are for the host
echo "Rewriting $(head -n 1 $f) to #!@pythonHost@"
sed -i "$f" -e "1 s^#!@python@^#!@pythonHost@^"
fi
# catch /python and /.python-wrapped # catch /python and /.python-wrapped
if head -n1 "$f" | grep -q '/\.\?\(python\|pypy\)'; then if head -n1 "$f" | grep -q '/\.\?\(python\|pypy\)'; then
# dont wrap EGG-INFO scripts since they are called from python # dont wrap EGG-INFO scripts since they are called from python

View File

@ -28,7 +28,7 @@ stdenv.mkDerivation rec {
preConfigure = '' preConfigure = ''
# Fix for boost 1.67+ # Fix for boost 1.67+
substituteInPlace CMakeLists.txt \ substituteInPlace CMakeLists.txt \
--replace "find_package(Boost)" "find_package(Boost 1.40 REQUIRED COMPONENTS python${builtins.replaceStrings ["."] [""] python.majorVersion})" --replace "find_package(Boost)" "find_package(Boost 1.40 REQUIRED COMPONENTS python${builtins.replaceStrings ["."] [""] python.pythonVersion})"
for f in `find . -name CMakeLists.txt`; do for f in `find . -name CMakeLists.txt`; do
substituteInPlace "$f" \ substituteInPlace "$f" \
--replace "boost_python" "\''${Boost_LIBRARIES}" --replace "boost_python" "\''${Boost_LIBRARIES}"

View File

@ -1,5 +1,4 @@
{ stdenv { stdenv
, bootstrapped-pip
, buildPythonPackage , buildPythonPackage
, python , python
, fetchPypi , fetchPypi
@ -24,11 +23,11 @@ buildPythonPackage rec {
# That is because while the default install phase succeeds to build the package, # That is because while the default install phase succeeds to build the package,
# it fails to generate the file "auto_paridecl.pxd". # it fails to generate the file "auto_paridecl.pxd".
installPhase = '' installPhase = ''
mkdir -p "$out/lib/${python.libPrefix}/site-packages" mkdir -p "$out/lib/${python.sitePackages}"
export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH" export PYTHONPATH="$out/lib/${python.sitePackages}:$PYTHONPATH"
# install "." instead of "*.whl" # install "." instead of "*.whl"
${bootstrapped-pip}/bin/pip install --no-index --prefix=$out --no-cache --build=tmpdir . ${python.pythonForBuild.pkgs.bootstrapped-pip}/bin/pip install --no-index --prefix=$out --no-cache --build=tmpdir .
''; '';
buildInputs = [ buildInputs = [

View File

@ -1,4 +1,4 @@
{ lib, buildPythonPackage, fetchPypi, libyaml }: { lib, buildPythonPackage, fetchPypi, libyaml, buildPackages }:
buildPythonPackage rec { buildPythonPackage rec {
pname = "PyYAML"; pname = "PyYAML";
@ -9,6 +9,8 @@ buildPythonPackage rec {
sha256 = "3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf"; sha256 = "3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf";
}; };
nativeBuildInputs = [ buildPackages.stdenv.cc ];
propagatedBuildInputs = [ libyaml ]; propagatedBuildInputs = [ libyaml ];
meta = with lib; { meta = with lib; {

View File

@ -17,19 +17,24 @@ stdenv.mkDerivation rec {
sha256 = "86bb4d8e1b0fabad1f4642b64c335b673e53e7a381de03c9a89fe678152c4c64"; sha256 = "86bb4d8e1b0fabad1f4642b64c335b673e53e7a381de03c9a89fe678152c4c64";
}; };
nativeBuildInputs = [ unzip wrapPython ]; nativeBuildInputs = [ unzip wrapPython python.pythonForBuild ];
buildInputs = [ python ];
doCheck = false; # requires pytest doCheck = false; # requires pytest
installPhase = '' installPhase = ''
dst=$out/${python.sitePackages} dst=$out/${python.sitePackages}
mkdir -p $dst mkdir -p $dst
export PYTHONPATH="$dst:$PYTHONPATH" export PYTHONPATH="$dst:$PYTHONPATH"
${python.interpreter} setup.py install --prefix=$out ${python.pythonForBuild.interpreter} setup.py install --prefix=$out
wrapPythonPrograms wrapPythonPrograms
''; '';
pythonPath = []; pythonPath = [];
dontPatchShebangs = true;
# Python packages built through cross-compilation are always for the host platform.
disallowedReferences = stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [ python.pythonForBuild ];
meta = with stdenv.lib; { meta = with stdenv.lib; {
description = "Utilities to facilitate the installation of Python packages"; description = "Utilities to facilitate the installation of Python packages";
homepage = https://pypi.python.org/pypi/setuptools; homepage = https://pypi.python.org/pypi/setuptools;

View File

@ -45,7 +45,7 @@ in buildPythonPackage rec {
format = "wheel"; format = "wheel";
src = let src = let
pyVerNoDot = lib.strings.stringAsChars (x: if x == "." then "" else x) "${python.majorVersion}"; pyVerNoDot = lib.strings.stringAsChars (x: if x == "." then "" else x) "${python.pythonVersion}";
pyver = if stdenv.isDarwin then builtins.substring 0 1 pyVerNoDot else pyVerNoDot; pyver = if stdenv.isDarwin then builtins.substring 0 1 pyVerNoDot else pyVerNoDot;
platform = if stdenv.isDarwin then "mac" else "linux"; platform = if stdenv.isDarwin then "mac" else "linux";
unit = if cudaSupport then "gpu" else "cpu"; unit = if cudaSupport then "gpu" else "cpu";

View File

@ -24,8 +24,8 @@ stdenv.mkDerivation rec {
enableParallelBuilding = false; enableParallelBuilding = false;
cmakeFlags = [ cmakeFlags = [
"-DPYTHON_LIBRARY=${python}/lib/libpython${python.majorVersion}m.so" "-DPYTHON_LIBRARY=${python}/lib/lib${python.libPrefix}.so"
"-DPYTHON_INCLUDE_DIR=${python}/include/python${python.majorVersion}m" "-DPYTHON_INCLUDE_DIR=${python}/include/${python.libPrefix}"
"-DCMAKE_VERBOSE_MAKEFILE=True" "-DCMAKE_VERBOSE_MAKEFILE=True"
"-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_BUILD_TYPE=Release"
"-DWITH_PYTHONQT:BOOL=ON" "-DWITH_PYTHONQT:BOOL=ON"

View File

@ -19,7 +19,7 @@ in stdenv.mkDerivation rec {
--replace "\$(LIBTOOL) --mode=install cp _unbound.la" "cp _unbound.la" --replace "\$(LIBTOOL) --mode=install cp _unbound.la" "cp _unbound.la"
''; '';
preConfigure = "export PYTHON_VERSION=${python.majorVersion}"; preConfigure = "export PYTHON_VERSION=${python.pythonVersion}";
configureFlags = [ configureFlags = [
"--with-ssl=${openssl.dev}" "--with-ssl=${openssl.dev}"

View File

@ -7937,6 +7937,7 @@ in
python3 = python37; python3 = python37;
pypy = pypy2; pypy = pypy2;
pypy2 = pypy27; pypy2 = pypy27;
pypy3 = pypy35;
# Python interpreter that is build with all modules, including tkinter. # Python interpreter that is build with all modules, including tkinter.
# These are for compatibility and should not be used inside Nixpkgs. # These are for compatibility and should not be used inside Nixpkgs.
@ -7953,33 +7954,8 @@ in
python2Packages = python2.pkgs; python2Packages = python2.pkgs;
python3Packages = python3.pkgs; python3Packages = python3.pkgs;
python27 = callPackage ../development/interpreters/python/cpython/2.7 { pythonInterpreters = callPackage ./../development/interpreters/python {};
self = python27; inherit (pythonInterpreters) python27 python35 python36 python37 pypy27 pypy35;
inherit (darwin) CF configd;
};
python35 = callPackage ../development/interpreters/python/cpython/3.5 {
inherit (darwin) CF configd;
self = python35;
};
python36 = callPackage ../development/interpreters/python/cpython/3.6 {
inherit (darwin) CF configd;
self = python36;
};
python37 = callPackage ../development/interpreters/python/cpython/3.7 {
inherit (darwin) CF configd;
self = python37;
};
pypy27 = callPackage ../development/interpreters/python/pypy/2.7 {
self = pypy27;
python = python27.override{x11Support=true;};
db = db.override { dbmSupport = true; };
};
pypy3 = callPackage ../development/interpreters/python/pypy/3 {
self = pypy3;
python = python27;
db = db.override { dbmSupport = true; };
};
# Python package sets. # Python package sets.
python27Packages = lib.hiPrioSet (recurseIntoAttrs python27.pkgs); python27Packages = lib.hiPrioSet (recurseIntoAttrs python27.pkgs);

View File

@ -18,16 +18,7 @@ let
packages = ( self: packages = ( self:
let let
pythonAtLeast = versionAtLeast python.pythonVersion; inherit (python.passthru) isPy27 isPy33 isPy34 isPy35 isPy36 isPy37 isPy3k isPyPy pythonAtLeast pythonOlder;
pythonOlder = versionOlder python.pythonVersion;
isPy27 = python.pythonVersion == "2.7";
isPy33 = python.pythonVersion == "3.3";
isPy34 = python.pythonVersion == "3.4";
isPy35 = python.pythonVersion == "3.5";
isPy36 = python.pythonVersion == "3.6";
isPy37 = python.pythonVersion == "3.7";
isPyPy = strings.substring 0 4 python.executable == "pypy";
isPy3k = strings.substring 0 1 python.pythonVersion == "3";
callPackage = pkgs.newScope self; callPackage = pkgs.newScope self;
@ -52,7 +43,6 @@ let
else ff; else ff;
buildPythonPackage = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix { buildPythonPackage = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix {
inherit bootstrapped-pip;
flit = self.flit; flit = self.flit;
# We want Python libraries to be named like e.g. "python3.6-${name}" # We want Python libraries to be named like e.g. "python3.6-${name}"
inherit namePrefix; inherit namePrefix;
@ -60,7 +50,6 @@ let
})); }));
buildPythonApplication = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix { buildPythonApplication = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix {
inherit bootstrapped-pip;
flit = self.flit; flit = self.flit;
namePrefix = ""; namePrefix = "";
toPythonModule = x: x; # Application does not provide modules. toPythonModule = x: x; # Application does not provide modules.
@ -130,7 +119,8 @@ let
in { in {
inherit python bootstrapped-pip pythonAtLeast pythonOlder isPy27 isPy33 isPy34 isPy35 isPy36 isPy37 isPyPy isPy3k buildPythonPackage buildPythonApplication; inherit (python.passthru) isPy27 isPy33 isPy34 isPy35 isPy36 isPy37 isPy3k isPyPy pythonAtLeast pythonOlder;
inherit python bootstrapped-pip buildPythonPackage buildPythonApplication;
inherit fetchPypi callPackage; inherit fetchPypi callPackage;
inherit hasPythonModule requiredPythonModules makePythonPath disabledIf; inherit hasPythonModule requiredPythonModules makePythonPath disabledIf;
inherit toPythonModule toPythonApplication; inherit toPythonModule toPythonApplication;