Merge pull request #312205 from onemoresuza/hare-remove-sh-overhead
hare: remove shell wrapping overhead
This commit is contained in:
@@ -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),
|
||||
];
|
||||
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user