From 0801041b528ff00c2a7bfbf309eb752362df344c Mon Sep 17 00:00:00 2001 From: Coutinho de Souza Date: Fri, 10 May 2024 16:37:28 -0300 Subject: [PATCH] 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 `_` 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`. --- .../ha/hare/003-hardcode-qbe-and-harec.patch | 24 ++++ pkgs/by-name/ha/hare/package.nix | 114 +++++++++--------- 2 files changed, 79 insertions(+), 59 deletions(-) create mode 100644 pkgs/by-name/ha/hare/003-hardcode-qbe-and-harec.patch diff --git a/pkgs/by-name/ha/hare/003-hardcode-qbe-and-harec.patch b/pkgs/by-name/ha/hare/003-hardcode-qbe-and-harec.patch new file mode 100644 index 000000000000..808d75aeb185 --- /dev/null +++ b/pkgs/by-name/ha/hare/003-hardcode-qbe-and-harec.patch @@ -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), + ]; diff --git a/pkgs/by-name/ha/hare/package.nix b/pkgs/by-name/ha/hare/package.nix index a798cc46819c..3cf37e33109b 100644 --- a/pkgs/by-name/ha/hare/package.nix +++ b/pkgs/by-name/ha/hare/package.nix @@ -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 = {