diff options
Diffstat (limited to 'pkgs/by-name/ha/hare/package.nix')
-rw-r--r-- | pkgs/by-name/ha/hare/package.nix | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/pkgs/by-name/ha/hare/package.nix b/pkgs/by-name/ha/hare/package.nix index c509955c6f099..a41bcb90a5139 100644 --- a/pkgs/by-name/ha/hare/package.nix +++ b/pkgs/by-name/ha/hare/package.nix @@ -8,15 +8,55 @@ , scdoc , tzdata , substituteAll +, 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-freebsd` or `riscv64-freebsd` 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)) + -> builtins.throw '' + The cross-compilation toolchains may only be enabled on the following platforms: + ${concatStringsSep "\n" workingPlatforms} +''; + let # We use harec's override of qbe until 1.2 is released, but the `qbe` argument # is kept to avoid breakage. qbe = harec.qbeUnstable; # https://harelang.org/platforms/ arch = stdenv.hostPlatform.uname.processor; - platform = lib.strings.toLower stdenv.hostPlatform.uname.system; + platform = lib.toLower stdenv.hostPlatform.uname.system; + embeddedOnBinaryTools = + let + genToolsFromToolchain = 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}"; + in + { + "ld" = absOrRelPath toolchain.buildPackages.binutils "ld"; + "as" = absOrRelPath toolchain.buildPackages.binutils "as"; + "cc" = absOrRelPath toolchain.stdenv.cc "cc"; + }; + in + { + x86_64 = genToolsFromToolchain x86_64PkgsCrossToolchain; + aarch64 = genToolsFromToolchain aarch64PkgsCrossToolchain; + riscv64 = genToolsFromToolchain riscv64PkgsCrossToolchain; + }; in stdenv.mkDerivation (finalAttrs: { pname = "hare"; @@ -58,6 +98,19 @@ stdenv.mkDerivation (finalAttrs: { "PREFIX=${builtins.placeholder "out"}" "PLATFORM=${platform}" "ARCH=${arch}" + # 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}" ]; enableParallelBuilding = true; @@ -80,6 +133,14 @@ stdenv.mkDerivation (finalAttrs: { setupHook = ./setup-hook.sh; + passthru = { + tests = lib.optionalAttrs enableCrossCompilation { + crossCompilation = callPackage ./cross-compilation-tests.nix { + hare = finalAttrs.finalPackage; + }; + }; + }; + meta = { homepage = "https://harelang.org/"; description = "Systems programming language designed to be simple, stable, and robust"; |