Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

llvmPackages.libc: init at 20.0.0-unstable-2024-12-08 #363449

Merged
merged 3 commits into from
Jan 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/systems/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ let
else if final.isMusl then "musl"
else if final.isUClibc then "uclibc"
else if final.isAndroid then "bionic"
else if final.isLLVMLibc then "llvm"
else if final.isLinux /* default */ then "glibc"
else if final.isFreeBSD then "fblibc"
else if final.isOpenBSD then "oblibc"
Expand Down
1 change: 1 addition & 0 deletions lib/systems/inspect.nix
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ rec {
isGnu = with abis; map (a: { abi = a; }) [ gnuabi64 gnuabin32 gnu gnueabi gnueabihf gnuabielfv1 gnuabielfv2 ];
isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf muslabin32 muslabi64 ];
isUClibc = with abis; map (a: { abi = a; }) [ uclibc uclibceabi uclibceabihf ];
isLLVMLibc = [ { abi = abis.llvm; } ];

isEfi = [
{ cpu = { family = "arm"; version = "6"; }; }
Expand Down
3 changes: 3 additions & 0 deletions lib/systems/parse.nix
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,9 @@ rec {
uclibceabihf = { float = "hard"; };
uclibc = {};

# LLVM libc
llvm = {};

unknown = {};
};

Expand Down
241 changes: 127 additions & 114 deletions pkgs/development/compilers/llvm/common/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1049,135 +1049,148 @@ let
relative = "compiler-rt";
});
in
{
compiler-rt-libc = callPackage ./compiler-rt (
let
# temp rename to avoid infinite recursion
(
{
compiler-rt-libc = callPackage ./compiler-rt (
let
# temp rename to avoid infinite recursion
stdenv =
# Darwin needs to use a bootstrap stdenv to avoid an infinite recursion when cross-compiling.
if args.stdenv.hostPlatform.isDarwin then
overrideCC darwin.bootstrapStdenv buildLlvmTools.clangWithLibcAndBasicRtAndLibcxx
else if args.stdenv.hostPlatform.useLLVM or false then
overrideCC args.stdenv buildLlvmTools.clangWithLibcAndBasicRtAndLibcxx
else
args.stdenv;
in
{
patches = compiler-rtPatches;
inherit stdenv;
}
// lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
libxcrypt = (libxcrypt.override { inherit stdenv; }).overrideAttrs (old: {
configureFlags = old.configureFlags ++ [ "--disable-symvers" ];
});
}
);

compiler-rt-no-libc = callPackage ./compiler-rt {
patches = compiler-rtPatches;
doFakeLibgcc = stdenv.hostPlatform.useLLVM or false;
stdenv =
# Darwin needs to use a bootstrap stdenv to avoid an infinite recursion when cross-compiling.
if args.stdenv.hostPlatform.isDarwin then
overrideCC darwin.bootstrapStdenv buildLlvmTools.clangWithLibcAndBasicRtAndLibcxx
else if args.stdenv.hostPlatform.useLLVM or false then
overrideCC args.stdenv buildLlvmTools.clangWithLibcAndBasicRtAndLibcxx
if stdenv.hostPlatform.isDarwin then
overrideCC darwin.bootstrapStdenv buildLlvmTools.clangNoLibcNoRt
else
args.stdenv;
in
{
patches = compiler-rtPatches;
inherit stdenv;
}
// lib.optionalAttrs (stdenv.hostPlatform.useLLVM or false) {
libxcrypt = (libxcrypt.override { inherit stdenv; }).overrideAttrs (old: {
configureFlags = old.configureFlags ++ [ "--disable-symvers" ];
});
}
);
overrideCC stdenv buildLlvmTools.clangNoLibcNoRt;
};

compiler-rt-no-libc = callPackage ./compiler-rt {
patches = compiler-rtPatches;
doFakeLibgcc = stdenv.hostPlatform.useLLVM or false;
stdenv =
# Darwin needs to use a bootstrap stdenv to avoid an infinite recursion when cross-compiling.
if stdenv.hostPlatform.isDarwin then
overrideCC darwin.bootstrapStdenv buildLlvmTools.clangNoLibcNoRt
compiler-rt =
if
stdenv.hostPlatform.libc == null
# Building the with-libc compiler-rt and WASM doesn't yet work,
# because wasilibc doesn't provide some expected things. See
# compiler-rt's file for further details.
|| stdenv.hostPlatform.isWasm
# Failing `#include <term.h>` in
# `lib/sanitizer_common/sanitizer_platform_limits_freebsd.cpp`
# sanitizers, not sure where to get it.
|| stdenv.hostPlatform.isFreeBSD
then
libraries.compiler-rt-no-libc
else
overrideCC stdenv buildLlvmTools.clangNoLibcNoRt;
};

compiler-rt =
if
stdenv.hostPlatform.libc == null
# Building the with-libc compiler-rt and WASM doesn't yet work,
# because wasilibc doesn't provide some expected things. See
# compiler-rt's file for further details.
|| stdenv.hostPlatform.isWasm
# Failing `#include <term.h>` in
# `lib/sanitizer_common/sanitizer_platform_limits_freebsd.cpp`
# sanitizers, not sure where to get it.
|| stdenv.hostPlatform.isFreeBSD
then
libraries.compiler-rt-no-libc
else
libraries.compiler-rt-libc;
libraries.compiler-rt-libc;

stdenv = overrideCC stdenv buildLlvmTools.clang;
stdenv = overrideCC stdenv buildLlvmTools.clang;

libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;
libcxxStdenv = overrideCC stdenv buildLlvmTools.libcxxClang;

libcxx = callPackage ./libcxx (
{
patches = lib.optionals (lib.versionOlder metadata.release_version "16") (
lib.optional (lib.versions.major metadata.release_version == "15")
# See:
# - https://reviews.llvm.org/D133566
# - https://github.com/NixOS/nixpkgs/issues/214524#issuecomment-1429146432
# !!! Drop in LLVM 16+
(
fetchpatch {
url = "https://github.com/llvm/llvm-project/commit/57c7bb3ec89565c68f858d316504668f9d214d59.patch";
hash = "sha256-B07vHmSjy5BhhkGSj3e1E0XmMv5/9+mvC/k70Z29VwY=";
}
)
++ [
(substitute {
src = ./libcxxabi/wasm.patch;
libcxx = callPackage ./libcxx (
{
patches = lib.optionals (lib.versionOlder metadata.release_version "16") (
lib.optional (lib.versions.major metadata.release_version == "15")
# See:
# - https://reviews.llvm.org/D133566
# - https://github.com/NixOS/nixpkgs/issues/214524#issuecomment-1429146432
# !!! Drop in LLVM 16+
(
fetchpatch {
url = "https://github.com/llvm/llvm-project/commit/57c7bb3ec89565c68f858d316504668f9d214d59.patch";
hash = "sha256-B07vHmSjy5BhhkGSj3e1E0XmMv5/9+mvC/k70Z29VwY=";
}
)
++ [
(substitute {
src = ./libcxxabi/wasm.patch;
substitutions = [
"--replace-fail"
"/cmake/"
"/llvm/cmake/"
];
})
]
++ lib.optional stdenv.hostPlatform.isMusl (substitute {
src = ./libcxx/libcxx-0001-musl-hacks.patch;
substitutions = [
"--replace-fail"
"/cmake/"
"/llvm/cmake/"
"/include/"
"/libcxx/include/"
];
})
]
++ lib.optional stdenv.hostPlatform.isMusl (substitute {
src = ./libcxx/libcxx-0001-musl-hacks.patch;
substitutions = [
"--replace-fail"
"/include/"
"/libcxx/include/"
];
})
);
stdenv =
if stdenv.hostPlatform.isDarwin then
overrideCC darwin.bootstrapStdenv buildLlvmTools.clangWithLibcAndBasicRt
else
overrideCC stdenv buildLlvmTools.clangWithLibcAndBasicRt;
}
// lib.optionalAttrs (lib.versionOlder metadata.release_version "14") {
# TODO: remove this, causes LLVM 13 packages rebuild.
inherit (metadata) monorepoSrc; # Preserve bug during #307211 refactor.
}
);

libunwind = callPackage ./libunwind {
patches = lib.optional (lib.versionOlder metadata.release_version "17") (
metadata.getVersionFile "libunwind/gnu-install-dirs.patch"
);
stdenv =
if stdenv.hostPlatform.isDarwin then
overrideCC darwin.bootstrapStdenv buildLlvmTools.clangWithLibcAndBasicRt
else
overrideCC stdenv buildLlvmTools.clangWithLibcAndBasicRt;
}
// lib.optionalAttrs (lib.versionOlder metadata.release_version "14") {
# TODO: remove this, causes LLVM 13 packages rebuild.
inherit (metadata) monorepoSrc; # Preserve bug during #307211 refactor.
}
);
stdenv = overrideCC stdenv buildLlvmTools.clangWithLibcAndBasicRt;
};

libunwind = callPackage ./libunwind {
patches = lib.optional (lib.versionOlder metadata.release_version "17") (
metadata.getVersionFile "libunwind/gnu-install-dirs.patch"
);
stdenv = overrideCC stdenv buildLlvmTools.clangWithLibcAndBasicRt;
};
openmp = callPackage ./openmp {
patches =
lib.optional (
lib.versionAtLeast metadata.release_version "15" && lib.versionOlder metadata.release_version "19"
) (metadata.getVersionFile "openmp/fix-find-tool.patch")
++ lib.optional (
lib.versionAtLeast metadata.release_version "14" && lib.versionOlder metadata.release_version "18"
) (metadata.getVersionFile "openmp/gnu-install-dirs.patch")
++ lib.optional (lib.versionAtLeast metadata.release_version "14") (
metadata.getVersionFile "openmp/run-lit-directly.patch"
)
++
lib.optional (lib.versionOlder metadata.release_version "14")
# Fix cross.
(
fetchpatch {
url = "https://github.com/llvm/llvm-project/commit/5e2358c781b85a18d1463fd924d2741d4ae5e42e.patch";
hash = "sha256-UxIlAifXnexF/MaraPW0Ut6q+sf3e7y1fMdEv1q103A=";
}
);
};
}
// lib.optionalAttrs (lib.versionAtLeast metadata.release_version "20") {
libc-overlay = callPackage ./libc {
isFullBuild = false;
};

openmp = callPackage ./openmp {
patches =
lib.optional (
lib.versionAtLeast metadata.release_version "15" && lib.versionOlder metadata.release_version "19"
) (metadata.getVersionFile "openmp/fix-find-tool.patch")
++ lib.optional (
lib.versionAtLeast metadata.release_version "14" && lib.versionOlder metadata.release_version "18"
) (metadata.getVersionFile "openmp/gnu-install-dirs.patch")
++ lib.optional (lib.versionAtLeast metadata.release_version "14") (
metadata.getVersionFile "openmp/run-lit-directly.patch"
)
++
lib.optional (lib.versionOlder metadata.release_version "14")
# Fix cross.
(
fetchpatch {
url = "https://github.com/llvm/llvm-project/commit/5e2358c781b85a18d1463fd924d2741d4ae5e42e.patch";
hash = "sha256-UxIlAifXnexF/MaraPW0Ut6q+sf3e7y1fMdEv1q103A=";
}
);
};
}
libc-full = callPackage ./libc {
isFullBuild = true;
};

libc = if stdenv.targetPlatform.libc == "llvm" then libraries.libc-full else libraries.libc-overlay;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this attribute being for two different things depending on the platform is going to be confusing.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tbf, we already have attributes which confuse people. clangUseLLVM, compiler-rt, stdenv.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And that's justification to make things more confusing??

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well I think it's not that confusing, it'll cause some accidents until someone realizes which one they should use if they need it. The lib names are different between the two so someone could easily tell when things go wrong when an error happens. Also, documenting the attributes better would help a lot.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So why not make it explicit whether full or overlay is being used? As we've established, they're used completely differently, so there isn't a situation where you'd want an attribute that was sometimes the overlay and sometimes full.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My thinking was having a shim which adds in both inside the overlay mode. Then the function which selects the libc cross could detect when to use the overlay mode. That could allow for mixing LLVM libc and glibc or LLVM libc and musl.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I know, a shim can be made by writing a linker script into libc.so.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then how about we hold off on this attribute until that's ready to go? It's not really useful as it is.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added the shim.

}
)
);

noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ];
Expand Down
95 changes: 95 additions & 0 deletions pkgs/development/compilers/llvm/common/libc/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
lib,
stdenv,
llvm_meta,
src ? null,
monorepoSrc ? null,
version,
release_version,
runCommand,
python3,
python3Packages,
patches ? [ ],
cmake,
ninja,
isFullBuild ? true,
linuxHeaders,
}:
let
pname = "libc";

src' = runCommand "${pname}-src-${version}" { } (''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/runtimes "$out"
cp -r ${monorepoSrc}/llvm "$out"
cp -r ${monorepoSrc}/${pname} "$out"
'');

stdenv' =
if stdenv.cc.isClang then
stdenv.override {
cc = stdenv.cc.override {
nixSupport = stdenv.cc.nixSupport // {
cc-cflags = lib.remove "-lunwind" stdenv.cc.nixSupport.cc-cflags;
};
};
}
else
stdenv;
in
stdenv'.mkDerivation (finalAttrs: {
inherit pname version patches;

src = src';

sourceRoot = "${finalAttrs.src.name}/runtimes";

nativeBuildInputs =
[
cmake
python3
]
++ (lib.optional (lib.versionAtLeast release_version "15") ninja)
++ (lib.optional isFullBuild python3Packages.pyyaml);

buildInputs = lib.optional isFullBuild linuxHeaders;

outputs = [ "out" ] ++ (lib.optional isFullBuild "dev");

postUnpack = lib.optionalString isFullBuild ''
patchShebangs $sourceRoot/../$pname/hdrgen/yaml_to_classes.py
chmod +x $sourceRoot/../$pname/hdrgen/yaml_to_classes.py
'';

prePatch = ''
cd ../${finalAttrs.pname}
chmod -R u+w ../
'';

postPatch = ''
cd ../runtimes
'';

postInstall = lib.optionalString (!isFullBuild) ''
substituteAll ${./libc-shim.so} $out/lib/libc.so
'';

libc = if (!isFullBuild) then stdenv.cc.libc else null;

cmakeFlags = [
(lib.cmakeBool "LLVM_LIBC_FULL_BUILD" isFullBuild)
(lib.cmakeFeature "LLVM_ENABLE_RUNTIMES" "libc")
];

# For the update script:
passthru = {
monorepoSrc = monorepoSrc;
inherit isFullBuild;
};

meta = llvm_meta // {
homepage = "https://libc.llvm.org/";
description = "Standard C library for LLVM";
};
})
1 change: 1 addition & 0 deletions pkgs/development/compilers/llvm/common/libc/libc-shim.so
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
GROUP (@libc@ @out@/lib/libllvmlibc.a)
6 changes: 3 additions & 3 deletions pkgs/development/compilers/llvm/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ let
"18.1.8".officialRelease.sha256 = "sha256-iiZKMRo/WxJaBXct9GdAcAT3cz9d9pnAcO1mmR6oPNE=";
"19.1.5".officialRelease.sha256 = "sha256-QxQL4QwUH6e5HWpBvI8yIbZYBNwqqRsZqPH0w/JSiHQ=";
"20.0.0-git".gitRelease = {
rev = "eb5cda480d2ad81230b2aa3e134e2b603ff90a1c";
rev-version = "20.0.0-unstable-2024-11-26";
sha256 = "sha256-8VbQINEZZqAIF4egMaNPd3/W3E3QmOXMl7WToftrebg=";
rev = "1ef5b987a464611a60e873650726b5e02fda0feb";
rev-version = "20.0.0-unstable-2024-12-17";
sha256 = "sha256-QCY9z9h3z5gPvwq6bNzAB5xFFStwOCfKh4VnWInhxU4=";
};
} // llvmVersions;

Expand Down
Loading