feat: build contexts for build, host, and target

This commit is contained in:
Jake Hamilton 2025-09-14 01:36:33 -07:00
parent 9ae15ed2ff
commit f4f1f0aea7
Signed by: jakehamilton
GPG key ID: 9762169A1B35EA68
4 changed files with 123 additions and 101 deletions

View file

@ -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 ++ [
"<context ${builtins.concatStringsSep path}>"
"<context ${path}>"
];
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 =

View file

@ -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 = { };
};

View file

@ -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
'';
};
};

View file

@ -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 = [ ];
};
};
};
}