Compare commits

..

4 commits

Author SHA1 Message Date
9708c965fd Fix non-deterministic "missing: Permission denied" errors
Make 'missing' executable where source tarballs use autotools
and are unpack with untar. untar doesn't preserve or set mtime,
which may result in autotools generated files, e.g. configure,
having newer timestamps than their source files (e.g. configure.in.)
In these circumstances autotools generated Makefiles will call
'missing' to either regenerate them or fix-up the timestamps.
2024-06-22 20:48:13 +01:00
a707b0f06b
refactor: format all nix code 2024-06-22 10:58:44 -07:00
3479354ec9
refactor: add formatting script 2024-06-22 10:56:18 -07:00
403420fd4b
fix: missing semicolon 2024-06-22 10:43:47 -07:00
159 changed files with 9003 additions and 8144 deletions

6
format.sh Executable file
View file

@ -0,0 +1,6 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -I "nixpkgs=https://github.com/nixos/nixpkgs/archive/nixos-24.05.tar.gz" -p nixfmt-rfc-style
files=$(find . -name "*.nix" -type f)
nixfmt ${1:-"--verify"} ${files}

View file

@ -1,14 +1,13 @@
{system ? builtins.currentSystem}: let
{
system ? builtins.currentSystem,
}:
let
lib = import ./../lib;
modules = import ./src;
result = lib.modules.run {
modules =
(builtins.attrValues modules)
++ [
{config.aux.system = system;}
];
modules = (builtins.attrValues modules) ++ [ { config.aux.system = system; } ];
};
in
result.config.exports.resolved.packages

View file

@ -7,31 +7,27 @@
};
};
outputs = inputs: let
outputs =
inputs:
let
inherit (inputs.lib) lib;
modules = import ./src;
forEachSystem = lib.attrs.generate [
"i686-linux"
];
in {
extras = let
result = lib.modules.run {
modules =
builtins.attrValues modules;
};
forEachSystem = lib.attrs.generate [ "i686-linux" ];
in
{
extras =
let
result = lib.modules.run { modules = builtins.attrValues modules; };
in
result.config.exports.resolved.extras;
packages = forEachSystem (
system: let
system:
let
result = lib.modules.run {
modules =
(builtins.attrValues modules)
++ [
{config.aux.system = system;}
];
modules = (builtins.attrValues modules) ++ [ { config.aux.system = system; } ];
};
in
result.config.exports.resolved.packages

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
builders = config.aux.foundation.builders;
stage0 = config.aux.foundation.stages.stage0;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.builders.bash.boot = {
build = lib.options.create {
type = lib.types.function lib.types.derivation;
@ -17,7 +16,8 @@ in {
config = {
aux.foundation.builders.bash.boot = {
build = settings @ {
build =
settings@{
name,
script,
meta ? { },
@ -25,9 +25,17 @@ in {
env ? { },
deps ? { },
...
}: let
}:
let
package = builtins.derivation (
(builtins.removeAttrs settings ["meta" "extras" "executable" "env" "deps" "script"])
(builtins.removeAttrs settings [
"meta"
"extras"
"executable"
"env"
"deps"
"script"
])
// env
// {
inherit name system script;
@ -68,10 +76,7 @@ in {
}
);
in
package
// {
inherit meta extras;
};
package // { inherit meta extras; };
};
};
}

View file

@ -1,15 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
includes = [
./boot.nix
];
in
{
includes = [ ./boot.nix ];
options.aux.foundation.builders.bash = {
build = lib.options.create {
@ -20,7 +17,8 @@ in {
config = {
aux.foundation.builders.bash = {
build = settings @ {
build =
settings@{
name,
script,
meta ? { },
@ -28,9 +26,17 @@ in {
env ? { },
deps ? { },
...
}: let
}:
let
package = builtins.derivation (
(builtins.removeAttrs settings ["meta" "extras" "executable" "env" "deps" "script"])
(builtins.removeAttrs settings [
"meta"
"extras"
"executable"
"env"
"deps"
"script"
])
// env
// {
inherit name system script;
@ -70,10 +76,7 @@ in {
}
);
in
package
// {
inherit meta extras;
};
package // { inherit meta extras; };
};
};
}

View file

@ -1,11 +1,10 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
stage0 = config.aux.foundation.stages.stage0;
in {
in
{
options.aux.foundation.builders.file.text = {
build = lib.options.create {
type = lib.types.function lib.types.derivation;
@ -15,7 +14,8 @@ in {
config = {
aux.foundation.builders.file.text = {
build = settings @ {
build =
settings@{
name,
contents,
isExecutable ? false,
@ -23,7 +23,8 @@ in {
meta ? { },
extras ? { },
...
}: let
}:
let
script =
''
target=''${out}''${destination}
@ -38,9 +39,19 @@ in {
chmod 555 ''${target}
'';
package = builtins.derivation (
(builtins.removeAttrs settings ["meta" "extras" "executable" "isExecutable"])
(builtins.removeAttrs settings [
"meta"
"extras"
"executable"
"isExecutable"
])
// {
inherit name system destination contents;
inherit
name
system
destination
contents
;
destinationDir = builtins.dirOf destination;
passAsFile = [ "contents" ];
@ -54,16 +65,11 @@ in {
(builtins.toFile "write-text-to-file.kaem" script)
];
PATH = lib.paths.bin [
stage0.mescc-tools-extra.package
];
PATH = lib.paths.bin [ stage0.mescc-tools-extra.package ];
}
);
in
package
// {
inherit meta extras;
};
package // { inherit meta extras; };
};
};
}

View file

@ -1,12 +1,11 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
builders = config.aux.foundation.builders;
stage0 = config.aux.foundation.stages.stage0;
in {
in
{
options.aux.foundation.builders.kaem = {
build = lib.options.create {
type = lib.types.function lib.types.derivation;
@ -16,7 +15,8 @@ in {
config = {
aux.foundation.builders.kaem = {
build = settings @ {
build =
settings@{
name,
script,
meta ? { },
@ -24,9 +24,17 @@ in {
env ? { },
deps ? { },
...
}: let
}:
let
package = builtins.derivation (
(builtins.removeAttrs settings ["meta" "extras" "executable" "env" "deps" "script"])
(builtins.removeAttrs settings [
"meta"
"extras"
"executable"
"env"
"deps"
"script"
])
// env
// {
inherit name system;
@ -37,12 +45,10 @@ in {
"--verbose"
"--strict"
"--file"
(
builders.file.text.build {
(builders.file.text.build {
name = "${name}-builder";
contents = script;
}
)
})
];
PATH = lib.paths.bin (
@ -56,10 +62,7 @@ in {
}
);
in
package
// {
inherit meta extras;
};
package // { inherit meta extras; };
};
};
}

View file

@ -1,9 +1,8 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
in {
in
{
options.aux.foundation.builders.raw = {
build = lib.options.create {
type = lib.types.function lib.types.derivation;
@ -13,7 +12,8 @@ in {
config = {
aux.foundation.builders.raw = {
build = settings @ {
build =
settings@{
pname,
version,
executable,
@ -21,11 +21,21 @@ in {
meta ? { },
extras ? { },
...
}: let
}:
let
package = builtins.derivation (
(builtins.removeAttrs settings ["meta" "extras" "executable"])
(builtins.removeAttrs settings [
"meta"
"extras"
"executable"
])
// {
inherit version pname system args;
inherit
version
pname
system
args
;
name = "${pname}-${version}";
@ -33,10 +43,7 @@ in {
}
);
in
package
// {
inherit meta extras;
};
package // { inherit meta extras; };
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
options = {
packages = lib.options.create {
default.value = { };
@ -14,7 +12,8 @@
type = lib.types.attrs.any;
};
};
in {
in
{
options = {
exports = {
inherit (options) packages extras;
@ -27,19 +26,16 @@ in {
config = {
exports.resolved = {
packages =
builtins.mapAttrs (
packages = builtins.mapAttrs (
name: value:
lib.attrs.filter
(
lib.attrs.filter (
name: value:
if value ? meta && value.meta ? platforms
then builtins.elem config.aux.system value.meta.platforms
else true
)
value
)
config.exports.packages;
if value ? meta && value.meta ? platforms then
builtins.elem config.aux.system value.meta.platforms
else
true
) value
) config.exports.packages;
extras = config.exports.extras;
};

View file

@ -1,4 +1,5 @@
{lib}: {
{ lib }:
{
options.aux.mirrors = {
gnu = lib.options.create {
type = lib.types.string;

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
parts = lib.strings.split "-" system;
@ -285,7 +283,8 @@
family = "javascript";
};
};
in {
in
{
options.aux.platform = {
name = lib.options.create {
type = lib.types.string;
@ -303,7 +302,10 @@ in {
};
endian = lib.options.create {
type = lib.types.enum ["little" "big"];
type = lib.types.enum [
"little"
"big"
];
default.value = "big";
description = "Endianess of the platform";
};
@ -332,12 +334,7 @@ in {
};
config = {
aux.platform =
(
platforms.${platform}
or (builtins.throw "Unsupported platform: ${system}")
)
// {
aux.platform = (platforms.${platform} or (builtins.throw "Unsupported platform: ${system}")) // {
name = platform;
# These will only ever have `linux` as the target since we

View file

@ -1,18 +1,18 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
architecture =
if system == "x86_64-linux"
then "AMD64"
else if system == "aarch64-linux"
then "AArch64"
else if system == "i686-linux"
then "x86"
else builtins.throw "Unsupported system for stage0: ${system}";
in {
if system == "x86_64-linux" then
"AMD64"
else if system == "aarch64-linux" then
"AArch64"
else if system == "i686-linux" then
"x86"
else
builtins.throw "Unsupported system for stage0: ${system}";
in
{
options.aux.foundation.stages.stage0.architecture = {
base = lib.options.create {
type = lib.types.string;

View file

@ -1,21 +1,21 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0;
system = config.aux.system;
builders = config.aux.foundation.builders;
architecture =
if system == "x86_64-linux"
then "AMD64"
else if system == "aarch64-linux"
then "AArch64"
else if system == "i686-linux"
then "x86"
else builtins.throw "Unsupported system for stage0: ${system}";
in {
if system == "x86_64-linux" then
"AMD64"
else if system == "aarch64-linux" then
"AArch64"
else if system == "i686-linux" then
"x86"
else
builtins.throw "Unsupported system for stage0: ${system}";
in
{
includes = [
./sources
./architecture

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.kaem;
system = config.aux.system;
@ -10,7 +8,8 @@
kaem-unwrapped = config.aux.foundation.stages.stage0.kaem-unwrapped;
mescc-tools = config.aux.foundation.stages.stage0.mescc-tools;
mescc-tools-extra = config.aux.foundation.stages.stage0.mescc-tools-extra;
in {
in
{
options.aux.foundation.stages.stage0.kaem = {
meta = {
description = lib.options.create {
@ -47,7 +46,8 @@ in {
config = {
aux.foundation.stages.stage0.kaem = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "kaem";
version = "1.6.0";
@ -64,7 +64,8 @@ in {
kaemUnwrapped = kaem-unwrapped.package;
PATH = lib.paths.bin [ mescc-tools-extra.package ];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.mescc-tools-extra;
hex0 = config.aux.foundation.stages.stage0.hex0;
catm = config.aux.foundation.stages.stage0.catm;
@ -18,7 +16,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.mescc-tools-extra = {
meta = {
description = lib.options.create {
@ -55,7 +54,8 @@ in {
config = {
aux.foundation.stages.stage0.mescc-tools-extra = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "mescc-tools-tools";
version = "1.6.0";
@ -75,7 +75,8 @@ in {
m2libcOS = "linux";
m2libcArch = architecture.m2libc;
mesccTools = mescc-tools.package;
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.mescc-tools;
hex0 = config.aux.foundation.stages.stage0.hex0;
catm = config.aux.foundation.stages.stage0.catm;
@ -18,24 +16,21 @@
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
bloodFlag =
if config.aux.platform.bits == 64
then "--64"
else " ";
endianFlag =
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian";
bloodFlag = if config.aux.platform.bits == 64 then "--64" else " ";
endianFlag = if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian";
baseAddress =
if config.aux.system == "x86_64-linux"
then "0x00600000"
else if config.aux.system == "aarch64-linux"
then "0x00600000"
else if config.aux.system == "i686-linux"
then "0x08048000"
else builtins.throw "Unsupported system: ${config.aux.system}";
if config.aux.system == "x86_64-linux" then
"0x00600000"
else if config.aux.system == "aarch64-linux" then
"0x00600000"
else if config.aux.system == "i686-linux" then
"0x08048000"
else
builtins.throw "Unsupported system: ${config.aux.system}";
getExtraUtil = name: let
getExtraUtil =
name:
let
script = builtins.toFile "build-${name}.kaem" ''
''${M2} --architecture ${architecture.m2libc} \
-f ''${m2libc}/sys/types.h \
@ -104,7 +99,8 @@
endianFlag = endianFlag;
baseAddress = baseAddress;
};
in {
in
{
options.aux.foundation.stages.stage0.mescc-tools = {
meta = {
description = lib.options.create {
@ -141,7 +137,8 @@ in {
config = {
aux.foundation.stages.stage0.mescc-tools = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "mescc-tools";
version = "1.6.0";
@ -176,7 +173,8 @@ in {
cp = getExtraUtil "cp";
chmod = getExtraUtil "chmod";
replace = getExtraUtil "replace";
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.hex0;
system = config.aux.system;
@ -9,14 +7,16 @@
sources = config.aux.foundation.stages.stage0.sources;
architecture =
if system == "x86_64-linux"
then "AMD64"
else if system == "aarch64-linux"
then "AArch64"
else if system == "i686-linux"
then "x86"
else builtins.throw "Unsupported system for stage0: ${system}";
in {
if system == "x86_64-linux" then
"AMD64"
else if system == "aarch64-linux" then
"AArch64"
else if system == "i686-linux" then
"x86"
else
builtins.throw "Unsupported system for stage0: ${system}";
in
{
options.aux.foundation.stages.stage0.hex0 = {
meta = {
description = lib.options.create {
@ -66,7 +66,8 @@ in {
config = {
aux.foundation.stages.stage0.hex0 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "hex0";
version = "1.6.0";
@ -82,24 +83,28 @@ in {
outputHashMode = "recursive";
outputHashAlgo = "sha256";
outputHash = cfg.hash;
});
hash = lib.modules.overrides.default (
if system == "x86_64-linux"
then "sha256-RCgK9oZRDQUiWLVkcIBSR2HeoB+Bh0czthrpjFEkCaY="
else if system == "aarch64-linux"
then "sha256-XTPsoKeI6wTZAF0UwEJPzuHelWOJe//wXg4HYO0dEJo="
else if system == "i686-linux"
then "sha256-QU3RPGy51W7M2xnfFY1IqruKzusrSLU+L190ztN6JW8="
else null
}
);
executable = lib.modules.overrides.default (import <nix/fetchurl.nix> {
hash = lib.modules.overrides.default (
if system == "x86_64-linux" then
"sha256-RCgK9oZRDQUiWLVkcIBSR2HeoB+Bh0czthrpjFEkCaY="
else if system == "aarch64-linux" then
"sha256-XTPsoKeI6wTZAF0UwEJPzuHelWOJe//wXg4HYO0dEJo="
else if system == "i686-linux" then
"sha256-QU3RPGy51W7M2xnfFY1IqruKzusrSLU+L190ztN6JW8="
else
null
);
executable = lib.modules.overrides.default (
import <nix/fetchurl.nix> {
name = "hex0-seed";
url = "https://github.com/oriansj/bootstrap-seeds/raw/b1263ff14a17835f4d12539226208c426ced4fba/POSIX/${architecture}/hex0-seed";
executable = true;
hash = cfg.hash;
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.hex1;
hex0 = config.aux.foundation.stages.stage0.hex0;
@ -9,7 +7,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.hex1 = {
meta = {
description = lib.options.create {
@ -46,7 +45,8 @@ in {
config = {
aux.foundation.stages.stage0.hex1 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "hex1";
version = "1.6.0";
@ -58,7 +58,8 @@ in {
"${sources.base}/hex1_${architecture.base}.hex0"
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.hex2-0;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex1 = config.aux.foundation.stages.stage0.hex1;
@ -10,7 +8,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.hex2-0 = {
meta = {
description = lib.options.create {
@ -47,7 +46,8 @@ in {
config = {
aux.foundation.stages.stage0.hex2-0 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "hex2-0";
version = "1.6.0";
@ -59,7 +59,8 @@ in {
"${sources.base}/hex2_${architecture.base}.hex1"
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.catm;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex1 = config.aux.foundation.stages.stage0.hex1;
@ -11,7 +9,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.catm = {
meta = {
description = lib.options.create {
@ -48,28 +47,28 @@ in {
config = {
aux.foundation.stages.stage0.catm = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "catm";
version = "1.6.0";
meta = cfg.meta;
executable =
if architecture.base == "AArch64"
then hex1.package
else hex2-0.package;
executable = if architecture.base == "AArch64" then hex1.package else hex2-0.package;
args =
if architecture.base == "AArch64"
then [
if architecture.base == "AArch64" then
[
"${sources.base}/catm_${architecture.base}.hex1"
(builtins.placeholder "out")
]
else [
else
[
"${sources.base}/catm_${architecture.base}.hex2"
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.M0;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex2-0 = config.aux.foundation.stages.stage0.hex2-0;
@ -11,7 +9,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.M0 = {
meta = {
description = lib.options.create {
@ -48,7 +47,8 @@ in {
config = {
aux.foundation.stages.stage0.M0 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "M0";
version = "1.6.0";
@ -56,7 +56,8 @@ in {
executable = hex2-0.package;
args = let
args =
let
M0_hex2-0 = builders.raw.build {
pname = "M0_hex2-0";
version = "1.6.0";
@ -71,11 +72,13 @@ in {
"${sources.base}/M0_${architecture.base}.hex2"
];
};
in [
in
[
M0_hex2-0
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.cc_arch;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex2-0 = config.aux.foundation.stages.stage0.hex2-0;
@ -12,7 +10,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.cc_arch = {
meta = {
description = lib.options.create {
@ -49,7 +48,8 @@ in {
config = {
aux.foundation.stages.stage0.cc_arch = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "cc_arch";
version = "1.6.0";
@ -57,7 +57,8 @@ in {
executable = hex2-0.package;
args = let
args =
let
cc_arch0_hex2-0 = builders.raw.build {
pname = "cc_arch0_hex2-0";
version = "1.6.0";
@ -85,11 +86,13 @@ in {
cc_arch0_hex2-0
];
};
in [
in
[
cc_arch1_hex2-0
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.M2;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex2-0 = config.aux.foundation.stages.stage0.hex2-0;
@ -13,7 +11,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.M2 = {
meta = {
description = lib.options.create {
@ -50,7 +49,8 @@ in {
config = {
aux.foundation.stages.stage0.M2 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "M2";
version = "1.6.0";
@ -58,7 +58,8 @@ in {
executable = hex2-0.package;
args = let
args =
let
M2_c = builders.raw.build {
pname = "M2_c";
version = "1.6.0";
@ -136,11 +137,13 @@ in {
M2_hex2-0
];
};
in [
in
[
M2_hex2-0'
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.blood-elf;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex2-0 = config.aux.foundation.stages.stage0.hex2-0;
@ -14,7 +12,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.blood-elf = {
meta = {
description = lib.options.create {
@ -51,7 +50,8 @@ in {
config = {
aux.foundation.stages.stage0.blood-elf = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "blood-elf";
version = "1.6.0";
@ -59,7 +59,8 @@ in {
executable = hex2-0.package;
args = let
args =
let
blood-elf_M1 = builders.raw.build {
pname = "blood-elf_M1";
version = "1.6.0";
@ -126,11 +127,13 @@ in {
blood-elf_hex2-0
];
};
in [
in
[
blood-elf_hex2-0'
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.M1-0;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex2-0 = config.aux.foundation.stages.stage0.hex2-0;
@ -15,7 +13,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.M1-0 = {
meta = {
description = lib.options.create {
@ -52,7 +51,8 @@ in {
config = {
aux.foundation.stages.stage0.M1-0 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "M1-0";
version = "1.6.0";
@ -60,7 +60,8 @@ in {
executable = hex2-0.package;
args = let
args =
let
M1-macro-0_M1 = builders.raw.build {
pname = "M1-macro-0_M1";
version = "1.6.0";
@ -94,16 +95,10 @@ in {
executable = blood-elf.package;
args =
(lib.lists.when (config.aux.platform.bits == 64) "--64")
++ [
args = (lib.lists.when (config.aux.platform.bits == 64) "--64") ++ [
"-f"
M1-macro-0_M1
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-o"
(builtins.placeholder "out")
];
@ -151,11 +146,13 @@ in {
M1-macro-0_hex2-0
];
};
in [
in
[
M1-macro-0_hex2-0'
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.hex2-1;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex2-0 = config.aux.foundation.stages.stage0.hex2-0;
@ -16,7 +14,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.hex2-1 = {
meta = {
description = lib.options.create {
@ -53,7 +52,8 @@ in {
config = {
aux.foundation.stages.stage0.hex2-1 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "hex2-1";
version = "1.6.0";
@ -61,7 +61,8 @@ in {
executable = hex2-0.package;
args = let
args =
let
hex2_linker_M1 = builders.raw.build {
pname = "hex2_linker_M1";
version = "1.6.0";
@ -114,16 +115,10 @@ in {
executable = blood-elf.package;
args =
(lib.lists.when (config.aux.platform.bits == 64) "--64")
++ [
args = (lib.lists.when (config.aux.platform.bits == 64) "--64") ++ [
"-f"
hex2_linker_M1
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-o"
(builtins.placeholder "out")
];
@ -139,11 +134,7 @@ in {
args = [
"--architecture"
architecture.m2libc
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-f"
"${sources.m2libc}/${architecture.m2libc}/${architecture.m2libc}_defs.M1"
"-f"
@ -170,11 +161,13 @@ in {
hex2_linker_hex2
];
};
in [
in
[
hex2_linker_hex2'
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.M1;
hex0 = config.aux.foundation.stages.stage0.hex0;
hex2-0 = config.aux.foundation.stages.stage0.hex2-0;
@ -17,7 +15,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.M1 = {
meta = {
description = lib.options.create {
@ -54,7 +53,8 @@ in {
config = {
aux.foundation.stages.stage0.M1 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "M1";
version = "1.6.0";
@ -62,7 +62,8 @@ in {
executable = hex2-1.package;
args = let
args =
let
M1-macro_M1 = builders.raw.build {
pname = "M1-macro_M1";
version = "1.6.0";
@ -113,16 +114,10 @@ in {
executable = blood-elf.package;
args =
(lib.lists.when (config.aux.platform.bits == 64) "--64")
++ [
args = (lib.lists.when (config.aux.platform.bits == 64) "--64") ++ [
"-f"
M1-macro_M1
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-o"
(builtins.placeholder "out")
];
@ -138,11 +133,7 @@ in {
args = [
"--architecture"
architecture.m2libc
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-f"
"${sources.m2libc}/${architecture.m2libc}/${architecture.m2libc}_defs.M1"
"-f"
@ -155,23 +146,21 @@ in {
(builtins.placeholder "out")
];
};
in [
in
[
"--architecture"
architecture.m2libc
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"--base-address"
(
if config.aux.system == "x86_64-linux"
then "0x00600000"
else if config.aux.system == "aarch64-linux"
then "0x00600000"
else if config.aux.system == "i686-linux"
then "0x08048000"
else builtins.throw "Unsupported system: ${config.aux.system}"
if config.aux.system == "x86_64-linux" then
"0x00600000"
else if config.aux.system == "aarch64-linux" then
"0x00600000"
else if config.aux.system == "i686-linux" then
"0x08048000"
else
builtins.throw "Unsupported system: ${config.aux.system}"
)
"-f"
"${sources.m2libc}/${architecture.m2libc}/ELF-${architecture.m2libc}-debug.hex2"
@ -180,7 +169,8 @@ in {
"-o"
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.hex2;
hex0 = config.aux.foundation.stages.stage0.hex0;
catm = config.aux.foundation.stages.stage0.catm;
@ -16,7 +14,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.hex2 = {
meta = {
description = lib.options.create {
@ -53,7 +52,8 @@ in {
config = {
aux.foundation.stages.stage0.hex2 = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "hex2";
version = "1.6.0";
@ -61,7 +61,8 @@ in {
executable = hex2-1.package;
args = let
args =
let
hex2_linker_M1 = builders.raw.build {
pname = "hex2_linker_M1";
version = "1.6.0";
@ -114,16 +115,10 @@ in {
executable = blood-elf.package;
args =
(lib.lists.when (config.aux.platform.bits == 64) "--64")
++ [
args = (lib.lists.when (config.aux.platform.bits == 64) "--64") ++ [
"-f"
hex2_linker_M1
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-o"
(builtins.placeholder "out")
];
@ -139,11 +134,7 @@ in {
args = [
"--architecture"
architecture.m2libc
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-f"
"${sources.m2libc}/${architecture.m2libc}/${architecture.m2libc}_defs.M1"
"-f"
@ -156,23 +147,21 @@ in {
(builtins.placeholder "out")
];
};
in [
in
[
"--architecture"
architecture.m2libc
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"--base-address"
(
if config.aux.system == "x86_64-linux"
then "0x00600000"
else if config.aux.system == "aarch64-linux"
then "0x00600000"
else if config.aux.system == "i686-linux"
then "0x08048000"
else builtins.throw "Unsupported system: ${config.aux.system}"
if config.aux.system == "x86_64-linux" then
"0x00600000"
else if config.aux.system == "aarch64-linux" then
"0x00600000"
else if config.aux.system == "i686-linux" then
"0x08048000"
else
builtins.throw "Unsupported system: ${config.aux.system}"
)
"-f"
"${sources.m2libc}/${architecture.m2libc}/ELF-${architecture.m2libc}-debug.hex2"
@ -181,7 +170,8 @@ in {
"-o"
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage0.kaem-unwrapped;
hex0 = config.aux.foundation.stages.stage0.hex0;
catm = config.aux.foundation.stages.stage0.catm;
@ -16,7 +14,8 @@
builders = config.aux.foundation.builders;
sources = config.aux.foundation.stages.stage0.sources;
architecture = config.aux.foundation.stages.stage0.architecture;
in {
in
{
options.aux.foundation.stages.stage0.kaem-unwrapped = {
meta = {
description = lib.options.create {
@ -53,7 +52,8 @@ in {
config = {
aux.foundation.stages.stage0.kaem-unwrapped = {
package = lib.modules.overrides.default (builders.raw.build {
package = lib.modules.overrides.default (
builders.raw.build {
pname = "kaem-unwrapped";
version = "1.6.0";
@ -61,7 +61,8 @@ in {
executable = hex2.package;
args = let
args =
let
kaem_M1 = builders.raw.build {
pname = "kaem_M1";
version = "1.6.0";
@ -116,16 +117,10 @@ in {
executable = blood-elf.package;
args =
(lib.lists.when (config.aux.platform.bits == 64) "--64")
++ [
args = (lib.lists.when (config.aux.platform.bits == 64) "--64") ++ [
"-f"
kaem_M1
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-o"
(builtins.placeholder "out")
];
@ -141,11 +136,7 @@ in {
args = [
"--architecture"
architecture.m2libc
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"-f"
"${sources.m2libc}/${architecture.m2libc}/${architecture.m2libc}_defs.M1"
"-f"
@ -158,23 +149,21 @@ in {
(builtins.placeholder "out")
];
};
in [
in
[
"--architecture"
architecture.m2libc
(
if config.aux.platform.endian == "little"
then "--little-endian"
else "--big-endian"
)
(if config.aux.platform.endian == "little" then "--little-endian" else "--big-endian")
"--base-address"
(
if config.aux.system == "x86_64-linux"
then "0x00600000"
else if config.aux.system == "aarch64-linux"
then "0x00600000"
else if config.aux.system == "i686-linux"
then "0x08048000"
else builtins.throw "Unsupported system: ${config.aux.system}"
if config.aux.system == "x86_64-linux" then
"0x00600000"
else if config.aux.system == "aarch64-linux" then
"0x00600000"
else if config.aux.system == "i686-linux" then
"0x08048000"
else
builtins.throw "Unsupported system: ${config.aux.system}"
)
"-f"
"${sources.m2libc}/${architecture.m2libc}/ELF-${architecture.m2libc}-debug.hex2"
@ -183,7 +172,8 @@ in {
"-o"
(builtins.placeholder "out")
];
});
}
);
};
};
}

View file

@ -1,11 +1,10 @@
{
lib,
config,
}: let
{ lib, config }:
let
system = config.aux.system;
architecture = config.aux.foundation.stages.stage0.architecture.base;
in {
in
{
options.aux.foundation.stages.stage0.sources = {
base = lib.options.create {
type = lib.types.string;
@ -44,27 +43,25 @@ in {
# fetching that, we are instead fetching each submodule directly. The central repository is located
# here: https://github.com/oriansj/stage0-posix
base =
if architecture == "AMD64"
then
if architecture == "AMD64" then
builtins.fetchTarball {
url = "https://github.com/oriansj/stage0-posix-amd64/archive/93fbe4c08772d8df1412e2554668e24cf604088c.tar.gz";
sha256 = "10d1xnjzqplpfip3pm89bydd501x1bcgkg7lkkadyq5bqpad5flp";
}
else if architecture == "AArch64"
then
else if architecture == "AArch64" then
# FIXME: We may need to patch the aarch64 variant.
# https://github.com/oriansj/M2libc/pull/17
builtins.fetchTarball {
url = "https://github.com/oriansj/stage0-posix-aarch64/archive/39a43f803d572b53f95d42507202152eeda18361.tar.gz";
sha256 = "1x607hr3n5j89394d156r23igpx8hifjd14ygksx7902rlwrrry2";
}
else if architecture == "x86"
then
else if architecture == "x86" then
builtins.fetchTarball {
url = "https://github.com/oriansj/stage0-posix-x86/archive/e86bf7d304bae5ce5ccc88454bb60cf0837e941f.tar.gz";
sha256 = "1c1fk793yzq8zbg60n2zd22fsmirc3zr26fj0iskap456g84nxv8";
}
else builtins.throw "Unsupported architecture for stage0: ${architecture}";
else
builtins.throw "Unsupported architecture for stage0: ${architecture}";
m2libc = builtins.fetchTarball {
url = "https://github.com/oriansj/M2libc/archive/de7c75f144176c3b9be77695d9bf94440445aeae.tar.gz";

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.bash.boot;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.bash.boot = {
meta = {
description = lib.options.create {
@ -61,7 +60,8 @@ in {
sha256 = "1r1z2qdw3rz668nxrzwa14vk2zcn00hw7mpjn384picck49d80xs";
};
package = let
package =
let
# Thanks to the live-bootstrap project!
# See https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/bash-2.05b/bash-2.05b.kaem
liveBootstrap = "https://github.com/fosslinux/live-bootstrap/raw/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/bash-2.05b";

View file

@ -1,17 +1,14 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.bash;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
includes = [
./boot.nix
];
in
{
includes = [ ./boot.nix ];
options.aux.foundation.stages.stage1.bash = {
meta = {
@ -72,7 +69,8 @@ in {
sha256 = "132qng0jy600mv1fs95ylnlisx2wavkkgpb19c6kmz7lnmjhjwhk";
};
package = let
package =
let
patches = [
# flush output for generated code
./patches/mksignames-flush.patch

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.binutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.binutils = {
meta = {
description = lib.options.create {
@ -62,7 +61,8 @@ in {
sha256 = "rppXieI0WeWWBuZxRyPy0//DHAMXQZHvDQFb3wYAdFA=";
};
package = let
package =
let
patches = [
# Make binutils output deterministic by default.
./patches/deterministic.patch

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.bison;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.bison = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.bzip2;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.bzip2 = {
meta = {
description = lib.options.create {

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.coreutils.boot;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.coreutils.boot = {
package = lib.options.create {
type = lib.types.derivation;
@ -34,7 +33,8 @@ in {
sha256 = "10wq6k66i8adr4k08p0xmg87ff4ypiazvwzlmi7myib27xgffz62";
};
package = let
package =
let
# Thanks to the live-bootstrap project!
# See https://github.com/fosslinux/live-bootstrap/blob/a8752029f60217a5c41c548b16f5cdd2a1a0e0db/sysa/coreutils-5.0/coreutils-5.0.kaem
liveBootstrap = "https://github.com/fosslinux/live-bootstrap/raw/a8752029f60217a5c41c548b16f5cdd2a1a0e0db/sysa/coreutils-5.0";

View file

@ -1,17 +1,14 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.coreutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
includes = [
./boot.nix
];
in
{
includes = [ ./boot.nix ];
options.aux.foundation.stages.stage1.coreutils = {
meta = {
@ -66,7 +63,8 @@ in {
sha256 = "X2ANkJOXOwr+JTk9m8GMRPIjJlf0yg2V6jHHAutmtzk=";
};
package = let
package =
let
configureFlags = [
"--prefix=${builtins.placeholder "out"}"
"--build=${platform.build}"

View file

@ -1,11 +1,10 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
includes = [
./nyacc
./mes

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.diffutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.diffutils = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.findutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.findutils = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gawk.boot;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gawk.boot = {
package = lib.options.create {
type = lib.types.derivation;
@ -35,7 +34,8 @@ in {
sha256 = "1z4bibjm7ldvjwq3hmyifyb429rs2d9bdwkvs0r171vv1khpdwmb";
};
package = let
package =
let
patches = [
# for reproducibility don't generate date stamp
./patches/no-stamp.patch

View file

@ -1,17 +1,14 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gawk;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
includes = [
./boot.nix
];
in
{
includes = [ ./boot.nix ];
options.aux.foundation.stages.stage1.gawk = {
meta = {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gcc;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
includes = [
./v4.6.nix
./v4.6.cxx.nix

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gcc.v46.cxx;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gcc.v46.cxx = {
package = lib.options.create {
type = lib.types.derivation;
@ -112,7 +111,8 @@ in {
};
};
package = let
package =
let
patches = [
# Remove hardcoded NATIVE_SYSTEM_HEADER_DIR
./patches/no-system-headers.patch

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gcc.v46;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gcc.v46 = {
package = lib.options.create {
type = lib.types.derivation;
@ -112,7 +111,8 @@ in {
};
};
package = let
package =
let
patches = [
# Remove hardcoded NATIVE_SYSTEM_HEADER_DIR
./patches/no-system-headers.patch

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gcc.v8;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gcc.v8 = {
package = lib.options.create {
type = lib.types.derivation;

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnugrep;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gnugrep = {
meta = {
description = lib.options.create {
@ -67,7 +66,8 @@ in {
sha256 = "05iayw5sfclc476vpviz67hdy03na0pz2kb5csa50232nfx34853";
};
package = let
package =
let
# Thanks to the live-bootstrap project!
# See https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/grep-2.4
makefile = builtins.fetchurl {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnum4;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gnum4 = {
meta = {
description = lib.options.create {

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnumake.boot;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gnumake.boot = {
package = lib.options.create {
type = lib.types.derivation;
@ -34,7 +33,8 @@ in {
sha256 = "1cwgcmwdn7gqn5da2ia91gkyiqs9birr10sy5ykpkaxzcwfzn5nx";
};
package = let
package =
let
patches = [
# Replaces /bin/sh with sh, see patch file for reasoning
./patches/0001-No-impure-bin-sh.patch
@ -114,8 +114,7 @@ in {
"-Dvfork=fork"
];
cflags =
[
cflags = [
"-I./src"
"-I./lib"
"-DHAVE_CONFIG_H"
@ -127,8 +126,7 @@ in {
"-DNO_OUTPUT_SYNC=1"
# mes-libc doesn't define O_TMPFILE
"-DO_TMPFILE=020000000"
]
++ config;
] ++ config;
sources = {
# Maintenance note: list of source files derived from Basic.mk
@ -166,27 +164,14 @@ in {
"lib/fnmatch.c"
"lib/glob.c"
];
remote = [
"src/remote-stub.c"
];
remote = [ "src/remote-stub.c" ];
};
files =
sources.make
++ sources.glob
++ sources.remote
++ [
"src/posixos.c"
];
files = sources.make ++ sources.glob ++ sources.remote ++ [ "src/posixos.c" ];
objects =
builtins.map
(
value:
builtins.replaceStrings [".c"] [".o"]
(builtins.baseNameOf value)
)
files;
objects = builtins.map (
value: builtins.replaceStrings [ ".c" ] [ ".o" ] (builtins.baseNameOf value)
) files;
in
builders.kaem.build {
name = "gnumake-${cfg.version}";

View file

@ -1,17 +1,14 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnumake;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
includes = [
./boot.nix
];
in
{
includes = [ ./boot.nix ];
options.aux.foundation.stages.stage1.gnumake = {
meta = {
@ -66,7 +63,8 @@ in {
sha256 = "3Rb7HWe/q3mnL16DkHNcSePo5wtJRaFasfgd23hlj7M=";
};
package = let
package =
let
patches = [
# Replaces /bin/sh with sh, see patch file for reasoning
./patches/0001-No-impure-bin-sh.patch

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnupatch;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gnupatch = {
meta = {
description = lib.options.create {
@ -61,7 +60,8 @@ in {
sha256 = "12nv7jx3gxfp50y11nxzlnmqqrpicjggw6pcsq0wyavkkm3cddgc";
};
package = let
package =
let
# Thanks to the live-bootstrap project!
# https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/patch-2.5.9/mk/main.mk
cflags = [
@ -110,23 +110,14 @@ in {
"xmalloc.c"
];
sources =
files
++ [
sources = files ++ [
# mes-libc doesn't implement `error()`
"error.c"
];
objects =
builtins.map
(
value:
builtins.replaceStrings
[".c"]
[".o"]
(builtins.baseNameOf value)
)
sources;
objects = builtins.map (
value: builtins.replaceStrings [ ".c" ] [ ".o" ] (builtins.baseNameOf value)
) sources;
in
builders.kaem.build {
name = "gnupatch-${cfg.version}";
@ -134,9 +125,7 @@ in {
meta = cfg.meta;
src = cfg.src;
deps.build.host = [
stage1.tinycc.mes.compiler.package
];
deps.build.host = [ stage1.tinycc.mes.compiler.package ];
script = ''
# Unpack

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnused.boot;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gnused.boot = {
package = lib.options.create {
type = lib.types.derivation;
@ -34,7 +33,8 @@ in {
sha256 = "0006gk1dw2582xsvgx6y6rzs9zw8b36rhafjwm288zqqji3qfrf3";
};
package = let
package =
let
# Thanks to the live-bootstrap project!
# See https://github.com/fosslinux/live-bootstrap/blob/1bc4296091c51f53a5598050c8956d16e945b0f5/sysa/sed-4.0.9/sed-4.0.9.kaem
makefile = builtins.fetchurl {

View file

@ -1,17 +1,14 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnused;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
includes = [
./boot.nix
];
in
{
includes = [ ./boot.nix ];
options.aux.foundation.stages.stage1.gnused = {
meta = {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnutar.boot;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gnutar.boot = {
package = lib.options.create {
type = lib.types.derivation;
@ -35,7 +34,8 @@ in {
sha256 = "02m6gajm647n8l9a5bnld6fnbgdpyi4i3i83p7xcwv0kif47xhy6";
};
package = let
package =
let
in
builders.bash.boot.build {
name = "gnutar-boot-${cfg.version}";

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnutar;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
includes = [
./boot.nix
./musl.nix

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gnutar.musl;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gnutar.musl = {
package = lib.options.create {
type = lib.types.derivation;

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.gzip;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.gzip = {
meta = {
description = lib.options.create {
@ -61,7 +60,8 @@ in {
sha256 = "0ryr5b00qz3xcdcv03qwjdfji8pasp0007ay3ppmk71wl8c1i90w";
};
package = let
package =
let
in
builders.bash.boot.build {
name = "gzip-${cfg.version}";

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.heirloom;
platform = config.aux.platform;
@ -9,10 +7,9 @@
stage1 = config.aux.foundation.stages.stage1;
stage2 = config.aux.foundation.stages.stage2;
in {
includes = [
./devtools.nix
];
in
{
includes = [ ./devtools.nix ];
options.aux.foundation.stages.stage1.heirloom = {
meta = {
@ -77,7 +74,8 @@ in {
sha256 = "6zP3C8wBmx0OCkHx11UtRcV6FicuThxIY07D5ESWow8=";
};
package = let
package =
let
patches = [
# we pre-generate nawk's proctab.c as meslibc is not capable of running maketab
# during build time (insufficient sscanf support)

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.heirloom.devtools;
platform = config.aux.platform;
@ -10,7 +8,8 @@
stage0 = config.aux.foundation.stages.stage0;
stage1 = config.aux.foundation.stages.stage1;
stage2 = config.aux.foundation.stages.stage2;
in {
in
{
options.aux.foundation.stages.stage1.heirloom.devtools = {
package = lib.options.create {
type = lib.types.derivation;
@ -68,7 +67,8 @@ in {
sha256 = "9f233d8b78e4351fe9dd2d50d83958a0e5af36f54e9818521458a08e058691ba";
};
package = let
package =
let
# Thanks to the live-bootstrap project!
# See https://github.com/fosslinux/live-bootstrap/blob/d918b984ad6fe4fc7680f3be060fd82f8c9fddd9/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem
liveBootstrap = "https://github.com/fosslinux/live-bootstrap/raw/d918b984ad6fe4fc7680f3be060fd82f8c9fddd9/sysa/heirloom-devtools-070527";

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.linux-headers;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.linux-headers = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.ln-boot;
builders = config.aux.foundation.builders;
stage0 = config.aux.foundation.stages.stage0;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.ln-boot = {
meta = {
description = lib.options.create {

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.mes.compiler;
system = config.aux.system;
@ -9,7 +7,8 @@
stage0 = config.aux.foundation.stages.stage0;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.mes.compiler = {
meta = {
description = lib.options.create {
@ -46,8 +45,11 @@ in {
config = {
aux.foundation.stages.stage1.mes.compiler = {
package = let
compile = path: let
package =
let
compile =
path:
let
file = builtins.baseNameOf path;
fileWithoutExtension = builtins.replaceStrings [ ".c" ] [ "" ] file;
@ -79,11 +81,9 @@ in {
sources = import ./sources.nix;
files =
lib.strings.concatMapSep
" "
(getSourcePath ".o")
(builtins.map compile sources.x86.linux.mescc.mes);
files = lib.strings.concatMapSep " " (getSourcePath ".o") (
builtins.map compile sources.x86.linux.mescc.mes
);
in
builders.kaem.build {
name = "mes-${stage1.mes.version}";

View file

@ -1,12 +1,11 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.mes;
system = config.aux.system;
builders = config.aux.foundation.builders;
in {
in
{
includes = [
./compiler.nix
./libs.nix

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.mes.libc;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.mes.libc = {
meta = {
description = lib.options.create {
@ -44,7 +43,8 @@ in {
config = {
aux.foundation.stages.stage1.mes.libc = {
package = let
package =
let
sources = import ./sources.nix;
libtcc1 = sources.x86.linux.gcc.libtcc1;
@ -57,9 +57,7 @@ in {
meta = cfg.meta;
deps.build.host = [
stage1.ln-boot.package
];
deps.build.host = [ stage1.ln-boot.package ];
script = ''
cd ${stage1.mes.libs.prefix}

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.mes.libs;
system = config.aux.system;
@ -9,7 +7,8 @@
stage0 = config.aux.foundation.stages.stage0;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.mes.libs = {
meta = {
description = lib.options.create {
@ -58,7 +57,8 @@ in {
aux.foundation.stages.stage1.mes.libs = {
prefix = "${cfg.src.out}/mes-${stage1.mes.version}";
src = let
src =
let
config_h = builtins.toFile "config.h" ''
#undef SYSTEM_LIBC
#define MES_VERSION "${stage1.mes.version}"
@ -140,8 +140,11 @@ in {
'';
};
package = let
compile = path: let
package =
let
compile =
path:
let
file = builtins.baseNameOf path;
fileWithoutExtension = builtins.replaceStrings [ ".c" ] [ "" ] file;
@ -171,10 +174,16 @@ in {
getSourcePath = suffix: source: "${source}/${source.name}${suffix}";
archive = destination: sources: "catm ${destination} ${lib.strings.concatMapSep " " (getSourcePath ".o") sources}";
source = destination: sources: "catm ${destination} ${lib.strings.concatMapSep " " (getSourcePath ".s") sources}";
archive =
destination: sources:
"catm ${destination} ${lib.strings.concatMapSep " " (getSourcePath ".o") sources}";
source =
destination: sources:
"catm ${destination} ${lib.strings.concatMapSep " " (getSourcePath ".s") sources}";
createLib = name: sources: let
createLib =
name: sources:
let
compiled = builtins.map compile sources;
in
builders.kaem.build {
@ -199,11 +208,13 @@ in {
libc-mini = createLib "libc-mini" sources.x86.linux.mescc.libc_mini;
libmescc = createLib "libmescc" sources.x86.linux.mescc.libmescc;
libc = createLib "libc" sources.x86.linux.mescc.libc;
libc_tcc = createLib "libc+tcc" (sources.x86.linux.mescc.libc_tcc
libc_tcc = createLib "libc+tcc" (
sources.x86.linux.mescc.libc_tcc
++ [
# We need `symlink` support for `ln-boot` to work.
"lib/linux/symlink.c"
]);
]
);
in
builders.kaem.build {
name = "mes-m2-libs-${stage1.mes.version}";

View file

@ -18,9 +18,7 @@
"lib/mes/globals.c"
"lib/linux/x86-mes-mescc/syscall-internal.c"
];
libtcc1 = [
"lib/libtcc1.c"
];
libtcc1 = [ "lib/libtcc1.c" ];
libc = [
"lib/mes/__init_io.c"
"lib/mes/eputs.c"
@ -546,9 +544,7 @@
"lib/mes/globals.c"
"lib/linux/x86-mes-gcc/syscall-internal.c"
];
libtcc1 = [
"lib/libtcc1.c"
];
libtcc1 = [ "lib/libtcc1.c" ];
libc = [
"lib/mes/__init_io.c"
"lib/mes/eputs.c"

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.musl.boot;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.musl.boot = {
package = lib.options.create {
type = lib.types.derivation;
@ -35,7 +34,8 @@ in {
sha256 = "E3DJqBKyzyp9koAlEMygBYzDfmanvt1wBR8KNAFQIqM=";
};
package = let
package =
let
# Thanks to the live-bootstrap project!
# See https://github.com/fosslinux/live-bootstrap/blob/d98f97e21413efc32c770d0356f1feda66025686/sysa/musl-1.1.24/musl-1.1.24.sh
liveBootstrap = "https://github.com/fosslinux/live-bootstrap/raw/d98f97e21413efc32c770d0356f1feda66025686/sysa/musl-1.1.24";

View file

@ -1,17 +1,14 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.musl;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
includes = [
./boot.nix
];
in
{
includes = [ ./boot.nix ];
options.aux.foundation.stages.stage1.musl = {
meta = {

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.nyacc;
builders = config.aux.foundation.builders;
@ -10,7 +8,8 @@
pname = "nyacc";
version = "1.00.2";
in {
in
{
options.aux.foundation.stages.stage1.nyacc = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.python;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.python = {
meta = {
description = lib.options.create {
@ -62,7 +61,8 @@ in {
sha256 = "eVw09E30Wg6blxDIxxwVxnGHFSTNQSyhTe8hLozLFV0=";
};
package = let
package =
let
patches = [
# Disable the use of ldconfig in ctypes.util.find_library (since
# ldconfig doesn't work on NixOS), and don't use

View file

@ -1,7 +1,5 @@
args @ {
lib,
config,
}: let
args@{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.tinycc.boot;
builders = config.aux.foundation.builders;
@ -11,7 +9,8 @@ args @ {
pname = "tinycc-boot";
helpers = lib.fp.withDynamicArgs (import ./helpers.nix) args;
in {
in
{
options.aux.foundation.stages.stage1.tinycc.boot = {
meta = {
description = lib.options.create {
@ -36,7 +35,10 @@ in {
platforms = lib.options.create {
type = lib.types.list.of lib.types.string;
description = "Platforms the package supports.";
default.value = ["x86_64-linux" "i686-linux"];
default.value = [
"x86_64-linux"
"i686-linux"
];
};
};
@ -66,8 +68,10 @@ in {
};
config = {
aux.foundation.stages.stage1.tinycc.boot = let
tinycc-boot = let
aux.foundation.stages.stage1.tinycc.boot =
let
tinycc-boot =
let
tinycc-mes-bootstrappable = helpers.createBoot {
pname = "tinycc-mes-bootstrappable";
version = stage1.tinycc.version;
@ -82,9 +86,7 @@ in {
"-D HAVE_LONG_LONG_STUB=1"
"-D HAVE_SETJMP=1"
];
lib.args = [
"-D HAVE_LONG_LONG_STUB=1"
];
lib.args = [ "-D HAVE_LONG_LONG_STUB=1" ];
boot = tinycc-mes-bootstrappable;
meta = cfg.meta;
};
@ -98,9 +100,7 @@ in {
"-D HAVE_LONG_LONG=1"
"-D HAVE_SETJMP=1"
];
lib.args = [
"-D HAVE_LONG_LONG=1"
];
lib.args = [ "-D HAVE_LONG_LONG=1" ];
boot = tinycc-boot0;
meta = cfg.meta;
};
@ -158,13 +158,15 @@ in {
boot = tinycc-boot3;
meta = cfg.meta;
};
in {
in
{
revision = "80114c4da6b17fbaabb399cc29f427e368309bc8";
libs.package = tinycc-boot.libs;
compiler.package = tinycc-boot.compiler;
src = let
src =
let
tarball = builtins.fetchurl {
url = "https://gitlab.com/janneke/tinycc/-/archive/${cfg.revision}/tinycc-${cfg.revision}.tar.gz";
sha256 = "1a0cw9a62qc76qqn5sjmp3xrbbvsz2dxrw21lrnx9q0s74mwaxbq";
@ -188,7 +190,8 @@ in {
replace --file libtcc.c --output libtcc.c --match-on "s->ms_extensions = 1;" --replace-with "s->ms_extensions = 1; s->static_link = 1;"
'';
};
in "${patched}/tinycc-${cfg.revision}";
in
"${patched}/tinycc-${cfg.revision}";
};
};
}

View file

@ -1,13 +1,12 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.tinycc;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
includes = [
./boot.nix
./mes.nix

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.tinycc.boot;
builders = config.aux.foundation.builders;
@ -9,11 +7,13 @@
stage1 = config.aux.foundation.stages.stage1;
cflags = stage1.mes.libc.package.extras.CFLAGS;
createBoot = {
createBoot =
{
pname,
version,
src,
}: let
}:
let
compiler = builders.kaem.build {
name = "${pname}-${version}";
@ -57,9 +57,13 @@
args = cflags;
tinycc = compiler;
};
in {inherit compiler libs;};
in
{
inherit compiler libs;
};
createTinyccMes = {
createTinyccMes =
{
pname,
version,
src,
@ -67,7 +71,8 @@
boot,
lib ? { },
meta,
}: let
}:
let
compiler = builders.kaem.build {
name = "${pname}-${version}";
@ -108,28 +113,33 @@
libs = createLibc {
inherit pname version src;
args =
builtins.concatStringsSep
" "
(
["-c" "-D" "TCC_TARGET_I386=1"]
args = builtins.concatStringsSep " " (
[
"-c"
"-D"
"TCC_TARGET_I386=1"
]
++ (lib.args or [ ])
);
tinycc = compiler;
};
in {
in
{
inherit compiler libs boot;
};
createLibc = {
createLibc =
{
pname,
version,
src,
args,
tinycc,
}: let
createLibrary = name: args: source:
}:
let
createLibrary =
name: args: source:
builders.kaem.build {
name = "${name}.a";
@ -167,10 +177,7 @@
cp ${libgetopt} ''${out}/lib/libgetopt.a
'';
};
in {
inherit
createBoot
createTinyccMes
createLibc
;
in
{
inherit createBoot createTinyccMes createLibc;
}

View file

@ -1,7 +1,5 @@
args @ {
lib,
config,
}: let
args@{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.tinycc.mes;
builders = config.aux.foundation.builders;
@ -11,7 +9,8 @@ args @ {
pname = "tinycc-mes";
helpers = lib.fp.withDynamicArgs (import ./helpers.nix) args;
in {
in
{
options.aux.foundation.stages.stage1.tinycc.mes = {
compiler = {
package = lib.options.create {
@ -39,8 +38,10 @@ in {
};
config = {
aux.foundation.stages.stage1.tinycc.mes = let
tinycc-mes = let
aux.foundation.stages.stage1.tinycc.mes =
let
tinycc-mes =
let
tccdefs = builders.kaem.build {
name = "tccdefs-${stage1.tinycc.version}";
@ -106,13 +107,15 @@ in {
boot = tinycc-mes-boot;
meta = stage1.tinycc.meta;
};
in {
in
{
revision = "86f3d8e33105435946383aee52487b5ddf918140";
libs.package = tinycc-mes.libs;
compiler.package = tinycc-mes.compiler;
src = let
src =
let
tarball = builtins.fetchurl {
url = "https://repo.or.cz/tinycc.git/snapshot/${cfg.revision}.tar.gz";
sha256 = "11idrvbwfgj1d03crv994mpbbbyg63j1k64lw1gjy7mkiifw2xap";
@ -136,7 +139,8 @@ in {
replace --file libtcc.c --output libtcc.c --match-on "s->ms_extensions = 1;" --replace-with "s->ms_extensions = 1; s->static_link = 1;"
'';
};
in "${patched}/tinycc-${builtins.substring 0 7 cfg.revision}";
in
"${patched}/tinycc-${builtins.substring 0 7 cfg.revision}";
};
};
}

View file

@ -1,7 +1,5 @@
args @ {
lib,
config,
}: let
args@{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.tinycc.musl;
builders = config.aux.foundation.builders;
@ -11,7 +9,8 @@ args @ {
pname = "tinycc-musl";
helpers = lib.fp.withDynamicArgs (import ./helpers.nix) args;
in {
in
{
options.aux.foundation.stages.stage1.tinycc.musl = {
compiler = {
package = lib.options.create {
@ -39,7 +38,8 @@ in {
};
config = {
aux.foundation.stages.stage1.tinycc.musl = let
aux.foundation.stages.stage1.tinycc.musl =
let
patches = [
./patches/ignore-duplicate-symbols.patch
./patches/ignore-static-inside-array.patch
@ -141,7 +141,8 @@ in {
install -Dm444 libtcc1.a $out/lib/libtcc1.a
'';
};
in {
in
{
revision = "fd6d2180c5c801bb0b4c5dde27d61503059fc97d";
src = builtins.fetchurl {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.xz;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.xz = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage1.zlib;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage1.zlib = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.bash;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.bash = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.binutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.binutils = {
meta = {
description = lib.options.create {
@ -62,7 +61,8 @@ in {
sha256 = "rppXieI0WeWWBuZxRyPy0//DHAMXQZHvDQFb3wYAdFA=";
};
package = let
package =
let
patches = [
# Make binutils output deterministic by default.
./patches/deterministic.patch

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.busybox;
platform = config.aux.platform;
@ -9,7 +7,8 @@
stage1 = config.aux.foundation.stages.stage1;
stage2 = config.aux.foundation.stages.stage2;
in {
in
{
options.aux.foundation.stages.stage2.busybox = {
meta = {
description = lib.options.create {
@ -63,10 +62,9 @@ in {
sha256 = "uMwkyVdNgJ5yecO+NJeVxdXOtv3xnKcJ+AzeUOR94xQ=";
};
package = let
patches = [
./patches/busybox-in-store.patch
];
package =
let
patches = [ ./patches/busybox-in-store.patch ];
busyboxConfig = [
"CC=musl-gcc"

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.bzip2;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.bzip2 = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.coreutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.coreutils = {
meta = {
description = lib.options.create {
@ -62,7 +61,8 @@ in {
sha256 = "X2ANkJOXOwr+JTk9m8GMRPIjJlf0yg2V6jHHAutmtzk=";
};
package = let
package =
let
configureFlags = [
"--prefix=${builtins.placeholder "out"}"
"--build=${platform.build}"

View file

@ -1,9 +1,8 @@
{
lib,
config,
}: let
{ lib, config }:
let
stage2 = config.aux.foundation.stages.stage2;
in {
in
{
includes = [
./bash
./binutils

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.diffutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.diffutils = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.findutils;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.findutils = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gawk;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.gawk = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gcc;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.gcc = {
meta = {
description = lib.options.create {

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.glibc;
platform = config.aux.platform;
@ -9,7 +7,8 @@
stage1 = config.aux.foundation.stages.stage1;
stage2 = config.aux.foundation.stages.stage2;
in {
in
{
options.aux.foundation.stages.stage2.glibc = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gnugrep;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.gnugrep = {
meta = {
description = lib.options.create {

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gnumake;
platform = config.aux.platform;
@ -9,7 +7,8 @@
stage1 = config.aux.foundation.stages.stage1;
stage2 = config.aux.foundation.stages.stage2;
in {
in
{
options.aux.foundation.stages.stage2.gnumake = {
meta = {
description = lib.options.create {
@ -63,7 +62,8 @@ in {
sha256 = "3Rb7HWe/q3mnL16DkHNcSePo5wtJRaFasfgd23hlj7M=";
};
package = let
package =
let
patches = [
# Replaces /bin/sh with sh, see patch file for reasoning
./patches/0001-No-impure-bin-sh.patch

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gnupatch;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.gnupatch = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gnused;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.gnused = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gnutar;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.gnutar = {
meta = {
description = lib.options.create {

View file

@ -1,14 +1,13 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.gzip;
platform = config.aux.platform;
builders = config.aux.foundation.builders;
stage1 = config.aux.foundation.stages.stage1;
in {
in
{
options.aux.foundation.stages.stage2.gzip = {
meta = {
description = lib.options.create {

View file

@ -1,7 +1,5 @@
{
lib,
config,
}: let
{ lib, config }:
let
cfg = config.aux.foundation.stages.stage2.patchelf;
platform = config.aux.platform;
@ -9,7 +7,8 @@
stage1 = config.aux.foundation.stages.stage1;
stage2 = config.aux.foundation.stages.stage2;
in {
in
{
options.aux.foundation.stages.stage2.patchelf = {
meta = {
description = lib.options.create {

View file

@ -1,4 +1,5 @@
{lib}: {
{ lib }:
{
options.aux = {
system = lib.options.create {
type = lib.types.string;

View file

@ -25,53 +25,50 @@ let
./src/versions/default.test.nix
];
resolve = file: let
resolve =
file:
let
imported = import file;
value =
if builtins.isFunction imported
then imported {inherit lib;}
else imported;
value = if builtins.isFunction imported then imported { inherit lib; } else imported;
relative = lib.strings.removePrefix (builtins.toString root) (builtins.toString file);
in {
in
{
inherit file value;
relative =
if lib.strings.hasPrefix "/" relative
then "." + relative
else relative;
relative = if lib.strings.hasPrefix "/" relative then "." + relative else relative;
namespace = getNamespace file;
};
resolved = builtins.map resolve files;
getNamespace = path: let
getNamespace =
path:
let
relative = lib.strings.removePrefix (builtins.toString root) (builtins.toString path);
parts = lib.strings.split "/" relative;
in
if builtins.length parts > 2
then builtins.elemAt parts 2
else relative;
if builtins.length parts > 2 then builtins.elemAt parts 2 else relative;
results = let
getTests = file: prefix: suite: let
results =
let
getTests =
file: prefix: suite:
let
nested = lib.attrs.mapToList (name: value: getTests file (prefix ++ [ name ]) value) suite;
relative = lib.strings.removePrefix (builtins.toString root) (builtins.toString file);
in
if builtins.isAttrs suite
then builtins.concatLists nested
else [
if builtins.isAttrs suite then
builtins.concatLists nested
else
[
{
inherit prefix file;
name = builtins.concatStringsSep " > " prefix;
value = suite;
relative =
if lib.strings.hasPrefix "/" relative
then "." + relative
else relative;
relative = if lib.strings.hasPrefix "/" relative then "." + relative else relative;
}
];
base =
builtins.map (entry: getTests entry.file [entry.namespace] entry.value) resolved;
base = builtins.map (entry: getTests entry.file [ entry.namespace ] entry.value) resolved;
in
builtins.concatLists base;
@ -80,29 +77,23 @@ let
total = "${builtins.toString (builtins.length successes)} / ${builtins.toString (builtins.length results)}";
in
if failures == []
then let
message =
lib.strings.concatMapSep "\n"
(test: " ${test.name}")
successes;
in ''
if failures == [ ] then
let
message = lib.strings.concatMapSep "\n" (test: " ${test.name}") successes;
in
''
SUCCESS (${total})
${message}
''
else let
successMessage =
lib.strings.concatMapSep "\n"
(test: " ${test.name}")
successes;
failureMessage =
lib.strings.concatMapSep "\n\n"
(test:
" ${test.name}\n"
+ " -> ${test.relative}")
failures;
in ''
else
let
successMessage = lib.strings.concatMapSep "\n" (test: " ${test.name}") successes;
failureMessage = lib.strings.concatMapSep "\n\n" (
test: " ${test.name}\n" + " -> ${test.relative}"
) failures;
in
''
FAILURE (${total})
${failureMessage}

View file

@ -1,7 +1,5 @@
{
description = "A NixPkgs library replacement containing helper functions and a module system.";
outputs = _: {
lib = import ./src;
};
outputs = _: { lib = import ./src; };
}

View file

@ -10,66 +10,76 @@ lib: {
## from `y` first if it exists and then `x` otherwise.
##
## @type Attrs a b c => (String -> Any -> Any -> Bool) -> a -> b -> c
mergeRecursiveUntil = predicate: x: y: let
process = path:
mergeRecursiveUntil =
predicate: x: y:
let
process =
path:
builtins.zipAttrsWith (
name: values: let
name: values:
let
currentPath = path ++ [ name ];
isSingleValue = builtins.length values == 1;
isComplete =
predicate currentPath
(builtins.elemAt values 1)
(builtins.elemAt values 0);
isComplete = predicate currentPath (builtins.elemAt values 1) (builtins.elemAt values 0);
in
if isSingleValue
then builtins.elemAt values 0
else if isComplete
then builtins.elemAt values 1
else process currentPath values
if isSingleValue then
builtins.elemAt values 0
else if isComplete then
builtins.elemAt values 1
else
process currentPath values
);
in
process [] [x y];
process [ ] [
x
y
];
## Merge two attribute sets recursively. Any values that are _not_ attribute sets
## will be overridden with the value from `y` first if it exists and then `x`
## otherwise.
##
## @type Attrs a b c => a -> b -> c
mergeRecursive =
lib.attrs.mergeRecursiveUntil
(path: x: y:
!(builtins.isAttrs x && builtins.isAttrs y));
mergeRecursive = lib.attrs.mergeRecursiveUntil (
path: x: y:
!(builtins.isAttrs x && builtins.isAttrs y)
);
## Get a value from an attribute set by a path. If the path does not exist,
## a fallback value will be returned instead.
##
## @type (List String) -> a -> Attrs -> a | b
select = path: fallback: target: let
select =
path: fallback: target:
let
name = builtins.head path;
rest = builtins.tail path;
in
if path == []
then target
else if target ? ${name}
then lib.attrs.select rest fallback target.${name}
else fallback;
if path == [ ] then
target
else if target ? ${name} then
lib.attrs.select rest fallback target.${name}
else
fallback;
## Get a value from an attribute set by a path. If the path does not exist,
## an error will be thrown.
##
## @type (List String) -> Attrs -> a
selectOrThrow = path: target: let
selectOrThrow =
path: target:
let
pathAsString = builtins.concatStringsSep "." path;
error = builtins.throw "Path not found in attribute set: ${pathAsString}";
in
if lib.attrs.has path target
then lib.attrs.select path null target
else error;
if lib.attrs.has path target then lib.attrs.select path null target else error;
## Zip specific attributes from a list of attribute sets.
##
## @type List String -> (List Any -> Any) -> List Attrs -> Attrs
zipWithNames = names: f: list: let
zipWithNames =
names: f: list:
let
transform = name: {
inherit name;
value = f name (builtins.catAttrs name list);
@ -81,18 +91,26 @@ lib: {
## Match an attribute set against a pattern.
##
## @type Attrs -> Attrs -> Bool
match = pattern: value: let
process = name: values: let
match =
pattern: value:
let
process =
name: values:
let
first = builtins.elemAt values 0;
second = builtins.elemAt values 1;
in
if builtins.length values == 1
then false
else if builtins.isAttrs first
then builtins.isAttrs second && lib.attrs.match first second
else first == second;
if builtins.length values == 1 then
false
else if builtins.isAttrs first then
builtins.isAttrs second && lib.attrs.match first second
else
first == second;
result = lib.attrs.zipWithNames (builtins.attrNames pattern) process [pattern value];
result = lib.attrs.zipWithNames (builtins.attrNames pattern) process [
pattern
value
];
in
assert lib.errors.trace (builtins.isAttrs pattern) "Pattern must be an attribute set";
assert lib.errors.trace (builtins.isAttrs value) "Value must be an attribute set";
@ -101,62 +119,62 @@ lib: {
## Create a nested attribute set with a value as the leaf node.
##
## @type (List String) -> a -> Attrs
set = path: value: let
set =
path: value:
let
length = builtins.length path;
process = depth:
if depth == length
then value
else {
${builtins.elemAt path depth} = process (depth + 1);
};
process =
depth: if depth == length then value else { ${builtins.elemAt path depth} = process (depth + 1); };
in
process 0;
## Check if a path exists in an attribute set.
##
## @type (List String) -> Attrs -> Bool
has = path: target: let
has =
path: target:
let
name = builtins.head path;
rest = builtins.tail path;
in
if path == []
then true
else if target ? ${name}
then lib.attrs.has rest target.${name}
else false;
if path == [ ] then
true
else if target ? ${name} then
lib.attrs.has rest target.${name}
else
false;
## Depending on a given condition, either use the given value or an empty
## attribute set.
##
## @type Attrs a b => Bool -> a -> a | b
when = condition: value:
if condition
then value
else {};
when = condition: value: if condition then value else { };
## Map an attribute set's names and values to a list.
##
## @type Any a => (String -> Any -> a) -> Attrs -> List a
mapToList = f: target:
builtins.map (name: f name target.${name}) (builtins.attrNames target);
mapToList = f: target: builtins.map (name: f name target.${name}) (builtins.attrNames target);
## Map an attribute set recursively. Only non-set leaf nodes will be mapped.
##
## @type (List String -> Any -> Any) -> Attrs -> Attrs
mapRecursive = f: target:
lib.attrs.mapRecursiveWhen (lib.fp.const true) f target;
mapRecursive = f: target: lib.attrs.mapRecursiveWhen (lib.fp.const true) f target;
## Map an attribute set recursively when a given predicate returns true.
## Only leaf nodes according to the predicate will be mapped.
##
## @type (Attrs -> Bool) -> (List String -> Any -> Any) -> Attrs -> Attrs
mapRecursiveWhen = predicate: f: target: let
process = path:
mapRecursiveWhen =
predicate: f: target:
let
process =
path:
builtins.mapAttrs (
name: value:
if builtins.isAttrs value && predicate value
then process (path ++ [name]) value
else f (path ++ [name]) value
if builtins.isAttrs value && predicate value then
process (path ++ [ name ]) value
else
f (path ++ [ name ]) value
);
in
process [ ] target;
@ -165,14 +183,16 @@ lib: {
## on the base level of the attribute set.
##
## @type (String -> Any -> Bool) -> Attrs -> Attrs
filter = predicate: target: let
filter =
predicate: target:
let
names = builtins.attrNames target;
process = name: let
process =
name:
let
value = target.${name};
in
if predicate name value
then [{inherit name value;}]
else [];
if predicate name value then [ { inherit name value; } ] else [ ];
valid = builtins.concatMap process names;
in
builtins.listToAttrs valid;
@ -181,13 +201,13 @@ lib: {
## applied to each name.
##
## @type (List String) -> (String -> Any) -> Attrs
generate = names: f: let
pairs =
builtins.map (name: {
generate =
names: f:
let
pairs = builtins.map (name: {
inherit name;
value = f name;
})
names;
}) names;
in
builtins.listToAttrs pairs;
};

View file

@ -1,8 +1,10 @@
let
lib = import ./../default.nix;
in {
in
{
"merge" = {
"merges two shallow sets" = let
"merges two shallow sets" =
let
expected = {
x = 1;
y = 2;
@ -12,7 +14,8 @@ in {
in
expected == actual;
"overwrites values from the first set" = let
"overwrites values from the first set" =
let
expected = {
x = 2;
};
@ -20,7 +23,8 @@ in {
in
actual == expected;
"does not merge nested sets" = let
"does not merge nested sets" =
let
expected = {
x.y = 2;
};
@ -30,25 +34,29 @@ in {
};
"mergeRecursiveUntil" = {
"merges with predicate" = let
"merges with predicate" =
let
expected = {
x.y.z = 1;
};
actual =
lib.attrs.mergeRecursiveUntil
(path: x: y: lib.lists.last path == "z")
{x.y.z = 2;}
{x.y.z = 1;};
actual = lib.attrs.mergeRecursiveUntil (
path: x: y:
lib.lists.last path == "z"
) { x.y.z = 2; } { x.y.z = 1; };
in
actual == expected;
"handles shallow merges" = let
"handles shallow merges" =
let
expected = {
x.y.z = 1;
};
actual =
lib.attrs.mergeRecursiveUntil
(path: x: y: true)
(
path: x: y:
true
)
{
x = {
y.z = 2;
@ -62,32 +70,30 @@ in {
};
"mergeRecursive" = {
"merges two sets deeply" = let
"merges two sets deeply" =
let
expected = {
x.y.z = 1;
};
actual =
lib.attrs.mergeRecursive
{x.y.z = 2;}
{x.y.z = 1;};
actual = lib.attrs.mergeRecursive { x.y.z = 2; } { x.y.z = 1; };
in
actual == expected;
};
"select" = {
"selects a nested value" = let
"selects a nested value" =
let
expected = "value";
actual =
lib.attrs.select
["x" "y" "z"]
null
{
x.y.z = expected;
};
actual = lib.attrs.select [
"x"
"y"
"z"
] null { x.y.z = expected; };
in
actual == expected;
"handles empty path" = let
"handles empty path" =
let
expected = {
x = {
y = {
@ -95,11 +101,7 @@ in {
};
};
};
actual =
lib.attrs.select
[]
null
{
actual = lib.attrs.select [ ] null {
x = {
y = {
z = 1;
@ -109,30 +111,32 @@ in {
in
actual == expected;
"handles fallback value" = let
"handles fallback value" =
let
expected = "fallback";
actual =
lib.attrs.select
["x" "y" "z"]
expected
{};
actual = lib.attrs.select [
"x"
"y"
"z"
] expected { };
in
actual == expected;
};
"selectOrThrow" = {
"selects a nested value" = let
"selects a nested value" =
let
expected = "value";
actual =
lib.attrs.selectOrThrow
["x" "y" "z"]
{
x.y.z = expected;
};
actual = lib.attrs.selectOrThrow [
"x"
"y"
"z"
] { x.y.z = expected; };
in
actual == expected;
"handles empty path" = let
"handles empty path" =
let
expected = {
x = {
y = {
@ -140,10 +144,7 @@ in {
};
};
};
actual =
lib.attrs.selectOrThrow
[]
{
actual = lib.attrs.selectOrThrow [ ] {
x = {
y = {
z = 1;
@ -153,11 +154,13 @@ in {
in
actual == expected;
"throws on nonexistent path" = let
actual =
lib.attrs.selectOrThrow
["x" "y" "z"]
{};
"throws on nonexistent path" =
let
actual = lib.attrs.selectOrThrow [
"x"
"y"
"z"
] { };
evaluated = builtins.tryEval (builtins.deepSeq actual actual);
in
@ -165,7 +168,8 @@ in {
};
"set" = {
"creates a nested set" = let
"creates a nested set" =
let
expected = {
x = {
y = {
@ -173,11 +177,16 @@ in {
};
};
};
actual = lib.attrs.set ["x" "y" "z"] 1;
actual = lib.attrs.set [
"x"
"y"
"z"
] 1;
in
actual == expected;
"handles empty path" = let
"handles empty path" =
let
expected = 1;
actual = lib.attrs.set [ ] 1;
in
@ -185,30 +194,43 @@ in {
};
"has" = {
"returns true for a nested value" = let
exists = lib.attrs.has ["x" "y" "z"] {x.y.z = 1;};
"returns true for a nested value" =
let
exists = lib.attrs.has [
"x"
"y"
"z"
] { x.y.z = 1; };
in
exists;
"returns false for a nonexistent value" = let
exists = lib.attrs.has ["x" "y" "z"] {};
"returns false for a nonexistent value" =
let
exists = lib.attrs.has [
"x"
"y"
"z"
] { };
in
!exists;
"handles empty path" = let
"handles empty path" =
let
exists = lib.attrs.has [ ] { };
in
exists;
};
"when" = {
"returns the value when condition is true" = let
"returns the value when condition is true" =
let
expected = "value";
actual = lib.attrs.when true expected;
in
actual == expected;
"returns an empty set when condition is false" = let
"returns an empty set when condition is false" =
let
expected = { };
actual = lib.attrs.when false "value";
in
@ -216,7 +238,8 @@ in {
};
"mapToList" = {
"converts a set to a list" = let
"converts a set to a list" =
let
expected = [
{
name = "x";
@ -227,10 +250,7 @@ in {
value = 2;
}
];
actual =
lib.attrs.mapToList
(name: value: {inherit name value;})
{
actual = lib.attrs.mapToList (name: value: { inherit name value; }) {
x = 1;
y = 2;
};
@ -239,7 +259,8 @@ in {
};
"mapRecursiveWhen" = {
"maps a set recursively" = let
"maps a set recursively" =
let
expected = {
x = {
y = {
@ -247,11 +268,7 @@ in {
};
};
};
actual =
lib.attrs.mapRecursiveWhen
(value: true)
(path: value: value + 1)
{
actual = lib.attrs.mapRecursiveWhen (value: true) (path: value: value + 1) {
x = {
y = {
z = 1;
@ -261,7 +278,8 @@ in {
in
actual == expected;
"maps a set given a condition" = let
"maps a set given a condition" =
let
expected = {
x = {
y = {
@ -270,13 +288,12 @@ in {
};
};
actual =
lib.attrs.mapRecursiveWhen
(value: !(value ? z))
(path: value:
lib.attrs.mapRecursiveWhen (value: !(value ? z))
(
path: value:
# We map before we get to a non-set value
if builtins.isAttrs value
then value
else value + 1)
if builtins.isAttrs value then value else value + 1
)
{
x = {
y = {
@ -289,7 +306,8 @@ in {
};
"mapRecursive" = {
"maps a set recursively" = let
"maps a set recursively" =
let
expected = {
x = {
y = {
@ -297,10 +315,7 @@ in {
};
};
};
actual =
lib.attrs.mapRecursive
(path: value: value + 1)
{
actual = lib.attrs.mapRecursive (path: value: value + 1) {
x = {
y = {
z = 1;
@ -312,14 +327,12 @@ in {
};
"filter" = {
"filters a set" = let
"filters a set" =
let
expected = {
y = 2;
};
actual =
lib.attrs.filter
(name: value: name == "y")
{
actual = lib.attrs.filter (name: value: name == "y") {
x = 1;
y = 2;
};

Some files were not shown because too many files have changed in this diff Show more