This commit is contained in:
commit
df07954f74
44
flake.lock
generated
Normal file
44
flake.lock
generated
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1754725699,
|
||||||
|
"narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-old": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1754725699,
|
||||||
|
"narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nixpkgs-old": "nixpkgs-old"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
30
flake.nix
Normal file
30
flake.nix
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
description = "A very basic flake";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||||
|
nixpkgs-old.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
nixpkgs-old,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
forAllSystems =
|
||||||
|
f: nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ] (sys: let pkgs = import nixpkgs {system = sys; overlays = [self.overlays.default];}; in f pkgs);
|
||||||
|
myOverlay =
|
||||||
|
pkgs:
|
||||||
|
import ./overlay.nix {
|
||||||
|
inherit pkgs;
|
||||||
|
oldPkgs = nixpkgs-old.legacyPackages.${pkgs.hostPlatform.system};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
overlays.default = final: _: myOverlay final;
|
||||||
|
|
||||||
|
legacyPackages = forAllSystems (pkgs: myOverlay pkgs);
|
||||||
|
};
|
||||||
|
}
|
||||||
11
importlib.nix
Normal file
11
importlib.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{stdenv, fetchPypi, python26Packages }: python26Packages.buildPythonPackage rec {
|
||||||
|
pname = "importlib";
|
||||||
|
version = "1.0.2";
|
||||||
|
pyproject = true;
|
||||||
|
|
||||||
|
src = fetchPypi {
|
||||||
|
inherit pname version;
|
||||||
|
extension = "tar.gz";
|
||||||
|
hash = "sha256-JNCWaqdoWbKISFgD8xAHZRL4c3fmya/pwoxSqMzdMow=";
|
||||||
|
};
|
||||||
|
}
|
||||||
16
jinja2.nix
Normal file
16
jinja2.nix
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{stdenv, fetchPypi, buildPythonPackage, setuptools }: buildPythonPackage rec {
|
||||||
|
pname = "Jinja2";
|
||||||
|
version = "2.5.2";
|
||||||
|
format = "setuptools";
|
||||||
|
#pyproject = true;
|
||||||
|
|
||||||
|
src = fetchPypi {
|
||||||
|
inherit pname version;
|
||||||
|
extension = "tar.gz";
|
||||||
|
hash = "sha256-GQQPAbOp2MY+TVeTb3hxCQgZm2k3CrRKD3QH3YkfAZs=";
|
||||||
|
};
|
||||||
|
|
||||||
|
propagatedBuildInputs = [setuptools];
|
||||||
|
|
||||||
|
#dependencies = [importlib];
|
||||||
|
}
|
||||||
28
overlay.nix
Normal file
28
overlay.nix
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{ pkgs, oldPkgs }:
|
||||||
|
let
|
||||||
|
bommels = pkgs.lib.makeScope pkgs.newScope (self: rec {
|
||||||
|
# python26 = pkgs.callPackage ./python26/default.nix {
|
||||||
|
# self = python26;
|
||||||
|
# xlibsWrapper = pkgs.xlibsWrapper;
|
||||||
|
# };
|
||||||
|
|
||||||
|
setuptools = self.callPackage ./setuptools.nix { inherit pythonPackages; };
|
||||||
|
#wrapPython = pkgs.callPackage ./python26/wrap-python.nix { python = python26; };
|
||||||
|
#mkPythonDerivation = pkgs.callPackage ./python26/mk-python-derivation.nix { inherit setuptools wrapPython; python = python26; };
|
||||||
|
#bootstrapped-pip = pkgs.callPackage ./python26/bootstrapped-pip.nix { python = python26; };
|
||||||
|
#buildPythonPackage = pkgs.callPackage ./python26/build-python-package.nix { inherit bootstrapped-pip mkPythonDerivation; python = python26; };
|
||||||
|
|
||||||
|
#pip = pkgs.callPackage ./pip.nix { inherit python26 buildPythonPackage; };
|
||||||
|
pythonInterpreters = self.callPackage ./python-interpreters.nix {};
|
||||||
|
inherit (pythonInterpreters) python26;
|
||||||
|
python26Packages = python26.pkgs;
|
||||||
|
pythonPackages = python26Packages;
|
||||||
|
|
||||||
|
#importlib = self.callPackage ./importlib.nix {};
|
||||||
|
some-package = pkgs.callPackage ./some-package.nix { inherit pythonPackages; };
|
||||||
|
});
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit bommels;
|
||||||
|
inherit (bommels) python26;
|
||||||
|
}
|
||||||
37
pip-install-hook.nix
Normal file
37
pip-install-hook.nix
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Setup hook for pip.
|
||||||
|
# shellcheck shell=bash
|
||||||
|
|
||||||
|
echo "Sourcing pip-install-hook"
|
||||||
|
|
||||||
|
pipInstallPhase() {
|
||||||
|
echo "Executing pipInstallPhase"
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
mkdir -p "$out/@pythonSitePackages@"
|
||||||
|
export PYTHONPATH="$out/@pythonSitePackages@:$PYTHONPATH"
|
||||||
|
|
||||||
|
local -a flagsArray=(
|
||||||
|
--no-index
|
||||||
|
--no-warn-script-location
|
||||||
|
--prefix="$out"
|
||||||
|
--no-cache
|
||||||
|
)
|
||||||
|
concatTo flagsArray pipInstallFlags
|
||||||
|
|
||||||
|
echo "Lolol"
|
||||||
|
|
||||||
|
pushd dist || return 1
|
||||||
|
echoCmd 'pip install flags' "${flagsArray[@]}"
|
||||||
|
# @pythonInterpreter@ -m pip install ./*.whl "${flagsArray[@]}"
|
||||||
|
@pip@ install ./*.whl "${flagsArray[@]}"
|
||||||
|
popd || return 1
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
echo "Finished executing pipInstallPhase"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -z "${dontUsePipInstall-}" ] && [ -z "${installPhase-}" ]; then
|
||||||
|
echo "Using pipInstallPhase"
|
||||||
|
installPhase=pipInstallPhase
|
||||||
|
fi
|
||||||
10
pip.nix
Normal file
10
pip.nix
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{stdenv, buildPythonPackage, fetchPypi, python26 }: buildPythonPackage rec {
|
||||||
|
pname = "pip";
|
||||||
|
version = "9.0.3";
|
||||||
|
pyproject = true;
|
||||||
|
|
||||||
|
src = fetchPypi {
|
||||||
|
inherit pname version;
|
||||||
|
hash = "";
|
||||||
|
};
|
||||||
|
}
|
||||||
28
python-imports-check-hook.sh
Normal file
28
python-imports-check-hook.sh
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# shellcheck shell=bash
|
||||||
|
|
||||||
|
# Setup hook for checking whether Python imports succeed
|
||||||
|
echo "Sourcing python-imports-check-hook.sh"
|
||||||
|
|
||||||
|
pythonImportsCheckPhase() {
|
||||||
|
echo "Executing pythonImportsCheckPhase"
|
||||||
|
|
||||||
|
if [[ -n "${pythonImportsCheck[*]-}" ]]; then
|
||||||
|
echo "Check whether the following modules can be imported: ${pythonImportsCheck[*]}"
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
pythonImportsCheckOutput="$out"
|
||||||
|
if [[ -n "${python-}" ]]; then
|
||||||
|
echo "Using python specific output \$python for imports check"
|
||||||
|
pythonImportsCheckOutput=$python
|
||||||
|
fi
|
||||||
|
export PYTHONPATH="$pythonImportsCheckOutput/@pythonSitePackages@:$PYTHONPATH"
|
||||||
|
# Python modules and namespaces names are Python identifiers, which must not contain spaces.
|
||||||
|
# See https://docs.python.org/3/reference/lexical_analysis.html
|
||||||
|
# shellcheck disable=SC2048,SC2086
|
||||||
|
(cd "$pythonImportsCheckOutput" && @pythonCheckInterpreter@ -c 'import sys; import importlib; list(map(lambda mod: importlib.import_module(mod), sys.argv[1:]))' ${pythonImportsCheck[*]})
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ -z "${dontUsePythonImportsCheck-}" ]]; then
|
||||||
|
echo "Using pythonImportsCheckPhase"
|
||||||
|
appendToVar preDistPhases pythonImportsCheckPhase
|
||||||
|
fi
|
||||||
80
python-interpreters.nix
Normal file
80
python-interpreters.nix
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
{
|
||||||
|
__splicedPackages,
|
||||||
|
callPackage,
|
||||||
|
fetchzip,
|
||||||
|
config,
|
||||||
|
db,
|
||||||
|
lib,
|
||||||
|
makeScopeWithSplicing',
|
||||||
|
pythonPackagesExtensions,
|
||||||
|
stdenv,
|
||||||
|
path
|
||||||
|
}@args:
|
||||||
|
|
||||||
|
(
|
||||||
|
let
|
||||||
|
pythonBase = path + "/pkgs/development/interpreters/python";
|
||||||
|
|
||||||
|
# Common passthru for all Python interpreters.
|
||||||
|
passthruFun = import ( pythonBase + "/passthrufun.nix") args;
|
||||||
|
fixupString = s: lib.replaceString "2.7" "2.6" (lib.replaceString "2.7.1" "2.6.9" s);
|
||||||
|
|
||||||
|
pythonRaw = ((callPackage "${pythonBase}/cpython/2.7" {
|
||||||
|
# TODO: splicedPackages again
|
||||||
|
self = __splicedPackages.python26;
|
||||||
|
sourceVersion = {
|
||||||
|
major = "2";
|
||||||
|
minor = "6";
|
||||||
|
patch = "9";
|
||||||
|
suffix = ""; # ActiveState's Python 2 extended support
|
||||||
|
};
|
||||||
|
hash = "sha256-uxXpGJ5rGPb5x0bIg5yqyQmyLKrjIl0LZjgApzsfd3Q=";
|
||||||
|
inherit passthruFun;
|
||||||
|
}).override {
|
||||||
|
rebuildBytecode = false;
|
||||||
|
pythonAttr = "python26";
|
||||||
|
packageOverrides = import ./python-overrides.nix;
|
||||||
|
#packageOverridesss = _: super: {
|
||||||
|
# setupTools = "lol";
|
||||||
|
#};
|
||||||
|
});
|
||||||
|
|
||||||
|
in {
|
||||||
|
|
||||||
|
python26 = pythonRaw.overrideAttrs (prev: {
|
||||||
|
patches = [
|
||||||
|
# Look in C_INCLUDE_PATH and LIBRARY_PATH for stuff.
|
||||||
|
./python26/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.
|
||||||
|
./python26/nix-store-mtime.patch
|
||||||
|
|
||||||
|
# http://bugs.python.org/issue10013
|
||||||
|
./python26/python2.6-fix-parallel-make.patch
|
||||||
|
];
|
||||||
|
postInstall = fixupString prev.postInstall;
|
||||||
|
preConfigure = lib.replaceString "${stdenv.cc.libc}/include/" "${stdenv.cc.libc.dev or stdenv.libc}/include/" prev.preConfigure;
|
||||||
|
});
|
||||||
|
|
||||||
|
pypy27 = callPackage ./pypy {
|
||||||
|
self = __splicedPackages.pypy27;
|
||||||
|
sourceVersion = {
|
||||||
|
major = "7";
|
||||||
|
minor = "3";
|
||||||
|
patch = "19";
|
||||||
|
};
|
||||||
|
|
||||||
|
hash = "sha256-hwPNywH5+Clm3UO2pgGPFAOZ21HrtDwSXB+aIV57sAM=";
|
||||||
|
pythonVersion = "2.7";
|
||||||
|
db = db.override { dbmSupport = !stdenv.hostPlatform.isDarwin; };
|
||||||
|
python = __splicedPackages.pythonInterpreters.pypy27_prebuilt;
|
||||||
|
inherit passthruFun;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// lib.optionalAttrs config.allowAliases {
|
||||||
|
pypy39_prebuilt = throw "pypy 3.9 has been removed, use pypy 3.10 instead"; # Added 2025-01-03
|
||||||
|
}
|
||||||
|
)
|
||||||
40
python-overrides.nix
Normal file
40
python-overrides.nix
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
self: super:
|
||||||
|
|
||||||
|
let
|
||||||
|
pipFunction = {fetchFromGitHub}: rec {version = "9.0.3";src = fetchFromGitHub {owner = "pypa"; repo = "pip"; rev = version; hash = "sha256-ei5ru7kr6m+VJYcYMH8Fjya1eqBqkOaC4+JwDqTd46Q=";};};
|
||||||
|
in
|
||||||
|
with self;
|
||||||
|
with super;
|
||||||
|
rec {
|
||||||
|
bootstrapped-pip = toPythonModule (callPackage ./python26/bootstrapped-pip.nix {});
|
||||||
|
|
||||||
|
pipInstallHookMine = callPackage (
|
||||||
|
{ makePythonHook, pip }:
|
||||||
|
makePythonHook {
|
||||||
|
name = "pip-install-hook";
|
||||||
|
propagatedBuildInputs = [ pip ];
|
||||||
|
substitutions = {
|
||||||
|
inherit pythonInterpreter pythonSitePackages pip;
|
||||||
|
};
|
||||||
|
} ./pip-install-hook.sh
|
||||||
|
) { };
|
||||||
|
pipInstallHook = pipInstallHookMine;
|
||||||
|
pythonImportsCheckHookMine = callPackage (
|
||||||
|
{ makePythonHook }:
|
||||||
|
makePythonHook {
|
||||||
|
name = "python-imports-check-hook";
|
||||||
|
substitutions = {
|
||||||
|
inherit pythonInterpreter pythonSitePackages;
|
||||||
|
};
|
||||||
|
} ./python-imports-check-hook.sh
|
||||||
|
) { };
|
||||||
|
pythonImportsCheckHook = pythonImportsCheckHookMine;
|
||||||
|
|
||||||
|
setuptools = toPythonModule (callPackage ./setuptools.nix { });
|
||||||
|
wheel = callPackage ./python26/wheel.nix { };
|
||||||
|
#pip = pip.overridePythonAttrs (callPackage pipFunction {});
|
||||||
|
|
||||||
|
bommels = {
|
||||||
|
jinja2 = callPackage ./jinja2.nix { };
|
||||||
|
};
|
||||||
|
}
|
||||||
56
python26/bootstrapped-pip.nix
Normal file
56
python26/bootstrapped-pip.nix
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
{ lib, stdenv, python, fetchurl, makeWrapper, unzip }:
|
||||||
|
|
||||||
|
let
|
||||||
|
wheel_source = fetchurl {
|
||||||
|
url = "https://pypi.python.org/packages/py2.py3/w/wheel/wheel-0.29.0-py2.py3-none-any.whl";
|
||||||
|
sha256 = "ea8033fc9905804e652f75474d33410a07404c1a78dd3c949a66863bd1050ebd";
|
||||||
|
};
|
||||||
|
setuptools_source = fetchurl {
|
||||||
|
url = "https://files.pythonhosted.org/packages/b8/cb/b919f52dd81b4b2210d0c5529b6b629a4002e08d49a90183605d1181b10c/setuptools-30.2.0-py2.py3-none-any.whl";
|
||||||
|
sha256 = "b7e7b28d6a728ea38953d66e12ef400c3c153c523539f1b3997c5a42f3770ff1";
|
||||||
|
};
|
||||||
|
argparse_source = fetchurl {
|
||||||
|
url = "https://pypi.python.org/packages/2.7/a/argparse/argparse-1.4.0-py2.py3-none-any.whl";
|
||||||
|
sha256 = "0533cr5w14da8wdb2q4py6aizvbvsdbk3sj7m1jx9lwznvnlf5n3";
|
||||||
|
};
|
||||||
|
in stdenv.mkDerivation rec {
|
||||||
|
name = "${python.libPrefix}-bootstrapped-pip-${version}";
|
||||||
|
version = "9.0.1";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://files.pythonhosted.org/packages/b6/ac/7015eb97dc749283ffdec1c3a88ddb8ae03b8fad0f0e611408f196358da3/pip-9.0.1-py2.py3-none-any.whl";
|
||||||
|
sha256 = "690b762c0a8460c303c089d5d0be034fb15a5ea2b75bdf565f40421f542fefb0";
|
||||||
|
};
|
||||||
|
|
||||||
|
unpackPhase = ''
|
||||||
|
mkdir -p $out/${python.sitePackages}
|
||||||
|
unzip -d $out/${python.sitePackages} $src
|
||||||
|
unzip -d $out/${python.sitePackages} ${setuptools_source}
|
||||||
|
unzip -d $out/${python.sitePackages} ${wheel_source}
|
||||||
|
'' + lib.optionalString (python.isPy26 or true) ''
|
||||||
|
unzip -d $out/${python.sitePackages} ${argparse_source}
|
||||||
|
'';
|
||||||
|
|
||||||
|
|
||||||
|
patchPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildInputs = [ python makeWrapper unzip ];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
# install pip binary
|
||||||
|
echo '#!${python.interpreter}' > $out/bin/pip
|
||||||
|
echo 'import sys;from pip import main' >> $out/bin/pip
|
||||||
|
echo 'sys.exit(main())' >> $out/bin/pip
|
||||||
|
chmod +x $out/bin/pip
|
||||||
|
|
||||||
|
# wrap binaries with PYTHONPATH
|
||||||
|
for f in $out/bin/*; do
|
||||||
|
wrapProgram $f --prefix PYTHONPATH ":" $out/${python.sitePackages}/
|
||||||
|
done
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
}
|
||||||
32
python26/build-python-package-common.nix
Normal file
32
python26/build-python-package-common.nix
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# This function provides generic bits to install a Python wheel.
|
||||||
|
|
||||||
|
{ python
|
||||||
|
, bootstrapped-pip
|
||||||
|
}:
|
||||||
|
|
||||||
|
{ buildInputs ? []
|
||||||
|
# Additional flags to pass to "pip install".
|
||||||
|
, installFlags ? []
|
||||||
|
, ... } @ attrs:
|
||||||
|
|
||||||
|
attrs // {
|
||||||
|
buildInputs = buildInputs ++ [ bootstrapped-pip ];
|
||||||
|
|
||||||
|
configurePhase = attrs.configurePhase or ''
|
||||||
|
runHook preConfigure
|
||||||
|
runHook postConfigure
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = attrs.installPhase or ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
mkdir -p "$out/${python.sitePackages}"
|
||||||
|
export PYTHONPATH="$out/${python.sitePackages}:$PYTHONPATH"
|
||||||
|
|
||||||
|
pushd dist
|
||||||
|
${bootstrapped-pip}/bin/pip install *.whl --no-index --prefix=$out --no-cache ${toString installFlags} --build tmpbuild
|
||||||
|
popd
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
}
|
||||||
56
python26/build-python-package-setuptools.nix
Normal file
56
python26/build-python-package-setuptools.nix
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# This function provides specific bits for building a setuptools-based Python package.
|
||||||
|
|
||||||
|
{ lib
|
||||||
|
, python
|
||||||
|
, bootstrapped-pip
|
||||||
|
}:
|
||||||
|
|
||||||
|
{
|
||||||
|
# passed to "python setup.py build_ext"
|
||||||
|
# https://github.com/pypa/pip/issues/881
|
||||||
|
setupPyBuildFlags ? []
|
||||||
|
# Execute before shell hook
|
||||||
|
, preShellHook ? ""
|
||||||
|
# Execute after shell hook
|
||||||
|
, postShellHook ? ""
|
||||||
|
, ... } @ attrs:
|
||||||
|
|
||||||
|
let
|
||||||
|
# use setuptools shim (so that setuptools is imported before distutils)
|
||||||
|
# pip does the same thing: https://github.com/pypa/pip/pull/3265
|
||||||
|
setuppy = ./run_setup.py;
|
||||||
|
|
||||||
|
in attrs // {
|
||||||
|
# we copy nix_run_setup.py over so it's executed relative to the root of the source
|
||||||
|
# many project make that assumption
|
||||||
|
buildPhase = attrs.buildPhase or ''
|
||||||
|
runHook preBuild
|
||||||
|
cp ${setuppy} nix_run_setup.py
|
||||||
|
${python.interpreter} nix_run_setup.py ${lib.optionalString (setupPyBuildFlags != []) ("build_ext " + (lib.concatStringsSep " " setupPyBuildFlags))} bdist_wheel
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
|
||||||
|
installCheckPhase = attrs.checkPhase or ''
|
||||||
|
runHook preCheck
|
||||||
|
${python.interpreter} nix_run_setup.py test
|
||||||
|
runHook postCheck
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Python packages that are installed with setuptools
|
||||||
|
# are typically distributed with tests.
|
||||||
|
# With Python it's a common idiom to run the tests
|
||||||
|
# after the software has been installed.
|
||||||
|
doCheck = attrs.doCheck or true;
|
||||||
|
|
||||||
|
shellHook = attrs.shellHook or ''
|
||||||
|
${preShellHook}
|
||||||
|
if test -e setup.py; then
|
||||||
|
tmp_path=$(mktemp -d)
|
||||||
|
export PATH="$tmp_path/bin:$PATH"
|
||||||
|
export PYTHONPATH="$tmp_path/${python.sitePackages}:$PYTHONPATH"
|
||||||
|
mkdir -p $tmp_path/${python.sitePackages}
|
||||||
|
${bootstrapped-pip}/bin/pip install -e . --prefix $tmp_path >&2
|
||||||
|
fi
|
||||||
|
${postShellHook}
|
||||||
|
'';
|
||||||
|
}
|
||||||
20
python26/build-python-package-wheel.nix
Normal file
20
python26/build-python-package-wheel.nix
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# This function provides specific bits for building a wheel-based Python package.
|
||||||
|
|
||||||
|
{
|
||||||
|
}:
|
||||||
|
|
||||||
|
{ ... } @ attrs:
|
||||||
|
|
||||||
|
attrs // {
|
||||||
|
unpackPhase = ''
|
||||||
|
mkdir dist
|
||||||
|
cp $src dist/"''${src#*-}"
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Wheels are pre-compiled
|
||||||
|
buildPhase = attrs.buildPhase or ":";
|
||||||
|
installCheckPhase = attrs.checkPhase or ":";
|
||||||
|
|
||||||
|
# Wheels don't have any checks to run
|
||||||
|
doCheck = attrs.doCheck or false;
|
||||||
|
}
|
||||||
34
python26/build-python-package.nix
Normal file
34
python26/build-python-package.nix
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/* This function provides a generic Python package builder. It is
|
||||||
|
intended to work with packages that use `distutils/setuptools'
|
||||||
|
(http://pypi.python.org/pypi/setuptools/), which represents a large
|
||||||
|
number of Python packages nowadays. */
|
||||||
|
|
||||||
|
{ lib
|
||||||
|
, python
|
||||||
|
, mkPythonDerivation
|
||||||
|
, bootstrapped-pip
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
setuptools-specific = import ./build-python-package-setuptools.nix { inherit lib python bootstrapped-pip; };
|
||||||
|
wheel-specific = import ./build-python-package-wheel.nix { };
|
||||||
|
common = import ./build-python-package-common.nix { inherit python bootstrapped-pip; };
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
# Several package formats are supported.
|
||||||
|
# "setuptools" : Install a common setuptools/distutils based package. This builds a wheel.
|
||||||
|
# "wheel" : Install from a pre-compiled wheel.
|
||||||
|
# "flit" : Install a flit package. This builds a wheel.
|
||||||
|
# "other" : Provide your own buildPhase and installPhase.
|
||||||
|
format ? "setuptools"
|
||||||
|
, ... } @ attrs:
|
||||||
|
|
||||||
|
let
|
||||||
|
formatspecific =
|
||||||
|
if format == "setuptools" then common (setuptools-specific attrs)
|
||||||
|
else if format == "wheel" then common (wheel-specific attrs)
|
||||||
|
else if format == "other" then {}
|
||||||
|
else throw "Unsupported format ${format}";
|
||||||
|
|
||||||
|
in mkPythonDerivation ( attrs // formatspecific )
|
||||||
216
python26/default.nix
Normal file
216
python26/default.nix
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
{ lib, stdenv, fetchurl, zlib ? null, zlibSupport ? true, bzip2, includeModules ? false
|
||||||
|
, sqlite, tcl, tk, xlibsWrapper, openssl, readline, db, ncurses, gdbm, self, callPackage
|
||||||
|
/*, python26Packages*/ }:
|
||||||
|
|
||||||
|
assert zlibSupport -> zlib != null;
|
||||||
|
|
||||||
|
let
|
||||||
|
majorVersion = "2.6";
|
||||||
|
version = "${majorVersion}.9";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "http://www.python.org/ftp/python/${version}/Python-${version}.tar.xz";
|
||||||
|
sha256 = "0hbfs2691b60c7arbysbzr0w9528d5pl8a4x7mq5psh6a2cvprya";
|
||||||
|
};
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# http://bugs.python.org/issue10013
|
||||||
|
./python2.6-fix-parallel-make.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
preConfigure = ''
|
||||||
|
# Purity.
|
||||||
|
for i in /usr /sw /opt /pkg; do
|
||||||
|
substituteInPlace ./setup.py --replace $i /no-such-path
|
||||||
|
done
|
||||||
|
'' + lib.optionalString (stdenv ? cc && stdenv.cc.libc != null) ''
|
||||||
|
for i in Lib/plat-*/regen; do
|
||||||
|
substituteInPlace $i --replace /usr/include/ ${stdenv.cc.libc.dev or stdenv.cc.libc}/include/
|
||||||
|
done
|
||||||
|
'' + lib.optionalString stdenv.isCygwin ''
|
||||||
|
# On Cygwin, `make install' tries to read this Makefile.
|
||||||
|
mkdir -p $out/lib/python${majorVersion}/config
|
||||||
|
touch $out/lib/python${majorVersion}/config/Makefile
|
||||||
|
mkdir -p $out/include/python${majorVersion}
|
||||||
|
touch $out/include/python${majorVersion}/pyconfig.h
|
||||||
|
'';
|
||||||
|
|
||||||
|
configureFlags = ["--enable-shared" "--with-threads" "--enable-unicode=ucs4"];
|
||||||
|
|
||||||
|
buildInputs =
|
||||||
|
lib.optional (stdenv ? cc && stdenv.cc.libc != null) stdenv.cc.libc ++
|
||||||
|
[ bzip2 openssl ]++ lib.optionals includeModules [ db openssl ncurses gdbm readline xlibsWrapper tcl tk sqlite ]
|
||||||
|
++ lib.optional zlibSupport zlib;
|
||||||
|
|
||||||
|
mkPaths = paths: {
|
||||||
|
C_INCLUDE_PATH = lib.makeSearchPathOutput "dev" "include" paths;
|
||||||
|
LIBRARY_PATH = lib.makeLibraryPath paths;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Build the basic Python interpreter without modules that have
|
||||||
|
# external dependencies.
|
||||||
|
python = stdenv.mkDerivation {
|
||||||
|
name = "python${if includeModules then "" else "-minimal"}-${version}";
|
||||||
|
pythonVersion = majorVersion;
|
||||||
|
|
||||||
|
inherit majorVersion version src patches buildInputs preConfigure
|
||||||
|
configureFlags;
|
||||||
|
|
||||||
|
inherit (mkPaths buildInputs) C_INCLUDE_PATH LIBRARY_PATH;
|
||||||
|
|
||||||
|
NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-msse2";
|
||||||
|
|
||||||
|
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"
|
||||||
|
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}
|
||||||
|
mv $out/share/man/man1/{python.1,python2.6.1}
|
||||||
|
ln -s $out/share/man/man1/{python2.6.1,python.1}
|
||||||
|
|
||||||
|
#paxmark E $out/bin/python${majorVersion}
|
||||||
|
|
||||||
|
${ lib.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;
|
||||||
|
isPy26 = true;
|
||||||
|
buildEnv = callPackage ./wrapper.nix { python = self; };
|
||||||
|
#withPackages = import ../../with-packages.nix { inherit buildEnv; pythonPackages = python26Packages; };
|
||||||
|
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 = lib.licenses.psfl;
|
||||||
|
platforms = lib.platforms.all;
|
||||||
|
maintainers = with lib.maintainers; [ chaoflow domenkozar ];
|
||||||
|
# If you want to use Python 2.6, remove "broken = true;" at your own
|
||||||
|
# risk. Python 2.6 has known security vulnerabilities is not receiving
|
||||||
|
# security updates as of October 2013.
|
||||||
|
#broken = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# 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 configureFlags;
|
||||||
|
|
||||||
|
buildInputs = [ python ] ++ deps;
|
||||||
|
|
||||||
|
inherit (mkPaths buildInputs) C_INCLUDE_PATH LIBRARY_PATH;
|
||||||
|
|
||||||
|
buildPhase =
|
||||||
|
''
|
||||||
|
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 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
crypt = buildInternalPythonModule {
|
||||||
|
moduleName = "crypt";
|
||||||
|
internalName = "crypt";
|
||||||
|
deps = lib.optional (stdenv ? glibc) stdenv.glibc;
|
||||||
|
};
|
||||||
|
|
||||||
|
curses = buildInternalPythonModule {
|
||||||
|
moduleName = "curses";
|
||||||
|
deps = [ ncurses ];
|
||||||
|
};
|
||||||
|
|
||||||
|
curses_panel = buildInternalPythonModule {
|
||||||
|
moduleName = "curses_panel";
|
||||||
|
deps = [ ncurses modules.curses ];
|
||||||
|
};
|
||||||
|
|
||||||
|
gdbm = buildInternalPythonModule {
|
||||||
|
moduleName = "gdbm";
|
||||||
|
internalName = "gdbm";
|
||||||
|
deps = [ gdbm ];
|
||||||
|
};
|
||||||
|
|
||||||
|
sqlite3 = buildInternalPythonModule {
|
||||||
|
moduleName = "sqlite3";
|
||||||
|
deps = [ sqlite ];
|
||||||
|
};
|
||||||
|
|
||||||
|
tkinter = buildInternalPythonModule {
|
||||||
|
moduleName = "tkinter";
|
||||||
|
deps = [ tcl tk xlibsWrapper ];
|
||||||
|
};
|
||||||
|
|
||||||
|
readline = buildInternalPythonModule {
|
||||||
|
moduleName = "readline";
|
||||||
|
internalName = "readline";
|
||||||
|
deps = [ readline ];
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
in python // { inherit modules; }
|
||||||
102
python26/mk-python-derivation.nix
Normal file
102
python26/mk-python-derivation.nix
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
/* Generic builder for Python packages that come without a setup.py. */
|
||||||
|
|
||||||
|
{ lib
|
||||||
|
, python
|
||||||
|
, wrapPython
|
||||||
|
, setuptools
|
||||||
|
, unzip
|
||||||
|
, ensureNewerSourcesHook
|
||||||
|
}:
|
||||||
|
|
||||||
|
{ name
|
||||||
|
|
||||||
|
# by default prefix `name` e.g. "python3.3-${name}"
|
||||||
|
, namePrefix ? python.libPrefix + "-"
|
||||||
|
|
||||||
|
# Dependencies for building the package
|
||||||
|
, buildInputs ? []
|
||||||
|
|
||||||
|
# Dependencies needed for running the checkPhase.
|
||||||
|
# These are added to buildInputs when doCheck = true.
|
||||||
|
, checkInputs ? []
|
||||||
|
|
||||||
|
# propagate build dependencies so in case we have A -> B -> C,
|
||||||
|
# C can import package A propagated by B
|
||||||
|
, propagatedBuildInputs ? []
|
||||||
|
|
||||||
|
# DEPRECATED: use propagatedBuildInputs
|
||||||
|
, pythonPath ? []
|
||||||
|
|
||||||
|
# used to disable derivation, useful for specific python versions
|
||||||
|
, disabled ? false
|
||||||
|
|
||||||
|
# Raise an error if two packages are installed with the same name
|
||||||
|
, catchConflicts ? true
|
||||||
|
|
||||||
|
# Additional arguments to pass to the makeWrapper function, which wraps
|
||||||
|
# generated binaries.
|
||||||
|
, makeWrapperArgs ? []
|
||||||
|
|
||||||
|
, meta ? {}
|
||||||
|
|
||||||
|
, passthru ? {}
|
||||||
|
|
||||||
|
, doCheck ? false
|
||||||
|
|
||||||
|
, ... } @ attrs:
|
||||||
|
|
||||||
|
|
||||||
|
# Keep extra attributes from `attrs`, e.g., `patchPhase', etc.
|
||||||
|
if disabled
|
||||||
|
then throw "${name} not supported for interpreter ${python.executable}"
|
||||||
|
else
|
||||||
|
|
||||||
|
python.stdenv.mkDerivation (builtins.removeAttrs attrs ["disabled"] // {
|
||||||
|
|
||||||
|
name = namePrefix + name;
|
||||||
|
|
||||||
|
inherit pythonPath;
|
||||||
|
|
||||||
|
|
||||||
|
# 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;
|
||||||
|
|
||||||
|
buildInputs = [ wrapPython ] ++ buildInputs ++ pythonPath
|
||||||
|
++ [ (ensureNewerSourcesHook { year = "1980"; }) ]
|
||||||
|
++ (lib.optional (lib.hasSuffix "zip" attrs.src.name or "") unzip)
|
||||||
|
++ lib.optionals doCheck checkInputs;
|
||||||
|
|
||||||
|
# propagate python/setuptools to active setup-hook in nix-shell
|
||||||
|
propagatedBuildInputs = propagatedBuildInputs ++ [ python setuptools ];
|
||||||
|
|
||||||
|
# Python packages don't have a checkPhase, only an installCheckPhase
|
||||||
|
doCheck = false;
|
||||||
|
doInstallCheck = doCheck;
|
||||||
|
|
||||||
|
postFixup = ''
|
||||||
|
wrapPythonPrograms
|
||||||
|
'' + lib.optionalString catchConflicts ''
|
||||||
|
# check if we have two packages with the same name in closure and fail
|
||||||
|
# this shouldn't happen, something went wrong with dependencies specs
|
||||||
|
${python.interpreter} ${./catch_conflicts.py}
|
||||||
|
'' + attrs.postFixup or '''';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit python; # The python interpreter
|
||||||
|
} // passthru;
|
||||||
|
|
||||||
|
meta = with lib.maintainers; {
|
||||||
|
# default to python's platforms
|
||||||
|
platforms = python.meta.platforms;
|
||||||
|
} // meta // {
|
||||||
|
# add extra maintainer(s) to every package
|
||||||
|
maintainers = (meta.maintainers or []) ++ [ chaoflow domenkozar ];
|
||||||
|
# a marker for release utilities to discover python packages
|
||||||
|
isBuildPythonPackage = python.meta.platforms;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
12
python26/nix-store-mtime.patch
Normal file
12
python26/nix-store-mtime.patch
Normal 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);
|
||||||
37
python26/python2.6-fix-parallel-make.patch
Normal file
37
python26/python2.6-fix-parallel-make.patch
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
diff -up Python-2.7/Makefile.pre.in.fix-parallel-make Python-2.7/Makefile.pre.in
|
||||||
|
--- Python-2.7/Makefile.pre.in.fix-parallel-make 2010-07-22 15:01:39.567996932 -0400
|
||||||
|
+++ Python-2.7/Makefile.pre.in 2010-07-22 15:47:02.437998509 -0400
|
||||||
|
@@ -207,6 +207,7 @@ SIGNAL_OBJS= @SIGNAL_OBJS@
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
# Grammar
|
||||||
|
+GRAMMAR_STAMP= $(srcdir)/grammar-stamp
|
||||||
|
GRAMMAR_H= $(srcdir)/Include/graminit.h
|
||||||
|
GRAMMAR_C= $(srcdir)/Python/graminit.c
|
||||||
|
GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar
|
||||||
|
@@ -530,10 +531,24 @@ Modules/getpath.o: $(srcdir)/Modules/get
|
||||||
|
Modules/python.o: $(srcdir)/Modules/python.c
|
||||||
|
$(MAINCC) -c $(PY_CFLAGS) -o $@ $(srcdir)/Modules/python.c
|
||||||
|
|
||||||
|
+# GNU "make" interprets rules with two dependents as two copies of the rule.
|
||||||
|
+#
|
||||||
|
+# In a parallel build this can lead to pgen being run twice, once for each of
|
||||||
|
+# GRAMMAR_H and GRAMMAR_C, leading to race conditions in which the compiler
|
||||||
|
+# reads a partially-overwritten copy of one of these files, leading to syntax
|
||||||
|
+# errors (or linker errors if the fragment happens to be syntactically valid C)
|
||||||
|
+#
|
||||||
|
+# See http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
|
||||||
|
+# for more information
|
||||||
|
+#
|
||||||
|
+# Introduce ".grammar-stamp" as a contrived single output from PGEN to avoid
|
||||||
|
+# this:
|
||||||
|
+$(GRAMMAR_H) $(GRAMMAR_C): $(GRAMMAR_STAMP)
|
||||||
|
|
||||||
|
-$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
|
||||||
|
+$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
|
||||||
|
-@$(INSTALL) -d Include
|
||||||
|
-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
|
||||||
|
+ touch $(GRAMMAR_STAMP)
|
||||||
|
|
||||||
|
$(PGEN): $(PGENOBJS)
|
||||||
|
$(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
|
||||||
27
python26/search-path.patch
Normal file
27
python26/search-path.patch
Normal 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']
|
||||||
15
python26/setup-hook.sh
Normal file
15
python26/setup-hook.sh
Normal file
@ -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+=(addPythonPath)
|
||||||
44
python26/wheel.nix
Normal file
44
python26/wheel.nix
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{ lib
|
||||||
|
, buildPythonPackage
|
||||||
|
, fetchPypi
|
||||||
|
, jsonschema
|
||||||
|
, bootstrapped-pip
|
||||||
|
, setuptools
|
||||||
|
, fetchFromGitHub
|
||||||
|
}:
|
||||||
|
|
||||||
|
buildPythonPackage rec {
|
||||||
|
pname = "wheel";
|
||||||
|
version = "0.29.0";
|
||||||
|
format = "setuptools";
|
||||||
|
|
||||||
|
#src = fetchPypi {
|
||||||
|
# inherit pname version;
|
||||||
|
# sha256 = "1ebb8ad7e26b448e9caa4773d2357849bf80ff9e313964bcaf79cbf0201a1648";
|
||||||
|
#};
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "pypa";
|
||||||
|
repo = pname;
|
||||||
|
rev = version;
|
||||||
|
name = "${pname}-${version}-source";
|
||||||
|
hash = "sha256-HedK21Lykt1dbq1wIKGlInuEWV4WezjV2Q2YX+0vyO8=";
|
||||||
|
};
|
||||||
|
|
||||||
|
#buildInputs = [ pytest pytestcov coverage ];
|
||||||
|
#nativeBuildInputs = [ bootstrapped-pip setuptools ];
|
||||||
|
|
||||||
|
#catchConflicts = false;
|
||||||
|
|
||||||
|
#doCheck = false;
|
||||||
|
|
||||||
|
#pythonImportsCheck = [ "wheel" ];
|
||||||
|
|
||||||
|
# We add this flag to ignore the copy installed by bootstrapped-pip
|
||||||
|
installFlags = [ "--ignore-installed" ];
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "A built-package format for Python";
|
||||||
|
license = with lib.licenses; [ mit ];
|
||||||
|
homepage = "https://bitbucket.org/pypa/wheel/";
|
||||||
|
};
|
||||||
|
}
|
||||||
51
python26/wrap-python.nix
Normal file
51
python26/wrap-python.nix
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{ lib
|
||||||
|
, python
|
||||||
|
, makeSetupHook
|
||||||
|
, makeWrapper }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
makeSetupHook {
|
||||||
|
deps = makeWrapper;
|
||||||
|
substitutions.libPrefix = python.libPrefix;
|
||||||
|
substitutions.executable = python.interpreter;
|
||||||
|
substitutions.python = python;
|
||||||
|
substitutions.magicalSedExpression = let
|
||||||
|
# Looks weird? Of course, it's between single quoted shell strings.
|
||||||
|
# NOTE: Order DOES matter here, so single character quotes need to be
|
||||||
|
# at the last position.
|
||||||
|
quoteVariants = [ "'\"'''\"'" "\"\"\"" "\"" "'\"'\"'" ]; # hey Vim: ''
|
||||||
|
|
||||||
|
mkStringSkipper = labelNum: quote: let
|
||||||
|
label = "q${toString labelNum}";
|
||||||
|
isSingle = elem quote [ "\"" "'\"'\"'" ];
|
||||||
|
endQuote = if isSingle then "[^\\\\]${quote}" else quote;
|
||||||
|
in ''
|
||||||
|
/^[a-z]?${quote}/ {
|
||||||
|
/${quote}${quote}|${quote}.*${endQuote}/{n;br}
|
||||||
|
:${label}; n; /^${quote}/{n;br}; /${endQuote}/{n;br}; b${label}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
# This preamble does two things:
|
||||||
|
# * Sets argv[0] to the original application's name; otherwise it would be .foo-wrapped.
|
||||||
|
# Python doesn't support `exec -a`.
|
||||||
|
# * Adds all required libraries to sys.path via `site.addsitedir`. It also handles *.pth files.
|
||||||
|
preamble = ''
|
||||||
|
import sys
|
||||||
|
import site
|
||||||
|
import functools
|
||||||
|
sys.argv[0] = '"'$(readlink -f "$f")'"'
|
||||||
|
functools.reduce(lambda k, p: site.addsitedir(p, k), ['"$([ -n "$program_PYTHONPATH" ] && (echo "'$program_PYTHONPATH'" | sed "s|:|','|g") || true)"'], site._init_pathinfo())
|
||||||
|
'';
|
||||||
|
|
||||||
|
in ''
|
||||||
|
1 {
|
||||||
|
:r
|
||||||
|
/\\$|,$/{N;br}
|
||||||
|
/__future__|^ |^ *(#.*)?$/{n;br}
|
||||||
|
${concatImapStrings mkStringSkipper quoteVariants}
|
||||||
|
/^[^# ]/i ${replaceStrings ["\n"] [";"] preamble}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
} ./wrap.sh
|
||||||
54
python26/wrapper.nix
Normal file
54
python26/wrapper.nix
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{ stdenv, python, buildEnv, makeWrapper
|
||||||
|
, extraLibs ? []
|
||||||
|
, postBuild ? ""
|
||||||
|
, ignoreCollisions ? false }:
|
||||||
|
|
||||||
|
# Create a python executable that knows about additional packages.
|
||||||
|
let
|
||||||
|
recursivePthLoader = import ../../python-modules/recursive-pth-loader/default.nix { stdenv = stdenv; python = python; };
|
||||||
|
env = (
|
||||||
|
let
|
||||||
|
paths = stdenv.lib.filter (x : x ? pythonPath) (stdenv.lib.closePropagation extraLibs) ++ [ python recursivePthLoader ];
|
||||||
|
in buildEnv {
|
||||||
|
name = "${python.name}-env";
|
||||||
|
|
||||||
|
inherit paths;
|
||||||
|
inherit ignoreCollisions;
|
||||||
|
|
||||||
|
postBuild = ''
|
||||||
|
. "${makeWrapper}/nix-support/setup-hook"
|
||||||
|
|
||||||
|
if [ -L "$out/bin" ]; then
|
||||||
|
unlink "$out/bin"
|
||||||
|
fi
|
||||||
|
mkdir -p "$out/bin"
|
||||||
|
|
||||||
|
for path in ${stdenv.lib.concatStringsSep " " paths}; do
|
||||||
|
if [ -d "$path/bin" ]; then
|
||||||
|
cd "$path/bin"
|
||||||
|
for prg in *; do
|
||||||
|
if [ -f "$prg" ]; then
|
||||||
|
rm -f "$out/bin/$prg"
|
||||||
|
makeWrapper "$path/bin/$prg" "$out/bin/$prg" --set PYTHONHOME "$out"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
'' + postBuild;
|
||||||
|
|
||||||
|
passthru.env = stdenv.mkDerivation {
|
||||||
|
name = "interactive-${python.name}-environment";
|
||||||
|
nativeBuildInputs = [ env ];
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
echo >&2 ""
|
||||||
|
echo >&2 "*** Python 'env' attributes are intended for interactive nix-shell sessions, not for building! ***"
|
||||||
|
echo >&2 ""
|
||||||
|
exit 1
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}) // {
|
||||||
|
inherit python;
|
||||||
|
inherit (python) meta;
|
||||||
|
};
|
||||||
|
in env
|
||||||
1
result
Symbolic link
1
result
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
/nix/store/b5d52gx1g9lwihsqgkdgm606nb1hni57-python2.6-wheel-0.29.0
|
||||||
40
setuptools.nix
Normal file
40
setuptools.nix
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{ lib,
|
||||||
|
stdenv
|
||||||
|
, fetchPypi
|
||||||
|
, python
|
||||||
|
, wrapPython
|
||||||
|
, unzip
|
||||||
|
}:
|
||||||
|
|
||||||
|
# Should use buildPythonPackage here somehow
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "setuptools";
|
||||||
|
version = "36.8.0";
|
||||||
|
name = "${python.libPrefix}-${pname}-${version}";
|
||||||
|
|
||||||
|
src = fetchPypi {
|
||||||
|
inherit pname version;
|
||||||
|
extension = "zip";
|
||||||
|
hash = "sha256-sqpaAOnk/SDzw91BLUkJIXRu/hS9o01TlzxKWasFs10=";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = [ python wrapPython unzip ];
|
||||||
|
doCheck = false; # requires pytest
|
||||||
|
installPhase = ''
|
||||||
|
dst=$out/${python.sitePackages}
|
||||||
|
mkdir -p $dst
|
||||||
|
export PYTHONPATH="$dst:$PYTHONPATH"
|
||||||
|
${python.interpreter} setup.py install --prefix=$out
|
||||||
|
wrapPythonPrograms
|
||||||
|
'';
|
||||||
|
|
||||||
|
pythonPath = [];
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Utilities to facilitate the installation of Python packages";
|
||||||
|
homepage = http://pypi.python.org/pypi/setuptools;
|
||||||
|
license = with licenses; [ psfl zpl20 ];
|
||||||
|
platforms = platforms.all;
|
||||||
|
priority = 10;
|
||||||
|
};
|
||||||
|
}
|
||||||
8
some-package.nix
Normal file
8
some-package.nix
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{stdenv, path }: stdenv.mkDerivation {
|
||||||
|
pname = "abc";
|
||||||
|
version = "0.1.0";
|
||||||
|
#src = ./some-package.nix;
|
||||||
|
builder = ''
|
||||||
|
'';
|
||||||
|
PATH_TEST=path;
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user