diff --git a/flake.nix b/flake.nix index 0bc3d0109..10de35dae 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..d5f6afaef --- /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 maintenance 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..edd2cdc29 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 { @@ -86,8 +88,14 @@ stdenv.mkDerivation { passthru = if solc_version == null then { # 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 // { + 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; + }); } else { }; } \ No newline at end of file