feat: cross compilation package set

This commit is contained in:
Jake Hamilton 2024-06-15 03:58:25 -07:00
parent 2989fdc4fe
commit 1c67c40213
Signed by: jakehamilton
GPG key ID: 9762169A1B35EA68
5 changed files with 89 additions and 23 deletions

View file

@ -94,7 +94,7 @@ lib: {
typeSet = lib.attrs.when ((shared "type") && isTypeMergeable) {
type = mergedType;
};
files = builtins.map lib.modules.getFiles result.declarations;
files = result.declarations;
serializedFiles = builtins.concatStringsSep " and " files;
getSubModules = option.options.type.getSubModules or null;
submodules =

View file

@ -767,19 +767,21 @@ lib: {
definition:
if shorthand && builtins.isAttrs definition.value
then let
config =
definition.value.config
or (
builtins.removeAttrs definition.value
(builtins.filter (key: key != "config") lib.modules.VALID_KEYS)
);
# TODO: Figure out if we can apply additional attributes to the generated module.
# Currently this causes issues to do with redefined options.
rest =
if definition.value ? config
then builtins.removeAttrs definition.value ["config"]
else lib.attrs.filter (name: value: builtins.elem name lib.modules.VALID_KEYS) definition.value;
builtins.removeAttrs
(lib.attrs.filter (name: value: builtins.elem name lib.modules.VALID_KEYS) definition.value)
["freeform"];
in
rest
// {
if definition.value ? config
then {
__file__ = definition.__file__;
config = definition.value.config;
}
else let
config = builtins.removeAttrs definition.value lib.modules.VALID_KEYS;
in {
__file__ = definition.__file__;
config = config;
}

View file

@ -8,10 +8,10 @@
},
"locked": {
"dir": "foundation",
"dirtyRev": "aa1c58f6ee8a3ad6ad569f34477192462533c16b-dirty",
"dirtyShortRev": "aa1c58f-dirty",
"lastModified": 1718411218,
"narHash": "sha256-LOzQGGygC2U08zNwg1YNljjrJKJxnJ8S4RkX2v81yRw=",
"dirtyRev": "2989fdc4fe153f13e7b6b476476805b03c419f0c-dirty",
"dirtyShortRev": "2989fdc-dirty",
"lastModified": 1718444137,
"narHash": "sha256-gArdjry0N4et4B+wQa31JyLJ448JWd9OFA1Roe3EOAc=",
"type": "git",
"url": "file:../?dir=foundation"
},
@ -24,10 +24,10 @@
"lib": {
"locked": {
"dir": "lib",
"dirtyRev": "aa1c58f6ee8a3ad6ad569f34477192462533c16b-dirty",
"dirtyShortRev": "aa1c58f-dirty",
"lastModified": 1718411218,
"narHash": "sha256-LOzQGGygC2U08zNwg1YNljjrJKJxnJ8S4RkX2v81yRw=",
"dirtyRev": "2989fdc4fe153f13e7b6b476476805b03c419f0c-dirty",
"dirtyShortRev": "2989fdc-dirty",
"lastModified": 1718444137,
"narHash": "sha256-gArdjry0N4et4B+wQa31JyLJ448JWd9OFA1Roe3EOAc=",
"type": "git",
"url": "file:../?dir=lib"
},

View file

@ -13,6 +13,7 @@ in {
packages = {
example-x = config.packages.example.x;
cross-example-x-x86_64-linux = config.packages.cross.x86_64-linux.example.x;
};
};
};

View file

@ -1,10 +1,11 @@
{
lib,
lib',
config,
}: let
lib' = config.lib;
doubles = lib'.systems.doubles.all;
packages = builtins.removeAttrs config.packages ["cross"];
in {
includes = [
./aux/foundation.nix
@ -13,7 +14,18 @@ in {
options = {
packages = lib.options.create {
description = "The package set.";
type = lib'.types.packages;
type = lib.types.submodule {
freeform = lib.modules.overrides.force (lib.types.attrs.of (lib.types.submodule {
freeform = lib.modules.overrides.force lib'.types.alias;
}));
options.cross = lib.attrs.generate doubles (system:
lib.options.create {
description = "The cross-compiled package set for the ${system} target.";
type = lib'.types.packages;
default = {};
});
};
};
preferences.packages = {
@ -24,4 +36,55 @@ in {
};
};
};
config.packages.cross = lib.attrs.generate doubles (
system:
builtins.mapAttrs
(
namespace:
builtins.mapAttrs
(name: alias: let
setHost = package:
if package != {}
then
package.extend ({config}: {
config = {
platform = {
host = lib.modules.overrides.force system;
};
deps = {
build = {
only = setHost package.deps.build.only;
build = setHost package.deps.build.build;
host = setHost package.deps.build.host;
target = setHost package.deps.build.target;
};
host = {
only = setHost package.deps.host.only;
host = setHost package.deps.host.host;
target = setHost package.deps.host.target;
};
target = {
only = setHost package.deps.target.only;
target = setHost package.deps.target.target;
};
};
};
})
else package;
updated =
alias
// {
versions =
builtins.mapAttrs
(version: package: setHost package)
alias.versions;
};
in
updated)
)
packages
);
}