Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
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})