Compare commits

...

6 Commits

Author SHA1 Message Date
John Ericson
5975ba6be1 clang: build with Ninja for all versions
Older versions using Make is a relic of old stdenv bootstrap.
2024-05-27 15:41:42 -04:00
John Ericson
95191cd7a5 llvmPackages: Clean up in a few ways 2024-05-27 15:41:42 -04:00
John Ericson
0fe5ab26b9 llvm: Alway disable hardening trivialautovarinit
Old code basically did just taht, this is simpler.
2024-05-27 14:34:19 -04:00
John Ericson
5b59dfc37a .git-blame-ignore-revs, .github: Mark formatting just done 2024-05-27 14:32:32 -04:00
John Ericson
65e2d797a2 llvmPackages: Format common files
This will help with further refactors
2024-05-27 14:30:55 -04:00
John Ericson
e8f0e65bf0 clang: Remove uneeded self
`finalAttrs` is good enough.
2024-05-27 13:47:01 -04:00
15 changed files with 1842 additions and 1462 deletions

View File

@@ -121,3 +121,6 @@ c759efa5e7f825913f9a69ef20f025f50f56dc4d
# python3Packages: format with nixfmt
59b1aef59071cae6e87859dc65de973d2cc595c0
# pkgs/development/compilers/llvm/common: Reformat with nixfmt-rfc-style
65e2d797a234feb71c787ad3ef0cafc52299bb37

View File

@@ -43,6 +43,7 @@ jobs:
nixos/modules/services/cluster/k3s
nixos/tests/k3s
pkgs/applications/networking/cluster/k3s
NIX_FMT_PATHS_LLVM_COMMON: pkgs/development/compilers/llvm/common
NIX_FMT_PATHS_VSCODE_EXTS: pkgs/applications/editors/vscode/extensions
NIX_FMT_PATHS_PHP_PACKAGES: pkgs/development/php-packages
NIX_FMT_PATHS_BUILD_SUPPORT_PHP: pkgs/build-support/php

View File

@@ -1,17 +1,28 @@
{ lib, runCommand, stdenv, llvm, lld, version, release_version }:
{
lib,
runCommand,
stdenv,
llvm,
lld,
version,
release_version,
}:
let
targetPrefix = lib.optionalString (stdenv.hostPlatform != stdenv.targetPlatform) "${stdenv.targetPlatform.config}-";
targetPrefix = lib.optionalString (
stdenv.hostPlatform != stdenv.targetPlatform
) "${stdenv.targetPlatform.config}-";
in
runCommand "llvm-binutils-${version}"
{
{
preferLocalBuild = true;
passthru = {
isLLVM = true;
inherit targetPrefix;
};
}
(''
}
(
''
mkdir -p $out/bin
for prog in ${lld}/bin/*; do
ln -s $prog $out/bin/${targetPrefix}$(basename $prog)
@@ -44,6 +55,8 @@ runCommand "llvm-binutils-${version}"
ln -s ${lld}/bin/lld $out/bin/${targetPrefix}ld
# Only >=13 show GNU windres compatible in help
'' + lib.optionalString (lib.versionAtLeast release_version "13") ''
''
+ lib.optionalString (lib.versionAtLeast release_version "13") ''
ln -s $llvmBin/llvm-rc $out/bin/${targetPrefix}windres
'')
''
)

View File

@@ -1,148 +1,208 @@
{ lib
, stdenv
, llvm_meta
, patches ? []
, src ? null
, monorepoSrc ? null
, runCommand
, substituteAll
, cmake
, ninja
, libxml2
, libllvm
, release_version
, version
, python3
, buildLlvmTools
, fixDarwinDylibNames
, enableManpages ? false
, clang-tools-extra_src ? null
{
lib,
stdenv,
llvm_meta,
patches ? [ ],
src ? null,
monorepoSrc ? null,
runCommand,
substituteAll,
cmake,
ninja,
libxml2,
libllvm,
release_version,
version,
python3,
buildLlvmTools,
fixDarwinDylibNames,
enableManpages ? false,
clang-tools-extra_src ? null,
}:
let
pname = "clang";
src' = if monorepoSrc != null then
runCommand "${pname}-src-${version}" {} ''
src' =
if monorepoSrc != null then
runCommand "${pname}-src-${version}" { } ''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/${pname} "$out"
cp -r ${monorepoSrc}/clang-tools-extra "$out"
'' else src;
self = stdenv.mkDerivation (finalAttrs: rec {
''
else
src;
in
stdenv.mkDerivation (
finalAttrs:
rec {
inherit pname version patches;
src = src';
sourceRoot = if lib.versionOlder release_version "13" then null
else "${src.name}/${pname}";
sourceRoot = if lib.versionOlder release_version "13" then null else "${src.name}/${pname}";
nativeBuildInputs = [ cmake ]
++ (lib.optional (lib.versionAtLeast release_version "15") ninja)
++ [ python3 ]
nativeBuildInputs =
[
cmake
ninja
python3
]
++ lib.optional (lib.versionAtLeast version "18" && enableManpages) python3.pkgs.myst-parser
++ lib.optional enableManpages python3.pkgs.sphinx
++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
buildInputs = [ libxml2 libllvm ];
buildInputs = [
libxml2
libllvm
];
cmakeFlags = (lib.optionals (lib.versionAtLeast release_version "15") [
"-DCLANG_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/clang"
]) ++ [
cmakeFlags =
[
"-DCMAKE_INSTALL_PACKAGEDIR=${placeholder "dev"}/lib/"
"-DCLANGD_BUILD_XPC=OFF"
"-DLLVM_ENABLE_RTTI=ON"
] ++ lib.optionals (lib.versionAtLeast release_version "17") [
"-DLLVM_INCLUDE_TESTS=OFF"
] ++ lib.optionals enableManpages [
(lib.cmakeBool "LLVM_INCLUDE_TESTS" finalAttrs.doCheck)
]
++ lib.optionals enableManpages [
"-DCLANG_INCLUDE_DOCS=ON"
"-DLLVM_ENABLE_SPHINX=ON"
"-DSPHINX_OUTPUT_MAN=ON"
"-DSPHINX_OUTPUT_HTML=OFF"
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) ([
]
++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) (
[
"-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
"-DCLANG_TABLEGEN=${buildLlvmTools.libclang.dev}/bin/clang-tblgen"
] ++ lib.optionals (lib.versionAtLeast release_version "15") [
]
++ lib.optionals (lib.versionAtLeast release_version "15") [
# Added in LLVM15:
# `clang-tidy-confusable-chars-gen`: https://github.com/llvm/llvm-project/commit/c3574ef739fbfcc59d405985a3a4fa6f4619ecdb
# `clang-pseudo-gen`: https://github.com/llvm/llvm-project/commit/cd2292ef824591cc34cc299910a3098545c840c7
"-DCLANG_TIDY_CONFUSABLE_CHARS_GEN=${buildLlvmTools.libclang.dev}/bin/clang-tidy-confusable-chars-gen"
"-DCLANG_PSEUDO_GEN=${buildLlvmTools.libclang.dev}/bin/clang-pseudo-gen"
]);
]
);
postPatch = ''
postPatch =
''
# Make sure clang passes the correct location of libLTO to ld64
substituteInPlace lib/Driver/ToolChains/Darwin.cpp \
--replace-fail 'StringRef P = llvm::sys::path::parent_path(D.Dir);' 'StringRef P = "${lib.getLib libllvm}";'
'' + (if lib.versionOlder release_version "13" then ''
''
+ (
if lib.versionOlder release_version "13" then
''
sed -i -e 's/DriverArgs.hasArg(options::OPT_nostdlibinc)/true/' \
-e 's/Args.hasArg(options::OPT_nostdlibinc)/true/' \
lib/Driver/ToolChains/*.cpp
'' else ''
''
else
''
(cd tools && ln -s ../../clang-tools-extra extra)
'') + lib.optionalString stdenv.hostPlatform.isMusl ''
''
)
+ lib.optionalString stdenv.hostPlatform.isMusl ''
sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp
'';
outputs = [ "out" "lib" "dev" "python" ];
outputs = [
"out"
"lib"
"dev"
"python"
];
postInstall = ''
postInstall =
''
ln -sv $out/bin/clang $out/bin/cpp
'' + (lib.optionalString (lib.versions.major release_version == "17") ''
''
+ (lib.optionalString (lib.versions.major release_version == "17") ''
mkdir -p $lib/lib/clang
mv $lib/lib/17 $lib/lib/clang/17
'') + ''
'')
+ ''
# Move libclang to 'lib' output
moveToOutput "lib/libclang.*" "$lib"
moveToOutput "lib/libclang-cpp.*" "$lib"
'' + (if lib.versionOlder release_version "15" then ''
''
+ (
if lib.versionOlder release_version "15" then
''
substituteInPlace $out/lib/cmake/clang/ClangTargets-release.cmake \
--replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
--replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
'' else ''
''
else
''
substituteInPlace $dev/lib/cmake/clang/ClangTargets-release.cmake \
--replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
--replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
'') + ''
''
)
+ ''
'' + (if lib.versionOlder release_version "15" then ''
''
+ (
if lib.versionOlder release_version "15" then
''
mkdir -p $python/bin $python/share/{clang,scan-view}
'' else ''
''
else
''
mkdir -p $python/bin $python/share/clang/
'') + ''
''
)
+ ''
mv $out/bin/{git-clang-format,scan-view} $python/bin
if [ -e $out/bin/set-xcode-analyzer ]; then
mv $out/bin/set-xcode-analyzer $python/bin
fi
mv $out/share/clang/*.py $python/share/clang
'' + (lib.optionalString (lib.versionOlder release_version "15") ''
''
+ (lib.optionalString (lib.versionOlder release_version "15") ''
mv $out/share/scan-view/*.py $python/share/scan-view
'') + ''
'')
+ ''
rm $out/bin/c-index-test
patchShebangs $python/bin
mkdir -p $dev/bin
'' + (if lib.versionOlder release_version "15" then ''
''
+ (
if lib.versionOlder release_version "15" then
''
cp bin/clang-tblgen $dev/bin
'' else ''
''
else
''
cp bin/{clang-tblgen,clang-tidy-confusable-chars-gen,clang-pseudo-gen} $dev/bin
'');
''
);
passthru = {
doCheck = false;
passthru =
{
inherit libllvm;
isClang = true;
} // (lib.optionalAttrs (lib.versionAtLeast release_version "15") {
}
// (lib.optionalAttrs (lib.versionAtLeast release_version "15") {
hardeningUnsupportedFlags = [ "fortify3" ];
hardeningUnsupportedFlagsByTargetPlatform =
targetPlatform:
lib.optional (!(targetPlatform.isx86_64 || targetPlatform.isAarch64)) "zerocallusedregs"
++ (finalAttrs.passthru.hardeningUnsupportedFlags or [ ]);
})
// (lib.optionalAttrs (lib.versionOlder release_version "15") {
hardeningUnsupportedFlags = [
"fortify3"
"zerocallusedregs"
];
hardeningUnsupportedFlagsByTargetPlatform = targetPlatform:
lib.optional (!(targetPlatform.isx86_64 || targetPlatform.isAarch64)) "zerocallusedregs"
++ (finalAttrs.passthru.hardeningUnsupportedFlags or []);
}) // (lib.optionalAttrs (lib.versionOlder release_version "15") {
hardeningUnsupportedFlags = [ "fortify3" "zerocallusedregs" ];
});
meta = llvm_meta // {
@@ -161,7 +221,8 @@ let
'';
mainProgram = "clang";
};
} // lib.optionalAttrs enableManpages ({
}
// lib.optionalAttrs enableManpages {
pname = "clang-manpages";
installPhase = ''
@@ -177,13 +238,10 @@ let
meta = llvm_meta // {
description = "man page for Clang ${version}";
};
} // (if lib.versionOlder release_version "15" then {
buildPhase = ''
make docs-clang-man
'';
} else {
ninjaFlags = [ "docs-clang-man" ];
})) // (lib.optionalAttrs (clang-tools-extra_src != null) { inherit clang-tools-extra_src; })
}
// (lib.optionalAttrs (clang-tools-extra_src != null) { inherit clang-tools-extra_src; })
// (lib.optionalAttrs (lib.versionOlder release_version "13") {
unpackPhase = ''
unpackFile $src
@@ -201,5 +259,5 @@ let
# 12, but appears to occur only for cross compiles.
NIX_CFLAGS_COMPILE = "-Wno-maybe-uninitialized";
};
}));
in self
})
)

View File

@@ -1,9 +1,10 @@
{ lib
, fetchFromGitHub ? null
, release_version ? null
, gitRelease ? null
, officialRelease ? null
, monorepoSrc' ? null
{
lib,
fetchFromGitHub ? null,
release_version ? null,
gitRelease ? null,
officialRelease ? null,
monorepoSrc' ? null,
}:
rec {
@@ -13,30 +14,30 @@ rec {
# See llvm/cmake/config-ix.cmake.
platforms =
lib.platforms.aarch64 ++
lib.platforms.arm ++
lib.platforms.mips ++
lib.platforms.power ++
lib.platforms.s390x ++
lib.platforms.wasi ++
lib.platforms.x86 ++
lib.optionals (lib.versionAtLeast release_version "7") lib.platforms.riscv ++
lib.optionals (lib.versionAtLeast release_version "14") lib.platforms.m68k;
lib.platforms.aarch64
++ lib.platforms.arm
++ lib.platforms.mips
++ lib.platforms.power
++ lib.platforms.s390x
++ lib.platforms.wasi
++ lib.platforms.x86
++ lib.optionals (lib.versionAtLeast release_version "7") lib.platforms.riscv
++ lib.optionals (lib.versionAtLeast release_version "14") lib.platforms.m68k;
};
releaseInfo =
if gitRelease != null then rec {
if gitRelease != null then
rec {
original = gitRelease;
release_version = original.version;
version = gitRelease.rev-version;
} else rec {
}
else
rec {
original = officialRelease;
release_version = original.version;
version =
if original ? candidate then
"${release_version}-${original.candidate}"
else
release_version;
if original ? candidate then "${release_version}-${original.candidate}" else release_version;
};
monorepoSrc =
@@ -45,16 +46,11 @@ rec {
else
let
sha256 = releaseInfo.original.sha256;
rev =
if gitRelease != null then
gitRelease.rev
else
"llvmorg-${releaseInfo.version}";
rev = if gitRelease != null then gitRelease.rev else "llvmorg-${releaseInfo.version}";
in
fetchFromGitHub {
owner = "llvm";
repo = "llvm-project";
inherit rev sha256;
};
}

View File

@@ -1,20 +1,21 @@
{ lib
, stdenv
, llvm_meta
, release_version
, version
, patches ? []
, src ? null
, monorepoSrc ? null
, runCommand
, cmake
, ninja
, python3
, xcbuild
, libllvm
, linuxHeaders
, libxcrypt
, doFakeLibgcc ? stdenv.hostPlatform.isFreeBSD
{
lib,
stdenv,
llvm_meta,
release_version,
version,
patches ? [ ],
src ? null,
monorepoSrc ? null,
runCommand,
cmake,
ninja,
python3,
xcbuild,
libllvm,
linuxHeaders,
libxcrypt,
doFakeLibgcc ? stdenv.hostPlatform.isFreeBSD,
}:
let
@@ -22,128 +23,168 @@ let
useLLVM = stdenv.hostPlatform.useLLVM or false;
bareMetal = stdenv.hostPlatform.parsed.kernel.name == "none";
haveLibc = stdenv.cc.libc != null;
isDarwinStatic = stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isStatic && lib.versionAtLeast release_version "16";
isDarwinStatic =
stdenv.hostPlatform.isDarwin
&& stdenv.hostPlatform.isStatic
&& lib.versionAtLeast release_version "16";
inherit (stdenv.hostPlatform) isMusl isAarch64;
baseName = "compiler-rt";
pname = baseName + lib.optionalString (haveLibc) "-libc";
src' = if monorepoSrc != null then
runCommand "${baseName}-src-${version}" {} ''
src' =
if monorepoSrc != null then
runCommand "${baseName}-src-${version}" { } ''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/${baseName} "$out"
'' else src;
''
else
src;
preConfigure = lib.optionalString (useLLVM && !haveLibc) ''
cmakeFlagsArray+=(-DCMAKE_C_FLAGS="-nodefaultlibs -ffreestanding")
'';
in
stdenv.mkDerivation ({
stdenv.mkDerivation (
{
inherit pname version patches;
src = src';
sourceRoot = if lib.versionOlder release_version "13" then null
else "${src'.name}/${baseName}";
sourceRoot = if lib.versionOlder release_version "13" then null else "${src'.name}/${baseName}";
nativeBuildInputs = [ cmake ]
nativeBuildInputs =
[ cmake ]
++ (lib.optional (lib.versionAtLeast release_version "15") ninja)
++ [ python3 libllvm.dev ]
++ [
python3
libllvm.dev
]
++ lib.optional stdenv.isDarwin xcbuild.xcrun;
buildInputs =
lib.optional (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isRiscV) linuxHeaders;
buildInputs = lib.optional (
stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isRiscV
) linuxHeaders;
env.NIX_CFLAGS_COMPILE = toString ([
"-DSCUDO_DEFAULT_OPTIONS=DeleteSizeMismatch=0:DeallocationTypeMismatch=0"
] ++ lib.optionals (!haveLibc) [
env.NIX_CFLAGS_COMPILE = toString (
[ "-DSCUDO_DEFAULT_OPTIONS=DeleteSizeMismatch=0:DeallocationTypeMismatch=0" ]
++ lib.optionals (!haveLibc) [
# The compiler got stricter about this, and there is a usellvm patch below
# which patches out the assert include causing an implicit definition of
# assert. It would be nicer to understand why compiler-rt thinks it should
# be able to #include <assert.h> in the first place; perhaps it's in the
# wrong, or perhaps there is a way to provide an assert.h.
"-Wno-error=implicit-function-declaration"
]);
]
);
cmakeFlags = [
cmakeFlags =
[
"-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON"
"-DCMAKE_C_COMPILER_TARGET=${stdenv.hostPlatform.config}"
"-DCMAKE_ASM_COMPILER_TARGET=${stdenv.hostPlatform.config}"
] ++ lib.optionals (haveLibc && stdenv.hostPlatform.libc == "glibc") [
]
++ lib.optionals (haveLibc && stdenv.hostPlatform.libc == "glibc") [
"-DSANITIZER_COMMON_CFLAGS=-I${libxcrypt}/include"
] ++ lib.optionals ((useLLVM || bareMetal || isMusl || isAarch64) && (lib.versions.major release_version == "13")) [
"-DCOMPILER_RT_BUILD_LIBFUZZER=OFF"
] ++ lib.optionals (useLLVM || bareMetal || isMusl || isDarwinStatic) [
]
++ lib.optionals (
(useLLVM || bareMetal || isMusl || isAarch64) && (lib.versions.major release_version == "13")
) [ "-DCOMPILER_RT_BUILD_LIBFUZZER=OFF" ]
++ lib.optionals (useLLVM || bareMetal || isMusl || isDarwinStatic) [
"-DCOMPILER_RT_BUILD_SANITIZERS=OFF"
"-DCOMPILER_RT_BUILD_XRAY=OFF"
"-DCOMPILER_RT_BUILD_LIBFUZZER=OFF"
"-DCOMPILER_RT_BUILD_MEMPROF=OFF"
"-DCOMPILER_RT_BUILD_ORC=OFF" # may be possible to build with musl if necessary
] ++ lib.optionals (useLLVM || bareMetal) [
"-DCOMPILER_RT_BUILD_PROFILE=OFF"
] ++ lib.optionals ((useLLVM && !haveLibc) || bareMetal || isDarwinStatic) [
]
++ lib.optionals (useLLVM || bareMetal) [ "-DCOMPILER_RT_BUILD_PROFILE=OFF" ]
++ lib.optionals ((useLLVM && !haveLibc) || bareMetal || isDarwinStatic) [
"-DCMAKE_CXX_COMPILER_WORKS=ON"
] ++ lib.optionals ((useLLVM && !haveLibc) || bareMetal) [
]
++ lib.optionals ((useLLVM && !haveLibc) || bareMetal) [
"-DCMAKE_C_COMPILER_WORKS=ON"
"-DCOMPILER_RT_BAREMETAL_BUILD=ON"
"-DCMAKE_SIZEOF_VOID_P=${toString (stdenv.hostPlatform.parsed.cpu.bits / 8)}"
] ++ lib.optionals (useLLVM && !haveLibc) [
"-DCMAKE_C_FLAGS=-nodefaultlibs"
] ++ lib.optionals (useLLVM) [
]
++ lib.optionals (useLLVM && !haveLibc) [ "-DCMAKE_C_FLAGS=-nodefaultlibs" ]
++ lib.optionals (useLLVM) [
"-DCOMPILER_RT_BUILD_BUILTINS=ON"
#https://stackoverflow.com/questions/53633705/cmake-the-c-compiler-is-not-able-to-compile-a-simple-test-program
"-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY"
] ++ lib.optionals (bareMetal) [
"-DCOMPILER_RT_OS_DIR=baremetal"
] ++ lib.optionals (stdenv.hostPlatform.isDarwin) (lib.optionals (lib.versionAtLeast release_version "16") [
]
++ lib.optionals (bareMetal) [ "-DCOMPILER_RT_OS_DIR=baremetal" ]
++ lib.optionals (stdenv.hostPlatform.isDarwin) (
lib.optionals (lib.versionAtLeast release_version "16") [
"-DCMAKE_LIPO=${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}lipo"
] ++ [
]
++ [
"-DDARWIN_macosx_OVERRIDE_SDK_VERSION=ON"
"-DDARWIN_osx_ARCHS=${stdenv.hostPlatform.darwinArch}"
"-DDARWIN_osx_BUILTIN_ARCHS=${stdenv.hostPlatform.darwinArch}"
] ++ lib.optionals (lib.versionAtLeast release_version "15") [
]
++ lib.optionals (lib.versionAtLeast release_version "15") [
# `COMPILER_RT_DEFAULT_TARGET_ONLY` does not apply to Darwin:
# https://github.com/llvm/llvm-project/blob/27ef42bec80b6c010b7b3729ed0528619521a690/compiler-rt/cmake/base-config-ix.cmake#L153
"-DCOMPILER_RT_ENABLE_IOS=OFF"
]) ++ lib.optionals (lib.versionAtLeast version "19" && stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13") [
"-DSANITIZER_MIN_OSX_VERSION=10.10"
];
]
)
++ lib.optionals (
lib.versionAtLeast version "19"
&& stdenv.isDarwin
&& lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13"
) [ "-DSANITIZER_MIN_OSX_VERSION=10.10" ];
outputs = [ "out" "dev" ];
outputs = [
"out"
"dev"
];
# TSAN requires XPC on Darwin, which we have no public/free source files for. We can depend on the Apple frameworks
# to get it, but they're unfree. Since LLVM is rather central to the stdenv, we patch out TSAN support so that Hydra
# can build this. If we didn't do it, basically the entire nixpkgs on Darwin would have an unfree dependency and we'd
# get no binary cache for the entire platform. If you really find yourself wanting the TSAN, make this controllable by
# a flag and turn the flag off during the stdenv build.
postPatch = lib.optionalString (!stdenv.isDarwin) ''
postPatch =
lib.optionalString (!stdenv.isDarwin) ''
substituteInPlace cmake/builtin-config-ix.cmake \
--replace 'set(X86 i386)' 'set(X86 i386 i486 i586 i686)'
'' + lib.optionalString stdenv.isDarwin ''
''
+ lib.optionalString stdenv.isDarwin ''
substituteInPlace cmake/config-ix.cmake \
--replace 'set(COMPILER_RT_HAS_TSAN TRUE)' 'set(COMPILER_RT_HAS_TSAN FALSE)'
'' + lib.optionalString (useLLVM && !haveLibc) ((lib.optionalString (lib.versionAtLeast release_version "18") ''
''
+ lib.optionalString (useLLVM && !haveLibc) (
(lib.optionalString (lib.versionAtLeast release_version "18") ''
substituteInPlace lib/builtins/aarch64/sme-libc-routines.c \
--replace "<stdlib.h>" "<stddef.h>"
'') + ''
'')
+ ''
substituteInPlace lib/builtins/int_util.c \
--replace "#include <stdlib.h>" ""
'' + (if stdenv.hostPlatform.isFreeBSD then
''
+ (
if stdenv.hostPlatform.isFreeBSD then
# As per above, but in FreeBSD assert is a macro and simply allowing it to be implicitly declared causes Issues!!!!!
''
substituteInPlace lib/builtins/clear_cache.c lib/builtins/cpu_model.c \
--replace "#include <assert.h>" "#define assert(e) ((e)?(void)0:__assert(__FUNCTION__,__FILE__,__LINE__,#e))"
'' else ''
''
else
''
substituteInPlace lib/builtins/clear_cache.c \
--replace "#include <assert.h>" ""
substituteInPlace lib/builtins/cpu_model${lib.optionalString (lib.versionAtLeast version "18") "/x86"}.c \
--replace "#include <assert.h>" ""
''));
''
)
);
# Hack around weird upsream RPATH bug
postInstall = lib.optionalString (stdenv.hostPlatform.isDarwin) ''
postInstall =
lib.optionalString (stdenv.hostPlatform.isDarwin) ''
ln -s "$out/lib"/*/* "$out/lib"
'' + lib.optionalString (useLLVM && stdenv.hostPlatform.isLinux) ''
''
+ lib.optionalString (useLLVM && stdenv.hostPlatform.isLinux) ''
ln -s $out/lib/*/clang_rt.crtbegin-*.o $out/lib/crtbegin.o
ln -s $out/lib/*/clang_rt.crtend-*.o $out/lib/crtend.o
# Note the history of crt{begin,end}S in previous versions of llvm in nixpkg:
@@ -154,7 +195,8 @@ stdenv.mkDerivation ({
ln -s $out/lib/*/clang_rt.crtend-*.o $out/lib/crtendS.o
ln -s $out/lib/*/clang_rt.crtbegin_shared-*.o $out/lib/crtbeginS.o
ln -s $out/lib/*/clang_rt.crtend_shared-*.o $out/lib/crtendS.o
'' + lib.optionalString doFakeLibgcc ''
''
+ lib.optionalString doFakeLibgcc ''
ln -s $out/lib/freebsd/libclang_rt.builtins-*.a $out/lib/libgcc.a
'';
@@ -171,9 +213,14 @@ stdenv.mkDerivation ({
'';
# "All of the code in the compiler-rt project is dual licensed under the MIT
# license and the UIUC License (a BSD-like license)":
license = with lib.licenses; [ mit ncsa ];
license = with lib.licenses; [
mit
ncsa
];
# compiler-rt requires a Clang stdenv on 32-bit RISC-V:
# https://reviews.llvm.org/D43106#1019077
broken = stdenv.hostPlatform.isRiscV32 && !stdenv.cc.isClang;
};
} // (if lib.versionOlder release_version "16" then { inherit preConfigure; } else {}))
}
// (if lib.versionOlder release_version "16" then { inherit preConfigure; } else { })
)

View File

@@ -1,10 +1,22 @@
{ lib, stdenv, version, runCommand, monorepoSrc, llvm, buildPackages, buildLlvmTools, ninja, cmake, python3 }:
{
lib,
stdenv,
version,
runCommand,
monorepoSrc,
llvm,
buildPackages,
buildLlvmTools,
ninja,
cmake,
python3,
}:
stdenv.mkDerivation rec {
pname = "libclc";
inherit version;
src = runCommand "${pname}-src-${version}" {} ''
src = runCommand "${pname}-src-${version}" { } ''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/${pname} "$out"
@@ -12,14 +24,16 @@ stdenv.mkDerivation rec {
sourceRoot = "${src.name}/${pname}";
outputs = [ "out" "dev" ];
patches = [
./libclc/libclc-gnu-install-dirs.patch
outputs = [
"out"
"dev"
];
patches = [ ./libclc/libclc-gnu-install-dirs.patch ];
# cmake expects all required binaries to be in the same place, so it will not be able to find clang without the patch
postPatch = ''
postPatch =
''
substituteInPlace CMakeLists.txt \
--replace 'find_program( LLVM_CLANG clang PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \
'find_program( LLVM_CLANG clang PATHS "${buildLlvmTools.clang.cc}/bin" NO_DEFAULT_PATH )' \
@@ -30,13 +44,20 @@ stdenv.mkDerivation rec {
--replace 'find_program( LLVM_OPT opt PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \
'find_program( LLVM_OPT opt PATHS "${buildLlvmTools.llvm}/bin" NO_DEFAULT_PATH )' \
--replace 'find_program( LLVM_SPIRV llvm-spirv PATHS ''${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH )' \
'find_program( LLVM_SPIRV llvm-spirv PATHS "${buildPackages.spirv-llvm-translator.override { inherit (buildLlvmTools) llvm; }}/bin" NO_DEFAULT_PATH )'
'' + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
'find_program( LLVM_SPIRV llvm-spirv PATHS "${
buildPackages.spirv-llvm-translator.override { inherit (buildLlvmTools) llvm; }
}/bin" NO_DEFAULT_PATH )'
''
+ lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
substituteInPlace CMakeLists.txt \
--replace 'COMMAND prepare_builtins' 'COMMAND ${buildLlvmTools.libclc.dev}/bin/prepare_builtins'
'';
nativeBuildInputs = [ cmake ninja python3 ];
nativeBuildInputs = [
cmake
ninja
python3
];
buildInputs = [ llvm ];
strictDeps = true;

View File

@@ -1,22 +1,23 @@
{ lib
, stdenv
, llvm_meta
, release_version
, monorepoSrc ? null
, src ? null
, patches ? []
, runCommand
, substitute
, cmake
, lndir
, ninja
, python3
, fixDarwinDylibNames
, version
, cxxabi ? null
, libcxxrt
, libunwind
, enableShared ? !stdenv.hostPlatform.isStatic
{
lib,
stdenv,
llvm_meta,
release_version,
monorepoSrc ? null,
src ? null,
patches ? [ ],
runCommand,
substitute,
cmake,
lndir,
ninja,
python3,
fixDarwinDylibNames,
version,
cxxabi ? null,
libcxxrt,
libunwind,
enableShared ? !stdenv.hostPlatform.isStatic,
}:
# note: our setup using libcxxabi instead of libcxxrt on FreeBSD diverges from
@@ -37,103 +38,134 @@ let
# Note: useLLVM is likely false for Darwin but true under pkgsLLVM
useLLVM = stdenv.hostPlatform.useLLVM or false;
src' = if monorepoSrc != null then
runCommand "${pname}-src-${version}" {} (''
src' =
if monorepoSrc != null then
runCommand "${pname}-src-${version}" { } (
''
mkdir -p "$out/llvm"
'' + (lib.optionalString (lib.versionAtLeast release_version "14") ''
''
+ (lib.optionalString (lib.versionAtLeast release_version "14") ''
cp -r ${monorepoSrc}/cmake "$out"
'') + ''
'')
+ ''
cp -r ${monorepoSrc}/libcxx "$out"
cp -r ${monorepoSrc}/llvm/cmake "$out/llvm"
cp -r ${monorepoSrc}/llvm/utils "$out/llvm"
'' + (lib.optionalString (lib.versionAtLeast release_version "14") ''
''
+ (lib.optionalString (lib.versionAtLeast release_version "14") ''
cp -r ${monorepoSrc}/third-party "$out"
'') + ''
'')
+ ''
cp -r ${monorepoSrc}/runtimes "$out"
'' + (lib.optionalString (cxxabi == null) ''
''
+ (lib.optionalString (cxxabi == null) ''
cp -r ${monorepoSrc}/libcxxabi "$out"
'')) else src;
'')
)
else
src;
cxxabiCMakeFlags = lib.optionals (lib.versionAtLeast release_version "18") [
"-DLIBCXXABI_USE_LLVM_UNWINDER=OFF"
] ++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) (if lib.versionAtLeast release_version "18" then [
cxxabiCMakeFlags =
lib.optionals (lib.versionAtLeast release_version "18") [ "-DLIBCXXABI_USE_LLVM_UNWINDER=OFF" ]
++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) (
if lib.versionAtLeast release_version "18" then
[
"-DLIBCXXABI_ADDITIONAL_LIBRARIES=unwind"
"-DLIBCXXABI_USE_COMPILER_RT=ON"
] else [
]
else
[
"-DLIBCXXABI_USE_COMPILER_RT=ON"
"-DLIBCXXABI_USE_LLVM_UNWINDER=ON"
]) ++ lib.optionals stdenv.hostPlatform.isWasm [
]
)
++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXXABI_ENABLE_THREADS=OFF"
"-DLIBCXXABI_ENABLE_EXCEPTIONS=OFF"
] ++ lib.optionals (!enableShared) [
"-DLIBCXXABI_ENABLE_SHARED=OFF"
];
]
++ lib.optionals (!enableShared) [ "-DLIBCXXABI_ENABLE_SHARED=OFF" ];
cxxCMakeFlags = [
"-DLIBCXX_CXX_ABI=${cxxabiName}"
] ++ lib.optionals (cxxabi == null && lib.versionAtLeast release_version "16") [
cxxCMakeFlags =
[ "-DLIBCXX_CXX_ABI=${cxxabiName}" ]
++ lib.optionals (cxxabi == null && lib.versionAtLeast release_version "16") [
# Note: llvm < 16 doesn't support this flag (or it's broken); handled in postInstall instead.
# Include libc++abi symbols within libc++.a for static linking libc++;
# dynamic linking includes them through libc++.so being a linker script
# which includes both shared objects.
"-DLIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY=ON"
] ++ lib.optionals (cxxabi != null) [
"-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${lib.getDev cxxabi}/include"
] ++ lib.optionals (stdenv.hostPlatform.isMusl || stdenv.hostPlatform.isWasi) [
]
++ lib.optionals (cxxabi != null) [ "-DLIBCXX_CXX_ABI_INCLUDE_PATHS=${lib.getDev cxxabi}/include" ]
++ lib.optionals (stdenv.hostPlatform.isMusl || stdenv.hostPlatform.isWasi) [
"-DLIBCXX_HAS_MUSL_LIBC=1"
] ++ lib.optionals (lib.versionAtLeast release_version "18" && !useLLVM && stdenv.hostPlatform.libc == "glibc" && !stdenv.hostPlatform.isStatic) [
"-DLIBCXX_ADDITIONAL_LIBRARIES=gcc_s"
] ++ lib.optionals useLLVM [
"-DLIBCXX_USE_COMPILER_RT=ON"
] ++ lib.optionals (useLLVM && lib.versionAtLeast release_version "16") [
]
++ lib.optionals (
lib.versionAtLeast release_version "18"
&& !useLLVM
&& stdenv.hostPlatform.libc == "glibc"
&& !stdenv.hostPlatform.isStatic
) [ "-DLIBCXX_ADDITIONAL_LIBRARIES=gcc_s" ]
++ lib.optionals useLLVM [ "-DLIBCXX_USE_COMPILER_RT=ON" ]
++ lib.optionals (useLLVM && lib.versionAtLeast release_version "16") [
"-DLIBCXX_ADDITIONAL_LIBRARIES=unwind"
] ++ lib.optionals stdenv.hostPlatform.isWasm [
]
++ lib.optionals stdenv.hostPlatform.isWasm [
"-DLIBCXX_ENABLE_THREADS=OFF"
"-DLIBCXX_ENABLE_FILESYSTEM=OFF"
"-DLIBCXX_ENABLE_EXCEPTIONS=OFF"
] ++ lib.optionals (!enableShared) [
"-DLIBCXX_ENABLE_SHARED=OFF"
];
]
++ lib.optionals (!enableShared) [ "-DLIBCXX_ENABLE_SHARED=OFF" ];
cmakeFlags = [
"-DLLVM_ENABLE_RUNTIMES=${lib.concatStringsSep ";" runtimes}"
] ++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) [
cmakeFlags =
[ "-DLLVM_ENABLE_RUNTIMES=${lib.concatStringsSep ";" runtimes}" ]
++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) [
# libcxxabi's CMake looks as though it treats -nostdlib++ as implying -nostdlib,
# but that does not appear to be the case for example when building
# pkgsLLVM.libcxxabi (which uses clangNoCompilerRtWithLibc).
"-DCMAKE_EXE_LINKER_FLAGS=-nostdlib"
"-DCMAKE_SHARED_LINKER_FLAGS=-nostdlib"
] ++ lib.optionals stdenv.hostPlatform.isWasm [
]
++ lib.optionals stdenv.hostPlatform.isWasm [
"-DCMAKE_C_COMPILER_WORKS=ON"
"-DCMAKE_CXX_COMPILER_WORKS=ON"
"-DUNIX=ON" # Required otherwise libc++ fails to detect the correct linker
] ++ cxxCMakeFlags
]
++ cxxCMakeFlags
++ lib.optionals (cxxabi == null) cxxabiCMakeFlags;
in
stdenv.mkDerivation (rec {
inherit pname version cmakeFlags patches;
stdenv.mkDerivation (
rec {
inherit
pname
version
cmakeFlags
patches
;
src = src';
outputs = [ "out" "dev" ];
outputs = [
"out"
"dev"
];
preConfigure = lib.optionalString stdenv.hostPlatform.isMusl ''
patchShebangs utils/cat_files.py
'';
nativeBuildInputs = [ cmake ninja python3 ]
++ lib.optional stdenv.isDarwin fixDarwinDylibNames
++ lib.optional (cxxabi != null) lndir;
nativeBuildInputs = [
cmake
ninja
python3
] ++ lib.optional stdenv.isDarwin fixDarwinDylibNames ++ lib.optional (cxxabi != null) lndir;
buildInputs = [ cxxabi ]
++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) [ libunwind ];
buildInputs = [ cxxabi ] ++ lib.optionals (useLLVM && !stdenv.hostPlatform.isWasm) [ libunwind ];
# libc++.so is a linker script which expands to multiple libraries,
# libc++.so.1 and libc++abi.so or the external cxxabi. ld-wrapper doesn't
# support linker scripts so the external cxxabi needs to be symlinked in
postInstall = lib.optionalString (cxxabi != null) ''
postInstall =
lib.optionalString (cxxabi != null) ''
lndir ${lib.getDev cxxabi}/include $dev/include/c++/v1
lndir ${lib.getLib cxxabi}/lib $out/lib
libcxxabi=$out/lib/lib${cxxabi.libName}.a
@@ -176,17 +208,30 @@ stdenv.mkDerivation (rec {
'';
# "All of the code in libc++ is dual licensed under the MIT license and the
# UIUC License (a BSD-like license)":
license = with lib.licenses; [ mit ncsa ];
license = with lib.licenses; [
mit
ncsa
];
};
} // (if (lib.versionOlder release_version "16" || lib.versionAtLeast release_version "17") then {
postPatch = (lib.optionalString (lib.versionAtLeast release_version "14" && lib.versionOlder release_version "15") ''
}
// (
if (lib.versionOlder release_version "16" || lib.versionAtLeast release_version "17") then
{
postPatch =
(lib.optionalString
(lib.versionAtLeast release_version "14" && lib.versionOlder release_version "15")
''
# fix CMake error when static and LIBCXXABI_USE_LLVM_UNWINDER=ON. aren't
# building unwind so don't need to depend on it
substituteInPlace libcxx/src/CMakeLists.txt \
--replace-fail "add_dependencies(cxx_static unwind)" "# add_dependencies(cxx_static unwind)"
'') + ''
''
)
+ ''
cd runtimes
'';
} else {
sourceRoot = "${src'.name}/runtimes";
}))
}
else
{ sourceRoot = "${src'.name}/runtimes"; }
)
)

View File

@@ -1,22 +1,25 @@
{ lib
, stdenv
, release_version
, patches ? []
, src ? null
, llvm_meta
, version
, monorepoSrc ? null
, runCommand
, cmake
, ninja
, python3
, libcxx
, enableShared ? !stdenv.hostPlatform.isStatic
{
lib,
stdenv,
release_version,
patches ? [ ],
src ? null,
llvm_meta,
version,
monorepoSrc ? null,
runCommand,
cmake,
ninja,
python3,
libcxx,
enableShared ? !stdenv.hostPlatform.isStatic,
}:
let
pname = "libunwind";
src' = if monorepoSrc != null then
runCommand "${pname}-src-${version}" {} (''
src' =
if monorepoSrc != null then
runCommand "${pname}-src-${version}" { } (
''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/${pname} "$out"
@@ -25,10 +28,14 @@ let
cp -r ${monorepoSrc}/libcxx/utils "$out/libcxx"
mkdir -p "$out/llvm"
cp -r ${monorepoSrc}/llvm/cmake "$out/llvm"
'' + lib.optionalString (lib.versionAtLeast release_version "15") ''
''
+ lib.optionalString (lib.versionAtLeast release_version "15") ''
cp -r ${monorepoSrc}/llvm/utils "$out/llvm"
cp -r ${monorepoSrc}/runtimes "$out"
'') else src;
''
)
else
src;
hasPatches = builtins.length patches > 0;
@@ -37,12 +44,18 @@ let
ln -s ${libcxx.src}/llvm .
'';
prePatch = lib.optionalString (lib.versionAtLeast release_version "15" && (hasPatches || lib.versionOlder release_version "18")) ''
prePatch =
lib.optionalString
(lib.versionAtLeast release_version "15" && (hasPatches || lib.versionOlder release_version "18"))
''
cd ../${pname}
chmod -R u+w .
'';
postPatch = lib.optionalString (lib.versionAtLeast release_version "15" && (hasPatches || lib.versionOlder release_version "18")) ''
postPatch =
lib.optionalString
(lib.versionAtLeast release_version "15" && (hasPatches || lib.versionOlder release_version "18"))
''
cd ../runtimes
'';
@@ -51,23 +64,34 @@ let
ln -s $out/lib/libunwind.so $out/lib/libunwind_shared.so
'';
in
stdenv.mkDerivation (rec {
stdenv.mkDerivation (
rec {
inherit pname version patches;
src = src';
sourceRoot =
if lib.versionOlder release_version "13" then null
else if lib.versionAtLeast release_version "15" then "${src.name}/runtimes"
else "${src.name}/${pname}";
if lib.versionOlder release_version "13" then
null
else if lib.versionAtLeast release_version "15" then
"${src.name}/runtimes"
else
"${src.name}/${pname}";
outputs = [ "out" "dev" ];
nativeBuildInputs = [ cmake ] ++ lib.optionals (lib.versionAtLeast release_version "15") [
ninja python3
outputs = [
"out"
"dev"
];
cmakeFlags = lib.optional (lib.versionAtLeast release_version "15") "-DLLVM_ENABLE_RUNTIMES=libunwind"
nativeBuildInputs =
[ cmake ]
++ lib.optionals (lib.versionAtLeast release_version "15") [
ninja
python3
];
cmakeFlags =
lib.optional (lib.versionAtLeast release_version "15") "-DLLVM_ENABLE_RUNTIMES=libunwind"
++ lib.optional (!enableShared) "-DLIBUNWIND_ENABLE_SHARED=OFF";
meta = llvm_meta // {
@@ -81,7 +105,9 @@ stdenv.mkDerivation (rec {
dependency of other runtimes.
'';
};
} // (if postUnpack != "" then { inherit postUnpack; } else {})
// (if (lib.versionAtLeast release_version "15") then { inherit postInstall; } else {})
// (if prePatch != "" then { inherit prePatch; } else {})
// (if postPatch != "" then { inherit postPatch; } else {}))
}
// (if postUnpack != "" then { inherit postUnpack; } else { })
// (if (lib.versionAtLeast release_version "15") then { inherit postInstall; } else { })
// (if prePatch != "" then { inherit prePatch; } else { })
// (if postPatch != "" then { inherit postPatch; } else { })
)

View File

@@ -1,66 +1,82 @@
{ lib
, stdenv
, llvm_meta
, release_version
, patches ? []
, buildLlvmTools
, monorepoSrc ? null
, src ? null
, libunwind ? null
, runCommand
, cmake
, ninja
, libxml2
, libllvm
, version
{
lib,
stdenv,
llvm_meta,
release_version,
patches ? [ ],
buildLlvmTools,
monorepoSrc ? null,
src ? null,
libunwind ? null,
runCommand,
cmake,
ninja,
libxml2,
libllvm,
version,
}:
let
pname = "lld";
src' =
if monorepoSrc != null then
runCommand "lld-src-${version}" {} ''
runCommand "lld-src-${version}" { } ''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/${pname} "$out"
mkdir -p "$out/libunwind"
cp -r ${monorepoSrc}/libunwind/include "$out/libunwind"
mkdir -p "$out/llvm"
'' else src;
''
else
src;
postPatch = lib.optionalString (lib.versions.major release_version == "12") ''
postPatch =
lib.optionalString (lib.versions.major release_version == "12") ''
substituteInPlace MachO/CMakeLists.txt --replace \
'(''${LLVM_MAIN_SRC_DIR}/' '('
mkdir -p libunwind/include
tar -xf "${libunwind.src}" --wildcards -C libunwind/include --strip-components=2 "libunwind-*/include/"
'' + lib.optionalString (lib.versions.major release_version == "13" && stdenv.isDarwin) ''
''
+ lib.optionalString (lib.versions.major release_version == "13" && stdenv.isDarwin) ''
substituteInPlace MachO/CMakeLists.txt --replace \
'(''${LLVM_MAIN_SRC_DIR}/' '(../'
'';
in
stdenv.mkDerivation (rec {
stdenv.mkDerivation (
rec {
inherit pname version patches;
src = src';
sourceRoot =
if lib.versionOlder release_version "13" then null
else "${src.name}/${pname}";
sourceRoot = if lib.versionOlder release_version "13" then null else "${src.name}/${pname}";
nativeBuildInputs = [ cmake ] ++ lib.optional (lib.versionAtLeast release_version "15") ninja;
buildInputs = [ libllvm libxml2 ];
buildInputs = [
libllvm
libxml2
];
cmakeFlags = lib.optionals (lib.versionOlder release_version "14") [
"-DLLVM_CONFIG_PATH=${libllvm.dev}/bin/llvm-config${lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) "-native"}"
] ++ lib.optionals (lib.versionAtLeast release_version "15") [
cmakeFlags =
lib.optionals (lib.versionOlder release_version "14") [
"-DLLVM_CONFIG_PATH=${libllvm.dev}/bin/llvm-config${
lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) "-native"
}"
]
++ lib.optionals (lib.versionAtLeast release_version "15") [
"-DLLD_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/lld"
] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
]
++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
"-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
];
# Musl's default stack size is too small for lld to be able to link Firefox.
LDFLAGS = lib.optionalString stdenv.hostPlatform.isMusl "-Wl,-z,stack-size=2097152";
outputs = [ "out" "lib" "dev" ];
outputs = [
"out"
"lib"
"dev"
];
meta = llvm_meta // {
homepage = "https://lld.llvm.org/";
@@ -74,4 +90,11 @@ stdenv.mkDerivation (rec {
of several different linkers.
'';
};
} // (if (postPatch == "" && lib.versions.major release_version != "13") then {} else { inherit postPatch; }))
}
// (
if (postPatch == "" && lib.versions.major release_version != "13") then
{ }
else
{ inherit postPatch; }
)
)

View File

@@ -1,8 +1,9 @@
{ lib
, stdenv
, fetchFromGitHub
, makeWrapper
, lldb
{
lib,
stdenv,
fetchFromGitHub,
makeWrapper,
lldb,
}:
stdenv.mkDerivation {

View File

@@ -1,30 +1,31 @@
{ lib
, stdenv
, llvm_meta
, release_version
, cmake
, zlib
, ncurses
, swig3
, swig4
, which
, libedit
, libxml2
, libllvm
, libclang
, python3
, version
, darwin
, lit
, makeWrapper
, lua5_3
, ninja
, runCommand
, src ? null
, monorepoSrc ? null
, patches ? [ ]
, enableManpages ? false
, ...
{
lib,
stdenv,
llvm_meta,
release_version,
cmake,
zlib,
ncurses,
swig3,
swig4,
which,
libedit,
libxml2,
libllvm,
libclang,
python3,
version,
darwin,
lit,
makeWrapper,
lua5_3,
ninja,
runCommand,
src ? null,
monorepoSrc ? null,
patches ? [ ],
enableManpages ? false,
...
}:
let
@@ -34,7 +35,9 @@ let
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/lldb "$out"
'' else src;
''
else
src;
vscodeExt = {
name = if lib.versionAtLeast release_version "18" then "lldb-dap" else "lldb-vscode";
version = if lib.versionAtLeast release_version "18" then "0.2.0" else "0.1.0";
@@ -42,7 +45,8 @@ let
swig = if lib.versionAtLeast release_version "18" then swig4 else swig3;
in
stdenv.mkDerivation (rec {
stdenv.mkDerivation (
rec {
passthru.monorepoSrc = monorepoSrc;
pname = "lldb";
inherit version;
@@ -50,11 +54,16 @@ stdenv.mkDerivation (rec {
src = src';
inherit patches;
outputs = [ "out" "lib" "dev" ];
outputs = [
"out"
"lib"
"dev"
];
sourceRoot = lib.optional (lib.versionAtLeast release_version "13") "${src.name}/${pname}";
nativeBuildInputs = [
nativeBuildInputs =
[
cmake
python3
which
@@ -62,28 +71,31 @@ stdenv.mkDerivation (rec {
lit
makeWrapper
lua5_3
] ++ lib.optionals enableManpages [
python3.pkgs.sphinx
] ++ lib.optionals (lib.versionOlder release_version "18" && enableManpages) [
]
++ lib.optionals enableManpages [ python3.pkgs.sphinx ]
++ lib.optionals (lib.versionOlder release_version "18" && enableManpages) [
python3.pkgs.recommonmark
] ++ lib.optionals (lib.versionAtLeast release_version "18" && enableManpages) [
]
++ lib.optionals (lib.versionAtLeast release_version "18" && enableManpages) [
python3.pkgs.myst-parser
] ++ lib.optionals (lib.versionAtLeast release_version "14") [
ninja
];
]
++ lib.optionals (lib.versionAtLeast release_version "14") [ ninja ];
buildInputs = [
buildInputs =
[
ncurses
zlib
libedit
libxml2
libllvm
] ++ lib.optionals (lib.versionAtLeast release_version "16") [
]
++ lib.optionals (lib.versionAtLeast release_version "16") [
# Starting with LLVM 16, the resource dir patch is no longer enough to get
# libclang into the rpath of the lldb executables. By putting it into
# buildInputs cc-wrapper will set up rpath correctly for us.
(lib.getLib libclang)
] ++ lib.optionals stdenv.isDarwin [
]
++ lib.optionals stdenv.isDarwin [
darwin.libobjc
darwin.apple_sdk.libs.xpc
darwin.apple_sdk.frameworks.Foundation
@@ -98,7 +110,8 @@ stdenv.mkDerivation (rec {
#
# See here for context:
# https://github.com/NixOS/nixpkgs/pull/194634#issuecomment-1272129132
++ lib.optional
++
lib.optional
(
stdenv.targetPlatform.isDarwin
&& !stdenv.targetPlatform.isAarch64
@@ -114,29 +127,36 @@ stdenv.mkDerivation (rec {
hardeningDisable = [ "format" ];
cmakeFlags = [
cmakeFlags =
[
"-DLLDB_INCLUDE_TESTS=${if doCheck then "YES" else "NO"}"
"-DLLVM_ENABLE_RTTI=OFF"
"-DClang_DIR=${lib.getDev libclang}/lib/cmake"
"-DLLVM_EXTERNAL_LIT=${lit}/bin/lit"
] ++ lib.optionals stdenv.isDarwin [
"-DLLDB_USE_SYSTEM_DEBUGSERVER=ON"
] ++ lib.optionals (!stdenv.isDarwin) [
]
++ lib.optionals stdenv.isDarwin [ "-DLLDB_USE_SYSTEM_DEBUGSERVER=ON" ]
++ lib.optionals (!stdenv.isDarwin) [
"-DLLDB_CODESIGN_IDENTITY=" # codesigning makes nondeterministic
] ++ lib.optionals (lib.versionAtLeast release_version "17") [
]
++ lib.optionals (lib.versionAtLeast release_version "17") [
"-DCLANG_RESOURCE_DIR=../../../../${libclang.lib}"
] ++ lib.optionals enableManpages ([
]
++ lib.optionals enableManpages (
[
"-DLLVM_ENABLE_SPHINX=ON"
"-DSPHINX_OUTPUT_MAN=ON"
"-DSPHINX_OUTPUT_HTML=OFF"
] ++ lib.optionals (lib.versionAtLeast release_version "15") [
]
++ lib.optionals (lib.versionAtLeast release_version "15") [
# docs reference `automodapi` but it's not added to the extensions list when
# only building the manpages:
# https://github.com/llvm/llvm-project/blob/af6ec9200b09039573d85e349496c4f5b17c3d7f/lldb/docs/conf.py#L54
#
# so, we just ignore the resulting errors
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
]) ++ lib.optionals doCheck [
]
)
++ lib.optionals doCheck [
"-DLLDB_TEST_C_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"
"-DLLDB_TEST_CXX_COMPILER=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++"
];
@@ -145,7 +165,8 @@ stdenv.mkDerivation (rec {
doInstallCheck = lib.versionOlder release_version "15";
# TODO: cleanup with mass-rebuild
installCheckPhase = ''
installCheckPhase =
''
if [ ! -e $lib/${python3.sitePackages}/lldb/_lldb*.so ] ; then
echo "ERROR: python files not installed where expected!";
return 1;
@@ -165,7 +186,9 @@ stdenv.mkDerivation (rec {
# vscode:
install -D ../tools/${vscodeExt.name}/package.json $out/share/vscode/extensions/llvm-org.${vscodeExt.name}-${vscodeExt.version}/package.json
mkdir -p $out/share/vscode/extensions/llvm-org.${vscodeExt.name}-${vscodeExt.version}/bin
ln -s $out/bin/*${if lib.versionAtLeast release_version "18" then vscodeExt.name else "-vscode"} $out/share/vscode/extensions/llvm-org.${vscodeExt.name}-${vscodeExt.version}/bin
ln -s $out/bin/*${
if lib.versionAtLeast release_version "18" then vscodeExt.name else "-vscode"
} $out/share/vscode/extensions/llvm-org.${vscodeExt.name}-${vscodeExt.version}/bin
'';
passthru.vscodeExtName = vscodeExt.name;
@@ -187,14 +210,14 @@ stdenv.mkDerivation (rec {
|| (((lib.versions.major release_version) == "13") && stdenv.isDarwin);
mainProgram = "lldb";
};
} // lib.optionalAttrs enableManpages {
}
// lib.optionalAttrs enableManpages {
pname = "lldb-manpages";
buildPhase = lib.optionalString (lib.versionOlder release_version "15") ''
make ${if (lib.versionOlder release_version "12") then "docs-man" else "docs-lldb-man"}
'';
ninjaFlags = lib.optionals (lib.versionAtLeast release_version "15") [ "docs-lldb-man" ];
propagatedBuildInputs = [ ];
@@ -215,4 +238,5 @@ stdenv.mkDerivation (rec {
meta = llvm_meta // {
description = "man pages for LLDB ${version}";
};
})
}
)

View File

@@ -1,53 +1,59 @@
{ lib
, stdenv
, llvm_meta
, pkgsBuildBuild
, pollyPatches ? []
, patches ? []
, polly_src ? null
, src ? null
, monorepoSrc ? null
, runCommand
, cmake
, darwin
, ninja
, python3
, python3Packages
, libffi
{
lib,
stdenv,
llvm_meta,
pkgsBuildBuild,
pollyPatches ? [ ],
patches ? [ ],
polly_src ? null,
src ? null,
monorepoSrc ? null,
runCommand,
cmake,
darwin,
ninja,
python3,
python3Packages,
libffi,
# TODO: Can this memory corruption bug still occur?
# <https://github.com/llvm/llvm-project/issues/61350>
, enableGoldPlugin ? libbfd.hasPluginAPI
, libbfd
, libpfm
, libxml2
, ncurses
, version
, release_version
, zlib
, which
, sysctl
, buildLlvmTools
, debugVersion ? false
, doCheck ? !stdenv.isAarch32 && (if lib.versionOlder release_version "15" then stdenv.isLinux else true)
&& (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl)
enableGoldPlugin ? libbfd.hasPluginAPI,
libbfd,
libpfm,
libxml2,
ncurses,
version,
release_version,
zlib,
which,
sysctl,
buildLlvmTools,
debugVersion ? false,
doCheck ?
!stdenv.isAarch32
&& (if lib.versionOlder release_version "15" then stdenv.isLinux else true)
&& (
!stdenv.isx86_32 # TODO: why
)
&& (!stdenv.hostPlatform.isMusl)
&& !(stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isBigEndian)
&& (stdenv.hostPlatform == stdenv.buildPlatform)
, enableManpages ? false
, enableSharedLibraries ? !stdenv.hostPlatform.isStatic
, enablePFM ? stdenv.isLinux /* PFM only supports Linux */
&& (stdenv.hostPlatform == stdenv.buildPlatform),
enableManpages ? false,
enableSharedLibraries ? !stdenv.hostPlatform.isStatic,
enablePFM ?
stdenv.isLinux # PFM only supports Linux
# broken for Ampere eMAG 8180 (c2.large.arm on Packet) #56245
# broken for the armv7l builder
&& !stdenv.hostPlatform.isAarch
, enablePolly ? lib.versionAtLeast release_version "14"
, enableTerminfo ? true
&& !stdenv.hostPlatform.isAarch,
enablePolly ? lib.versionAtLeast release_version "14",
enableTerminfo ? true,
}:
let
inherit (lib) optional optionals optionalString;
# Used when creating a version-suffixed symlink of libLLVM.dylib
shortVersion = with lib;
concatStringsSep "." (take 1 (splitString "." release_version));
shortVersion = with lib; concatStringsSep "." (take 1 (splitString "." release_version));
# Ordinarily we would just the `doCheck` and `checkDeps` functionality
# `mkDerivation` gives us to manage our test dependencies (instead of breaking
@@ -66,113 +72,147 @@ let
#
# So, we "manually" assemble one python derivation for the package to depend
# on, taking into account whether checks are enabled or not:
python = if doCheck then
python =
if doCheck then
# Note that we _explicitly_ ask for a python interpreter for our host
# platform here; the splicing that would ordinarily take care of this for
# us does not seem to work once we use `withPackages`.
let
checkDeps = ps: with ps; [ psutil ];
in pkgsBuildBuild.targetPackages.python3.withPackages checkDeps
else python3;
in
pkgsBuildBuild.targetPackages.python3.withPackages checkDeps
else
python3;
pname = "llvm";
src' = if monorepoSrc != null then
runCommand "${pname}-src-${version}" {} (''
src' =
if monorepoSrc != null then
runCommand "${pname}-src-${version}" { } (
''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/${pname} "$out"
cp -r ${monorepoSrc}/third-party "$out"
'' + lib.optionalString enablePolly ''
''
+ lib.optionalString enablePolly ''
chmod u+w "$out/${pname}/tools"
cp -r ${monorepoSrc}/polly "$out/${pname}/tools"
'') else src;
''
)
else
src;
patches' = patches ++ lib.optionals enablePolly pollyPatches;
in
stdenv.mkDerivation (rec {
stdenv.mkDerivation (
finalAttrs:
{
inherit pname version;
src = src';
patches = patches';
sourceRoot = if lib.versionOlder release_version "13" then null
else "${src.name}/${pname}";
sourceRoot = if lib.versionOlder release_version "13" then null else "${src.name}/${pname}";
outputs = [ "out" "lib" "dev" "python" ];
outputs = [
"out"
"lib"
"dev"
"python"
];
nativeBuildInputs = [ cmake ]
nativeBuildInputs =
[ cmake ]
++ (lib.optional (lib.versionAtLeast release_version "15") ninja)
++ [ python ]
++ optionals enableManpages [
# Note: we intentionally use `python3Packages` instead of `python3.pkgs`;
# splicing does *not* work with the latter. (TODO: fix)
python3Packages.sphinx
] ++ optionals (lib.versionOlder version "18" && enableManpages) [
python3Packages.recommonmark
] ++ optionals (lib.versionAtLeast version "18" && enableManpages) [
python3Packages.myst-parser
];
]
++ optionals (lib.versionOlder version "18" && enableManpages) [ python3Packages.recommonmark ]
++ optionals (lib.versionAtLeast version "18" && enableManpages) [ python3Packages.myst-parser ];
buildInputs = [ libxml2 libffi ]
++ optional enablePFM libpfm; # exegesis
buildInputs = [
libxml2
libffi
] ++ optional enablePFM libpfm; # exegesis
propagatedBuildInputs = (lib.optional (lib.versionAtLeast release_version "14" || stdenv.buildPlatform == stdenv.hostPlatform) ncurses)
propagatedBuildInputs =
(lib.optional (
lib.versionAtLeast release_version "14" || stdenv.buildPlatform == stdenv.hostPlatform
) ncurses)
++ [ zlib ];
postPatch = optionalString stdenv.isDarwin (''
nativeCheckInputs =
lib.optional (lib.versionAtLeast release_version "13") which
++ lib.optional (stdenv.isDarwin && lib.versionAtLeast release_version "15") sysctl;
postPatch =
''
patchShebangs test/BugPoint/compile-custom.ll.py
''
+
# FileSystem permissions tests fail with various special bits
''
substituteInPlace unittests/Support/CMakeLists.txt \
--replace "Path.cpp" ""
rm unittests/Support/Path.cpp
substituteInPlace unittests/IR/CMakeLists.txt \
--replace "PassBuilderCallbacksTest.cpp" ""
rm unittests/IR/PassBuilderCallbacksTest.cpp
''
+
# timing-based tests are trouble
''
rm utils/lit/tests/googletest-timeout.py
''
+
# FileSystem permissions tests fail with various special bits
''
substituteInPlace unittests/Support/CMakeLists.txt \
--replace "Path.cpp" ""
rm unittests/Support/Path.cpp
substituteInPlace unittests/IR/CMakeLists.txt \
--replace "PassBuilderCallbacksTest.cpp" ""
rm unittests/IR/PassBuilderCallbacksTest.cpp
''
+ optionalString stdenv.isDarwin (
''
substituteInPlace cmake/modules/AddLLVM.cmake \
--replace 'set(_install_name_dir INSTALL_NAME_DIR "@rpath")' "set(_install_name_dir)" \
--replace 'set(_install_rpath "@loader_path/../''${CMAKE_INSTALL_LIBDIR}''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' ""
'' +
''
+
# As of LLVM 15, marked as XFAIL on arm64 macOS but lit doesn't seem to pick
# this up: https://github.com/llvm/llvm-project/blob/c344d97a125b18f8fed0a64aace73c49a870e079/llvm/test/MC/ELF/cfi-version.ll#L7
(optionalString (lib.versionAtLeast release_version "15") (''
optionalString (lib.versionAtLeast release_version "15") (
''
rm test/MC/ELF/cfi-version.ll
'' +
''
+
# This test tries to call `sw_vers` by absolute path (`/usr/bin/sw_vers`)
# and thus fails under the sandbox:
(if lib.versionAtLeast release_version "16" then ''
substituteInPlace unittests/TargetParser/Host.cpp \
--replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }"
'' else ''
substituteInPlace unittests/Support/Host.cpp \
--replace '/usr/bin/sw_vers' "${(builtins.toString darwin.DarwinTools) + "/bin/sw_vers" }"
'') +
# This test tries to call the intrinsics `@llvm.roundeven.f32` and
# `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf`
# and `roundeven` on macOS and FreeBSD.
#
# However these functions are glibc specific so the test fails:
# - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html
# - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html
#
# TODO(@rrbutani): this seems to run fine on `aarch64-darwin`, why does it
# pass there?
optionalString (lib.versionAtLeast release_version "16") ''
substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \
--replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \
--replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" ""
'' +
# fails when run in sandbox
optionalString (!stdenv.hostPlatform.isx86 && lib.versionAtLeast release_version "18") ''
substituteInPlace unittests/Support/VirtualFileSystemTest.cpp \
--replace "PhysicalFileSystemWorkingDirFailure" "DISABLED_PhysicalFileSystemWorkingDirFailure"
''))) +
# dup of above patch with different conditions
optionalString (stdenv.isDarwin && stdenv.hostPlatform.isx86 && lib.versionAtLeast release_version "15") (optionalString (lib.versionOlder release_version "16") ''
substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \
--replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \
--replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" ""
(
let
file =
if lib.versionAtLeast release_version "16" then
"unittests/TargetParser/Host.cpp"
else
"unittests/Support/Host.cpp";
in
''
substituteInPlace ${file} \
--replace \
'/usr/bin/sw_vers' \
"${builtins.toString darwin.DarwinTools + "/bin/sw_vers"}"
''
)
'' +
# fails when run in sandbox
((optionalString (lib.versionAtLeast release_version "18") ''
substituteInPlace unittests/Support/VirtualFileSystemTest.cpp \
--replace "PhysicalFileSystemWorkingDirFailure" "DISABLED_PhysicalFileSystemWorkingDirFailure"
'') +
+ optionalString stdenv.hostPlatform.isAarch64 (
# This test fails on darwin x86_64 because `sw_vers` reports a different
# macOS version than what LLVM finds by reading
# `/System/Library/CoreServices/SystemVersion.plist` (which is passed into
@@ -201,43 +241,65 @@ stdenv.mkDerivation (rec {
# not clear to me when/where/for what this even gets used in LLVM.
#
# TODO(@rrbutani): fix/follow-up
(if lib.versionAtLeast release_version "16" then ''
substituteInPlace unittests/TargetParser/Host.cpp \
(
let
file =
if lib.versionAtLeast release_version "16" then
"unittests/TargetParser/Host.cpp"
else
"unittests/Support/Host.cpp";
in
''
substituteInPlace ${file} \
--replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion"
'' else ''
substituteInPlace unittests/Support/Host.cpp \
--replace "getMacOSHostVersion" "DISABLED_getMacOSHostVersion"
'') +
''
)
+
# This test fails with a `dysmutil` crash; have not yet dug into what's
# going on here (TODO(@rrbutani)).
''
rm test/tools/dsymutil/ARM/obfuscated.test
'')) +
# FileSystem permissions tests fail with various special bits
''
substituteInPlace unittests/Support/CMakeLists.txt \
--replace "Path.cpp" ""
rm unittests/Support/Path.cpp
substituteInPlace unittests/IR/CMakeLists.txt \
--replace "PassBuilderCallbacksTest.cpp" ""
rm unittests/IR/PassBuilderCallbacksTest.cpp
'' + lib.optionalString (lib.versionAtLeast release_version "13") ''
)
)
+
# This test tries to call the intrinsics `@llvm.roundeven.f32` and
# `@llvm.roundeven.f64` which seem to (incorrectly?) lower to `roundevenf`
# and `roundeven` on macOS and FreeBSD.
#
# However these functions are glibc specific so the test fails:
# - https://www.gnu.org/software/gnulib/manual/html_node/roundevenf.html
# - https://www.gnu.org/software/gnulib/manual/html_node/roundeven.html
#
# TODO(@rrbutani): this seems to run fine on `aarch64-darwin`, why does it
# pass there?
optionalString (lib.versionAtLeast release_version "16") ''
substituteInPlace test/ExecutionEngine/Interpreter/intrinsics.ll \
--replace "%roundeven32 = call float @llvm.roundeven.f32(float 0.000000e+00)" "" \
--replace "%roundeven64 = call double @llvm.roundeven.f64(double 0.000000e+00)" ""
''
+
# fails when run in sandbox
optionalString (!stdenv.hostPlatform.isx86 && lib.versionAtLeast release_version "18") ''
substituteInPlace unittests/Support/VirtualFileSystemTest.cpp \
--replace "PhysicalFileSystemWorkingDirFailure" "DISABLED_PhysicalFileSystemWorkingDirFailure"
''
)
+ lib.optionalString (lib.versionAtLeast release_version "13") ''
rm test/tools/llvm-objcopy/ELF/mirror-permissions-unix.test
'' + lib.optionalString (lib.versionOlder release_version "13") ''
''
+ lib.optionalString (lib.versionOlder release_version "13") ''
# TODO: Fix failing tests:
rm test/DebugInfo/X86/vla-multi.ll
'' +
''
+
# Fails in the presence of anti-virus software or other intrusion-detection software that
# modifies the atime when run. See #284056.
lib.optionalString (lib.versionAtLeast release_version "16") (''
lib.optionalString (lib.versionAtLeast release_version "16") (
''
rm test/tools/llvm-objcopy/ELF/strip-preserve-atime.test
'' + lib.optionalString (lib.versionOlder release_version "17") ''
'') +
# timing-based tests are trouble
lib.optionalString (lib.versionAtLeast release_version "15" && lib.versionOlder release_version "17") ''
rm utils/lit/tests/googletest-timeout.py
'' +
''
+
# valgrind unhappy with musl or glibc, but fails w/musl only
optionalString stdenv.hostPlatform.isMusl ''
patch -p1 -i ${./TLI-musl.patch}
@@ -245,7 +307,9 @@ stdenv.mkDerivation (rec {
--replace "add_subdirectory(DynamicLibrary)" ""
rm unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp
rm test/CodeGen/AArch64/wineh4.mir
'' + optionalString stdenv.hostPlatform.isAarch32 ''
''
)
+ optionalString stdenv.hostPlatform.isAarch32 ''
# skip failing X86 test cases on 32-bit ARM
rm test/DebugInfo/X86/convert-debugloc.ll
rm test/DebugInfo/X86/convert-inlined.ll
@@ -253,11 +317,13 @@ stdenv.mkDerivation (rec {
rm test/tools/dsymutil/X86/op-convert.test
rm test/tools/gold/X86/split-dwarf.ll
rm test/tools/llvm-objcopy/MachO/universal-object.test
'' +
''
+
# Seems to require certain floating point hardware (NEON?)
optionalString (stdenv.hostPlatform.system == "armv6l-linux") ''
rm test/ExecutionEngine/frem.ll
'' +
''
+
# 1. TODO: Why does this test fail on FreeBSD?
# It seems to reference /usr/local/lib/libfile.a, which is clearly a problem.
# 2. This test fails for the same reason it fails on MacOS, but the fix is
@@ -265,16 +331,16 @@ stdenv.mkDerivation (rec {
optionalString stdenv.isFreeBSD ''
rm test/tools/llvm-libtool-darwin/L-and-l.test
rm test/ExecutionEngine/Interpreter/intrinsics.ll
'' + ''
patchShebangs test/BugPoint/compile-custom.ll.py
'' +
''
+
# Tweak tests to ignore namespace part of type to support
# gcc-12: https://gcc.gnu.org/PR103598.
# The change below mangles strings like:
# CHECK-NEXT: Starting llvm::Function pass manager run.
# to:
# CHECK-NEXT: Starting {{.*}}Function pass manager run.
(lib.optionalString (lib.versionOlder release_version "13") (''
lib.optionalString (lib.versionOlder release_version "13") (
''
for f in \
test/Other/new-pass-manager.ll \
test/Other/new-pm-O0-defaults.ll \
@@ -295,19 +361,17 @@ stdenv.mkDerivation (rec {
--replace 'Starting llvm::' 'Starting {{.*}}' \
--replace 'Finished llvm::' 'Finished {{.*}}'
done
'' +
''
+
# gcc-13 fix
''
sed -i '/#include <string>/i#include <cstdint>' \
include/llvm/DebugInfo/Symbolize/DIPrinter.h
''));
''
);
# Workaround for configure flags that need to have spaces
preConfigure = if lib.versionAtLeast release_version "15" then ''
cmakeFlagsArray+=(
-DLLVM_LIT_ARGS="-svj''${NIX_BUILD_CORES} --no-progress-bar"
)
'' else ''
preConfigure = ''
cmakeFlagsArray+=(
-DLLVM_LIT_ARGS='-svj''${NIX_BUILD_CORES} --no-progress-bar'
)
@@ -318,7 +382,9 @@ stdenv.mkDerivation (rec {
cmakeBuildType = if debugVersion then "Debug" else "Release";
cmakeFlags = with stdenv; let
cmakeFlags =
with stdenv;
let
# These flags influence llvm-config's BuildVariables.inc in addition to the
# general build. We need to make sure these are also passed via
# CROSS_TOOLCHAIN_FLAGS_NATIVE when cross-compiling or llvm-config-native
@@ -326,26 +392,25 @@ stdenv.mkDerivation (rec {
#
# Some flags don't need to be repassed because LLVM already does so (like
# CMAKE_BUILD_TYPE), others are irrelevant to the result.
flagsForLlvmConfig = (if lib.versionOlder release_version "15" then [
"-DLLVM_INSTALL_CMAKE_DIR=${placeholder "dev"}/lib/cmake/llvm/"
] else [
"-DLLVM_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/llvm"
]) ++ [
flagsForLlvmConfig = [
"-DLLVM_ENABLE_RTTI=ON"
] ++ optionals enableSharedLibraries [
"-DLLVM_LINK_LLVM_DYLIB=ON"
(lib.cmakeBool "LLVM_LINK_LLVM_DYLIB" enableSharedLibraries)
(lib.optional (lib.versionOlder release_version "15") "-DLLVM_INSTALL_CMAKE_DIR=${placeholder "dev"}/lib/cmake/llvm/")
];
in flagsForLlvmConfig ++ [
in
flagsForLlvmConfig
++ [
"-DCMAKE_INSTALL_PACKAGEDIR=${placeholder "dev"}/lib/"
"-DLLVM_INSTALL_UTILS=ON" # Needed by rustc
"-DLLVM_BUILD_TESTS=${if doCheck then "ON" else "OFF"}"
(lib.cmakeBool "LLVM_INCLUDE_TESTS" finalAttrs.doCheck)
(lib.cmakeBool "LLVM_BUILD_TESTS" finalAttrs.doCheck)
"-DLLVM_ENABLE_FFI=ON"
"-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}"
"-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}"
"-DLLVM_ENABLE_DUMP=ON"
(lib.cmakeBool "LLVM_ENABLE_TERMINFO" enableTerminfo)
] ++ optionals (!doCheck) [
"-DLLVM_INCLUDE_TESTS=OFF"
] ++ optionals stdenv.hostPlatform.isStatic [
]
++ optionals stdenv.hostPlatform.isStatic [
# Disables building of shared libs, -fPIC is still injected by cc-wrapper
"-DLLVM_ENABLE_PIC=OFF"
"-DCMAKE_SKIP_INSTALL_RPATH=ON"
@@ -354,18 +419,26 @@ stdenv.mkDerivation (rec {
# file and doesn't link zlib as well.
# https://github.com/ClangBuiltLinux/tc-build/issues/150#issuecomment-845418812
"-DLLVM_ENABLE_LIBXML2=OFF"
] ++ optionals enableManpages [
]
++ optionals enableManpages [
"-DLLVM_BUILD_DOCS=ON"
"-DLLVM_ENABLE_SPHINX=ON"
"-DSPHINX_OUTPUT_MAN=ON"
"-DSPHINX_OUTPUT_HTML=OFF"
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
] ++ optionals (enableGoldPlugin) [
"-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include"
] ++ optionals isDarwin [
]
++ optionals (enableGoldPlugin) [ "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" ]
++ optionals isDarwin [
"-DLLVM_ENABLE_LIBCXX=ON"
"-DCAN_TARGET_i386=false"
] ++ optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [
]
++
optionals
(
stdenv.hostPlatform != stdenv.buildPlatform
&& !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)
)
[
"-DCMAKE_CROSSCOMPILING=True"
"-DLLVM_TABLEGEN=${buildLlvmTools.llvm}/bin/llvm-tblgen"
(
@@ -388,30 +461,44 @@ stdenv.mkDerivation (rec {
"-DCMAKE_INSTALL_LIBDIR=${placeholder "lib"}/lib"
"-DCMAKE_INSTALL_LIBEXECDIR=${placeholder "lib"}/libexec"
];
in "-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list="
+ lib.concatStringsSep ";" (lib.concatLists [
in
"-DCROSS_TOOLCHAIN_FLAGS_NATIVE:list="
+ lib.concatStringsSep ";" (
lib.concatLists [
flagsForLlvmConfig
nativeToolchainFlags
nativeInstallFlags
])
]
)
)
];
postInstall = ''
postInstall =
''
mkdir -p $python/share
mv $out/share/opt-viewer $python/share/opt-viewer
moveToOutput "bin/llvm-config*" "$dev"
substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \
substituteInPlace "$dev/lib/cmake/llvm/LLVMExports-${
if debugVersion then "debug" else "release"
}.cmake" \
--replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \
--replace "$out/bin/llvm-config" "$dev/bin/llvm-config"
'' + (if lib.versionOlder release_version "15" then ''
''
+ (
if lib.versionOlder release_version "15" then
''
substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \
--replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}'"$lib"'")'
'' else ''
''
else
''
substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \
--replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")'
'')
+ optionalString (stdenv.isDarwin && enableSharedLibraries && lib.versionOlder release_version "18") ''
''
)
+
optionalString (stdenv.isDarwin && enableSharedLibraries && lib.versionOlder release_version "18")
''
ln -s $lib/lib/libLLVM.dylib $lib/lib/libLLVM-${shortVersion}.dylib
''
+ optionalString (stdenv.isDarwin && enableSharedLibraries) ''
@@ -425,6 +512,8 @@ stdenv.mkDerivation (rec {
checkTarget = "check-all";
hardeningDisable = [ "trivialautovarinit" ];
# For the update script:
passthru.monorepoSrc = monorepoSrc;
@@ -447,10 +536,12 @@ stdenv.mkDerivation (rec {
under the "Apache 2.0 License with LLVM exceptions".
'';
};
} // lib.optionalAttrs enableManpages ({
}
// lib.optionalAttrs enableManpages (
{
pname = "llvm-manpages";
propagatedBuildInputs = [];
propagatedBuildInputs = [ ];
postPatch = null;
postInstall = null;
@@ -462,7 +553,10 @@ stdenv.mkDerivation (rec {
meta = llvm_meta // {
description = "man pages for LLVM ${version}";
};
} // (if lib.versionOlder release_version "15" then {
}
// (
if lib.versionOlder release_version "15" then
{
buildPhase = ''
make docs-llvm-man
'';
@@ -470,26 +564,32 @@ stdenv.mkDerivation (rec {
installPhase = ''
make -C docs install
'';
} else {
}
else
{
ninjaFlags = [ "docs-llvm-man" ];
installTargets = [ "install-docs-llvm-man" ];
postPatch = null;
postInstall = null;
})) // lib.optionalAttrs (lib.versionOlder release_version "13") {
}
)
)
// lib.optionalAttrs (lib.versionOlder release_version "13") {
inherit polly_src;
unpackPhase = ''
unpackPhase =
''
unpackFile $src
mv llvm-${release_version}* llvm
sourceRoot=$PWD/llvm
'' + optionalString enablePolly ''
''
+ optionalString enablePolly ''
unpackFile $polly_src
mv polly-* $sourceRoot/tools/polly
'';
} // lib.optionalAttrs (lib.versionAtLeast release_version "13") {
nativeCheckInputs = [ which ] ++ lib.optional (stdenv.isDarwin && lib.versionAtLeast release_version "15") sysctl;
} // lib.optionalAttrs (lib.versionOlder release_version "15") {
}
// lib.optionalAttrs (lib.versionOlder release_version "15") {
# hacky fix: created binaries need to be run before installation
preBuild = ''
mkdir -p $out/
@@ -503,7 +603,8 @@ stdenv.mkDerivation (rec {
preCheck = ''
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$PWD/lib
'';
} // lib.optionalAttrs (lib.versionAtLeast release_version "15") {
}
// lib.optionalAttrs (lib.versionAtLeast release_version "15") {
# Defensive check: some paths (that we make symlinks to) depend on the release
# version, for example:
# - https://github.com/llvm/llvm-project/blob/406bde9a15136254f2b10d9ef3a42033b3cb1b16/clang/lib/Headers/CMakeLists.txt#L185
@@ -512,12 +613,14 @@ stdenv.mkDerivation (rec {
# version we were given.
#
# We do this check here, in the LLVM build, because it happens early.
postConfigure = let
postConfigure =
let
v = lib.versions;
major = v.major release_version;
minor = v.minor release_version;
patch = v.patch release_version;
in ''
in
''
# $1: part, $2: expected
check_version() {
part="''${1^^}"
@@ -535,6 +638,5 @@ stdenv.mkDerivation (rec {
check_version minor ${minor}
check_version patch ${patch}
'';
} // lib.optionalAttrs (lib.versionOlder release_version "17" || lib.versionAtLeast release_version "18") {
hardeningDisable = [ "trivialautovarinit" ];
})
}
)

View File

@@ -1,15 +1,20 @@
{ lib
, stdenv
, llvm_meta
, buildLlvmTools
, monorepoSrc
, runCommand
, cmake
, ninja
, libxml2
, libllvm
, version
, doCheck ? (!stdenv.isx86_32 /* TODO: why */) && (!stdenv.hostPlatform.isMusl)
{
lib,
stdenv,
llvm_meta,
buildLlvmTools,
monorepoSrc,
runCommand,
cmake,
ninja,
libxml2,
libllvm,
version,
doCheck ?
(
!stdenv.isx86_32 # TODO: why
)
&& (!stdenv.hostPlatform.isMusl),
}:
stdenv.mkDerivation rec {
@@ -28,9 +33,7 @@ stdenv.mkDerivation rec {
sourceRoot = "${src.name}/mlir";
patches = [
./gnu-install-dirs.patch
];
patches = [ ./gnu-install-dirs.patch ];
nativeBuildInputs = [
cmake
@@ -42,7 +45,8 @@ stdenv.mkDerivation rec {
libxml2
];
cmakeFlags = [
cmakeFlags =
[
"-DLLVM_BUILD_TOOLS=ON"
# Install headers as well
"-DLLVM_INSTALL_TOOLCHAIN_ONLY=OFF"
@@ -55,17 +59,28 @@ stdenv.mkDerivation rec {
"-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}"
"-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}"
"-DLLVM_ENABLE_DUMP=ON"
] ++ lib.optionals stdenv.hostPlatform.isStatic [
]
++ lib.optionals stdenv.hostPlatform.isStatic [
# Disables building of shared libs, -fPIC is still injected by cc-wrapper
"-DLLVM_ENABLE_PIC=OFF"
"-DLLVM_BUILD_STATIC=ON"
"-DLLVM_LINK_LLVM_DYLIB=OFF"
] ++ lib.optionals ((stdenv.hostPlatform != stdenv.buildPlatform) && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) [
]
++
lib.optionals
(
(stdenv.hostPlatform != stdenv.buildPlatform)
&& !(stdenv.buildPlatform.canExecute stdenv.hostPlatform)
)
[
"-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
"-DMLIR_TABLEGEN_EXE=${buildLlvmTools.mlir}/bin/mlir-tblgen"
];
outputs = [ "out" "dev" ];
outputs = [
"out"
"dev"
];
meta = llvm_meta // {
homepage = "https://mlir.llvm.org/";

View File

@@ -1,63 +1,63 @@
{ lib
, stdenv
, llvm_meta
, release_version
, patches ? []
, monorepoSrc ? null
, src ? null
, runCommand
, cmake
, ninja
, llvm
, targetLlvm
, lit
, clang-unwrapped
, perl
, pkg-config
, xcbuild
, version
{
lib,
stdenv,
llvm_meta,
release_version,
patches ? [ ],
monorepoSrc ? null,
src ? null,
runCommand,
cmake,
ninja,
llvm,
targetLlvm,
lit,
clang-unwrapped,
perl,
pkg-config,
xcbuild,
version,
}:
let
pname = "openmp";
src' =
if monorepoSrc != null then
runCommand "${pname}-src-${version}" {} ''
runCommand "${pname}-src-${version}" { } ''
mkdir -p "$out"
cp -r ${monorepoSrc}/cmake "$out"
cp -r ${monorepoSrc}/${pname} "$out"
'' else src;
''
else
src;
in
stdenv.mkDerivation (rec {
stdenv.mkDerivation (
rec {
inherit pname version patches;
src = src';
sourceRoot =
if lib.versionOlder release_version "13" then null
else "${src.name}/${pname}";
sourceRoot = if lib.versionOlder release_version "13" then null else "${src.name}/${pname}";
outputs = [ "out" ]
++ lib.optionals (lib.versionAtLeast release_version "14") [ "dev" ];
outputs = [ "out" ] ++ lib.optionals (lib.versionAtLeast release_version "14") [ "dev" ];
patchFlags =
if lib.versionOlder release_version "14" then [ "-p2" ]
else null;
patchFlags = if lib.versionOlder release_version "14" then [ "-p2" ] else null;
nativeBuildInputs = [
cmake
] ++ lib.optionals (lib.versionAtLeast release_version "15") [
ninja
] ++ [ perl ] ++ lib.optionals (lib.versionAtLeast release_version "14") [
pkg-config lit
nativeBuildInputs =
[ cmake ]
++ lib.optionals (lib.versionAtLeast release_version "15") [ ninja ]
++ [ perl ]
++ lib.optionals (lib.versionAtLeast release_version "14") [
pkg-config
lit
];
buildInputs = [
(if stdenv.buildPlatform == stdenv.hostPlatform then llvm else targetLlvm)
];
buildInputs = [ (if stdenv.buildPlatform == stdenv.hostPlatform then llvm else targetLlvm) ];
cmakeFlags = lib.optionals (lib.versions.major release_version == "13") [
cmakeFlags =
lib.optionals (lib.versions.major release_version == "13") [
"-DLIBOMPTARGET_BUILD_AMDGCN_BCLIB=OFF" # Building the AMDGCN device RTL fails
] ++ lib.optionals (lib.versionAtLeast release_version "14") [
]
++ lib.optionals (lib.versionAtLeast release_version "14") [
"-DCLANG_TOOL=${clang-unwrapped}/bin/clang"
"-DOPT_TOOL=${llvm}/bin/opt"
"-DLINK_TOOL=${llvm}/bin/llvm-link"
@@ -75,12 +75,17 @@ stdenv.mkDerivation (rec {
'';
# "All of the code is dual licensed under the MIT license and the UIUC
# License (a BSD-like license)":
license = with lib.licenses; [ mit ncsa ];
license = with lib.licenses; [
mit
ncsa
];
};
} // (lib.optionalAttrs (lib.versionAtLeast release_version "14") {
}
// (lib.optionalAttrs (lib.versionAtLeast release_version "14") {
doCheck = false;
checkTarget = "check-openmp";
preCheck = ''
patchShebangs ../tools/archer/tests/deflake.bash
'';
}))
})
)