let # copied from genAttrs = names: f: builtins.listToAttrs (map (n: { name = n; value = f n; }) names); mapAttrsToList = f: attrs: map (name: f name attrs.${name}) (builtins.attrNames attrs); # The list of systems supported by nixpkgs and hydra defaultSystems = [ "aarch64-linux" "i686-linux" "x86_64-darwin" "x86_64-linux" ]; # eachSystem using defaultSystems eachDefaultSystem = eachSystem defaultSystems; # Builds a map from =value to .=value for each system. # # eachSystem = systems: f: let op = attrs: system: let ret = f system; op = attrs: key: attrs // { ${key} = (attrs.${key} or { }) // { ${system} = ret.${key}; }; } ; in builtins.foldl' op attrs (builtins.attrNames ret); in builtins.foldl' op { } systems ; # Nix flakes insists on having a flat attribute set of derivations in # various places like the `packages` and `checks` attributes. # # This function traverses a tree of attributes (by respecting # recurseIntoAttrs) and only returns their derivations, with a flattened # key-space. # # Eg: # # flattenTree { hello = pkgs.hello; gitAndTools = pkgs.gitAndTools }; # # Returns: # # { # hello = «derivation»; # "gitAndTools/git" = «derivation»; # "gitAndTools/hub" = «derivation»; # # ... # } flattenTree = tree: import ./flattenTree.nix tree; # Returns the structure used by `nix app` mkApp = { drv , name ? drv.pname or drv.name , exePath ? drv.passthru.exePath or "/bin/${name}" }: { type = "app"; program = "${drv}${exePath}"; }; in { inherit defaultSystems eachDefaultSystem eachSystem flattenTree mkApp ; }