Compare commits

..

No commits in common. "93157512205af050b96e9f84ce7d90f425906c51" and "af571a03a4c37f98e44aa4ab37d499a7ffc0c77c" have entirely different histories.

15 changed files with 2325 additions and 2372 deletions

View file

@ -4,184 +4,166 @@ lib: {
## Merge a list of option definitions into a single value. ## Merge a list of option definitions into a single value.
## ##
## @type Location -> List Definition -> Any ## @type Location -> List Definition -> Any
default = default = location: definitions: let
location: definitions: values = lib.options.getDefinitionValues definitions;
let first = builtins.elemAt values 0;
values = lib.options.getDefinitionValues definitions; mergedFunctions = x: lib.options.mergeDefault location (builtins.map (f: f x) values);
first = builtins.elemAt values 0; mergedLists = builtins.concatLists values;
mergedFunctions = x: lib.options.mergeDefault location (builtins.map (f: f x) values); mergedAttrs = builtins.foldl' lib.attrs.merge {} values;
mergedLists = builtins.concatLists values; mergedBools = builtins.any lib.bools.or false values;
mergedAttrs = builtins.foldl' lib.attrs.merge { } values; mergedStrings = lib.strings.concat values;
mergedBools = builtins.any lib.bools.or false values; in
mergedStrings = lib.strings.concat values; if builtins.length values == 1
in then builtins.elemAt values 0
if builtins.length values == 1 then else if builtins.all builtins.isFunction values
builtins.elemAt values 0 then mergedFunctions
else if builtins.all builtins.isFunction values then else if builtins.all builtins.isList values
mergedFunctions then mergedLists
else if builtins.all builtins.isList values then else if builtins.all builtins.isAttrs values
mergedLists then mergedAttrs
else if builtins.all builtins.isAttrs values then else if builtins.all builtins.isBool values
mergedAttrs then mergedBools
else if builtins.all builtins.isBool values then else if builtins.all lib.strings.isString values
mergedBools then mergedStrings
else if builtins.all lib.strings.isString values then else if builtins.all builtins.isInt values && builtins.all (x: x == first) values
mergedStrings then first
else if builtins.all builtins.isInt values && builtins.all (x: x == first) values then
first
# TODO: Improve this error message to show the location and definitions for the option. # TODO: Improve this error message to show the location and definitions for the option.
else else builtins.throw "Cannot merge definitions.";
builtins.throw "Cannot merge definitions.";
## Merge multiple option definitions together. ## Merge multiple option definitions together.
## ##
## @type Location -> Type -> List Definition ## @type Location -> Type -> List Definition
definitions = definitions = location: type: definitions: let
location: type: definitions: identifier = lib.options.getIdentifier location;
let resolve = definition: let
identifier = lib.options.getIdentifier location; properties = builtins.addErrorContext "while evaluating definitions from `${definition.__file__ or "<unknown>"}`:" (
resolve = lib.modules.apply.properties definition.value
definition: );
let normalize = value: {
properties = builtins.addErrorContext "while evaluating definitions from `${definition.__file__ or "<unknown>"}`:" ( __file__ = definition.__file__;
lib.modules.apply.properties definition.value inherit value;
);
normalize = value: {
__file__ = definition.__file__;
inherit value;
};
in
builtins.map normalize properties;
resolved = builtins.concatMap resolve definitions;
overridden = lib.modules.apply.overrides resolved;
values =
if builtins.any (definition: lib.types.is "order" definition.value) overridden.values then
lib.modules.apply.order overridden.values
else
overridden.values;
isDefined = values != [ ];
invalid = builtins.filter (definition: !(type.check definition.value)) values;
merged =
if isDefined then
if builtins.all (definition: type.check definition.value) values then
type.merge location values
else
builtins.throw "A definition for `${identifier}` is not of type `${type.description}`. Definition values:${lib.options.getDefinitions invalid}"
else
builtins.throw "The option `${identifier}` is used but not defined.";
optional = if isDefined then { value = merged; } else { };
in
{
inherit
isDefined
values
merged
optional
;
raw = {
inherit values;
inherit (overridden) highestPriority;
}; };
in
builtins.map normalize properties;
resolved = builtins.concatMap resolve definitions;
overridden = lib.modules.apply.overrides resolved;
values =
if builtins.any (definition: lib.types.is "order" definition.value) overridden.values
then lib.modules.apply.order overridden.values
else overridden.values;
isDefined = values != [];
invalid = builtins.filter (definition: !(type.check definition.value)) values;
merged =
if isDefined
then
if builtins.all (definition: type.check definition.value) values
then type.merge location values
else builtins.throw "A definition for `${identifier}` is not of type `${type.description}`. Definition values:${lib.options.getDefinitions invalid}"
else builtins.throw "The option `${identifier}` is used but not defined.";
optional =
if isDefined
then {value = merged;}
else {};
in {
inherit
isDefined
values
merged
optional
;
raw = {
inherit values;
inherit (overridden) highestPriority;
}; };
};
## Merge multiple option declarations together. ## Merge multiple option declarations together.
## ##
## @type Location -> List Option ## @type Location -> List Option
declarations = declarations = location: options: let
location: options: merge = result: option: let
let mergedType = result.type.mergeType option.options.type.functor;
merge = isTypeMergeable = mergedType != null;
result: option: shared = name: option.options ? ${name} && result ? ${name};
let typeSet = lib.attrs.when ((shared "type") && isTypeMergeable) {type = mergedType;};
mergedType = result.type.mergeType option.options.type.functor; files = result.declarations;
isTypeMergeable = mergedType != null; serializedFiles = builtins.concatStringsSep " and " files;
shared = name: option.options ? ${name} && result ? ${name}; getSubModules = option.options.type.getSubModules or null;
typeSet = lib.attrs.when ((shared "type") && isTypeMergeable) { type = mergedType; }; submodules =
files = result.declarations; if getSubModules != null
serializedFiles = builtins.concatStringsSep " and " files;
getSubModules = option.options.type.getSubModules or null;
submodules =
if getSubModules != null then
builtins.map (module: {
__file__ = option.__file__;
includes = [ module ];
}) getSubModules
++ result.options
else
result.options;
in
if
shared "default"
|| shared "example"
|| shared "description"
|| shared "apply"
|| (shared "type" && !isTypeMergeable)
then then
builtins.throw "The option `${lib.options.getIdentifier location}` in `${option.__file__}` is already declared in ${serializedFiles}" builtins.map (module: {
else __file__ = option.__file__;
option.options includes = [module];
// result })
// { getSubModules
declarations = result.declarations ++ [ option.__file__ ]; ++ result.options
options = submodules; else result.options;
}
// typeSet;
in in
if
shared "default"
|| shared "example"
|| shared "description"
|| shared "apply"
|| (shared "type" && !isTypeMergeable)
then builtins.throw "The option `${lib.options.getIdentifier location}` in `${option.__file__}` is already declared in ${serializedFiles}"
else
option.options
// result
// {
declarations = result.declarations ++ [option.__file__];
options = submodules;
}
// typeSet;
in
builtins.foldl' merge { builtins.foldl' merge {
inherit location; inherit location;
declarations = [ ]; declarations = [];
options = [ ]; options = [];
} options; }
options;
## Merge an option, only supporting a single unique definition. ## Merge an option, only supporting a single unique definition.
## ##
## @type String -> Location -> List Definition -> Any ## @type String -> Location -> List Definition -> Any
unique = unique = message: location: definitions: let
message: location: definitions: identifier = lib.options.getIdentifier location;
let total = builtins.length definitions;
identifier = lib.options.getIdentifier location; first = builtins.elemAt definitions 0;
total = builtins.length definitions; in
first = builtins.elemAt definitions 0; if total == 1
in then first.value
if total == 1 then else if total == 0
first.value then builtins.throw "Cannot merge unused option `${identifier}`.\n${message}"
else if total == 0 then else builtins.throw "The option `${identifier}` is defined multiple times, but must be unique.\n${message}\nDefinitions:${lib.options.getDefinitions definitions}";
builtins.throw "Cannot merge unused option `${identifier}`.\n${message}"
else
builtins.throw "The option `${identifier}` is defined multiple times, but must be unique.\n${message}\nDefinitions:${lib.options.getDefinitions definitions}";
## Merge a single instance of an option. ## Merge a single instance of an option.
## ##
## @type Location -> List Definition -> Any ## @type Location -> List Definition -> Any
one = lib.options.merge.unique ""; one = lib.options.merge.unique "";
equal = equal = location: definitions: let
location: definitions: identifier = lib.options.getIdentifier location;
let first = builtins.elemAt definitions 0;
identifier = lib.options.getIdentifier location; rest = builtins.tail definitions;
first = builtins.elemAt definitions 0; merge = x: y:
rest = builtins.tail definitions; if x != y
merge = then builtins.throw "The option `${identifier}` has conflicting definitions:${lib.options.getDefinitions definitions}"
x: y: else x;
if x != y then merged = builtins.foldl' merge first rest;
builtins.throw "The option `${identifier}` has conflicting definitions:${lib.options.getDefinitions definitions}" in
else if builtins.length definitions == 0
x; then builtins.throw "Cannot merge unused option `${identifier}`."
merged = builtins.foldl' merge first rest; else if builtins.length definitions == 1
in then first.value
if builtins.length definitions == 0 then else merged.value;
builtins.throw "Cannot merge unused option `${identifier}`."
else if builtins.length definitions == 1 then
first.value
else
merged.value;
}; };
## Check whether a value is an option. ## Check whether a value is an option.
@ -192,50 +174,46 @@ lib: {
## Create an option. ## Create an option.
## ##
## @type { type? :: String | Null, apply? :: (a -> b) | Null, default? :: { value :: a, text :: String }, example? :: String | Null, visible? :: Bool | Null, internal? :: Bool | Null, writable? :: Bool | Null, description? :: String | Null } -> Option a ## @type { type? :: String | Null, apply? :: (a -> b) | Null, default? :: { value :: a, text :: String }, example? :: String | Null, visible? :: Bool | Null, internal? :: Bool | Null, writable? :: Bool | Null, description? :: String | Null } -> Option a
create = create = settings @ {
settings@{ type ? lib.types.unspecified,
type ? lib.types.unspecified, apply ? null,
apply ? null, default ? {},
default ? { }, example ? null,
example ? null, visible ? null,
visible ? null, internal ? null,
internal ? null, writable ? null,
writable ? null, description ? null,
description ? null, }: {
}: __type__ = "option";
{ inherit
__type__ = "option"; type
inherit apply
type default
apply example
default visible
example internal
visible writable
internal description
writable ;
description };
;
};
## Create a sink option. ## Create a sink option.
## ##
## @type @alias lib.options.create ## @type @alias lib.options.create
sink = sink = settings: let
settings: defaults = {
let internal = true;
defaults = { visible = false;
internal = true; default = false;
visible = false; description = "A sink option for unused definitions";
default = false; type = lib.types.create {
description = "A sink option for unused definitions"; name = "sink";
type = lib.types.create { check = lib.fp.const true;
name = "sink"; merge = lib.fp.const (lib.fp.const false);
check = lib.fp.const true;
merge = lib.fp.const (lib.fp.const false);
};
apply = value: builtins.throw "Cannot read the value of a Sink option.";
}; };
in apply = value: builtins.throw "Cannot read the value of a Sink option.";
};
in
lib.options.create (defaults // settings); lib.options.create (defaults // settings);
## Get the definition values from a list of options definitions. ## Get the definition values from a list of options definitions.
@ -246,94 +224,93 @@ lib: {
## Convert a list of option identifiers into a single identifier. ## Convert a list of option identifiers into a single identifier.
## ##
## @type List String -> String ## @type List String -> String
getIdentifier = getIdentifier = location: let
location: special = [
let # lib.types.attrs.of (lib.types.submodule {})
special = [ "<name>"
# lib.types.attrs.of (lib.types.submodule {}) # lib.types.list.of (submodule {})
"<name>" "*"
# lib.types.list.of (submodule {}) # lib.types.function
"*" "<function body>"
# lib.types.function ];
"<function body>" escape = part:
]; if builtins.elem part special
escape = part: if builtins.elem part special then part else lib.strings.escape.nix.identifier part; then part
in else lib.strings.escape.nix.identifier part;
in
lib.strings.concatMapSep "." escape location; lib.strings.concatMapSep "." escape location;
## Get a string message of the definitions for an option. ## Get a string message of the definitions for an option.
## ##
## @type List Definition -> String ## @type List Definition -> String
getDefinitions = getDefinitions = definitions: let
definitions: serialize = definition: let
let valueWithRecursionLimit =
serialize = lib.generators.withRecursion {
definition: limit = 10;
let throw = false;
valueWithRecursionLimit = lib.generators.withRecursion { }
limit = 10; definition.value;
throw = false;
} definition.value;
eval = builtins.tryEval (lib.generators.pretty { } valueWithRecursionLimit); eval = builtins.tryEval (lib.generators.pretty {} valueWithRecursionLimit);
lines = lib.strings.split "\n" eval.value; lines = lib.strings.split "\n" eval.value;
linesLength = builtins.length lines; linesLength = builtins.length lines;
firstFiveLines = lib.lists.take 5 lines; firstFiveLines = lib.lists.take 5 lines;
ellipsis = lib.lists.when (linesLength > 5) "..."; ellipsis = lib.lists.when (linesLength > 5) "...";
value = builtins.concatStringsSep "\n " (firstFiveLines ++ ellipsis); value = builtins.concatStringsSep "\n " (firstFiveLines ++ ellipsis);
result = result =
if !eval.success then if !eval.success
"" then ""
else if linesLength > 1 then else if linesLength > 1
":\n " + value then ":\n " + value
else else ": " + value;
": " + value; in "\n- In `${definition.__file__}`${result}";
in in
"\n- In `${definition.__file__}`${result}";
in
lib.strings.concatMap serialize definitions; lib.strings.concatMap serialize definitions;
## Run a set of definitions, calculating the resolved value and associated information. ## Run a set of definitions, calculating the resolved value and associated information.
## ##
## @type Location -> Option -> List Definition -> String & { value :: Any, highestPriority :: Int, isDefined :: Bool, files :: List String, definitions :: List Any, definitionsWithLocations :: List Definition } ## @type Location -> Option -> List Definition -> String & { value :: Any, highestPriority :: Int, isDefined :: Bool, files :: List String, definitions :: List Any, definitionsWithLocations :: List Definition }
run = run = location: option: definitions: let
location: option: definitions: identifier = lib.options.getIdentifier location;
let
identifier = lib.options.getIdentifier location;
definitionsWithDefault = definitionsWithDefault =
if option ? default && option.default ? value then if option ? default && option.default ? value
[ then
{ [
__file__ = builtins.head option.declarations; {
value = lib.modules.overrides.option option.default.value; __file__ = builtins.head option.declarations;
} value = lib.modules.overrides.option option.default.value;
] }
++ definitions ]
else ++ definitions
definitions; else definitions;
merged = merged =
if option.writable or null == false && builtins.length definitionsWithDefault > 1 then if option.writable or null == false && builtins.length definitionsWithDefault > 1
let then let
separatedDefinitions = builtins.map ( separatedDefinitions =
definition: builtins.map (
definition:
definition definition
// { // {
value = (lib.options.merge.definitions location option.type [ definition ]).merged; value = (lib.options.merge.definitions location option.type [definition]).merged;
} }
) definitionsWithDefault; )
in definitionsWithDefault;
builtins.throw "The option `${identifier}` is not writable, but is set more than once:${lib.options.getDefinitions separatedDefinitions}" in
else builtins.throw "The option `${identifier}` is not writable, but is set more than once:${lib.options.getDefinitions separatedDefinitions}"
lib.options.merge.definitions location option.type definitionsWithDefault; else lib.options.merge.definitions location option.type definitionsWithDefault;
value = if option.apply or null != null then option.apply merged.merged else merged.merged; value =
in if option.apply or null != null
then option.apply merged.merged
else merged.merged;
in
option option
// { // {
value = builtins.addErrorContext "while evaluating the option `${identifier}`:" value; value = builtins.addErrorContext "while evaluating the option `${identifier}`:" value;

File diff suppressed because it is too large Load diff

View file

@ -1,85 +1,88 @@
{ lib, config }: {
let lib,
config,
}: let
cfg = config.builders.basic; cfg = config.builders.basic;
lib' = config.lib; lib' = config.lib;
inherit (config) foundation; inherit (config) foundation;
in in {
{
config.builders = { config.builders = {
basic = { basic = {
executable = "${foundation.stage2-bash}/bin/bash"; executable = "${foundation.stage2-bash}/bin/bash";
build = build = package: let
package: phases = lib.dag.apply.defaults package.phases {
let unpack = lib.dag.entry.before ["patch"] "";
phases = lib.dag.apply.defaults package.phases {
unpack = lib.dag.entry.before [ "patch" ] "";
patch = lib.dag.entry.between [ "configure" ] [ "unpack" ] ""; patch = lib.dag.entry.between ["configure"] ["unpack"] "";
configure = lib.dag.entry.between [ "build" ] [ "patch" ] ""; configure = lib.dag.entry.between ["build"] ["patch"] "";
build = lib.dag.entry.between [ "install" ] [ "configure" ] ""; build = lib.dag.entry.between ["install"] ["configure"] "";
install = lib.dag.entry.after [ "build" ] ""; install = lib.dag.entry.after ["build"] "";
}; };
sorted = lib.dag.sort.topographic phases; sorted = lib.dag.sort.topographic phases;
script = lib.strings.concatMapSep "\n" ( script =
entry: if builtins.isFunction entry.value then entry.value package else entry.value lib.strings.concatMapSep "\n" (
) sorted.result; entry:
if builtins.isFunction entry.value
then entry.value package
else entry.value
)
sorted.result;
system = package.platform.build.double; system = package.platform.build.double;
built = builtins.derivation ( built = builtins.derivation (
package.env package.env
// { // {
inherit (package) name; inherit (package) name;
inherit script system; inherit script system;
passAsFile = [ "script" ]; passAsFile = ["script"];
SHELL = cfg.executable; SHELL = cfg.executable;
PATH = PATH = let
let bins = lib.paths.bin (
bins = lib.paths.bin ( (lib'.packages.dependencies.getPackages package.deps.build.host)
(lib'.packages.dependencies.getPackages package.deps.build.host) ++ [
++ [ foundation.stage2-bash
foundation.stage2-bash foundation.stage2-coreutils
foundation.stage2-coreutils ]
] );
); in
in builtins.concatStringsSep ":" (
builtins.concatStringsSep ":" ( [bins] ++ (lib.lists.when (package.env ? PATH) [package.env.PATH])
[ bins ] ++ (lib.lists.when (package.env ? PATH) [ package.env.PATH ]) );
);
builder = cfg.executable; builder = cfg.executable;
args = [ args = [
"-e" "-e"
(builtins.toFile "bash-builder.sh" '' (builtins.toFile "bash-builder.sh" ''
export CONFIG_SHELL=$SHELL export CONFIG_SHELL=$SHELL
# Normalize the NIX_BUILD_CORES variable. The value might be 0, which # Normalize the NIX_BUILD_CORES variable. The value might be 0, which
# means that we're supposed to try and auto-detect the number of # means that we're supposed to try and auto-detect the number of
# available CPU cores at run-time. # available CPU cores at run-time.
NIX_BUILD_CORES="''${NIX_BUILD_CORES:-1}" NIX_BUILD_CORES="''${NIX_BUILD_CORES:-1}"
if ((NIX_BUILD_CORES <= 0)); then if ((NIX_BUILD_CORES <= 0)); then
guess=$(nproc 2>/dev/null || true) guess=$(nproc 2>/dev/null || true)
((NIX_BUILD_CORES = guess <= 0 ? 1 : guess)) ((NIX_BUILD_CORES = guess <= 0 ? 1 : guess))
fi fi
export NIX_BUILD_CORES export NIX_BUILD_CORES
bash -eux $scriptPath bash -eux $scriptPath
'') '')
]; ];
} }
); );
in in
built built
// { // {
inherit (package) meta; inherit (package) meta;

View file

@ -1,10 +1,8 @@
# This file handles creating all of the exports for this project and is not # This file handles creating all of the exports for this project and is not
# exported itself. # exported itself.
{ config }: {config}: let
let
inherit (config) lib; inherit (config) lib;
in in {
{
# freeform = lib.types.any; # freeform = lib.types.any;
config = { config = {
@ -26,7 +24,6 @@ in
# .config; # .config;
foundation-gcc = config.packages.foundation.gcc; foundation-gcc = config.packages.foundation.gcc;
foundation-binutils = config.packages.foundation.binutils; foundation-binutils = config.packages.foundation.binutils;
foundation-linux-headers = config.packages.foundation.linux-headers;
# foundation-linux-headers = config.packages.foundation.linux-headers.versions.latest.extend { # foundation-linux-headers = config.packages.foundation.linux-headers.versions.latest.extend {
# platform.host = lib.modules.overrides.force "x86_64-linux"; # platform.host = lib.modules.overrides.force "x86_64-linux";
# }; # };

View file

@ -1,7 +1,8 @@
{ lib, config }:
let
in
{ {
lib,
config,
}: let
in {
config = { config = {
lib.options = { lib.options = {
package = lib.options.create { package = lib.options.create {

View file

@ -1,62 +1,56 @@
{ lib, config }:
let
lib' = config.lib;
in
{ {
lib,
config,
}: let
lib' = config.lib;
in {
config = { config = {
lib.packages = { lib.packages = {
dependencies = { dependencies = {
getPackages = getPackages = dependencies: let
dependencies: available = builtins.filter (dependency: !(builtins.isNull dependency)) (
let builtins.attrValues dependencies
available = builtins.filter (dependency: !(builtins.isNull dependency)) ( );
builtins.attrValues dependencies in
);
in
builtins.map (dependency: dependency.package) available; builtins.map (dependency: dependency.package) available;
build = build = build': host': target':
build': host': target': builtins.mapAttrs
builtins.mapAttrs (name: dep: lib'.packages.build dep build' host' target'); (name: dep: lib'.packages.build dep build' host' target');
}; };
getLatest = getLatest = alias: let
alias: versions = builtins.attrNames alias.versions;
let sorted = builtins.sort (lib.versions.gte) versions;
versions = builtins.attrNames alias.versions; in
sorted = builtins.sort (lib.versions.gte) versions;
in
builtins.head sorted; builtins.head sorted;
resolve = resolve = alias:
alias: if alias ? versions
if alias ? versions then then
alias.versions.${config.preferences.packages.version} alias.versions.${config.preferences.packages.version}
or (alias.versions.${lib'.packages.getLatest alias}) or (alias.versions.${lib'.packages.getLatest alias})
else else alias;
alias;
build = build = alias: build: host: target: let
alias: build: host: target: package = lib'.packages.resolve alias;
let
package = lib'.packages.resolve alias;
buildDependencies = buildDependencies = build': host': target':
build': host': target': builtins.mapAttrs (name: dep: lib'.packages.build dep build' host' target');
builtins.mapAttrs (name: dep: lib'.packages.build dep build' host' target');
platform = { platform = {
build = lib.modules.overrides.force build; build = lib.modules.overrides.force build;
host = lib.modules.overrides.force host; host = lib.modules.overrides.force host;
target = lib.modules.overrides.force target; target = lib.modules.overrides.force target;
}; };
withPlatform = lib.modules.run { withPlatform = lib.modules.run {
modules = package.__modules__ ++ [ modules =
package.__modules__
++ [
lib'.types.package.children.submodule lib'.types.package.children.submodule
( (
{ config }: {config}: {
{
config = { config = {
__modules__ = package.__modules__; __modules__ = package.__modules__;
@ -65,12 +59,14 @@ in
} }
) )
]; ];
}; };
# Not all platform information can be effectively handled via submodules. To handle # Not all platform information can be effectively handled via submodules. To handle
# the case where a user copies the resolved config over we need to ensure that # the case where a user copies the resolved config over we need to ensure that
# dependencies are appropriately updated. # dependencies are appropriately updated.
withDeps = withPlatform.config // { withDeps =
withPlatform.config
// {
deps = { deps = {
build = { build = {
only = buildDependencies build build build withPlatform.config.deps.build.only; only = buildDependencies build build build withPlatform.config.deps.build.only;
@ -90,12 +86,13 @@ in
}; };
}; };
withPackage = lib.modules.run { withPackage = lib.modules.run {
modules = package.__modules__ ++ [ modules =
package.__modules__
++ [
lib'.types.package.children.submodule lib'.types.package.children.submodule
( (
{ config }: {config}: {
{
config = { config = {
__modules__ = package.__modules__; __modules__ = package.__modules__;
@ -108,8 +105,8 @@ in
} }
) )
]; ];
}; };
in in
withPackage.config; withPackage.config;
}; };
}; };

File diff suppressed because it is too large Load diff

View file

@ -1,64 +1,65 @@
{ lib, config }: {
let lib,
config,
}: let
inherit (config) preferences builders; inherit (config) preferences builders;
lib' = config.lib; lib' = config.lib;
in in {
{
config = { config = {
lib.types = { lib.types = {
license = license = let
let type = lib.types.submodule (
type = lib.types.submodule ( {config}: {
{ config }: options = {
{ name = {
options = { full = lib.options.create {
name = { description = "The full name of the license.";
full = lib.options.create { type = lib.types.string;
description = "The full name of the license.";
type = lib.types.string;
};
short = lib.options.create {
description = "The short name of the license.";
type = lib.types.string;
};
}; };
spdx = lib.options.create { short = lib.options.create {
description = "The SPDX identifier for the license."; description = "The short name of the license.";
type = lib.types.nullish lib.types.string; type = lib.types.string;
default.value = null;
};
url = lib.options.create {
description = "The URL for the license.";
type = lib.types.nullish lib.types.string;
};
free = lib.options.create {
description = "Whether the license is free.";
type = lib.types.bool;
default.value = true;
};
redistributable = lib.options.create {
description = "Whether the license is allows redistribution.";
type = lib.types.bool;
default = {
text = "config.free";
value = config.free;
};
}; };
}; };
}
); spdx = lib.options.create {
in description = "The SPDX identifier for the license.";
type = lib.types.nullish lib.types.string;
default.value = null;
};
url = lib.options.create {
description = "The URL for the license.";
type = lib.types.nullish lib.types.string;
};
free = lib.options.create {
description = "Whether the license is free.";
type = lib.types.bool;
default.value = true;
};
redistributable = lib.options.create {
description = "Whether the license is allows redistribution.";
type = lib.types.bool;
default = {
text = "config.free";
value = config.free;
};
};
};
}
);
in
lib.types.either type (lib.types.list.of type); lib.types.either type (lib.types.list.of type);
platform = platform =
lib.types.coerce lib.types.string lib'.systems.withBuildInfo lib.types.coerce
lib'.systems.types.platformWithBuildInfo; lib.types.string
lib'.systems.withBuildInfo
lib'.systems.types.platformWithBuildInfo;
builder = lib.types.submodule { builder = lib.types.submodule {
freeform = lib.types.any; freeform = lib.types.any;
@ -73,18 +74,14 @@ in
packages = lib.types.attrs.of (lib.types.attrs.of lib'.types.alias); packages = lib.types.attrs.of (lib.types.attrs.of lib'.types.alias);
dependencies = dependencies = build: host: target: let
build: host: target: initial = lib.types.raw;
let
initial = lib.types.raw;
transform = transform = value: let
value: package = lib'.packages.resolve value;
let
package = lib'.packages.resolve value;
in
lib'.packages.build package build host target;
in in
lib'.packages.build package build host target;
in
lib.types.attrs.of (lib.types.coerce initial transform lib'.types.package); lib.types.attrs.of (lib.types.coerce initial transform lib'.types.package);
alias = lib.types.submodule { alias = lib.types.submodule {
@ -102,284 +99,288 @@ in
versions = lib.options.create { versions = lib.options.create {
description = "Available versions of the package."; description = "Available versions of the package.";
type = lib.types.attrs.of lib'.types.package; type = lib.types.attrs.of lib'.types.package;
default.value = { }; default.value = {};
}; };
}; };
}; };
package = package = let
let normalize = value:
normalize = if builtins.isFunction value || builtins.isList value
value: then value
if builtins.isFunction value || builtins.isList value then else if value ? __modules__
value then value.__modules__
else if value ? __modules__ then else {
value.__modules__ config = value;
else
{ config = value; };
initial = lib.types.create {
name = "PackageConfig";
description = "configuration for a package";
check = value: builtins.isFunction value || builtins.isAttrs value || builtins.isList value;
merge =
location: definitions:
let
normalized = builtins.map (definition: lib.lists.from.any (normalize definition.value)) definitions;
in
builtins.concatLists normalized;
}; };
transform = initial = lib.types.create {
location: value: name = "PackageConfig";
let description = "configuration for a package";
modules = lib.lists.from.any (normalize value); check = value: builtins.isFunction value || builtins.isAttrs value || builtins.isList value;
merge = location: definitions: let
normalized =
builtins.map
(definition: lib.lists.from.any (normalize definition.value))
definitions;
in
builtins.concatLists
normalized;
};
result = lib.modules.run { transform = location: value: let
prefix = location; modules =
modules = modules ++ [ lib.lists.from.any (normalize value);
submodule
{ config.__modules__ = modules; } result = lib.modules.run {
]; prefix = location;
modules =
modules
++ [submodule {config.__modules__ = modules;}];
};
in
result.config;
final = lib.types.raw;
deps = build: host: target:
lib.types.submodule {
options = {
build = {
only = lib.options.create {
description = "Dependencies which are only used in the build environment.";
type = lib'.types.dependencies build build build;
default.value = {};
};
build = lib.options.create {
description = "Dependencies which are created in the build environment and are executed in the build environment.";
type = lib'.types.dependencies build build target;
default.value = {};
};
host = lib.options.create {
description = "Dependencies which are created in the build environment and are executed in the host environment.";
type = lib'.types.dependencies build host target;
default.value = {};
};
target = lib.options.create {
description = "Dependencies which are created in the build environment and are executed in the target environment.";
type = lib'.types.dependencies build target target;
default.value = {};
};
}; };
in
result.config;
final = lib.types.raw; host = {
only = lib.options.create {
description = "Dependencies which are only used in the host environment.";
type = lib'.types.dependencies host host host;
default.value = {};
};
deps = host = lib.options.create {
build: host: target: description = "Dependencies which are executed in the host environment.";
lib.types.submodule { type = lib'.types.dependencies host host target;
options = { default.value = {};
};
target = lib.options.create {
description = "Dependencies which are executed in the host environment which produces code for the target environment.";
type = lib'.types.dependencies host target target;
default.value = {};
};
};
target = {
only = lib.options.create {
description = "Dependencies which are only used in the target environment.";
type = lib'.types.dependencies target target target;
default.value = {};
};
target = lib.options.create {
description = "Dependencies which are executed in the target environment.";
type = lib'.types.dependencies target target target;
default.value = {};
};
};
};
};
submodule = {config}: let
build = config.platform.build;
host = config.platform.host;
target = config.platform.target;
in {
options = {
__modules__ = lib.options.create {
description = "User specified modules for the package definition.";
type = lib.types.list.of (initial
// {
merge = lib.options.merge.one;
});
# writable = false;
internal = true;
default.value = [];
};
meta = {
description = lib.options.create {
description = "The description for the package.";
type = lib.types.nullish lib.types.string;
default.value = null;
};
homepage = lib.options.create {
description = "The homepage for the package.";
type = lib.types.nullish lib.types.string;
default.value = null;
};
license = lib.options.create {
description = "The license for the package.";
type = lib.types.nullish lib'.types.license;
default.value = null;
};
free = lib.options.create {
description = "Whether the package is free.";
type = lib.types.bool;
default.value = true;
};
insecure = lib.options.create {
description = "Whether the package is insecure.";
type = lib.types.bool;
default.value = false;
};
broken = lib.options.create {
description = "Whether the package is broken.";
type = lib.types.bool;
default.value = false;
};
main = lib.options.create {
description = "The main entry point for the package.";
type = lib.types.nullish lib.types.string;
default.value = null;
};
platforms = lib.options.create {
description = "The platforms the package supports.";
type = lib.types.list.of lib.types.string;
default.value = [];
};
};
platform = {
build = lib.options.create {
description = "The build platform for the package.";
type = lib'.types.platform;
default.value = lib'.systems.withBuildInfo "x86_64-linux";
};
host = lib.options.create {
description = "The host platform for the package.";
type = lib'.types.platform;
default.value = lib'.systems.withBuildInfo "x86_64-linux";
};
target = lib.options.create {
description = "The target platform for the package.";
type = lib'.types.platform;
default.value = lib'.systems.withBuildInfo "x86_64-linux";
};
};
name = lib.options.create {
description = "The name of the package.";
type = lib.types.string;
default = {
text = "\${config.pname}-\${config.version}";
value =
if config.pname != null && config.version != null
then "${config.pname}-${config.version}"
else "";
};
};
pname = lib.options.create {
description = "The program name for the package";
type = lib.types.nullish lib.types.string;
default.value = null;
};
version = lib.options.create {
description = "The version for the package.";
type = lib.types.nullish lib.types.version;
default.value = null;
};
builder = lib.options.create {
description = "The builder for the package.";
type = lib'.types.builder;
};
phases = lib.options.create {
description = "The phases for the package.";
type = lib.types.dag.of lib.types.string;
default.value = {};
};
env = lib.options.create {
description = "The environment for the package.";
type = lib.types.attrs.of lib.types.string;
default.value = {};
};
package = lib.options.create {
description = "The built derivation.";
type = lib.types.derivation;
default.value = config.builder.build config;
};
deps = lib.options.create {
description = "The dependencies for the package.";
type = deps build host target;
default.value = {};
apply = value: {
build = { build = {
only = lib.options.create { only = lib'.packages.dependencies.build build build build value.build.only;
description = "Dependencies which are only used in the build environment."; build = lib'.packages.dependencies.build build build target value.build.build;
type = lib'.types.dependencies build build build; host = lib'.packages.dependencies.build build host target value.build.host;
default.value = { }; target = lib'.packages.dependencies.build build target target value.build.target;
};
build = lib.options.create {
description = "Dependencies which are created in the build environment and are executed in the build environment.";
type = lib'.types.dependencies build build target;
default.value = { };
};
host = lib.options.create {
description = "Dependencies which are created in the build environment and are executed in the host environment.";
type = lib'.types.dependencies build host target;
default.value = { };
};
target = lib.options.create {
description = "Dependencies which are created in the build environment and are executed in the target environment.";
type = lib'.types.dependencies build target target;
default.value = { };
};
}; };
host = { host = {
only = lib.options.create { only = lib'.packages.dependencies.build host host host value.host.only;
description = "Dependencies which are only used in the host environment."; host = lib'.packages.dependencies.build host host target value.host.host;
type = lib'.types.dependencies host host host; target = lib'.packages.dependencies.build host target target value.host.target;
default.value = { };
};
host = lib.options.create {
description = "Dependencies which are executed in the host environment.";
type = lib'.types.dependencies host host target;
default.value = { };
};
target = lib.options.create {
description = "Dependencies which are executed in the host environment which produces code for the target environment.";
type = lib'.types.dependencies host target target;
default.value = { };
};
}; };
target = { target = {
only = lib.options.create { only = lib'.packages.dependencies.build target target target value.target.only;
description = "Dependencies which are only used in the target environment."; target = lib'.packages.dependencies.build target target target value.target.target;
type = lib'.types.dependencies target target target;
default.value = { };
};
target = lib.options.create {
description = "Dependencies which are executed in the target environment.";
type = lib'.types.dependencies target target target;
default.value = { };
};
}; };
}; };
}; };
};
};
submodule = type =
{ config }: (lib.types.coerceWithLocation initial transform final)
let // {
build = config.platform.build;
host = config.platform.host;
target = config.platform.target;
in
{
options = {
__modules__ = lib.options.create {
description = "User specified modules for the package definition.";
type = lib.types.list.of (initial // { merge = lib.options.merge.one; });
# writable = false;
internal = true;
default.value = [ ];
};
meta = {
description = lib.options.create {
description = "The description for the package.";
type = lib.types.nullish lib.types.string;
default.value = null;
};
homepage = lib.options.create {
description = "The homepage for the package.";
type = lib.types.nullish lib.types.string;
default.value = null;
};
license = lib.options.create {
description = "The license for the package.";
type = lib.types.nullish lib'.types.license;
default.value = null;
};
free = lib.options.create {
description = "Whether the package is free.";
type = lib.types.bool;
default.value = true;
};
insecure = lib.options.create {
description = "Whether the package is insecure.";
type = lib.types.bool;
default.value = false;
};
broken = lib.options.create {
description = "Whether the package is broken.";
type = lib.types.bool;
default.value = false;
};
main = lib.options.create {
description = "The main entry point for the package.";
type = lib.types.nullish lib.types.string;
default.value = null;
};
platforms = lib.options.create {
description = "The platforms the package supports.";
type = lib.types.list.of lib.types.string;
default.value = [ ];
};
};
platform = {
build = lib.options.create {
description = "The build platform for the package.";
type = lib'.types.platform;
default.value = lib'.systems.withBuildInfo "x86_64-linux";
};
host = lib.options.create {
description = "The host platform for the package.";
type = lib'.types.platform;
default.value = lib'.systems.withBuildInfo "x86_64-linux";
};
target = lib.options.create {
description = "The target platform for the package.";
type = lib'.types.platform;
default.value = lib'.systems.withBuildInfo "x86_64-linux";
};
};
name = lib.options.create {
description = "The name of the package.";
type = lib.types.string;
default = {
text = "\${config.pname}-\${config.version}";
value =
if config.pname != null && config.version != null then "${config.pname}-${config.version}" else "";
};
};
pname = lib.options.create {
description = "The program name for the package";
type = lib.types.nullish lib.types.string;
default.value = null;
};
version = lib.options.create {
description = "The version for the package.";
type = lib.types.nullish lib.types.version;
default.value = null;
};
builder = lib.options.create {
description = "The builder for the package.";
type = lib'.types.builder;
};
phases = lib.options.create {
description = "The phases for the package.";
type = lib.types.dag.of lib.types.string;
default.value = { };
};
env = lib.options.create {
description = "The environment for the package.";
type = lib.types.attrs.of lib.types.string;
default.value = { };
};
package = lib.options.create {
description = "The built derivation.";
type = lib.types.derivation;
default.value = config.builder.build config;
};
deps = lib.options.create {
description = "The dependencies for the package.";
type = deps build host target;
default.value = { };
apply = value: {
build = {
only = lib'.packages.dependencies.build build build build value.build.only;
build = lib'.packages.dependencies.build build build target value.build.build;
host = lib'.packages.dependencies.build build host target value.build.host;
target = lib'.packages.dependencies.build build target target value.build.target;
};
host = {
only = lib'.packages.dependencies.build host host host value.host.only;
host = lib'.packages.dependencies.build host host target value.host.host;
target = lib'.packages.dependencies.build host target target value.host.target;
};
target = {
only = lib'.packages.dependencies.build target target target value.target.only;
target = lib'.packages.dependencies.build target target target value.target.target;
};
};
};
};
};
type = (lib.types.coerceWithLocation initial transform final) // {
name = "Package"; name = "Package";
description = "a package definition"; description = "a package definition";
}; };
in in
type type
// { // {
children = type.children // { children =
inherit submodule; type.children
}; // {
inherit submodule;
};
}; };
}; };
}; };

View file

@ -1,36 +1,35 @@
{ lib', config }:
let
inherit (config) builders packages;
in
{ {
lib',
config,
}: let
inherit (config) builders packages;
in {
config.packages.aux.a = { config.packages.aux.a = {
versions = { versions = {
"latest" = "latest" = {config}: {
{ config }: config = {
{ meta = {
config = { platforms = ["i686-linux"];
meta = { };
platforms = [ "i686-linux" ];
};
name = "${config.pname}-${config.version}"; name = "${config.pname}-${config.version}";
pname = "a"; pname = "a";
version = "1.0.0"; version = "1.0.0";
builder = builders.basic; builder = builders.basic;
deps.build.host = { deps.build.host = {
inherit (packages.aux) b; inherit (packages.aux) b;
}; };
phases = { phases = {
install = '' install = ''
echo "a with b: ${config.deps.build.host.b.package.system}" > $out echo "a with b: ${config.deps.build.host.b.package.system}" > $out
''; '';
};
}; };
}; };
};
}; };
}; };
} }

View file

@ -1,38 +1,36 @@
{ config }: {config}: let
let
inherit (config) lib builders packages; inherit (config) lib builders packages;
in in {
{
config.packages.aux.b = { config.packages.aux.b = {
versions = { versions = {
"latest" = "latest" = {config}: {
{ config }: options = {
{ custom = lib.options.create {
options = { type = lib.types.bool;
custom = lib.options.create { type = lib.types.bool; };
};
config = {
meta = {
platforms = [ "i686-linux" ];
};
name = "${config.pname}-${config.version}";
custom = true;
pname = "b";
version = "1.0.0";
builder = builders.basic;
phases = {
install = ''
echo "b" > $out
'';
};
}; };
}; };
config = {
meta = {
platforms = ["i686-linux"];
};
name = "${config.pname}-${config.version}";
custom = true;
pname = "b";
version = "1.0.0";
builder = builders.basic;
phases = {
install = ''
echo "b" > $out
'';
};
};
};
}; };
}; };
} }

View file

@ -1,12 +1,10 @@
{ config }: {config}: let
let
inherit (config) lib; inherit (config) lib;
doubles = lib.systems.doubles.all; doubles = lib.systems.doubles.all;
packages = builtins.removeAttrs config.packages [ "cross" ]; packages = builtins.removeAttrs config.packages ["cross"];
in in {
{
includes = [ includes = [
./foundation ./foundation
./aux/a.nix ./aux/a.nix
@ -21,11 +19,11 @@ in
options.cross = lib.attrs.generate doubles ( options.cross = lib.attrs.generate doubles (
system: system:
lib.options.create { lib.options.create {
description = "The cross-compiled package set for the ${system} target."; description = "The cross-compiled package set for the ${system} target.";
type = lib.types.packages; type = lib.types.packages;
default = { }; default = {};
} }
); );
}; };
}; };
@ -44,63 +42,63 @@ in
config.packages.cross = lib.attrs.generate doubles ( config.packages.cross = lib.attrs.generate doubles (
system: system:
builtins.mapAttrs (
namespace:
builtins.mapAttrs ( builtins.mapAttrs (
name: alias: namespace:
let builtins.mapAttrs (
setHost = name: alias: let
package: setHost = package:
package package // {
// { __modules__ = package.__modules__ ++ [
__modules__ = package.__modules__ ++ [ {
{ config.platform = {
config.platform = { host = lib.modules.override 5 system;
host = lib.modules.override 5 system; target = lib.modules.override 5 system;
target = lib.modules.override 5 system; };
}; }
} ];
]; };
}; # if package != {}
# if package != {} # then
# then # (package.extend (
# (package.extend ( # {config}: {
# {config}: { # config = {
# config = { # platform = {
# platform = { # host = lib.modules.overrides.force system;
# host = lib.modules.overrides.force system; # target = lib.modules.overrides.default system;
# target = lib.modules.overrides.default system; # };
# };
# deps = { # deps = {
# build = { # build = {
# only = setHost package.deps.build.only; # only = setHost package.deps.build.only;
# build = setHost package.deps.build.build; # build = setHost package.deps.build.build;
# host = setHost package.deps.build.host; # host = setHost package.deps.build.host;
# target = setHost package.deps.build.target; # target = setHost package.deps.build.target;
# }; # };
# host = { # host = {
# only = setHost package.deps.host.only; # only = setHost package.deps.host.only;
# host = setHost package.deps.host.host; # host = setHost package.deps.host.host;
# target = setHost package.deps.host.target; # target = setHost package.deps.host.target;
# }; # };
# target = { # target = {
# only = setHost package.deps.target.only; # only = setHost package.deps.target.only;
# target = setHost package.deps.target.target; # target = setHost package.deps.target.target;
# }; # };
# }; # };
# }; # };
# } # }
# )) # ))
# .config # .config
# else package; # else package;
updated = alias // { updated =
versions = builtins.mapAttrs (version: package: setHost package) alias.versions; alias
}; // {
in versions = builtins.mapAttrs (version: package: setHost package) alias.versions;
updated };
in
updated
)
) )
) packages packages
); );
} }

View file

@ -3,126 +3,121 @@
lib', lib',
config, config,
options, options,
}: }: let
let inherit
inherit (config) (config)
mirrors mirrors
builders builders
# These are the upstream foundational packages exported from the Aux Foundation project. # These are the upstream foundational packages exported from the Aux Foundation project.
foundation foundation
packages packages
; ;
in in {
{
config.packages.foundation.binutils = { config.packages.foundation.binutils = {
versions = { versions = {
"latest" = "latest" = {config}: {
{ config }: options = {
{ src = lib.options.create {
options = { type = lib.types.derivation;
src = lib.options.create { description = "Source for the package.";
type = lib.types.derivation;
description = "Source for the package.";
};
};
config = {
meta = {
platforms = [ "i686-linux" ];
};
pname = "binutils";
version = "2.41";
builder = builders.basic;
deps = {
build = {
host = {
inherit (packages.foundation) gcc;
};
};
};
env = {
PATH = lib.paths.bin [
# foundation.stage2-gcc
foundation.stage2-binutils
foundation.stage2-gnumake
foundation.stage2-gnupatch
foundation.stage2-gnused
foundation.stage2-gnugrep
foundation.stage2-gawk
foundation.stage2-diffutils
foundation.stage2-findutils
foundation.stage2-gnutar
foundation.stage1-xz
];
};
phases =
let
patches = [
# Make binutils output deterministic by default.
./patches/deterministic.patch
];
configureFlags = [
# "CC=musl-gcc"
"LDFLAGS=--static"
"--prefix=${builtins.placeholder "out"}"
"--build=${config.platform.build.triple}"
"--host=${config.platform.host.triple}"
"--target=${config.platform.target.triple}"
"--with-sysroot=/"
"--enable-deterministic-archives"
# depends on bison
"--disable-gprofng"
# Turn on --enable-new-dtags by default to make the linker set
# RUNPATH instead of RPATH on binaries. This is important because
# RUNPATH can be overridden using LD_LIBRARY_PATH at runtime.
"--enable-new-dtags"
# By default binutils searches $libdir for libraries. This brings in
# libbfd and libopcodes into a default visibility. Drop default lib
# path to force users to declare their use of these libraries.
"--with-lib-path=:"
"--disable-multilib"
];
in
{
unpack = ''
tar xf ${config.src}
cd binutils-${config.version}
'';
patch = ''
${lib.strings.concatMapSep "\n" (file: "patch -Np1 -i ${file}") patches}
'';
configure = ''
bash ./configure ${builtins.concatStringsSep " " configureFlags}
'';
build = ''
make -j $NIX_BUILD_CORES
'';
install = ''
make -j $NIX_BUILD_CORES install-strip
'';
};
src = builtins.fetchurl {
url = "${mirrors.gnu}/binutils/binutils-${config.version}.tar.xz";
sha256 = "rppXieI0WeWWBuZxRyPy0//DHAMXQZHvDQFb3wYAdFA=";
};
}; };
}; };
config = {
meta = {
platforms = ["i686-linux"];
};
pname = "binutils";
version = "2.41";
builder = builders.basic;
deps = {
build = {
host = {
inherit (packages.foundation) gcc;
};
};
};
env = {
PATH = lib.paths.bin [
# foundation.stage2-gcc
foundation.stage2-binutils
foundation.stage2-gnumake
foundation.stage2-gnupatch
foundation.stage2-gnused
foundation.stage2-gnugrep
foundation.stage2-gawk
foundation.stage2-diffutils
foundation.stage2-findutils
foundation.stage2-gnutar
foundation.stage1-xz
];
};
phases = let
patches = [
# Make binutils output deterministic by default.
./patches/deterministic.patch
];
configureFlags = [
# "CC=musl-gcc"
"LDFLAGS=--static"
"--prefix=${builtins.placeholder "out"}"
"--build=${config.platform.build.triple}"
"--host=${config.platform.host.triple}"
"--target=${config.platform.target.triple}"
"--with-sysroot=/"
"--enable-deterministic-archives"
# depends on bison
"--disable-gprofng"
# Turn on --enable-new-dtags by default to make the linker set
# RUNPATH instead of RPATH on binaries. This is important because
# RUNPATH can be overridden using LD_LIBRARY_PATH at runtime.
"--enable-new-dtags"
# By default binutils searches $libdir for libraries. This brings in
# libbfd and libopcodes into a default visibility. Drop default lib
# path to force users to declare their use of these libraries.
"--with-lib-path=:"
"--disable-multilib"
];
in {
unpack = ''
tar xf ${config.src}
cd binutils-${config.version}
'';
patch = ''
${lib.strings.concatMapSep "\n" (file: "patch -Np1 -i ${file}") patches}
'';
configure = ''
bash ./configure ${builtins.concatStringsSep " " configureFlags}
'';
build = ''
make -j $NIX_BUILD_CORES
'';
install = ''
make -j $NIX_BUILD_CORES install-strip
'';
};
src = builtins.fetchurl {
url = "${mirrors.gnu}/binutils/binutils-${config.version}.tar.xz";
sha256 = "rppXieI0WeWWBuZxRyPy0//DHAMXQZHvDQFb3wYAdFA=";
};
};
};
}; };
}; };
} }

View file

@ -3,8 +3,7 @@
lib', lib',
config, config,
options, options,
}: }: {
{
includes = [ includes = [
./gcc ./gcc
./binutils ./binutils

View file

@ -1,210 +1,217 @@
{ config, options }: {
let config,
inherit (config) options,
}: let
inherit
(config)
lib lib
mirrors mirrors
builders builders
# These are the upstream foundational packages exported from the Aux Foundation project. # These are the upstream foundational packages exported from the Aux Foundation project.
foundation foundation
packages packages
; ;
in in {
{
config.packages.foundation.gcc = { config.packages.foundation.gcc = {
versions = { versions = {
"latest" = "latest" = {
{ config, meta }: config,
{ meta,
options = { }: {
options = {
src = lib.options.create {
type = lib.types.derivation;
description = "Source for the package.";
};
cc = {
src = lib.options.create { src = lib.options.create {
type = lib.types.derivation; type = lib.types.derivation;
description = "Source for the package."; description = "The cc source for the package.";
};
cc = {
src = lib.options.create {
type = lib.types.derivation;
description = "The cc source for the package.";
};
};
gmp = {
src = lib.options.create {
type = lib.types.derivation;
description = "The gmp source for the package.";
};
version = lib.options.create {
type = lib.types.string;
description = "Version of gmp.";
};
};
mpfr = {
src = lib.options.create {
type = lib.types.derivation;
description = "The mpfr source for the package.";
};
version = lib.options.create {
type = lib.types.string;
description = "Version of mpfr.";
};
};
mpc = {
src = lib.options.create {
type = lib.types.derivation;
description = "The mpc source for the package.";
};
version = lib.options.create {
type = lib.types.string;
description = "Version of mpc.";
};
};
isl = {
src = lib.options.create {
type = lib.types.derivation;
description = "The isl source for the package.";
};
version = lib.options.create {
type = lib.types.string;
description = "Version of isl.";
};
}; };
}; };
config = { gmp = {
meta = { src = lib.options.create {
platforms = [ "i686-linux" ]; type = lib.types.derivation;
description = "The gmp source for the package.";
}; };
pname = "gcc"; version = lib.options.create {
version = "13.2.0"; type = lib.types.string;
description = "Version of gmp.";
};
};
builder = builders.basic; mpfr = {
src = lib.options.create {
env = { type = lib.types.derivation;
PATH = lib.paths.bin [ description = "The mpfr source for the package.";
foundation.stage2-gcc
foundation.stage2-binutils
foundation.stage2-gnumake
foundation.stage2-gnused
foundation.stage2-gnugrep
foundation.stage2-gawk
foundation.stage2-diffutils
foundation.stage2-findutils
foundation.stage2-gnutar
foundation.stage2-gzip
foundation.stage2-bzip2
foundation.stage1-xz
];
}; };
phases = version = lib.options.create {
let type = lib.types.string;
host = lib.systems.withBuildInfo config.platform.host; description = "Version of mpfr.";
};
};
mbits = if host.system.cpu.family == "x86" then if host.is64bit then "-m64" else "-m32" else ""; mpc = {
in src = lib.options.create {
{ type = lib.types.derivation;
unpack = '' description = "The mpc source for the package.";
# Unpack
tar xf ${config.src}
tar xf ${config.gmp.src}
tar xf ${config.mpfr.src}
tar xf ${config.mpc.src}
tar xf ${config.isl.src}
cd gcc-${config.version}
ln -s ../gmp-${config.gmp.version} gmp
ln -s ../mpfr-${config.mpfr.version} mpfr
ln -s ../mpc-${config.mpc.version} mpc
ln -s ../isl-${config.isl.version} isl
'';
patch = ''
# Patch
# force musl even if host triple is gnu
sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host
'';
configure = ''
# Configure
export CC="gcc -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
export CXX="g++ -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
export CFLAGS_FOR_TARGET="-Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
export LIBRARY_PATH="${foundation.stage1-musl}/lib"
bash ./configure \
--prefix=$out \
--build=${config.platform.build.triple} \
--host=${config.platform.host.triple} \
--target=${config.platform.target.triple} \
--with-native-system-header-dir=/include \
--with-sysroot=${foundation.stage1-musl} \
--enable-languages=c,c++ \
--disable-bootstrap \
--disable-libsanitizer \
--disable-lto \
--disable-multilib \
--disable-plugin \
CFLAGS=-static \
CXXFLAGS=-static
'';
build = ''
# Build
make -j $NIX_BUILD_CORES
'';
install = ''
# Install
make -j $NIX_BUILD_CORES install-strip
'';
};
src = builtins.fetchurl {
url = "${mirrors.gnu}/gcc/gcc-${config.version}/gcc-${config.version}.tar.xz";
sha256 = "4nXnZEKmBnNBon8Exca4PYYTFEAEwEE1KIY9xrXHQ9o=";
}; };
gmp = { version = lib.options.create {
version = "6.3.0"; type = lib.types.string;
src = builtins.fetchurl { description = "Version of mpc.";
url = "${mirrors.gnu}/gmp/gmp-${config.gmp.version}.tar.xz";
sha256 = "o8K4AgG4nmhhb0rTC8Zq7kknw85Q4zkpyoGdXENTiJg=";
};
}; };
};
mpfr = { isl = {
version = "4.2.1"; src = lib.options.create {
src = builtins.fetchurl { type = lib.types.derivation;
url = "${mirrors.gnu}/mpfr/mpfr-${config.mpfr.version}.tar.xz"; description = "The isl source for the package.";
sha256 = "J3gHNTpnJpeJlpRa8T5Sgp46vXqaW3+yeTiU4Y8fy7I=";
};
}; };
version = lib.options.create {
mpc = { type = lib.types.string;
version = "1.3.1"; description = "Version of isl.";
src = builtins.fetchurl {
url = "${mirrors.gnu}/mpc/mpc-${config.mpc.version}.tar.gz";
sha256 = "q2QkkvXPiCt0qgy3MM1BCoHtzb7IlRg86TDnBsHHWbg=";
};
};
isl = {
version = "0.24";
src = builtins.fetchurl {
url = "https://gcc.gnu.org/pub/gcc/infrastructure/isl-${config.isl.version}.tar.bz2";
sha256 = "/PeN2WVsEOuM+fvV9ZoLawE4YgX+GTSzsoegoYmBRcA=";
};
}; };
}; };
}; };
config = {
meta = {
platforms = ["i686-linux"];
};
pname = "gcc";
version = "13.2.0";
builder = builders.basic;
env = {
PATH = lib.paths.bin [
foundation.stage2-gcc
foundation.stage2-binutils
foundation.stage2-gnumake
foundation.stage2-gnused
foundation.stage2-gnugrep
foundation.stage2-gawk
foundation.stage2-diffutils
foundation.stage2-findutils
foundation.stage2-gnutar
foundation.stage2-gzip
foundation.stage2-bzip2
foundation.stage1-xz
];
};
phases = let
host = lib.systems.withBuildInfo config.platform.host;
mbits =
if host.system.cpu.family == "x86"
then
if host.is64bit
then "-m64"
else "-m32"
else "";
in {
unpack = ''
# Unpack
tar xf ${config.src}
tar xf ${config.gmp.src}
tar xf ${config.mpfr.src}
tar xf ${config.mpc.src}
tar xf ${config.isl.src}
cd gcc-${config.version}
ln -s ../gmp-${config.gmp.version} gmp
ln -s ../mpfr-${config.mpfr.version} mpfr
ln -s ../mpc-${config.mpc.version} mpc
ln -s ../isl-${config.isl.version} isl
'';
patch = ''
# Patch
# force musl even if host triple is gnu
sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host
'';
configure = ''
# Configure
export CC="gcc -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
export CXX="g++ -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
export CFLAGS_FOR_TARGET="-Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
export LIBRARY_PATH="${foundation.stage1-musl}/lib"
bash ./configure \
--prefix=$out \
--build=${config.platform.build.triple} \
--host=${config.platform.host.triple} \
--target=${config.platform.target.triple} \
--with-native-system-header-dir=/include \
--with-sysroot=${foundation.stage1-musl} \
--enable-languages=c,c++ \
--disable-bootstrap \
--disable-libsanitizer \
--disable-lto \
--disable-multilib \
--disable-plugin \
CFLAGS=-static \
CXXFLAGS=-static
'';
build = ''
# Build
make -j $NIX_BUILD_CORES
'';
install = ''
# Install
make -j $NIX_BUILD_CORES install-strip
'';
};
src = builtins.fetchurl {
url = "${mirrors.gnu}/gcc/gcc-${config.version}/gcc-${config.version}.tar.xz";
sha256 = "4nXnZEKmBnNBon8Exca4PYYTFEAEwEE1KIY9xrXHQ9o=";
};
gmp = {
version = "6.3.0";
src = builtins.fetchurl {
url = "${mirrors.gnu}/gmp/gmp-${config.gmp.version}.tar.xz";
sha256 = "o8K4AgG4nmhhb0rTC8Zq7kknw85Q4zkpyoGdXENTiJg=";
};
};
mpfr = {
version = "4.2.1";
src = builtins.fetchurl {
url = "${mirrors.gnu}/mpfr/mpfr-${config.mpfr.version}.tar.xz";
sha256 = "J3gHNTpnJpeJlpRa8T5Sgp46vXqaW3+yeTiU4Y8fy7I=";
};
};
mpc = {
version = "1.3.1";
src = builtins.fetchurl {
url = "${mirrors.gnu}/mpc/mpc-${config.mpc.version}.tar.gz";
sha256 = "q2QkkvXPiCt0qgy3MM1BCoHtzb7IlRg86TDnBsHHWbg=";
};
};
isl = {
version = "0.24";
src = builtins.fetchurl {
url = "https://gcc.gnu.org/pub/gcc/infrastructure/isl-${config.isl.version}.tar.bz2";
sha256 = "/PeN2WVsEOuM+fvV9ZoLawE4YgX+GTSzsoegoYmBRcA=";
};
};
};
};
}; };
}; };
} }

View file

@ -3,79 +3,79 @@
lib', lib',
config, config,
options, options,
}: }: let
let inherit
inherit (config) (config)
mirrors mirrors
builders builders
# These are the upstream foundational packages exported from the Aux Foundation project. # These are the upstream foundational packages exported from the Aux Foundation project.
foundation foundation
; ;
in in {
{
config.packages.foundation.linux-headers = { config.packages.foundation.linux-headers = {
versions = { versions = {
"latest" = "latest" = {
{ config, meta }: config,
{ meta,
options = { }: {
src = lib.options.create { options = {
type = lib.types.derivation; src = lib.options.create {
description = "Source for the package."; type = lib.types.derivation;
}; description = "Source for the package.";
};
config = {
meta = {
platforms = [ "i686-linux" ];
};
pname = "linux-headers";
version = "6.5.6";
builder = builders.basic;
env = {
PATH = lib.paths.bin [
foundation.stage2-gcc
foundation.stage1-musl
foundation.stage2-binutils
foundation.stage2-gnumake
foundation.stage2-gnupatch
foundation.stage2-gnused
foundation.stage2-gnugrep
foundation.stage2-gawk
foundation.stage2-diffutils
foundation.stage2-findutils
foundation.stage2-gnutar
foundation.stage1-xz
];
};
phases = {
unpack = ''
tar xf ${config.src}
cd linux-${config.version}
'';
build = ''
make -j $NIX_BUILD_CORES CC=musl-gcc HOSTCC=musl-gcc ARCH=${config.platform.host.linux.arch} headers
'';
install = ''
find usr/include -name '.*' -exec rm {} +
mkdir -p $out
cp -rv usr/include $out/
'';
};
src = builtins.fetchurl {
url = "https://cdn.kernel.org/pub/linux/kernel/v${lib.versions.major config.version}.x/linux-${config.version}.tar.xz";
sha256 = "eONtQhRUcFHCTfIUD0zglCjWxRWtmnGziyjoCUqV0vY=";
};
}; };
}; };
config = {
meta = {
platforms = ["i686-linux"];
};
pname = "linux-headers";
version = "6.5.6";
builder = builders.basic;
env = {
PATH = lib.paths.bin [
foundation.stage2-gcc
foundation.stage1-musl
foundation.stage2-binutils
foundation.stage2-gnumake
foundation.stage2-gnupatch
foundation.stage2-gnused
foundation.stage2-gnugrep
foundation.stage2-gawk
foundation.stage2-diffutils
foundation.stage2-findutils
foundation.stage2-gnutar
foundation.stage1-xz
];
};
phases = {
unpack = ''
tar xf ${config.src}
cd linux-${config.version}
'';
build = ''
make -j $NIX_BUILD_CORES CC=musl-gcc HOSTCC=musl-gcc ARCH=${config.platform.host.linux.arch} headers
'';
install = ''
find usr/include -name '.*' -exec rm {} +
mkdir -p $out
cp -rv usr/include $out/
'';
};
src = builtins.fetchurl {
url = "https://cdn.kernel.org/pub/linux/kernel/v${lib.versions.major config.version}.x/linux-${config.version}.tar.xz";
sha256 = "eONtQhRUcFHCTfIUD0zglCjWxRWtmnGziyjoCUqV0vY=";
};
};
};
}; };
}; };
} }