hydra: 0-unstable-2024-11-25 -> 0-unstable-2024-12-05 (#363987)
[NixPkgs.git] / pkgs / stdenv / freebsd / default.nix
blob8286b5d6076b57b89b81aa38141e0b88e806efeb
1 # afaik the longest dependency chain is stdenv -> stdenv-1#coreutils -> stdenv-1#gmp -> stdenv-0#libcxx -> stdenv-0#libc
2 # this is only possible through aggressive hacking to make libcxx build with stdenv-0#libc instead of bootstrapTools.libc.
4   lib,
5   localSystem,
6   crossSystem,
7   config,
8   overlays,
9   crossOverlays ? [ ],
10   bootstrapFiles ?
11     let
12       table = {
13         x86_64-freebsd = import ./bootstrap-files/x86_64-unknown-freebsd.nix;
14       };
15       files =
16         table.${localSystem.system}
17           or (throw "unsupported platform ${localSystem.system} for the pure FreeBSD stdenv");
18     in
19     files,
22 assert crossSystem == localSystem;
23 let
24   inherit (localSystem) system;
25   mkExtraBuildCommands0 = cc: ''
26     rsrc="$out/resource-root"
27     mkdir "$rsrc"
28     ln -s "${lib.getLib cc}/lib/clang/${lib.versions.major cc.version}/include" "$rsrc"
29     echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags
30   '';
31   mkExtraBuildCommands =
32     cc: compiler-rt:
33     mkExtraBuildCommands0 cc
34     + ''
35       ln -s "${compiler-rt.out}/lib" "$rsrc/lib"
36       ln -s "${compiler-rt.out}/share" "$rsrc/share"
37     '';
39   bootstrapArchive = (
40     derivation {
41       inherit system;
42       name = "bootstrap-archive";
43       pname = "bootstrap-archive";
44       version = "9.9.9";
45       builder = "${bootstrapFiles.unpack}/libexec/ld-elf.so.1";
46       args = [
47         "${bootstrapFiles.unpack}/bin/bash"
48         ./unpack-bootstrap-files.sh
49       ];
50       LD_LIBRARY_PATH = "${bootstrapFiles.unpack}/lib";
51       src = bootstrapFiles.unpack;
52       inherit (bootstrapFiles) bootstrapTools;
53     }
54   );
56   linkBootstrap = (
57     attrs:
58     derivation (
59       attrs
60       // {
61         inherit system;
62         name = attrs.name or (builtins.baseNameOf (builtins.elemAt attrs.paths 0));
63         src = bootstrapArchive;
64         builder = "${bootstrapArchive}/bin/bash";
65         args = [ ./linkBootstrap.sh ];
66         PATH = "${bootstrapArchive}/bin";
67         paths = attrs.paths;
68       }
69     )
70   );
72   # commented linkBootstrap entries are provided but unused
73   bootstrapTools = {
74     expand-response-params = "";
75     bsdcp = linkBootstrap { paths = [ "bin/bsdcp" ]; };
76     patchelf = linkBootstrap { paths = [ "bin/patchelf" ]; };
77     bash = linkBootstrap {
78       paths = [
79         "bin/bash"
80         "bin/sh"
81       ];
82       shell = "bin/bash";
83       shellPath = "/bin/bash";
84     };
85     curl = linkBootstrap {
86       paths = [
87         "bin/curl"
88       ];
89     };
90     llvmPackages = {
91       clang-unwrapped = linkBootstrap {
92         paths = [
93           "bin/clang"
94           "bin/clang++"
95           "bin/cpp"
96         ];
97         # SYNCME: this version number must be synced with the one in make-bootstrap-tools.nix
98         version = "18";
99       };
100       libunwind = linkBootstrap {
101         name = "libunwind";
102         paths = [
103           "lib/libunwind.a"
104           "lib/libunwind.so"
105           "lib/libunwind.so.1"
106           "lib/libunwind.so.1.0"
107           "lib/libunwind_shared.so"
108         ];
109       };
110     };
111     coreutils = linkBootstrap {
112       name = "coreutils";
113       paths = map (str: "bin/" + str) [
114         "base64"
115         "basename"
116         "cat"
117         "chcon"
118         "chgrp"
119         "chmod"
120         "chown"
121         "chroot"
122         "cksum"
123         "comm"
124         "cp"
125         "csplit"
126         "cut"
127         "date"
128         "dd"
129         "df"
130         "dir"
131         "dircolors"
132         "dirname"
133         "du"
134         "echo"
135         "env"
136         "expand"
137         "expr"
138         "factor"
139         "false"
140         "fmt"
141         "fold"
142         "groups"
143         "head"
144         "hostid"
145         "id"
146         "install"
147         "join"
148         "kill"
149         "link"
150         "ln"
151         "logname"
152         "ls"
153         "md5sum"
154         "mkdir"
155         "mkfifo"
156         "mknod"
157         "mktemp"
158         "mv"
159         "nice"
160         "nl"
161         "nohup"
162         "nproc"
163         "numfmt"
164         "od"
165         "paste"
166         "pathchk"
167         "pinky"
168         "pr"
169         "printenv"
170         "printf"
171         "ptx"
172         "pwd"
173         "readlink"
174         "realpath"
175         "rm"
176         "rmdir"
177         "runcon"
178         "seq"
179         "shred"
180         "shuf"
181         "sleep"
182         "sort"
183         "split"
184         "stat"
185         "stdbuf"
186         "stty"
187         "sum"
188         "tac"
189         "tail"
190         "tee"
191         "test"
192         "timeout"
193         "touch"
194         "tr"
195         "true"
196         "truncate"
197         "tsort"
198         "tty"
199         "uname"
200         "unexpand"
201         "uniq"
202         "unlink"
203         "users"
204         "vdir"
205         "wc"
206         "who"
207         "whoami"
208         "yes"
209         "["
210       ];
211     };
212     diffutils = linkBootstrap {
213       name = "diffutils";
214       paths = map (str: "bin/" + str) [
215         "diff"
216         "cmp"
217         #"diff3"
218         #"sdiff"
219       ];
220     };
221     findutils = linkBootstrap {
222       name = "findutils";
223       paths = [
224         "bin/find"
225         "bin/xargs"
226       ];
227     };
228     iconv = linkBootstrap { paths = [ "bin/iconv" ]; };
229     patch = linkBootstrap { paths = [ "bin/patch" ]; };
230     gnutar = linkBootstrap { paths = [ "bin/tar" ]; };
231     gawk = linkBootstrap {
232       paths = [
233         "bin/awk"
234         "bin/gawk"
235       ];
236     };
237     gnumake = linkBootstrap { paths = [ "bin/make" ]; };
238     gnugrep = linkBootstrap {
239       paths = [
240         "bin/grep"
241         "bin/egrep"
242         "bin/fgrep"
243       ];
244     };
245     gnused = linkBootstrap { paths = [ "bin/sed" ]; };
246     gzip = linkBootstrap {
247       paths = [
248         "bin/gzip"
249         #"bin/gunzip"
250       ];
251     };
252     bzip2 = linkBootstrap {
253       paths = [
254         "bin/bzip2"
255         "lib/libbz2.so"
256         "lib/libbz2.so.1"
257       ];
258     };
259     xz = linkBootstrap {
260       paths = [
261         "bin/xz"
262         "bin/unxz"
263         "lib/liblzma.so"
264         "lib/liblzma.so.5"
265       ];
266     };
267     binutils-unwrapped = linkBootstrap {
268       name = "binutils";
269       paths = map (str: "bin/" + str) [
270         "ld"
271         #"as"
272         #"addr2line"
273         "ar"
274         #"c++filt"
275         #"elfedit"
276         #"gprof"
277         #"objdump"
278         "nm"
279         "objcopy"
280         "ranlib"
281         "readelf"
282         "size"
283         "strings"
284         "strip"
285       ];
286     };
287     freebsd = {
288       locales = linkBootstrap { paths = [ "share/locale" ]; };
289       libc = linkBootstrap {
290         name = "bootstrapLibs";
291         paths = [
292           "lib/Scrt1.o"
293           "lib/crt1.o"
294           "lib/crtbegin.o"
295           "lib/crtbeginS.o"
296           "lib/crtbeginT.o"
297           "lib/crtend.o"
298           "lib/crtendS.o"
299           "lib/crti.o"
300           "lib/crtn.o"
301           "lib/libc++.a"
302           "lib/libc++.so"
303           "lib/libc++.so.1"
304           "lib/libc.a"
305           "lib/libc.so"
306           "lib/libc.so.7"
307           "lib/libc_nonshared.a"
308           "lib/libcrypt.so"
309           "lib/libcrypt.so.5"
310           "lib/libcxxrt.a"
311           "lib/libcxxrt.so"
312           "lib/libcxxrt.so.1"
313           "lib/libdevstat.so"
314           "lib/libdevstat.so.7"
315           "lib/libdl.so"
316           "lib/libdl.so.1"
317           "lib/libelf.so"
318           "lib/libelf.so.2"
319           "lib/libexecinfo.so"
320           "lib/libexecinfo.so.1"
321           "lib/libgcc.a"
322           "lib/libgcc_eh.a"
323           "lib/libgcc_s.so"
324           "lib/libgcc_s.so.1"
325           "lib/libkvm.so"
326           "lib/libkvm.so.7"
327           "lib/libm.a"
328           "lib/libm.so"
329           "lib/libm.so.5"
330           "lib/libmd.so"
331           "lib/libmd.so.6"
332           "lib/libncurses.so"
333           "lib/libncurses.so.6"
334           "lib/libncursesw.so"
335           "lib/libncursesw.so.6"
336           "lib/libpthread.so"
337           "lib/librt.so"
338           "lib/librt.so.1"
339           "lib/libthr.so"
340           "lib/libthr.so.3"
341           "lib/libutil.so"
342           "lib/libutil.so.9"
343           "lib/libxnet.so"
344           "include"
345           "share"
346           "libexec"
347         ];
348         pname = "libs";
349         version = "bootstrap";
350       };
351     };
352   };
354   mkStdenv =
355     {
356       name ? "freebsd",
357       overrides ?
358         prevStage: super: self:
359         { },
360       hascxx ? true,
361     }:
362     prevStage:
363     let
364       bsdcp =
365         prevStage.bsdcp or (prevStage.runCommand "bsdcp" { }
366           "mkdir -p $out/bin; cp ${prevStage.freebsd.cp}/bin/cp $out/bin/bsdcp"
367         );
368       initialPath = with prevStage; [
369         coreutils
370         gnutar
371         findutils
372         gnumake
373         gnused
374         patchelf
375         gnugrep
376         gawk
377         diffutils
378         patch
379         bash
380         xz
381         gzip
382         bzip2
383         bsdcp
384       ];
385       shell = "${prevStage.bash}/bin/bash";
386       stdenvNoCC = import ../generic {
387         inherit
388           config
389           initialPath
390           shell
391           fetchurlBoot
392           ;
393         name = "stdenvNoCC-${name}";
394         buildPlatform = localSystem;
395         hostPlatform = localSystem;
396         targetPlatform = localSystem;
397         cc = null;
398       };
399       fetchurlBoot = import ../../build-support/fetchurl {
400         inherit lib stdenvNoCC;
401         inherit (prevStage) curl;
402       };
403       stdenv = import ../generic {
404         inherit
405           config
406           initialPath
407           shell
408           fetchurlBoot
409           ;
410         name = "stdenv-${name}";
411         buildPlatform = localSystem;
412         hostPlatform = localSystem;
413         targetPlatform = localSystem;
414         extraNativeBuildInputs = [
415           ./unpack-source.sh
416           ./always-patchelf.sh
417         ];
418         cc = lib.makeOverridable (import ../../build-support/cc-wrapper) {
419           inherit lib stdenvNoCC;
420           name = "${name}-cc";
421           inherit (prevStage.freebsd) libc;
422           inherit (prevStage) gnugrep coreutils expand-response-params;
423           libcxx = prevStage.llvmPackages.libcxx or null;
424           runtimeShell = shell;
425           propagateDoc = false;
426           nativeTools = false;
427           nativeLibc = false;
428           cc = prevStage.llvmPackages.clang-unwrapped;
429           isClang = true;
430           extraPackages = lib.optionals hascxx [
431             prevStage.llvmPackages.compiler-rt
432           ];
433           nixSupport = {
434             libcxx-cxxflags = lib.optionals (!hascxx) [ "-isystem ${prevStage.freebsd.libc}/include/c++/v1" ];
435           };
436           extraBuildCommands = lib.optionalString hascxx (
437             mkExtraBuildCommands prevStage.llvmPackages.clang-unwrapped prevStage.llvmPackages.compiler-rt
438           );
439           bintools = lib.makeOverridable (import ../../build-support/bintools-wrapper) {
440             inherit lib stdenvNoCC;
441             name = "${name}-bintools";
442             inherit (prevStage.freebsd) libc;
443             inherit (prevStage) gnugrep coreutils expand-response-params;
444             runtimeShell = shell;
445             bintools = prevStage.binutils-unwrapped;
446             propagateDoc = false;
447             nativeTools = false;
448             nativeLibc = false;
449           };
450         };
451         overrides = overrides prevStage;
452         preHook = ''
453           export NIX_ENFORCE_PURITY="''${NIX_ENFORCE_PURITY-1}"
454           export NIX_ENFORCE_NO_NATIVE="''${NIX_ENFORCE_NO_NATIVE-1}"
455           export PATH_LOCALE=${prevStage.freebsd.localesReal or prevStage.freebsd.locales}/share/locale
456         '';
457       };
458     in
459     {
460       inherit config overlays stdenv;
461     };
464   (
465     { }:
466     mkStdenv {
467       name = "freebsd-boot-0";
468       hascxx = false;
469       overrides = prevStage: self: super: {
470         # this one's goal is to build foundational libs like libc and libcxx. we want to override literally every possible bin package we can with bootstrap tools
471         # we CAN'T import LLVM because the compiler built here is used to build the final compiler and the final compiler must not be built by the bootstrap compiler
472         inherit (bootstrapTools)
473           patchelf
474           bash
475           curl
476           coreutils
477           diffutils
478           findutils
479           iconv
480           patch
481           gnutar
482           gawk
483           gnumake
484           gnugrep
485           gnused
486           gzip
487           bzip2
488           xz
489           ;
490         binutils-unwrapped = builtins.removeAttrs bootstrapTools.binutils-unwrapped [ "src" ];
491         fetchurl = import ../../build-support/fetchurl {
492           inherit lib;
493           inherit (self) stdenvNoCC;
494           inherit (prevStage) curl;
495         };
496         gettext = super.gettext.overrideAttrs {
497           NIX_CFLAGS_COMPILE = "-DHAVE_ICONV=1"; # we clearly have iconv. what do you want?
498         };
499         curlReal = super.curl;
500         tzdata = super.tzdata.overrideAttrs { NIX_CFLAGS_COMPILE = "-DHAVE_GETTEXT=0"; };
502         # make it so libcxx/libunwind are built in this stdenv and not the next
503         freebsd = super.freebsd.overrideScope (
504           self': super': {
505             inherit (prevStage.freebsd) locales;
506             stdenvNoLibcxx = self.overrideCC (self.stdenv // { name = "stdenv-freebsd-boot-0.4"; }) (
507               self.stdenv.cc.override {
508                 name = "freebsd-boot-0.4-cc";
509                 libc = self.freebsd.libc;
510                 bintools = self.stdenv.cc.bintools.override {
511                   name = "freebsd-boot-0.4-bintools";
512                   libc = self.freebsd.libc;
513                 };
514               }
515             );
516           }
517         );
518         llvmPackages = super.llvmPackages // {
519           libcxx =
520             (super.llvmPackages.libcxx.override {
521               stdenv = self.overrideCC (self.stdenv // { name = "stdenv-freebsd-boot-0.5"; }) (
522                 self.stdenv.cc.override {
523                   name = "freebsd-boot-0.5-cc";
524                   libc = self.freebsd.libc;
525                   bintools = self.stdenv.cc.bintools.override {
526                     name = "freebsd-boot-0.5-bintools";
527                     libc = self.freebsd.libc;
528                   };
529                   extraPackages = [
530                     self.llvmPackages.compiler-rt
531                   ];
532                   extraBuildCommands = mkExtraBuildCommands self.llvmPackages.clang-unwrapped self.llvmPackages.compiler-rt;
533                 }
534               );
535             }).overrideAttrs
536               (
537                 self': super': {
538                   NIX_CFLAGS_COMPILE = "-nostdlib++";
539                   NIX_LDFLAGS = "--allow-shlib-undefined";
540                   cmakeFlags = builtins.filter (x: x != "-DCMAKE_SHARED_LINKER_FLAGS=-nostdlib") super'.cmakeFlags;
541                 }
542               );
543         };
544       };
545     } bootstrapTools
546   )
547   (mkStdenv {
548     name = "freebsd-boot-1";
549     overrides = prevStage: self: super: {
550       # this one's goal is to build all the tools that get imported into the final stdenv.
551       # we can import the foundational libs from boot-0
552       # we can import bins and libs that DON'T get imported OR LINKED into the final stdenv from boot-0
553       curl = prevStage.curlReal;
554       inherit (prevStage)
555         fetchurl
556         python3
557         bison
558         perl
559         cmake
560         ninja
561         ;
562       fetchurlReal = super.fetchurl;
563       freebsd = super.freebsd.overrideScope (
564         self': super': {
565           locales = prevStage.freebsd.locales;
566           localesReal = super'.locales;
567           libc = prevStage.freebsd.libc;
568         }
569       );
570       llvmPackages = super.llvmPackages // {
571         libcxx = prevStage.llvmPackages.libcxx;
572       };
573     };
574   })
575   (mkStdenv {
576     name = "freebsd";
577     overrides = prevStage: self: super: {
578       __bootstrapArchive = bootstrapArchive;
579       fetchurl = prevStage.fetchurlReal;
580       freebsd = super.freebsd.overrideScope (
581         self': super': { localesPrev = prevStage.freebsd.localesReal; }
582       );
583     };
584   })