Merge pull request #312205 from onemoresuza/hare-remove-sh-overhead

hare: remove shell wrapping overhead
This commit is contained in:
Peder Bergebakken Sundt
2024-05-16 16:44:58 +02:00
committed by GitHub
2 changed files with 79 additions and 59 deletions
@@ -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),
];
+55 -59
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 = {