forked from auxolotl/labs
Work in progress cross compiler for x86_64. I've managed to get a full x86_64 gcc using the binaries built from foundation, and am working on implementing their builds into tidepool. ### Bootstrapping steps 0) Start with i686 tools (gcc, binutils, musl, etc) 1) Build binutils targeting x86_64-linux 2) Build a minimal gcc cross compiler using the cross binutils. This minimal cross compiler does not have support for libc, so is pretty much only useful for building musl or glibc. 3) Use the minimal cross compiler to build x86_64-linux glibc or musl 4) Now that we have a cross compiler and x86_64-linux libc, we can build gcc for the target architecture! 5) Profit! We can now build anything x86_64 using our gcc compiler! Co-authored-by: Jake Hamilton <jake.hamilton@hey.com> Reviewed-on: auxolotl/labs#8 Reviewed-by: Jake Hamilton <jake.hamilton@hey.com> Co-authored-by: Victor Fuentes <vmfuentes64@gmail.com> Co-committed-by: Victor Fuentes <vmfuentes64@gmail.com>
121 lines
4.1 KiB
Nix
121 lines
4.1 KiB
Nix
{ config }:
|
|
let
|
|
cfg = config.builders.basic;
|
|
|
|
inherit (config) lib foundation;
|
|
in
|
|
{
|
|
config.builders = {
|
|
basic = {
|
|
executable = "${foundation.stage2-bash}/bin/bash";
|
|
|
|
build =
|
|
package:
|
|
let
|
|
system = package.platform.build.double;
|
|
|
|
dependencies = lib.packages.dependencies.collect package;
|
|
|
|
context = lib.packages.context.create dependencies { };
|
|
|
|
hooks = lib.packages.hooks.create dependencies context;
|
|
|
|
phasesWithHooks =
|
|
let
|
|
all = lib.lists.flatten [
|
|
hooks.build.only
|
|
hooks.build.build
|
|
hooks.build.host
|
|
hooks.build.target
|
|
hooks.host.only
|
|
hooks.host.host
|
|
hooks.host.target
|
|
hooks.target.only
|
|
hooks.target.target
|
|
];
|
|
in
|
|
builtins.foldl' (final: defaults: lib.dag.apply.defaults final defaults) package.phases all;
|
|
|
|
phases = lib.dag.apply.defaults phasesWithHooks {
|
|
unpack = lib.dag.entry.before [ "patch" ] "";
|
|
|
|
patch = lib.dag.entry.between [ "unpack" ] [ "configure" ] "";
|
|
|
|
configure = lib.dag.entry.between [ "patch" ] [ "build" ] "";
|
|
|
|
build = lib.dag.entry.between [ "configure" ] [ "install" ] "";
|
|
|
|
install = lib.dag.entry.after [ "build" ] "";
|
|
};
|
|
|
|
sorted = lib.dag.sort.topological phases;
|
|
|
|
script = lib.strings.concatMapSep "\n" (entry: entry.value) sorted.result;
|
|
|
|
built = builtins.derivation (
|
|
package.env
|
|
// {
|
|
inherit (package) name;
|
|
inherit script system;
|
|
|
|
passAsFile = [ "script" ];
|
|
|
|
SHELL = cfg.executable;
|
|
|
|
PATH =
|
|
let
|
|
bins = lib.paths.bin (
|
|
(lib.packages.dependencies.get dependencies.build.only)
|
|
++ (lib.packages.dependencies.get dependencies.build.build)
|
|
++ (lib.packages.dependencies.get dependencies.build.host)
|
|
++ (lib.packages.dependencies.get dependencies.build.target)
|
|
++ (lib.packages.dependencies.get dependencies.host.only)
|
|
++ (lib.packages.dependencies.get dependencies.host.host)
|
|
++ (lib.packages.dependencies.get dependencies.host.target)
|
|
++ (lib.packages.dependencies.get dependencies.target.only)
|
|
++ (lib.packages.dependencies.get dependencies.target.target)
|
|
++ [
|
|
foundation.stage2-bash
|
|
foundation.stage2-coreutils
|
|
]
|
|
);
|
|
in
|
|
builtins.concatStringsSep ":" (
|
|
[ bins ] ++ (lib.lists.when (package.env ? PATH) [ package.env.PATH ])
|
|
);
|
|
|
|
builder = cfg.executable;
|
|
|
|
args = [
|
|
"-e"
|
|
(builtins.toFile "bash-builder.sh" ''
|
|
export CONFIG_SHELL=$SHELL
|
|
|
|
# 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
|
|
# available CPU cores at run-time.
|
|
NIX_BUILD_CORES="''${NIX_BUILD_CORES:-1}"
|
|
if ((NIX_BUILD_CORES <= 0)); then
|
|
guess=$(nproc 2>/dev/null || true)
|
|
((NIX_BUILD_CORES = guess <= 0 ? 1 : guess))
|
|
fi
|
|
export NIX_BUILD_CORES
|
|
|
|
bash -eux $scriptPath
|
|
'')
|
|
];
|
|
}
|
|
);
|
|
in
|
|
# (builtins.trace "build: ${package.name} -> build=${package.platform.build.triple} host=${package.platform.host.triple} target=${package.platform.target.triple}")
|
|
built
|
|
// {
|
|
inherit (package) meta;
|
|
extras = {
|
|
inherit package context;
|
|
phases = builtins.listToAttrs sorted.result;
|
|
} // package.extras;
|
|
};
|
|
};
|
|
};
|
|
}
|