From a76d0f23d837022b424c7ab38c2601b23a8d2da5 Mon Sep 17 00:00:00 2001 From: Mykola Orliuk Date: Thu, 13 Nov 2025 21:58:15 +0100 Subject: [PATCH] python3Packages.amazon-ion: include c_ext module This should bring 60x speed up in parsing text Ion. Resolves #461284 --- .../python-modules/amazon-ion/default.nix | 56 ++++++++++++++++++- pkgs/top-level/python-packages.nix | 2 +- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/pkgs/development/python-modules/amazon-ion/default.nix b/pkgs/development/python-modules/amazon-ion/default.nix index 0d4a9bd1578b..6198971bfa5b 100644 --- a/pkgs/development/python-modules/amazon-ion/default.nix +++ b/pkgs/development/python-modules/amazon-ion/default.nix @@ -4,12 +4,14 @@ cbor2, docopt, fetchFromGitHub, + fetchpatch2, jsonconversion, pytestCheckHook, pytest_7, setuptools, six, tabulate, + cmake, }: buildPythonPackage rec { @@ -23,15 +25,60 @@ buildPythonPackage rec { tag = "v${version}"; # Test vectors require git submodule fetchSubmodules = true; - hash = "sha256-ZnslVmXE2YvTAkpfw2lbpB+uF85n/CvA22htO/Y7yWk="; + leaveDotGit = true; # During ion-c submodule build git history/hash used to infer version + postFetch = '' + # Generated file should match output of command in ion-c/cmake/VersionHeader.cmake + # Run Git before creating any files to avoid triggering false dirty suffix. + (cd "$out/ion-c" && v="$(git describe --long --tags --dirty --match "v*")" && echo -n "$v" > .nixpkgs-patching-IONC_FULL_VERSION.txt) + + # Based on https://github.com/NixOS/nixpkgs/blob/183125f9/pkgs/build-support/fetchgit/nix-prefetch-git#L358 + find "$out" -name .git -exec rm -rf '{}' '+' + ''; + hash = "sha256-VBbxGXPAwS3jwEsm64yEKqJKVKGvPStboLjHoRcoonE="; }; + patches = [ + # backport changes that adapt code to more strict compilers + (fetchpatch2 { + name = "46aebb0-Address-incompatible-pointer-errors.patch"; + url = "https://github.com/amazon-ion/ion-c/commit/46aebb0b650a4cf61425ef1a8e78e2443023e853.patch?full_index=1"; + hash = "sha256-5qzSbZV9Oe5soJzkyCtVtWejedLEjAz7yuVotATPmbs="; + stripLen = 1; + extraPrefix = "ion-c/"; + }) + ]; + postPatch = '' substituteInPlace setup.py \ --replace "'pytest-runner'," "" + + # Ion C building is in _download_ion_c() which will try to remove sources and re-download + substituteInPlace install.py \ + --replace-fail "isdir(_CURRENT_ION_C_DIR)" "False" + substituteInPlace install.py \ + --replace-fail "check_call(['git'" "check_call(['true'" + + # Ion-C infers version based on Git. But there are issues with making .git folders deterministic. + # See https://github.com/NixOS/nixpkgs/issues/8567 + # Hence, we'll inject version ourselves + substituteInPlace ion-c/cmake/VersionHeader.cmake \ + --replace-fail 'set(IONC_FULL_VERSION "''${CMAKE_PROJECT_VERSION}")' \ + "set(IONC_FULL_VERSION \"$(cat ion-c/.nixpkgs-patching-IONC_FULL_VERSION.txt)\")" ''; - build-system = [ setuptools ]; + build-system = [ + setuptools + ]; + + dontUseCmakeConfigure = true; # CMake invoked by install.py + + # Can't use cmakeFlags since we do not control invocation of cmake. + # But build-release.sh in ion-c is sensitive to this env variable. + env.CMAKE_FLAGS = "-DCMAKE_SKIP_BUILD_RPATH=ON"; + + nativeBuildInputs = [ + cmake + ]; dependencies = [ jsonconversion @@ -55,7 +102,10 @@ buildPythonPackage rec { "tests/test_benchmark_cli.py" ]; - pythonImportsCheck = [ "amazon.ion" ]; + pythonImportsCheck = [ + "amazon.ion" + "amazon.ion.ionc" # C extension module for speedup + ]; meta = with lib; { description = "Python implementation of Amazon Ion"; diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index eb44f2fd32d3..a0a644fbf022 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -656,7 +656,7 @@ self: super: with self; { amarna = callPackage ../development/python-modules/amarna { }; - amazon-ion = callPackage ../development/python-modules/amazon-ion { }; + amazon-ion = callPackage ../development/python-modules/amazon-ion { inherit (pkgs) cmake; }; amberelectric = callPackage ../development/python-modules/amberelectric { };