diff --git a/tidepool/src/lib/packages.nix b/tidepool/src/lib/packages.nix index 6114e6a..0759866 100644 --- a/tidepool/src/lib/packages.nix +++ b/tidepool/src/lib/packages.nix @@ -16,7 +16,7 @@ in build = build: host: target: - builtins.mapAttrs (name: dep: dep.packages.${build}.${host}.${target}); + builtins.mapAttrs (name: dep: (lib.packages.resolve dep).packages.${build}.${host}.${target}); collect = package: @@ -28,8 +28,9 @@ in dependencies: let getDeps = - name: dependency: + name: dep: let + dependency = lib.packages.resolve dep; deps = { build = { build = @@ -61,19 +62,21 @@ in propagated = lib.attrs.mapToList getDeps dependencies; in lib.lists.flatten propagated; + + withoutNulls = deps: builtins.filter (dep: dep != null) deps; in { build = { - build = builtins.attrValues package.deps.build.build ++ process package.deps.build.build; - host = builtins.attrValues package.deps.build.host ++ process package.deps.build.host; - target = builtins.attrValues package.deps.build.target ++ process package.deps.build.target; + build = withoutNulls (builtins.attrValues package.deps.build.build ++ process package.deps.build.build); + host = withoutNulls (builtins.attrValues package.deps.build.host ++ process package.deps.build.host); + target = withoutNulls (builtins.attrValues package.deps.build.target ++ process package.deps.build.target); }; host = { - host = builtins.attrValues package.deps.host.host ++ process package.deps.host.host; - target = builtins.attrValues package.deps.host.target ++ process package.deps.host.target; + host = withoutNulls (builtins.attrValues package.deps.host.host ++ process package.deps.host.host); + target = withoutNulls (builtins.attrValues package.deps.host.target ++ process package.deps.host.target); }; target = { - target = builtins.attrValues package.deps.target.target ++ process package.deps.target.target; + target = withoutNulls (builtins.attrValues package.deps.target.target ++ process package.deps.target.target); }; }; }; @@ -83,9 +86,9 @@ in package: collected: ctx: let process = - path: + path: deps: let - dependencies = lib.attrs.selectOrThrow path collected; + dependencies = lib.lists.flatten deps; contexts = builtins.map (dependency: dependency.context or { }) dependencies; result = lib.modules.run { args = { @@ -93,8 +96,9 @@ in }; prefix = package.__module__.args.dynamic.meta.prefix ++ [ - "" + "" ]; + modules = (builtins.map (context: { config = context; }) contexts) ++ [ { freeform = lib.types.any; @@ -103,22 +107,12 @@ in target = lib.options.create { description = "The dependency target that is being generated."; type = lib.types.enum [ - "build.build" - "build.host" - "build.target" - "host.host" - "host.target" - "target.target" + "build" + "host" + "target" ]; writable = false; - default.value = builtins.concatStringsSep "." path; - }; - - deps = lib.options.create { - description = "The collected dependencies."; - writable = false; - default.value = collected; - type = lib.types.dependencies; + default.value = path; }; }; @@ -128,38 +122,34 @@ in }; in result.config; + + build = process "build" [ collected.build.build collected.build.host collected.build.target ]; + host = process "host" [ collected.host.host collected.host.target ]; + target = process "target" [ collected.target.target ]; in + build // host // { - build = { - build = process [ - "build" - "build" - ]; - host = process [ - "build" - "host" - ]; - target = process [ - "build" - "target" - ]; - }; - host = { - host = process [ - "host" - "host" - ]; - target = process [ - "host" - "target" - ]; - }; - target = { - target = process [ - "target" - "target" - ]; - }; + inherit build host target; + + deps = collected; + + __toString = value: + let + all = builtins.mapAttrs + (host: targets: + builtins.mapAttrs + (target: deps: + builtins.map (dep: dep.package) deps + ) + targets + ) + collected; + in + builtins.toJSON ( + builtins.removeAttrs value [ "deps" "__toString" ] // { + deps = all; + } + ); }; }; @@ -171,9 +161,9 @@ in path: let dependencies = lib.attrs.selectOrThrow path collected; - hooks = builtins.map ( - dependency: if builtins.isFunction dependency.hooks then dependency.hooks ctx else dependency.hooks - ) dependencies; + hooks = builtins.map + (dependency: if builtins.isFunction dependency.hooks then dependency.hooks ctx else dependency.hooks) + dependencies; in hooks; in @@ -270,9 +260,11 @@ in alias: build: host: target: let package = lib.packages.resolve alias; - matches = builtins.filter ( - platform: platform.build == build && platform.host == host && platform.target == target - ) package.platforms; + matches = builtins.filter + ( + platform: platform.build == build && platform.host == host && platform.target == target + ) + package.platforms; in { compatible = diff --git a/tidepool/src/lib/types.nix b/tidepool/src/lib/types.nix index 051a934..6b327c0 100644 --- a/tidepool/src/lib/types.nix +++ b/tidepool/src/lib/types.nix @@ -152,9 +152,11 @@ in merge = location: definitions: let - modules = builtins.concatMap ( - definition: lib.lists.from.any (normalize definition.value) - ) definitions; + modules = builtins.concatMap + ( + definition: lib.lists.from.any (normalize definition.value) + ) + definitions; result = lib.modules.run { prefix = location; @@ -173,10 +175,10 @@ in }; submodule = - { - config, - meta, - name ? "builder", + { config + , meta + , name ? "builder" + , }: { options = { @@ -288,26 +290,32 @@ in transform = value: let - result = builtins.mapAttrs ( - namespace: aliases: - builtins.mapAttrs ( - id: alias: - alias - // { - versions = builtins.mapAttrs (version: package: { - __modules__ = (lib.lists.from.any (normalize package)) ++ [ - { - config = { - id = lib.modules.overrides.default id; - version = lib.modules.overrides.default version; - namespace = lib.modules.overrides.default namespace; - }; - } - ]; - }) alias.versions; - } - ) aliases - ) value; + result = builtins.mapAttrs + ( + namespace: aliases: + builtins.mapAttrs + ( + id: alias: + alias + // { + versions = builtins.mapAttrs + (version: package: { + __modules__ = (lib.lists.from.any (normalize package)) ++ [ + { + config = { + id = lib.modules.overrides.default id; + version = lib.modules.overrides.default version; + namespace = lib.modules.overrides.default namespace; + }; + } + ]; + }) + alias.versions; + } + ) + aliases + ) + value; in result; @@ -405,8 +413,8 @@ in let default = config.${global.config.preferences.packages.version}; in - default.extend - or (builtins.throw "Package \"${name}\" does not have a ${global.config.preferences.packages.version} release."); + default.extend + or (builtins.throw "Package \"${name}\" does not have a ${global.config.preferences.packages.version} release."); }; stable = lib.options.create { @@ -488,9 +496,11 @@ in merge = location: definitions: let - modules = builtins.concatMap ( - definition: lib.lists.from.any (normalize definition.value) - ) definitions; + modules = builtins.concatMap + ( + definition: lib.lists.from.any (normalize definition.value) + ) + definitions; result = lib.modules.run { prefix = location; @@ -557,9 +567,9 @@ in }; submodule = - { - config, - meta, + { config + , meta + , }: let build = config.platform.build; @@ -577,10 +587,10 @@ in __toString = lib.options.create { description = "The derivation of the package as a string."; - type = lib.types.string; + type = lib.types.function lib.types.string; internal = true; writable = false; - default.value = builtins.toString config.package; + default.value = value: builtins.toString value.package; }; extend = lib.options.create { @@ -899,7 +909,7 @@ in phases = lib.options.create { description = "The phases for the package."; type = lib.types.either (lib.types.dag.of lib.types.string) ( - lib.types.function lib.types.dag.of lib.types.string + lib.types.function (lib.types.dag.of lib.types.string) ); default.value = { }; }; diff --git a/tidepool/src/packages/aux/a.nix b/tidepool/src/packages/aux/a.nix index 37fd58c..692adff 100644 --- a/tidepool/src/packages/aux/a.nix +++ b/tidepool/src/packages/aux/a.nix @@ -33,9 +33,15 @@ in inherit (packages.aux) b; }; - phases = { + phases = ctx: { install = '' - echo "a with b: ${config.deps.host.host.b.platform.host.double}" > $out + echo "a with b: ${config.deps.host.host.b.platform.host}" > $out + echo >> $out + echo a=$out >> $out + echo b=$AUX_B >> $out + echo c=$AUX_C >> $out + echo >> $out + echo '${ctx}' >> $out ''; }; }; diff --git a/tidepool/src/packages/foundation/default.nix b/tidepool/src/packages/foundation/default.nix index cecab3a..1c3eed6 100644 --- a/tidepool/src/packages/foundation/default.nix +++ b/tidepool/src/packages/foundation/default.nix @@ -1,3 +1,7 @@ +{ config }: +let + inherit (config) lib; +in { includes = [ ./bash @@ -25,4 +29,14 @@ ./xz ./zlib ]; + + config = { + packages.context.options = { + "foundation:cflags" = lib.options.create { + description = "C compiler flags used by the foundation compiler toolchain."; + type = lib.types.list.of lib.types.string; + default.value = [ ]; + }; + }; + }; }