From f72b341556cf9438ecdc64de2973892387485531 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Sun, 8 Dec 2024 19:56:12 -0800 Subject: [PATCH] llvmPackages_git.libc: init --- .../compilers/llvm/common/default.nix | 241 +++++++++--------- .../compilers/llvm/common/libc/default.nix | 95 +++++++ .../compilers/llvm/common/libc/libc-shim.so | 1 + pkgs/top-level/all-packages.nix | 3 + 4 files changed, 226 insertions(+), 114 deletions(-) create mode 100644 pkgs/development/compilers/llvm/common/libc/default.nix create mode 100644 pkgs/development/compilers/llvm/common/libc/libc-shim.so diff --git a/pkgs/development/compilers/llvm/common/default.nix b/pkgs/development/compilers/llvm/common/default.nix index 102a43161e3d8..383bc9cf1e20f 100644 --- a/pkgs/development/compilers/llvm/common/default.nix +++ b/pkgs/development/compilers/llvm/common/default.nix @@ -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 ` 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 ` 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; + } + ) ); noExtend = extensible: lib.attrsets.removeAttrs extensible [ "extend" ]; diff --git a/pkgs/development/compilers/llvm/common/libc/default.nix b/pkgs/development/compilers/llvm/common/libc/default.nix new file mode 100644 index 0000000000000..eecae81bb433a --- /dev/null +++ b/pkgs/development/compilers/llvm/common/libc/default.nix @@ -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"; + }; +}) diff --git a/pkgs/development/compilers/llvm/common/libc/libc-shim.so b/pkgs/development/compilers/llvm/common/libc/libc-shim.so new file mode 100644 index 0000000000000..f3beea87680da --- /dev/null +++ b/pkgs/development/compilers/llvm/common/libc/libc-shim.so @@ -0,0 +1 @@ +GROUP (@libc@ @out@/lib/libllvmlibc.a) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a694f39b4b93f..7751d432be157 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9163,6 +9163,9 @@ with pkgs; else if name == "nblibc" then targetPackages.netbsd.libc or netbsd.libc else if name == "wasilibc" then targetPackages.wasilibc or wasilibc else if name == "relibc" then targetPackages.relibc or relibc + else if name == "llvm" then + # Use llvmPackages_git until LLVM 20 is the default. + targetPackages.llvmPackages_git.libc or llvmPackages_git.libc else throw "Unknown libc ${name}"; libcCross =