feat: build contexts for build, host, and target
This commit is contained in:
parent
9ae15ed2ff
commit
f4f1f0aea7
4 changed files with 123 additions and 101 deletions
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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 = { };
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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 = [ ];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue