From 5db8407d8ca7a023dc2253c5a72ac0b0ed53733c Mon Sep 17 00:00:00 2001 From: Julian Kuners Date: Fri, 3 Oct 2025 18:15:16 +0100 Subject: [PATCH 1/2] add pyproject-nix overlay --- flake.nix | 25 +++++++++++---- nix/kontrol-pyk-pyproject/default.nix | 45 ++++++++++++++++++++++++++ nix/kontrol-pyk/default.nix | 46 ++++----------------------- nix/kontrol/default.nix | 23 +++++++++++--- 4 files changed, 89 insertions(+), 50 deletions(-) create mode 100644 nix/kontrol-pyk-pyproject/default.nix diff --git a/flake.nix b/flake.nix index cb09fbea6..6827af447 100644 --- a/flake.nix +++ b/flake.nix @@ -70,8 +70,15 @@ }; kontrolOverlay = final: prev: let + kontrol-pyk-pyproject = final.callPackage ./nix/kontrol-pyk-pyproject { + inherit uv2nix; + }; kontrol-pyk = final.callPackage ./nix/kontrol-pyk { - inherit pyproject-nix pyproject-build-systems uv2nix; + inherit pyproject-nix pyproject-build-systems kontrol-pyk-pyproject; + pyproject-overlays = [ + (k-framework.overlays.pyk-pyproject system) + (kevm.overlays.pyk-pyproject system) + ]; python = final."python${pythonVer}"; }; kontrol = final.callPackage ./nix/kontrol { @@ -79,7 +86,7 @@ rev = self.rev or null; }; in { - inherit kontrol; + inherit kontrol kontrol-pyk-pyproject; }; solcMkDefaultOverlay = final: prev: { solcMkDefault = solc.mkDefault; @@ -148,13 +155,19 @@ ''; }; packages = rec { - kontrol = pkgs.kontrol; - uv = pkgs.uv; + inherit (pkgs) kontrol uv kontrol-pyk kontrol-pyk-pyproject; default = kontrol; }; }) // { - overlays.default = final: prev: { - inherit (self.packages.${final.system}) kontrol; + overlays = { + default = final: prev: { + inherit (self.packages.${final.system}) kontrol; + }; + # this pyproject-nix overlay allows for overriding the python packages that are otherwise locked in `uv.lock` + # by using this overlay in dependant nix flakes, you ensure that nix overrides also override the python package + pyk-pyproject = system: final: prev: { + inherit (self.packages.${system}.kontrol-pyk-pyproject.lockFileOverlay final prev) kontrol-pyk; + }; }; }; } diff --git a/nix/kontrol-pyk-pyproject/default.nix b/nix/kontrol-pyk-pyproject/default.nix new file mode 100644 index 000000000..d828bc3c9 --- /dev/null +++ b/nix/kontrol-pyk-pyproject/default.nix @@ -0,0 +1,45 @@ +{ + lib, + callPackage, + nix-gitignore, + stdenvNoCC, + + uv2nix, + solc_version ? null, +}: +let + # patches cannot yet be applied to uv workspaces, so we use a derivation containing the src instead + src = stdenvNoCC.mkDerivation { + name = "kontrol-pyk-src"; + src = callPackage ../kontrol-source { }; + + dontConfigure = true; + dontBuild = true; + + postPatch = '' + ${lib.strings.optionalString (solc_version != null) '' + substituteInPlace ./src/kontrol/foundry.py \ + --replace "'forge', 'build'," "'forge', 'build', '--no-auto-detect'," + ''} + ''; + + installPhase = '' + mkdir -p $out + cp -r . $out/ + ''; + }; + + # load a uv workspace from a workspace root + workspace = uv2nix.lib.workspace.loadWorkspace { + workspaceRoot = "${src}"; + }; + + # create overlay + lockFileOverlay = workspace.mkPyprojectOverlay { + # prefer "wheel" over "sdist" due to maintance overhead + # there is no bundled set of overlays for "sdist" in uv2nix, in contrast to poetry2nix + sourcePreference = "wheel"; + }; +in { + inherit lockFileOverlay workspace; +} diff --git a/nix/kontrol-pyk/default.nix b/nix/kontrol-pyk/default.nix index 23f48a60a..4fa568417 100644 --- a/nix/kontrol-pyk/default.nix +++ b/nix/kontrol-pyk/default.nix @@ -1,65 +1,33 @@ { lib, callPackage, - stdenvNoCC, pyproject-nix, pyproject-build-systems, - uv2nix, + kontrol-pyk-pyproject, + pyproject-overlays ? [ ], - python, - solc_version ? null + python }: let + inherit (kontrol-pyk-pyproject) lockFileOverlay workspace; + pyproject-util = callPackage pyproject-nix.build.util {}; pyproject-packages = callPackage pyproject-nix.build.packages { inherit python; }; - # patches cannot yet be applied to uv workspaces, so we use a derivation containing the src instead - src = stdenvNoCC.mkDerivation { - name = "kontrol-pyk-src"; - src = callPackage ../kontrol-source { }; - - dontConfigure = true; - dontBuild = true; - - postPatch = '' - ${lib.strings.optionalString (solc_version != null) '' - substituteInPlace ./src/kontrol/foundry.py \ - --replace "'forge', 'build'," "'forge', 'build', '--no-auto-detect'," - ''} - ''; - - installPhase = '' - mkdir -p $out - cp -r . $out/ - ''; - }; - - # load a uv workspace from a workspace root - workspace = uv2nix.lib.workspace.loadWorkspace { - workspaceRoot = "${src}"; - }; - - # create overlay - lockFileOverlay = workspace.mkPyprojectOverlay { - # prefer "wheel" over "sdist" due to maintance overhead - # there is no bundled set of overlays for "sdist" in uv2nix, in contrast to poetry2nix - sourcePreference = "wheel"; - }; - buildSystemsOverlay = import ./build-systems-overlay.nix; # construct package set - pythonSet = pyproject-packages.overrideScope (lib.composeManyExtensions [ + pythonSet = pyproject-packages.overrideScope (lib.composeManyExtensions ([ # make build tools available by default as these are not necessarily specified in python lock files pyproject-build-systems.overlays.default # include all packages from the python lock file lockFileOverlay # add build system overrides to certain python packages buildSystemsOverlay - ]); + ] ++ pyproject-overlays)); in pyproject-util.mkApplication { # default dependancy group enables no optional dependencies and no dependency-groups venv = pythonSet.mkVirtualEnv "kontrol-pyk-env" workspace.deps.default; diff --git a/nix/kontrol/default.nix b/nix/kontrol/default.nix index fa29a3de9..17bf23a25 100644 --- a/nix/kontrol/default.nix +++ b/nix/kontrol/default.nix @@ -31,7 +31,9 @@ rev ? null } @ args: let - kontrol-pyk-solc = kontrol-pyk.override { inherit solc_version; }; + kontrol-pyk-solc = kontrol-pyk.override ( oldArgs: { + kontrol-pyk-pyproject = oldArgs.kontrol-pyk-pyproject.override { inherit solc_version; }; + }); nixLibs = "-I${openssl.dev}/include -L${openssl.out}/lib -I${secp256k1}/include -L${secp256k1}/lib"; in stdenv.mkDerivation { @@ -84,10 +86,21 @@ stdenv.mkDerivation { } --set NIX_LIBS "${nixLibs}" --set KDIST_DIR $out ''; - passthru = if solc_version == null then { + passthru = if solc_version == null then + let + kontrol-pyk-with-solc = new_solc_version: kontrol-pyk.override ( oldArgs: { + kontrol-pyk-pyproject = oldArgs.kontrol-pyk-pyproject.override { solc_version = new_solc_version; }; + }); + in { # list all supported solc versions here - solc_0_8_13 = callPackage ./default.nix (args // { solc_version = solc_0_8_13; }); - solc_0_8_15 = callPackage ./default.nix (args // { solc_version = solc_0_8_15; }); - solc_0_8_22 = callPackage ./default.nix (args // { solc_version = solc_0_8_22; }); + solc_0_8_13 = callPackage ./default.nix (args // { + kontrol-pyk = kontrol-pyk-with-solc solc_0_8_13; + }); + solc_0_8_15 = callPackage ./default.nix (args // { + kontrol-pyk = kontrol-pyk-with-solc solc_0_8_15; + }); + solc_0_8_22 = callPackage ./default.nix (args // { + kontrol-pyk = kontrol-pyk-with-solc solc_0_8_22; + }); } else { }; } \ No newline at end of file From f925ae1fc694710696d7ac3ca0e70463eab71a95 Mon Sep 17 00:00:00 2001 From: Julian Kuners Date: Mon, 20 Oct 2025 20:21:33 +0200 Subject: [PATCH 2/2] fix solc override in nix derivation passthroughs --- nix/kontrol/default.nix | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/nix/kontrol/default.nix b/nix/kontrol/default.nix index 17bf23a25..edd2cdc29 100644 --- a/nix/kontrol/default.nix +++ b/nix/kontrol/default.nix @@ -86,21 +86,16 @@ stdenv.mkDerivation { } --set NIX_LIBS "${nixLibs}" --set KDIST_DIR $out ''; - passthru = if solc_version == null then - let - kontrol-pyk-with-solc = new_solc_version: kontrol-pyk.override ( oldArgs: { - kontrol-pyk-pyproject = oldArgs.kontrol-pyk-pyproject.override { solc_version = new_solc_version; }; - }); - in { + passthru = if solc_version == null then { # list all supported solc versions here solc_0_8_13 = callPackage ./default.nix (args // { - kontrol-pyk = kontrol-pyk-with-solc solc_0_8_13; + solc_version = solc_0_8_13; }); solc_0_8_15 = callPackage ./default.nix (args // { - kontrol-pyk = kontrol-pyk-with-solc solc_0_8_15; + solc_version = solc_0_8_15; }); solc_0_8_22 = callPackage ./default.nix (args // { - kontrol-pyk = kontrol-pyk-with-solc solc_0_8_22; + solc_version = solc_0_8_22; }); } else { }; } \ No newline at end of file