robotnix icon indicating copy to clipboard operation
robotnix copied to clipboard

"stack overflow; max-call-depth exceeded" when building generateKeysScript

Open CyberShadow opened this issue 1 year ago • 4 comments

$ cat ../in2023.nix      
{
  device = "instantnoodlep";
  flavor = "lineageos";
}

$ nix-build --arg configuration ../in2023.nix -A generateKeysScript -o generate-keys --show-trace
error:
       … while calling the 'derivationStrict' builtin
         at <nix/derivation-internal.nix>:9:12:
            8|
            9|   strict = derivationStrict drvAttrs;
             |            ^
           10|

       … while evaluating derivation 'generate_keys.sh'
         whose name attribute is located at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/pkgs/stdenv/generic/make-derivation.nix:205:7

       … while evaluating attribute 'text' of derivation 'generate_keys.sh'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/pkgs/build-support/trivial-builders.nix:117:16:
          116|     runCommand name
          117|       { inherit text executable checkPhase meta;
             |                ^
          118|         passAsFile = [ "text" ];

       … while evaluating derivation 'android-key-tools'
         whose name attribute is located at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/pkgs/stdenv/generic/make-derivation.nix:205:7

       … while evaluating attribute 'buildCommand' of derivation 'android-key-tools'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/pkgs/build-support/trivial-builders.nix:74:14:
           73|       name = lib.strings.sanitizeDerivationName name;
           74|       inherit buildCommand;
             |              ^
           75|       passAsFile = [ "buildCommand" ]

       … from call site
         at /home/vladimir/work/android-build/robotnix/modules/signing.nix:205:14:
          204|
          205|         cp ${config.source.dirs."development".src}/tools/make_key $out/bin/make_key
             |              ^
          206|         substituteInPlace $out/bin/make_key --replace openssl ${lib.getBin pkgs.openssl}/bin/openssl

       … while calling 'g'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:301:19:
          300|           g =
          301|             name: value:
             |                   ^
          302|             if isAttrs value && cond value

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:304:20:
          303|               then recurse (path ++ [name]) value
          304|               else f (path ++ [name]) value;
             |                    ^
          305|         in mapAttrs g set;

       … while calling anonymous lambda
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/modules.nix:171:72:
          170|           # For definitions that have an associated option
          171|           declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options;
             |                                                                        ^
          172|

       … while evaluating the option `source.dirs.development.src':

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/modules.nix:578:35:
          577|       # yield a value computed from the definitions
          578|       value = if opt ? apply then opt.apply res.mergedValue else res.mergedValue;
             |                                   ^
          579|

       … while calling 'apply'
         at /home/vladimir/work/android-build/robotnix/modules/source.nix:83:17:
           82|         default = pkgs.runCommand "empty" {} "mkdir -p $out";
           83|         apply = src: # Maybe replace with with pkgs.applyPatches? Need patchFlags though...
             |                 ^
           84|           if (config.patches != [] || config.postPatch != "")

       … from call site
         at /home/vladimir/work/android-build/robotnix/modules/source.nix:84:39:
           83|         apply = src: # Maybe replace with with pkgs.applyPatches? Need patchFlags though...
           84|           if (config.patches != [] || config.postPatch != "")
             |                                       ^
           85|           then (pkgs.runCommand "${builtins.replaceStrings ["/"] ["="] config.relpath}-patched" {} ''

       … while calling 'g'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:301:19:
          300|           g =
          301|             name: value:
             |                   ^
          302|             if isAttrs value && cond value

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:304:20:
          303|               then recurse (path ++ [name]) value
          304|               else f (path ++ [name]) value;
             |                    ^
          305|         in mapAttrs g set;

       … while calling anonymous lambda
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/modules.nix:171:72:
          170|           # For definitions that have an associated option
          171|           declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options;
             |                                                                        ^
          172|

       … while evaluating the option `source.dirs.development.postPatch':

       … while calling anonymous lambda
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/modules.nix:597:28:
          596|         # Process mkMerge and mkIf properties.
          597|         defs' = concatMap (m:
             |                            ^
          598|           map (value: { inherit (m) file; inherit value; }) (builtins.addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value))

       … while evaluating definitions from `/home/vladimir/work/android-build/robotnix/modules/source.nix':

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/modules.nix:598:137:
          597|         defs' = concatMap (m:
          598|           map (value: { inherit (m) file; inherit value; }) (builtins.addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value))
             |                                                                                                                                         ^
          599|         ) defs;

       … while calling 'dischargeProperties'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/modules.nix:669:25:
          668|   */
          669|   dischargeProperties = def:
             |                         ^
          670|     if def._type or "" == "merge" then

       … from call site
         at /home/vladimir/work/android-build/robotnix/modules/source.nix:197:38:
          196|         relpathSplit = lib.splitString "/" config.relpath;
          197|         mountPoints = lib.attrNames (lib.attrByPath relpathSplit {} dirsTree);
             |                                      ^
          198|       in mkIf (mountPoints != [])

       … while calling 'attrByPath'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:24:35:
           23|   */
           24|   attrByPath = attrPath: default: e:
             |                                   ^
           25|     let attr = head attrPath;

       … from call site
         at /home/vladimir/work/android-build/robotnix/modules/source.nix:47:5:
           46|   in
           47|     combineTreeBranches (lib.mapAttrsToList (name: dir: listToTreeBranch (lib.splitString "/" dir.relpath)) enabledDirs);
             |     ^
           48|

       … while calling 'combineTreeBranches'
         at /home/vladimir/work/android-build/robotnix/modules/source.nix:43:27:
           42|       else { "${builtins.head xs}" = listToTreeBranch (builtins.tail xs); };
           43|     combineTreeBranches = branches:
             |                           ^
           44|       lib.foldr lib.recursiveUpdate {} branches;

       … from call site
         at /home/vladimir/work/android-build/robotnix/modules/source.nix:44:7:
           43|     combineTreeBranches = branches:
           44|       lib.foldr lib.recursiveUpdate {} branches;
             |       ^
           45|     enabledDirs = lib.filterAttrs (name: dir: dir.enable) config.source.dirs;

       … while calling 'foldr'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/lists.nix:52:20:
           51|   */
           52|   foldr = op: nul: list:
             |                    ^
           53|     let

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/lists.nix:59:8:
           58|         else op (elemAt list n) (fold' (n + 1));
           59|     in fold' 0;
             |        ^
           60|

       … while calling 'fold''
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/lists.nix:55:15:
           54|       len = length list;
           55|       fold' = n:
             |               ^
           56|         if n == len

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/lists.nix:58:14:
           57|         then nul
           58|         else op (elemAt list n) (fold' (n + 1));
             |              ^
           59|     in fold' 0;

       … while calling 'recursiveUpdate'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:449:26:
          448|      */
          449|   recursiveUpdate = lhs: rhs:
             |                          ^
          450|     recursiveUpdateUntil (path: lhs: rhs:

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:450:5:
          449|   recursiveUpdate = lhs: rhs:
          450|     recursiveUpdateUntil (path: lhs: rhs:
             |     ^
          451|       !(isAttrs lhs && isAttrs rhs)

       … while calling 'recursiveUpdateUntil'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:418:37:
          417|      */
          418|   recursiveUpdateUntil = pred: lhs: rhs:
             |                                     ^
          419|     let f = attrPath:

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:428:8:
          427|       );
          428|     in f [] [rhs lhs];
             |        ^
          429|

       … while calling 'zipAttrsWith'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:381:21:
          380|   */
          381|   zipAttrsWith = f: sets: zipAttrsWithNames (concatMap attrNames sets) f sets;
             |                     ^
          382|   /* Like `zipAttrsWith' with `(name: values: values)' as the function.

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:381:27:
          380|   */
          381|   zipAttrsWith = f: sets: zipAttrsWithNames (concatMap attrNames sets) f sets;
             |                           ^
          382|   /* Like `zipAttrsWith' with `(name: values: values)' as the function.

       … while calling 'zipAttrsWithNames'
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:366:33:
          365|   */
          366|   zipAttrsWithNames = names: f: sets:
             |                                 ^
          367|     listToAttrs (map (name: {

       … from call site
         at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/lists.nix:58:34:
           57|         then nul
           58|         else op (elemAt list n) (fold' (n + 1));
             |                                  ^
           59|     in fold' 0;

       (11079 duplicate frames omitted)

       error: stack overflow; max-call-depth exceeded
       at /nix/store/d0dl9ch4hhxkqikc1dw3868j95gsbb0h-source/lib/attrsets.nix:381:46:
          380|   */
          381|   zipAttrsWith = f: sets: zipAttrsWithNames (concatMap attrNames sets) f sets;
             |                                              ^
          382|   /* Like `zipAttrsWith' with `(name: values: values)' as the function.

CyberShadow avatar Mar 09 '24 07:03 CyberShadow

It seems to be due to a bug in nixpkgs.

The bug manifests with the nixpkgs version in flake.lock, but not a more recent version.

CyberShadow avatar Mar 09 '24 08:03 CyberShadow

2dcae7d82f5ef0b373413d2fbfc1001141561c74 is the first good commit
commit 2dcae7d82f5ef0b373413d2fbfc1001141561c74
Author: pennae <[email protected]>
Date:   Sat Dec 25 15:20:26 2021 +0100

    lib/attrsets: use builtins.zipAttrsWith if available

 lib/attrsets.nix | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
bisect found first good commit

https://github.com/NixOS/nixpkgs/commit/2dcae7d82f5ef0b373413d2fbfc1001141561c74 https://github.com/NixOS/nixpkgs/pull/152046

Looks like it wasn't even intended as a bugfix.

CyberShadow avatar Mar 09 '24 08:03 CyberShadow

If we can get that exact version to build, feel free to update the lock.

See https://github.com/nix-community/robotnix/issues/218

Atemu avatar Mar 09 '24 09:03 Atemu

just increasing the max-call-depth by adding --option max-call-depth 1000000 to the nix build command solved it for me as a workaround

c2vi avatar Apr 23 '24 18:04 c2vi