1{
2 lib,
3 callPackage,
4 stdenvAdapters,
5 buildPackages,
6 targetPackages,
7 stdenv,
8 pkgs,
9 recurseIntoAttrs,
10 # This is the default binutils, but with *this* version of LLD rather
11 # than the default LLVM version's, if LLD is the choice. We use these for
12 # the `useLLVM` bootstrapping below.
13 bootBintoolsNoLibc ? if stdenv.targetPlatform.linker == "lld" then null else pkgs.bintoolsNoLibc,
14 bootBintools ? if stdenv.targetPlatform.linker == "lld" then null else pkgs.bintools,
15 llvmVersions ? { },
16 patchesFn ? lib.id,
17 # Allows passthrough to packages via newScope in ./common/default.nix.
18 # This makes it possible to do
19 # `(llvmPackages.override { <someLlvmDependency> = bar; }).clang` and get
20 # an llvmPackages whose packages are overridden in an internally consistent way.
21 ...
22}@packageSetArgs:
23let
24 versions = {
25 "18.1.8".officialRelease.sha256 = "sha256-iiZKMRo/WxJaBXct9GdAcAT3cz9d9pnAcO1mmR6oPNE=";
26 "19.1.7".officialRelease.sha256 = "sha256-cZAB5vZjeTsXt9QHbP5xluWNQnAHByHtHnAhVDV0E6I=";
27 "20.1.8".officialRelease.sha256 = "sha256-ysyB/EYxi2qE9fD5x/F2zI4vjn8UDoo1Z9ukiIrjFGw=";
28 "21.1.1".officialRelease.sha256 = "sha256-IB9Z3bIMwfgw2W2Vxo89CmtCM9DfOyV2Ei64nqgHrgc=";
29 "22.0.0-git".gitRelease = {
30 rev = "cac0635ee9e947b5f90130df2f471aa4b722e04b";
31 rev-version = "22.0.0-unstable-2025-09-28";
32 sha256 = "sha256-wOhLGRYbkJOM6uglKXWZ7/94w/Fi3K2tlyPWdOVsCvM=";
33 };
34 }
35 // llvmVersions;
36
37 mkPackage =
38 {
39 name ? null,
40 officialRelease ? null,
41 gitRelease ? null,
42 monorepoSrc ? null,
43 version ? null,
44 }@args:
45 let
46 inherit
47 (import ./common/common-let.nix {
48 inherit lib;
49 inherit gitRelease officialRelease version;
50 })
51 releaseInfo
52 ;
53 inherit (releaseInfo) release_version;
54 attrName =
55 args.name or (if (gitRelease != null) then "git" else lib.versions.major release_version);
56 in
57 lib.nameValuePair attrName (
58 recurseIntoAttrs (
59 callPackage ./common (
60 {
61 inherit (stdenvAdapters) overrideCC;
62 buildLlvmTools = buildPackages."llvmPackages_${attrName}".tools;
63 targetLlvmLibraries =
64 # Allow overriding targetLlvmLibraries; this enables custom runtime builds.
65 packageSetArgs.targetLlvmLibraries or targetPackages."llvmPackages_${attrName}".libraries
66 or llvmPackages."${attrName}".libraries;
67 targetLlvm = targetPackages."llvmPackages_${attrName}".llvm or llvmPackages."${attrName}".llvm;
68 inherit
69 officialRelease
70 gitRelease
71 monorepoSrc
72 version
73 patchesFn
74 ;
75 }
76 // packageSetArgs # Allow overrides.
77 )
78 )
79 );
80
81 llvmPackages = lib.mapAttrs' (version: args: mkPackage (args // { inherit version; })) versions;
82in
83llvmPackages // { inherit mkPackage versions; }