diff options
Diffstat (limited to 'pkgs/by-name/ha/hare/package.nix')
-rw-r--r-- | pkgs/by-name/ha/hare/package.nix | 157 |
1 files changed, 87 insertions, 70 deletions
diff --git a/pkgs/by-name/ha/hare/package.nix b/pkgs/by-name/ha/hare/package.nix index 49e4d91db7f5a..3cf37e33109b1 100644 --- a/pkgs/by-name/ha/hare/package.nix +++ b/pkgs/by-name/ha/hare/package.nix @@ -1,71 +1,88 @@ -{ lib -, stdenv -, fetchFromSourcehut -, binutils-unwrapped -, harec -, makeWrapper -, qbe -, gitUpdater -, scdoc -, tzdata -, substituteAll -, fetchpatch -, callPackage -, enableCrossCompilation ? (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.is64bit) -, pkgsCross -, x86_64PkgsCrossToolchain ? pkgsCross.gnu64 -, aarch64PkgsCrossToolchain ? pkgsCross.aarch64-multiplatform -, riscv64PkgsCrossToolchain ? pkgsCross.riscv64 +{ + lib, + stdenv, + fetchFromSourcehut, + harec, + qbe, + gitUpdater, + scdoc, + tzdata, + substituteAll, + fetchpatch, + callPackage, + enableCrossCompilation ? (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.is64bit), + pkgsCross, + x86_64PkgsCrossToolchain ? pkgsCross.gnu64, + aarch64PkgsCrossToolchain ? pkgsCross.aarch64-multiplatform, + riscv64PkgsCrossToolchain ? pkgsCross.riscv64, }: # There's no support for `aarch64` or `riscv64` for freebsd nor for openbsd on nix. # See `lib.systems.doubles.aarch64` and `lib.systems.doubles.riscv64`. -assert let - inherit (stdenv.hostPlatform) isLinux is64bit; - inherit (lib) intersectLists platforms concatStringsSep; - workingPlatforms = intersectLists platforms.linux (with platforms; x86_64 ++ aarch64 ++ riscv64); -in -(enableCrossCompilation -> !(isLinux && is64bit)) +assert + let + inherit (stdenv.hostPlatform) isLinux is64bit; + inherit (lib) intersectLists platforms concatStringsSep; + workingPlatforms = intersectLists platforms.linux (with platforms; x86_64 ++ aarch64 ++ riscv64); + in + (enableCrossCompilation -> !(isLinux && is64bit)) -> builtins.throw '' - The cross-compilation toolchains may only be enabled on the following platforms: - ${concatStringsSep "\n" workingPlatforms} -''; + The cross-compilation toolchains may only be enabled on the following platforms: + ${concatStringsSep "\n" workingPlatforms} + ''; let + buildArch = stdenv.buildPlatform.uname.processor; arch = stdenv.hostPlatform.uname.processor; - qbePlatform = { - x86_64 = "amd64_sysv"; - aarch64 = "arm64"; - riscv64 = "rv64"; - }.${arch}; platform = lib.toLower stdenv.hostPlatform.uname.system; + qbePlatform = + { + x86_64 = "amd64_sysv"; + aarch64 = "arm64"; + riscv64 = "rv64"; + } + .${arch}; embeddedOnBinaryTools = let - genToolsFromToolchain = toolchain: + 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"; version = "0.24.0"; - outputs = [ "out" "man" ]; + outputs = [ + "out" + "man" + ]; src = fetchFromSourcehut { owner = "~sircmpwn"; @@ -88,20 +105,35 @@ 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"; + hash = "sha256-A59bGO/9tOghV8/MomTxd8xRExkHVdoMom2d+HTfQGg="; + }) ]; nativeBuildInputs = [ harec - makeWrapper qbe scdoc ]; + # Needed for build frameworks like `haredo`, which set the HAREC and QBE env vars to `harec` and + # `qbe` respectively. + propagatedBuildInputs = [ + harec + qbe + ]; + buildInputs = [ - binutils-unwrapped harec qbe - tzdata ]; makeFlags = [ @@ -110,23 +142,15 @@ stdenv.mkDerivation (finalAttrs: { "ARCH=${arch}" "VERSION=${finalAttrs.version}-nixpkgs" "QBEFLAGS=-t${qbePlatform}" - "CC=${stdenv.cc.targetPrefix}cc" "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 [ - "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}" - ]; + ] ++ lib.optionals enableCrossCompilation crossCompMakeFlags; enableParallelBuilding = true; @@ -141,19 +165,12 @@ 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 = { updateScript = gitUpdater { }; tests = lib.optionalAttrs enableCrossCompilation { - crossCompilation = callPackage ./cross-compilation-tests.nix { - hare = finalAttrs.finalPackage; - }; + crossCompilation = callPackage ./cross-compilation-tests.nix { hare = finalAttrs.finalPackage; }; }; }; |