1{
2 lib,
3 callPackage,
4 stdenvAdapters,
5 buildPackages,
6 targetPackages,
7 stdenv,
8 gcc12Stdenv,
9 pkgs,
10 recurseIntoAttrs,
11 # This is the default binutils, but with *this* version of LLD rather
12 # than the default LLVM version's, if LLD is the choice. We use these for
13 # the `useLLVM` bootstrapping below.
14 bootBintoolsNoLibc ? if stdenv.targetPlatform.linker == "lld" then null else pkgs.bintoolsNoLibc,
15 bootBintools ? if stdenv.targetPlatform.linker == "lld" then null else pkgs.bintools,
16 llvmVersions ? { },
17 patchesFn ? lib.id,
18 # Allows passthrough to packages via newScope in ./common/default.nix.
19 # This makes it possible to do
20 # `(llvmPackages.override { <someLlvmDependency> = bar; }).clang` and get
21 # an llvmPackages whose packages are overridden in an internally consistent way.
22 ...
23}@packageSetArgs:
24let
25 versions = {
26 "12.0.1".officialRelease.sha256 = "08s5w2db9imb2yaqsvxs6pg21csi1cf6wa35rf8x6q07mam7j8qv";
27 "13.0.1".officialRelease.sha256 = "06dv6h5dmvzdxbif2s8njki6h32796v368dyb5945x8gjj72xh7k";
28 "14.0.6".officialRelease.sha256 = "sha256-vffu4HilvYwtzwgq+NlS26m65DGbp6OSSne2aje1yJE=";
29 "15.0.7".officialRelease.sha256 = "sha256-wjuZQyXQ/jsmvy6y1aksCcEDXGBjuhpgngF3XQJ/T4s=";
30 "16.0.6".officialRelease.sha256 = "sha256-fspqSReX+VD+Nl/Cfq+tDcdPtnQPV1IRopNDfd5VtUs=";
31 "17.0.6".officialRelease.sha256 = "sha256-8MEDLLhocshmxoEBRSKlJ/GzJ8nfuzQ8qn0X/vLA+ag=";
32 "18.1.8".officialRelease.sha256 = "sha256-iiZKMRo/WxJaBXct9GdAcAT3cz9d9pnAcO1mmR6oPNE=";
33 "19.1.7".officialRelease.sha256 = "sha256-cZAB5vZjeTsXt9QHbP5xluWNQnAHByHtHnAhVDV0E6I=";
34 "20.1.5".officialRelease.sha256 = "sha256-WKfY+VvAsZEEc0xYgF6+MsXDXZz7haMU6bxqmUpaHuQ=";
35 "21.0.0-git".gitRelease = {
36 rev = "0004c37c1cd55c461bbf24b83165d11f49be1397";
37 rev-version = "21.0.0-unstable-2025-05-25";
38 sha256 = "sha256-n8WFnYNb46kK7MEh7XF/Psdbn+KJQFKs/LQBZxCklY4=";
39 };
40 } // llvmVersions;
41
42 mkPackage =
43 {
44 name ? null,
45 officialRelease ? null,
46 gitRelease ? null,
47 monorepoSrc ? null,
48 version ? null,
49 }@args:
50 let
51 inherit
52 (import ./common/common-let.nix {
53 inherit lib;
54 inherit gitRelease officialRelease version;
55 })
56 releaseInfo
57 ;
58 inherit (releaseInfo) release_version;
59 attrName =
60 args.name or (if (gitRelease != null) then "git" else lib.versions.major release_version);
61 in
62 lib.nameValuePair attrName (
63 recurseIntoAttrs (
64 callPackage ./common (
65 {
66 inherit (stdenvAdapters) overrideCC;
67 buildLlvmTools = buildPackages."llvmPackages_${attrName}".tools;
68 targetLlvmLibraries =
69 # Allow overriding targetLlvmLibraries; this enables custom runtime builds.
70 packageSetArgs.targetLlvmLibraries or targetPackages."llvmPackages_${attrName}".libraries
71 or llvmPackages."${attrName}".libraries;
72 targetLlvm = targetPackages."llvmPackages_${attrName}".llvm or llvmPackages."${attrName}".llvm;
73 inherit
74 officialRelease
75 gitRelease
76 monorepoSrc
77 version
78 patchesFn
79 ;
80 }
81 // packageSetArgs # Allow overrides.
82 // {
83 stdenv =
84 if (lib.versions.major release_version == "13" && stdenv.cc.cc.isGNU or false) then
85 gcc12Stdenv
86 else
87 stdenv; # does not build with gcc13
88 }
89 )
90 )
91 );
92
93 llvmPackages = lib.mapAttrs' (version: args: mkPackage (args // { inherit version; })) versions;
94in
95llvmPackages // { inherit mkPackage; }