openxray: 2188-november-2023-rc1 -> 2921-january-2025-rc1 (#375925)
[NixPkgs.git] / pkgs / by-name / li / limine / package.nix
blob978d346e2b2db44646930b0dd753073649615acd
1 # Derivation containing the Limine host tool and the compiled bootloader
3   fetchurl,
4   lib,
5   llvmPackages_18,
6   mtools,
7   nasm,
8   # The following options map to configure flags.
9   enableAll ? false,
10   buildCDs ? false,
11   targets ? [ ],
12   # x86 specific flags
13   biosSupport ? false,
14   pxeSupport ? false,
17 let
18   llvmPackages = llvmPackages_18;
19   stdenv = llvmPackages.stdenv;
21   version = "8.7.0";
23   hasI686 =
24     (if targets == [ ] then stdenv.hostPlatform.isx86_32 else (builtins.elem "i686" targets))
25     || enableAll;
27   hasX86_64 =
28     (if targets == [ ] then stdenv.hostPlatform.isx86_64 else (builtins.elem "x86_64" targets))
29     || enableAll;
31   uefiFlags =
32     target:
33     {
34       aarch64 = [ "--enable-uefi-aarch64" ];
35       i686 = [ "--enable-uefi-ia32" ];
36       loongarch64 = [ "--enable-uefi-loongarch64" ];
37       riscv64 = [ "--enable-uefi-riscv64" ];
38       x86_64 = [ "--enable-uefi-x86-64" ];
39     }
40     .${target} or (throw "Unsupported target ${target}");
42   configureFlags =
43     lib.optionals enableAll [ "--enable-all" ]
44     ++ lib.optionals biosSupport [ "--enable-bios" ]
45     ++ lib.optionals (buildCDs && biosSupport) [ "--enable-bios-cd" ]
46     ++ lib.optionals buildCDs [ "--enable-uefi-cd" ]
47     ++ lib.optionals pxeSupport [ "--enable-bios-pxe" ]
48     ++ lib.concatMap uefiFlags (
49       if targets == [ ] then [ stdenv.hostPlatform.parsed.cpu.name ] else targets
50     );
53 assert lib.assertMsg (!(biosSupport && !hasI686)) "BIOS builds are possible only for x86";
55 assert lib.assertMsg (!(pxeSupport && !hasI686)) "PXE builds are possible only for x86";
57 # The output of the derivation is a tool to create bootable images using Limine
58 # as bootloader for various platforms and corresponding binary and helper files.
59 stdenv.mkDerivation {
60   inherit version configureFlags;
61   pname = "limine";
62   # We don't use the Git source but the release tarball, as the source has a
63   # `./bootstrap` script performing network access to download resources.
64   # Packaging that in Nix is very cumbersome.
65   src = fetchurl {
66     url = "https://github.com/limine-bootloader/limine/releases/download/v${version}/limine-${version}.tar.gz";
67     hash = "sha256-pwoR9ptMpdhdEe/Kbyc+smv9oNIqtJ9L0KFdf6/g0Ec=";
68   };
70   hardeningDisable = [
71     # clang doesn't support this for RISC-V target
72     "zerocallusedregs"
73   ];
75   enableParallelBuilding = true;
77   nativeBuildInputs =
78     [
79       llvmPackages.libllvm
80       llvmPackages.lld
81     ]
82     ++ lib.optionals (enableAll || buildCDs) [
83       mtools
84     ]
85     ++ lib.optionals (hasI686 || hasX86_64) [ nasm ];
87   outputs = [
88     "out"
89     "dev"
90     "doc"
91     "man"
92   ];
94   meta = with lib; {
95     homepage = "https://limine-bootloader.org/";
96     description = "Limine Bootloader";
97     mainProgram = "limine";
98     # The platforms on that the Limine binary and helper tools can run, not
99     # necessarily the platforms for that bootable images can be created.
100     platforms = platforms.unix;
101     badPlatforms = platforms.darwin;
102     # Caution. Some submodules have different licenses.
103     license = [
104       licenses.asl20 # cc-runtime
105       licenses.bsd0 # freestanding-toolchain, freestanding-headers
106       licenses.bsd2 # limine, flanterm
107       licenses.mit # limine-efi, stb
108       licenses.zlib # tinf
109     ];
110     maintainers = [
111       maintainers._48cf
112       maintainers.phip1611
113       maintainers.sanana
114       maintainers.surfaceflinger
115     ];
116   };