|
101 | 101 | ; |
102 | 102 | }; |
103 | 103 |
|
104 | | - finalPkgs = if opt.pkgs.isDefined then cfg.pkgs.appendOverlays cfg.overlays else defaultPkgs; |
| 104 | + overlayedPkgs = if opt.pkgs.isDefined then cfg.pkgs.appendOverlays cfg.overlays else defaultPkgs; |
| 105 | + splicedPackages = overlayedPkgs.__splicedPackages; |
105 | 106 |
|
| 107 | + finalPkgs = if (cfg.scopedOverlays or [ ]) == [ ] then splicedPackages else |
| 108 | + let |
| 109 | + # cribbed of lib.makeScope |
| 110 | + withScope = base: extension: |
| 111 | + let |
| 112 | + self = packages self // scope; |
| 113 | + packages = self: extension self base; |
| 114 | + scope = { |
| 115 | + inherit extension packages; |
| 116 | + |
| 117 | + newScope = scope: base.newScope (self // scope); |
| 118 | + |
| 119 | + callPackage = self.newScope {}; |
| 120 | + callPackages = base.callPackagesWith self; |
| 121 | + callPackageWith = autoArgs: base.callPackageWith (self // autoArgs); |
| 122 | + callPackagesWith = autoArgs: base.callPackagesWith (self // autoArgs); |
| 123 | + |
| 124 | + appendOverlays = fs: withScope (base.appendOverlays fs) extension; |
| 125 | + extend = f: self.appendOverlays [f]; |
| 126 | + |
| 127 | + overrideScope = f: lib.makeScope base.newScope (lib.extends f packages); |
| 128 | + appendOverlaysToScope = fs: withScope base (lib.composeManyExtensions ([extension] ++ fs)); |
| 129 | + extendScope = f: self.appendOverlaysToScope [f]; |
| 130 | + }; |
| 131 | + in base // self; |
| 132 | + in |
| 133 | + withScope splicedPackages (lib.composeManyExtensions cfg.scopedOverlays); |
106 | 134 | in |
107 | 135 |
|
108 | 136 | { |
|
194 | 222 | ''; |
195 | 223 | }; |
196 | 224 |
|
| 225 | + scopedOverlays = lib.mkOption { |
| 226 | + default = []; |
| 227 | + example = lib.literalExpression |
| 228 | + '' |
| 229 | + [ |
| 230 | + (self: super: { |
| 231 | + # Log commands run in builds of configuration files |
| 232 | + runCommand = name: args: text: super.runCommand name args ''' |
| 233 | + set +x |
| 234 | + ''${text} |
| 235 | + '''; |
| 236 | + ] |
| 237 | + ''; |
| 238 | + type = lib.types.listOf overlayType; |
| 239 | + description = '' |
| 240 | + List of overlays to apply in a new scope after `nixpkgs.overlays` is applied accessed trough the `pgks` module argument. |
| 241 | + ''; |
| 242 | + }; |
| 243 | + |
197 | 244 | hostPlatform = lib.mkOption { |
198 | 245 | type = lib.types.either lib.types.str lib.types.attrs; # TODO utilize lib.systems.parsedPlatform |
199 | 246 | example = { |
|
356 | 403 | # which is somewhat costly for Nixpkgs. With an explicit priority, we only |
357 | 404 | # evaluate the wrapper to find out that the priority is lower, and then we |
358 | 405 | # don't need to evaluate `finalPkgs`. |
359 | | - lib.mkOverride lib.modules.defaultOverridePriority finalPkgs.__splicedPackages; |
| 406 | + lib.mkOverride lib.modules.defaultOverridePriority finalPkgs; |
360 | 407 | }; |
361 | 408 |
|
362 | 409 | assertions = |
|
0 commit comments