hare: remove shell wrapping overhead

Hardcode qbe and harec to avoid the overhead of wrapping hare with a
bash script.

By doing that, we also had to change how `makeFlags` were defined: Now
only part of the `<ARCH>_<TOOL>` make variables are conditioned to the
enableCrossCompilation. The ones belonging to the build platform are
passed unconditionally.

Add qbe and harec to propagatedBuildInputs.

Some build frameworks may rely on having harec and qbe available on
PATH by setting `HAREC` and `QBE` to relative paths --- e. g., `haredo`.
This commit is contained in:
Coutinho de Souza 2024-05-10 16:37:28 -03:00
parent 005028d7e2
commit 0801041b52
No known key found for this signature in database
GPG Key ID: 59081FCB8F9AABB5
2 changed files with 79 additions and 59 deletions

View File

@ -0,0 +1,24 @@
diff --git a/cmd/hare/build.ha b/cmd/hare/build.ha
index b2ac6518..417b46c6 100644
--- a/cmd/hare/build.ha
+++ b/cmd/hare/build.ha
@@ -37,7 +37,7 @@ fn build(name: str, cmd: *getopt::command) (void | error) = {
case let ncpu: size =>
yield ncpu;
},
- version = build::get_version(os::tryenv("HAREC", "harec"))?,
+ version = build::get_version(os::tryenv("HAREC", "@harec@"))?,
arch = arch.qbe_name,
platform = build::get_platform(os::sysname())?,
...
@@ -145,8 +145,8 @@ fn build(name: str, cmd: *getopt::command) (void | error) = {
set_arch_tags(&ctx.ctx.tags, arch);
ctx.cmds = ["",
- os::tryenv("HAREC", "harec"),
- os::tryenv("QBE", "qbe"),
+ os::tryenv("HAREC", "@harec@"),
+ os::tryenv("QBE", "@qbe@"),
os::tryenv("AS", arch.as_cmd),
os::tryenv("LD", arch.ld_cmd),
];

View File

@ -2,9 +2,7 @@
lib,
stdenv,
fetchFromSourcehut,
binutils-unwrapped,
harec,
makeWrapper,
qbe,
gitUpdater,
scdoc,
@ -34,7 +32,9 @@ assert
'';
let
buildArch = stdenv.buildPlatform.uname.processor;
arch = stdenv.hostPlatform.uname.processor;
platform = lib.toLower stdenv.hostPlatform.uname.system;
qbePlatform =
{
x86_64 = "amd64_sysv";
@ -42,32 +42,38 @@ let
riscv64 = "rv64";
}
.${arch};
platform = lib.toLower stdenv.hostPlatform.uname.system;
embeddedOnBinaryTools =
let
genToolsFromToolchain =
genPaths =
toolchain:
let
crossTargetPrefix = toolchain.stdenv.cc.targetPrefix;
toolchainArch = toolchain.stdenv.hostPlatform.uname.processor;
absOrRelPath =
toolDrv: toolBasename:
if arch == toolchainArch then
toolBasename
else
lib.getExe' toolDrv "${crossTargetPrefix}${toolBasename}";
inherit (toolchain.stdenv.cc) targetPrefix;
inherit (toolchain.stdenv.targetPlatform.uname) processor;
in
{
"ld" = absOrRelPath toolchain.buildPackages.binutils "ld";
"as" = absOrRelPath toolchain.buildPackages.binutils "as";
"cc" = absOrRelPath toolchain.stdenv.cc "cc";
"${processor}" = {
"ld" = lib.getExe' toolchain.buildPackages.binutils "${targetPrefix}ld";
"as" = lib.getExe' toolchain.buildPackages.binutils "${targetPrefix}as";
"cc" = lib.getExe' toolchain.stdenv.cc "${targetPrefix}cc";
};
};
in
{
x86_64 = genToolsFromToolchain x86_64PkgsCrossToolchain;
aarch64 = genToolsFromToolchain aarch64PkgsCrossToolchain;
riscv64 = genToolsFromToolchain riscv64PkgsCrossToolchain;
};
builtins.foldl' (acc: elem: acc // (genPaths elem)) { } [
x86_64PkgsCrossToolchain
aarch64PkgsCrossToolchain
riscv64PkgsCrossToolchain
];
crossCompMakeFlags = builtins.filter (x: !(lib.hasPrefix (lib.toUpper buildArch) x)) [
"RISCV64_AS=${embeddedOnBinaryTools.riscv64.as}"
"RISCV64_CC=${embeddedOnBinaryTools.riscv64.cc}"
"RISCV64_LD=${embeddedOnBinaryTools.riscv64.ld}"
"AARCH64_AS=${embeddedOnBinaryTools.aarch64.as}"
"AARCH64_CC=${embeddedOnBinaryTools.aarch64.cc}"
"AARCH64_LD=${embeddedOnBinaryTools.aarch64.ld}"
"X86_64_AS=${embeddedOnBinaryTools.x86_64.as}"
"X86_64_CC=${embeddedOnBinaryTools.x86_64.cc}"
"X86_64_LD=${embeddedOnBinaryTools.x86_64.ld}"
];
in
stdenv.mkDerivation (finalAttrs: {
pname = "hare";
@ -99,6 +105,12 @@ stdenv.mkDerivation (finalAttrs: {
# Don't build haredoc since it uses the build `hare` bin, which breaks
# cross-compilation.
./002-dont-build-haredoc.patch
# Hardcode harec and qbe.
(substituteAll {
src = ./003-hardcode-qbe-and-harec.patch;
harec = lib.getExe harec;
qbe = lib.getExe qbe;
})
# Display toolchains when using `hare version -v`.
(fetchpatch {
url = "https://git.sr.ht/~sircmpwn/hare/commit/e35f2284774436f422e06f0e8d290b173ced1677.patch";
@ -108,42 +120,37 @@ stdenv.mkDerivation (finalAttrs: {
nativeBuildInputs = [
harec
makeWrapper
qbe
scdoc
];
buildInputs = [
binutils-unwrapped
# Needed for build frameworks like `haredo`, which set the HAREC and QBE env vars to `harec` and
# `qbe` respectively.
propagatedBuildInputs = [
harec
qbe
tzdata
];
makeFlags =
[
"HARECACHE=.harecache"
"PREFIX=${builtins.placeholder "out"}"
"ARCH=${arch}"
"VERSION=${finalAttrs.version}-nixpkgs"
"QBEFLAGS=-t${qbePlatform}"
"AS=${stdenv.cc.targetPrefix}as"
"LD=${stdenv.cc.targetPrefix}ld"
# Strip the variable of an empty $(SRCDIR)/hare/third-party, since nix does
# not follow the FHS.
"HAREPATH=$(SRCDIR)/hare/stdlib"
]
++ lib.optionals enableCrossCompilation [
"RISCV64_AS=${embeddedOnBinaryTools.riscv64.as}"
"RISCV64_CC=${embeddedOnBinaryTools.riscv64.cc}"
"RISCV64_LD=${embeddedOnBinaryTools.riscv64.ld}"
"AARCH64_AS=${embeddedOnBinaryTools.aarch64.as}"
"AARCH64_CC=${embeddedOnBinaryTools.aarch64.cc}"
"AARCH64_LD=${embeddedOnBinaryTools.aarch64.ld}"
"X86_64_AS=${embeddedOnBinaryTools.x86_64.as}"
"X86_64_CC=${embeddedOnBinaryTools.x86_64.cc}"
"X86_64_LD=${embeddedOnBinaryTools.x86_64.ld}"
];
buildInputs = [
harec
qbe
];
makeFlags = [
"HARECACHE=.harecache"
"PREFIX=${builtins.placeholder "out"}"
"ARCH=${arch}"
"VERSION=${finalAttrs.version}-nixpkgs"
"QBEFLAGS=-t${qbePlatform}"
"AS=${stdenv.cc.targetPrefix}as"
"LD=${stdenv.cc.targetPrefix}ld"
"${lib.toUpper buildArch}_AS=${embeddedOnBinaryTools.${buildArch}.as}"
"${lib.toUpper buildArch}_CC=${embeddedOnBinaryTools.${buildArch}.cc}"
"${lib.toUpper buildArch}_LD=${embeddedOnBinaryTools.${buildArch}.ld}"
# Strip the variable of an empty $(SRCDIR)/hare/third-party, since nix does
# not follow the FHS.
"HAREPATH=$(SRCDIR)/hare/stdlib"
] ++ lib.optionals enableCrossCompilation crossCompMakeFlags;
enableParallelBuilding = true;
@ -158,17 +165,6 @@ stdenv.mkDerivation (finalAttrs: {
ln -s configs/${platform}.mk config.mk
'';
postFixup = ''
wrapProgram $out/bin/hare \
--prefix PATH : ${
lib.makeBinPath [
binutils-unwrapped
harec
qbe
]
}
'';
setupHook = ./setup-hook.sh;
passthru = {