Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at devShellTools-shell 177 lines 5.4 kB view raw
1{ 2 lib, 3 stdenv, 4 fetchFromSourcehut, 5 harec, 6 scdoc, 7 tzdata, 8 mailcap, 9 replaceVars, 10 callPackage, 11 enableCrossCompilation ? (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.is64bit), 12 pkgsCross, 13 x86_64PkgsCrossToolchain ? pkgsCross.gnu64, 14 aarch64PkgsCrossToolchain ? pkgsCross.aarch64-multiplatform, 15 riscv64PkgsCrossToolchain ? pkgsCross.riscv64, 16}: 17 18# There's no support for `aarch64` or `riscv64` for freebsd nor for openbsd on nix. 19# See `lib.systems.doubles.aarch64` and `lib.systems.doubles.riscv64`. 20assert 21 let 22 inherit (stdenv.hostPlatform) isLinux is64bit; 23 inherit (lib) intersectLists platforms concatStringsSep; 24 workingPlatforms = intersectLists platforms.linux (with platforms; x86_64 ++ aarch64 ++ riscv64); 25 in 26 lib.assertMsg (enableCrossCompilation -> isLinux && is64bit) '' 27 The cross-compilation toolchains may only be enabled on the following platforms: 28 ${concatStringsSep "\n" workingPlatforms} 29 ''; 30 31let 32 inherit (harec) qbe; 33 buildArch = stdenv.buildPlatform.uname.processor; 34 arch = stdenv.hostPlatform.uname.processor; 35 platform = lib.toLower stdenv.hostPlatform.uname.system; 36 qbePlatform = 37 { 38 x86_64 = "amd64_sysv"; 39 aarch64 = "arm64"; 40 riscv64 = "rv64"; 41 } 42 .${arch}; 43 embeddedOnBinaryTools = 44 let 45 genPaths = 46 toolchain: 47 let 48 inherit (toolchain.stdenv.cc) targetPrefix; 49 inherit (toolchain.stdenv.targetPlatform.uname) processor; 50 in 51 { 52 "${processor}" = { 53 "ld" = lib.getExe' toolchain.buildPackages.binutils "${targetPrefix}ld"; 54 "as" = lib.getExe' toolchain.buildPackages.binutils "${targetPrefix}as"; 55 "cc" = lib.getExe' toolchain.stdenv.cc "${targetPrefix}cc"; 56 }; 57 }; 58 in 59 builtins.foldl' (acc: elem: acc // (genPaths elem)) { } [ 60 x86_64PkgsCrossToolchain 61 aarch64PkgsCrossToolchain 62 riscv64PkgsCrossToolchain 63 ]; 64 crossCompMakeFlags = builtins.filter (x: !(lib.hasPrefix (lib.toUpper buildArch) x)) [ 65 "RISCV64_AS=${embeddedOnBinaryTools.riscv64.as}" 66 "RISCV64_CC=${embeddedOnBinaryTools.riscv64.cc}" 67 "RISCV64_LD=${embeddedOnBinaryTools.riscv64.ld}" 68 "AARCH64_AS=${embeddedOnBinaryTools.aarch64.as}" 69 "AARCH64_CC=${embeddedOnBinaryTools.aarch64.cc}" 70 "AARCH64_LD=${embeddedOnBinaryTools.aarch64.ld}" 71 "X86_64_AS=${embeddedOnBinaryTools.x86_64.as}" 72 "X86_64_CC=${embeddedOnBinaryTools.x86_64.cc}" 73 "X86_64_LD=${embeddedOnBinaryTools.x86_64.ld}" 74 ]; 75in 76stdenv.mkDerivation (finalAttrs: { 77 pname = "hare"; 78 version = "0.24.2"; 79 80 outputs = [ 81 "out" 82 "man" 83 ]; 84 85 src = fetchFromSourcehut { 86 owner = "~sircmpwn"; 87 repo = "hare"; 88 rev = finalAttrs.version; 89 hash = "sha256-61lckI0F+Ez5LR/8g6ftS0W7Q/+EU/1flTDFleBg6pc="; 90 }; 91 92 patches = [ 93 # Replace FHS paths with nix store 94 (replaceVars ./001-tzdata.patch { 95 inherit tzdata; 96 }) 97 # Don't build haredoc since it uses the build `hare` bin, which breaks 98 # cross-compilation. 99 ./002-dont-build-haredoc.patch 100 # Hardcode harec and qbe. 101 (replaceVars ./003-hardcode-qbe-and-harec.patch { 102 harec_bin = lib.getExe harec; 103 qbe_bin = lib.getExe qbe; 104 }) 105 # Use mailcap `/etc/mime.types` for Hare's mime module 106 (replaceVars ./004-use-mailcap-for-mimetypes.patch { 107 inherit mailcap; 108 }) 109 ]; 110 111 nativeBuildInputs = [ 112 harec 113 qbe 114 scdoc 115 ]; 116 117 buildInputs = [ 118 harec 119 qbe 120 ]; 121 122 makeFlags = [ 123 "HARECACHE=.harecache" 124 "PREFIX=${builtins.placeholder "out"}" 125 "ARCH=${arch}" 126 "VERSION=${finalAttrs.version}-nixpkgs" 127 "QBEFLAGS=-t${qbePlatform}" 128 "AS=${stdenv.cc.targetPrefix}as" 129 "LD=${stdenv.cc.targetPrefix}ld" 130 "${lib.toUpper buildArch}_AS=${embeddedOnBinaryTools.${buildArch}.as}" 131 "${lib.toUpper buildArch}_CC=${embeddedOnBinaryTools.${buildArch}.cc}" 132 "${lib.toUpper buildArch}_LD=${embeddedOnBinaryTools.${buildArch}.ld}" 133 # Strip the variable of an empty $(SRCDIR)/hare/third-party, since nix does 134 # not follow the FHS. 135 "HAREPATH=$(SRCDIR)/hare/stdlib" 136 ] 137 ++ lib.optionals enableCrossCompilation crossCompMakeFlags; 138 139 enableParallelBuilding = true; 140 141 # Append the distribution name to the version 142 env.LOCALVER = "nixpkgs"; 143 144 strictDeps = true; 145 146 doCheck = true; 147 148 postConfigure = '' 149 ln -s configs/${platform}.mk config.mk 150 ''; 151 152 passthru = { 153 tests = 154 lib.optionalAttrs enableCrossCompilation { 155 crossCompilation = callPackage ./cross-compilation-tests.nix { hare = finalAttrs.finalPackage; }; 156 } 157 // lib.optionalAttrs (stdenv.buildPlatform.canExecute stdenv.hostPlatform) { 158 mimeModule = callPackage ./mime-module-test.nix { hare = finalAttrs.finalPackage; }; 159 } 160 // 161 lib.optionalAttrs (enableCrossCompilation && stdenv.buildPlatform.canExecute stdenv.hostPlatform) 162 { 163 crossCompilation = callPackage ./cross-compilation-tests.nix { hare = finalAttrs.finalPackage; }; 164 }; 165 # To be propagated by `hareHook`. 166 inherit harec qbe; 167 }; 168 169 meta = { 170 homepage = "https://harelang.org/"; 171 description = "Systems programming language designed to be simple, stable, and robust"; 172 license = lib.licenses.gpl3Only; 173 maintainers = with lib.maintainers; [ onemoresuza ]; 174 mainProgram = "hare"; 175 inherit (harec.meta) platforms badPlatforms; 176 }; 177})