From 7017c8c5f91b6f54b09e842b1b92ed377a8d4061 Mon Sep 17 00:00:00 2001 From: arcnmx Date: Thu, 13 Jun 2024 14:59:35 -0700 Subject: [PATCH] chore(overlays): trivial builder wrappers --- nixos/base/nixpkgs.nix | 43 ++++++++++++++++++++++-- outputs.nix | 26 +++++++++------ overlays/builders.nix | 76 ++++++++++++++++++++++++++++++++++++++++++ overlays/default.nix | 2 ++ 4 files changed, 134 insertions(+), 13 deletions(-) create mode 100644 overlays/builders.nix diff --git a/nixos/base/nixpkgs.nix b/nixos/base/nixpkgs.nix index 4db103a0..ad305c83 100644 --- a/nixos/base/nixpkgs.nix +++ b/nixos/base/nixpkgs.nix @@ -1,7 +1,32 @@ -{gensokyo-zone, ...}: let +{ + config, + system, + gensokyo-zone, + lib, + ... +}: let + inherit (gensokyo-zone.lib) mkAlmostForce; + inherit (lib.options) mkOption; + inherit (lib.modules) mkIf mkDefault; + inherit (lib.attrsets) optionalAttrs; inherit (gensokyo-zone.self) overlays; + cfg = config.nixpkgs; + hostPlatform = lib.systems.elaborate { + inherit (system) system; + }; in { - nixpkgs = { + options.nixpkgs = with lib.types; { + usePkgs = mkOption { + type = enum ["legacyPackages.pkgs" "import" "nixos"]; + description = "gensokyo-zone#legacyPackages.pkgs"; + default = + if cfg.buildPlatform == cfg.hostPlatform && cfg.hostPlatform == hostPlatform && gensokyo-zone.self ? legacyPackages.${cfg.hostPlatform.system}.pkgs + then "legacyPackages.pkgs" + else "import"; + }; + }; + config.nixpkgs = { + hostPlatform = mkDefault hostPlatform; overlays = [ gensokyo-zone.inputs.arcexprs.overlays.default overlays.default @@ -13,4 +38,18 @@ in { ]; }; }; + config._module.args.pkgs = let + pkgsArgs = { + inherit (cfg) config overlays; + localSystem = cfg.buildPlatform; + }; + pkgsCrossArgs = optionalAttrs (cfg.buildPlatform != cfg.hostPlatform) { + crossSystem = cfg.hostPlatform; + }; + pkgs = { + "legacyPackages.pkgs" = gensokyo-zone.self.legacyPackages.${cfg.hostPlatform.system}.pkgs; + import = import gensokyo-zone.inputs.nixpkgs (pkgsArgs // pkgsCrossArgs); + }; + in + mkIf (cfg.usePkgs != "nixos") (mkAlmostForce pkgs.${cfg.usePkgs}.__withSubBuilders); } diff --git a/outputs.nix b/outputs.nix index c35d0500..05305381 100644 --- a/outputs.nix +++ b/outputs.nix @@ -14,18 +14,22 @@ devShells = import ./devShells.nix {inherit system inputs;}; packages = import ./packages {inherit system inputs;}; legacyPackages = { - pkgs = import inputs.nixpkgs { - inherit system; - overlays = [ - inputs.self.overlays.default - inputs.self.overlays.deploy-rs - inputs.self.overlays.systemd2mqtt - inputs.self.overlays.arc - ]; - config = { - allowUnfree = true; + pkgs = let + pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ + inputs.self.overlays.default + inputs.self.overlays.deploy-rs + inputs.self.overlays.systemd2mqtt + inputs.self.overlays.arc + ]; + config = { + allowUnfree = true; + }; }; - }; + # see overlays/builders.nix + in + pkgs.__withSubBuilders; patchedNixpkgs = pkgs.applyPatches { name = "nixpkgs"; src = inputs.nixpkgs; diff --git a/overlays/builders.nix b/overlays/builders.nix new file mode 100644 index 00000000..9edd7e86 --- /dev/null +++ b/overlays/builders.nix @@ -0,0 +1,76 @@ +final: prev: let + inherit (final.lib.attrsets) mapAttrs' nameValuePair; + subBuilders = { + applyPatches = args: + prev.applyPatches ({ + allowSubstitutes = true; + } + // args); + writeTextFile = args: + prev.writeTextFile ({ + allowSubstitutes = true; + } + // args); + writeText = name: text: final.writeTextFile' {inherit name text;}; + writeShellScript = name: text: + final.writeTextFile' { + inherit name; + executable = true; + text = '' + #!${final.runtimeShell} + ${text} + ''; + checkPhase = '' + ${final.stdenv.shellDryRun} "$target" + ''; + }; + writeShellScriptBin = name: text: + final.writeTextFile' { + inherit name; + destination = "/bin/${name}"; + executable = true; + text = '' + #!${final.runtimeShell} + ${text} + ''; + checkPhase = '' + ${final.stdenv.shellDryRun} "$target" + ''; + }; + symlinkJoin = args: + prev.symlinkJoin ({ + allowSubstitutes = true; + } + // args); + linkFarm = name: entries: + (prev.linkFarm name entries).overrideAttrs (_: { + allowSubstitutes = true; + }); + runCommandLocal = name: env: + final.runCommandWith { + stdenv = final.stdenvNoCC; + runLocal = true; + inherit name; + derivationArgs = + { + allowSubstitutes = true; + } + // env; + }; + # TODO: writeScript, writeScriptBin, runCommandWith... + }; + subBuilders' = mapAttrs' (name: nameValuePair "${name}'") subBuilders; +in { + inherit + (subBuilders') + applyPatches' + writeTextFile' + writeText' + writeShellScript' + writeShellScriptBin' + symlinkJoin' + linkFarm' + runCommandLocal' + ; + __withSubBuilders = final // subBuilders; +} diff --git a/overlays/default.nix b/overlays/default.nix index fd6bac54..bb69231e 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -3,6 +3,7 @@ in rec { default = nixlib.composeManyExtensions [ barcodebuddy + builders krb5 minecraft nfs @@ -17,6 +18,7 @@ in rec { nginx = import ./nginx.nix; samba = import ./samba.nix; openwebrx = import ./openwebrxplus.nix; + builders = import ./builders.nix; deploy-rs = inputs.deploy-rs.overlays.default or inputs.deploy-rs.overlay; systemd2mqtt = inputs.systemd2mqtt.overlays.default; arc = inputs.arcexprs.overlays.default;