Skip to content

Commit d6d5c8a

Browse files
llvmPackages_17: init
1 parent b6c1354 commit d6d5c8a

53 files changed

Lines changed: 2524 additions & 349 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
{ lib, stdenv, llvm_meta
2+
, monorepoSrc, runCommand
3+
, cmake, ninja, libxml2, libllvm, version, python3
4+
, buildLlvmTools
5+
, fixDarwinDylibNames
6+
, enableManpages ? false
7+
}:
8+
9+
let
10+
self = stdenv.mkDerivation (rec {
11+
pname = "clang";
12+
inherit version;
13+
14+
src = runCommand "${pname}-src-${version}" {} ''
15+
mkdir -p "$out"
16+
cp -r ${monorepoSrc}/cmake "$out"
17+
cp -r ${monorepoSrc}/${pname} "$out"
18+
cp -r ${monorepoSrc}/clang-tools-extra "$out"
19+
'';
20+
21+
sourceRoot = "${src.name}/${pname}";
22+
23+
nativeBuildInputs = [ cmake ninja python3 ]
24+
++ lib.optional enableManpages python3.pkgs.sphinx
25+
++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
26+
27+
buildInputs = [ libxml2 libllvm ];
28+
29+
cmakeFlags = [
30+
"-DCLANG_INSTALL_PACKAGE_DIR=${placeholder "dev"}/lib/cmake/clang"
31+
"-DCLANGD_BUILD_XPC=OFF"
32+
"-DLLVM_ENABLE_RTTI=ON"
33+
"-DLLVM_INCLUDE_TESTS=OFF"
34+
] ++ lib.optionals enableManpages [
35+
"-DCLANG_INCLUDE_DOCS=ON"
36+
"-DLLVM_ENABLE_SPHINX=ON"
37+
"-DSPHINX_OUTPUT_MAN=ON"
38+
"-DSPHINX_OUTPUT_HTML=OFF"
39+
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
40+
] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
41+
"-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
42+
"-DCLANG_TABLEGEN=${buildLlvmTools.libclang.dev}/bin/clang-tblgen"
43+
# Added in LLVM15:
44+
# `clang-tidy-confusable-chars-gen`: https://github.com/llvm/llvm-project/commit/c3574ef739fbfcc59d405985a3a4fa6f4619ecdb
45+
# `clang-pseudo-gen`: https://github.com/llvm/llvm-project/commit/cd2292ef824591cc34cc299910a3098545c840c7
46+
"-DCLANG_TIDY_CONFUSABLE_CHARS_GEN=${buildLlvmTools.libclang.dev}/bin/clang-tidy-confusable-chars-gen"
47+
"-DCLANG_PSEUDO_GEN=${buildLlvmTools.libclang.dev}/bin/clang-pseudo-gen"
48+
];
49+
50+
patches = [
51+
./purity.patch
52+
# https://reviews.llvm.org/D51899
53+
./gnu-install-dirs.patch
54+
../../common/clang/add-nostdlibinc-flag.patch
55+
# FIMXE: do we need this patch?
56+
# (substituteAll {
57+
# src = ../../clang-11-12-LLVMgold-path.patch;
58+
# libllvmLibdir = "${libllvm.lib}/lib";
59+
# })
60+
];
61+
62+
postPatch = ''
63+
(cd tools && ln -s ../../clang-tools-extra extra)
64+
'' + lib.optionalString stdenv.hostPlatform.isMusl ''
65+
sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp
66+
'';
67+
68+
outputs = [ "out" "lib" "dev" "python" ];
69+
70+
postInstall = ''
71+
ln -sv $out/bin/clang $out/bin/cpp
72+
73+
mkdir -p $lib/lib/clang
74+
mv $lib/lib/17 $lib/lib/clang/17
75+
76+
# Move libclang to 'lib' output
77+
moveToOutput "lib/libclang.*" "$lib"
78+
moveToOutput "lib/libclang-cpp.*" "$lib"
79+
substituteInPlace $dev/lib/cmake/clang/ClangTargets-release.cmake \
80+
--replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
81+
--replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
82+
83+
mkdir -p $python/bin $python/share/clang/
84+
mv $out/bin/{git-clang-format,scan-view} $python/bin
85+
if [ -e $out/bin/set-xcode-analyzer ]; then
86+
mv $out/bin/set-xcode-analyzer $python/bin
87+
fi
88+
mv $out/share/clang/*.py $python/share/clang
89+
rm $out/bin/c-index-test
90+
patchShebangs $python/bin
91+
92+
mkdir -p $dev/bin
93+
cp bin/{clang-tblgen,clang-tidy-confusable-chars-gen,clang-pseudo-gen} $dev/bin
94+
'';
95+
96+
passthru = {
97+
inherit libllvm;
98+
isClang = true;
99+
hardeningUnsupportedFlags = [ "fortify3" ];
100+
};
101+
102+
meta = llvm_meta // {
103+
homepage = "https://clang.llvm.org/";
104+
description = "A C language family frontend for LLVM";
105+
longDescription = ''
106+
The Clang project provides a language front-end and tooling
107+
infrastructure for languages in the C language family (C, C++, Objective
108+
C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project.
109+
It aims to deliver amazingly fast compiles, extremely useful error and
110+
warning messages and to provide a platform for building great source
111+
level tools. The Clang Static Analyzer and clang-tidy are tools that
112+
automatically find bugs in your code, and are great examples of the sort
113+
of tools that can be built using the Clang frontend as a library to
114+
parse C/C++ code.
115+
'';
116+
mainProgram = "clang";
117+
};
118+
} // lib.optionalAttrs enableManpages {
119+
pname = "clang-manpages";
120+
121+
ninjaFlags = [ "docs-clang-man" ];
122+
123+
installPhase = ''
124+
mkdir -p $out/share/man/man1
125+
# Manually install clang manpage
126+
cp docs/man/*.1 $out/share/man/man1/
127+
'';
128+
129+
outputs = [ "out" ];
130+
131+
doCheck = false;
132+
133+
meta = llvm_meta // {
134+
description = "man page for Clang ${version}";
135+
};
136+
});
137+
in self
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
diff --git a/CMakeLists.txt b/CMakeLists.txt
2+
index f7936d72e088..a362fa49b534 100644
3+
--- a/CMakeLists.txt
4+
+++ b/CMakeLists.txt
5+
@@ -31,7 +31,21 @@ if(CLANG_BUILT_STANDALONE)
6+
find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
7+
list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")
8+
9+
- # Turn into CACHE PATHs for overwritting
10+
+ # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets
11+
+ # LLVM_CONFIG.
12+
+ if (NOT LLVM_CONFIG_FOUND)
13+
+ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config
14+
+ # path is removed.
15+
+ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS})
16+
+ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}")
17+
+ # N.B. this is just a default value, the CACHE PATHs below can be overriden.
18+
+ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")
19+
+ set(TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}")
20+
+ set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}")
21+
+ else()
22+
+ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}")
23+
+ endif()
24+
+
25+
set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
26+
set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree")
27+
set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree")
28+
diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake
29+
index 75b0080f6715..c895b884cd27 100644
30+
--- a/cmake/modules/AddClang.cmake
31+
+++ b/cmake/modules/AddClang.cmake
32+
@@ -119,8 +119,8 @@ macro(add_clang_library name)
33+
install(TARGETS ${lib}
34+
COMPONENT ${lib}
35+
${export_to_clangtargets}
36+
- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
37+
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
38+
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
39+
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
40+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
41+
42+
if (NOT LLVM_ENABLE_IDE)
43+
diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt
44+
index f2b0c5cddcbb..52f37fc368ce 100644
45+
--- a/lib/Headers/CMakeLists.txt
46+
+++ b/lib/Headers/CMakeLists.txt
47+
@@ -473,6 +473,7 @@ add_header_target("windows-resource-headers" ${windows_only_files})
48+
add_header_target("utility-resource-headers" ${utility_files})
49+
50+
get_clang_resource_dir(header_install_dir SUBDIR include)
51+
+set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/${CLANG_VERSION_MAJOR}/include)
52+
53+
#############################################################
54+
# Install rules for the catch-all clang-resource-headers target
55+
diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt
56+
index 4f23065a2472..6a0f55991e24 100644
57+
--- a/tools/libclang/CMakeLists.txt
58+
+++ b/tools/libclang/CMakeLists.txt
59+
@@ -234,7 +234,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
60+
COMPONENT
61+
libclang-python-bindings
62+
DESTINATION
63+
- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
64+
+ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
65+
endforeach()
66+
if(NOT LLVM_ENABLE_IDE)
67+
add_custom_target(libclang-python-bindings)
68+
diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt
69+
index 3aca22c0b0a8..3115353e3fe3 100644
70+
--- a/tools/scan-build-py/CMakeLists.txt
71+
+++ b/tools/scan-build-py/CMakeLists.txt
72+
@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild})
73+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib})
74+
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib})
75+
install(FILES lib/libscanbuild/${lib}
76+
- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild
77+
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild"
78+
COMPONENT scan-build-py)
79+
endforeach()
80+
81+
@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources})
82+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource})
83+
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource})
84+
install(FILES lib/libscanbuild/resources/${resource}
85+
- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild/resources
86+
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources"
87+
COMPONENT scan-build-py)
88+
endforeach()
89+
90+
@@ -122,7 +122,7 @@ foreach(lib ${LibEar})
91+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib})
92+
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib})
93+
install(FILES lib/libear/${lib}
94+
- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libear
95+
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear"
96+
COMPONENT scan-build-py)
97+
endforeach()
98+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
From 4add81bba40dcec62c4ea4481be8e35ac53e89d8 Mon Sep 17 00:00:00 2001
2+
From: Will Dietz <w@wdtz.org>
3+
Date: Thu, 18 May 2017 11:56:12 -0500
4+
Subject: [PATCH] "purity" patch for 5.0
5+
6+
---
7+
lib/Driver/ToolChains/Gnu.cpp | 7 -------
8+
1 file changed, 7 deletions(-)
9+
10+
diff --git a/lib/Driver/ToolChains/Gnu.cpp b/lib/Driver/ToolChains/Gnu.cpp
11+
index fe3c0191bb..c6a482bece 100644
12+
--- a/lib/Driver/ToolChains/Gnu.cpp
13+
+++ b/lib/Driver/ToolChains/Gnu.cpp
14+
@@ -487,13 +487,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
15+
} else {
16+
if (Args.hasArg(options::OPT_rdynamic))
17+
CmdArgs.push_back("-export-dynamic");
18+
19+
- if (!Args.hasArg(options::OPT_shared) && !IsStaticPIE &&
20+
- !Args.hasArg(options::OPT_r)) {
21+
- CmdArgs.push_back("-dynamic-linker");
22+
- CmdArgs.push_back(Args.MakeArgString(Twine(D.DyldPrefix) +
23+
- ToolChain.getDynamicLinker(Args)));
24+
- }
25+
}
26+
27+
CmdArgs.push_back("-o");
28+
--
29+
2.11.0
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
diff --git a/lib/builtins/CMakeLists.txt b/lib/builtins/CMakeLists.txt
2+
index 3a66dd9c3fb..7efc85d9f9f 100644
3+
--- a/lib/builtins/CMakeLists.txt
4+
+++ b/lib/builtins/CMakeLists.txt
5+
@@ -348,4 +348,8 @@ if (NOT MSVC)
6+
7+
+ set(i486_SOURCES ${i386_SOURCES})
8+
+ set(i586_SOURCES ${i386_SOURCES})
9+
+ set(i686_SOURCES ${i386_SOURCES})
10+
+
11+
if (WIN32)
12+
set(i386_SOURCES
13+
${i386_SOURCES}
14+
@@ -723,6 +723,7 @@ else ()
15+
endif()
16+
17+
foreach (arch ${BUILTIN_SUPPORTED_ARCH})
18+
+ message("arch: ${arch}")
19+
if (CAN_TARGET_${arch})
20+
# For ARM archs, exclude any VFP builtins if VFP is not supported
21+
if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$")
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
diff --git a/lib/sanitizer_common/sanitizer_mac.cpp b/lib/sanitizer_common/sanitizer_mac.cpp
2+
--- a/lib/sanitizer_common/sanitizer_mac.cpp
3+
+++ b/lib/sanitizer_common/sanitizer_mac.cpp
4+
@@ -613,9 +613,15 @@ HandleSignalMode GetHandleSignalMode(int signum) {
5+
// Offset example:
6+
// XNU 17 -- macOS 10.13 -- iOS 11 -- tvOS 11 -- watchOS 4
7+
constexpr u16 GetOSMajorKernelOffset() {
8+
- if (TARGET_OS_OSX) return 4;
9+
- if (TARGET_OS_IOS || TARGET_OS_TV) return 6;
10+
- if (TARGET_OS_WATCH) return 13;
11+
+#if TARGET_OS_OSX
12+
+ return 4;
13+
+#endif
14+
+#if TARGET_OS_IOS || TARGET_OS_TV
15+
+ return 6;
16+
+#endif
17+
+#if TARGET_OS_WATCH
18+
+ return 13;
19+
+#endif
20+
}
21+
22+
using VersStr = char[64];
23+
@@ -627,13 +633,13 @@ static uptr ApproximateOSVersionViaKernelVersion(VersStr vers) {
24+
u16 os_major = kernel_major - offset;
25+
26+
const char *format = "%d.0";
27+
- if (TARGET_OS_OSX) {
28+
- if (os_major >= 16) { // macOS 11+
29+
- os_major -= 5;
30+
- } else { // macOS 10.15 and below
31+
- format = "10.%d";
32+
- }
33+
+#if TARGET_OS_OSX
34+
+ if (os_major >= 16) { // macOS 11+
35+
+ os_major -= 5;
36+
+ } else { // macOS 10.15 and below
37+
+ format = "10.%d";
38+
}
39+
+#endif
40+
return internal_snprintf(vers, sizeof(VersStr), format, os_major);
41+
}
42+
43+
@@ -681,15 +687,14 @@ void ParseVersion(const char *vers, u16 *major, u16 *minor) {
44+
// Aligned versions example:
45+
// macOS 10.15 -- iOS 13 -- tvOS 13 -- watchOS 6
46+
static void MapToMacos(u16 *major, u16 *minor) {
47+
- if (TARGET_OS_OSX)
48+
- return;
49+
-
50+
- if (TARGET_OS_IOS || TARGET_OS_TV)
51+
+#if !TARGET_OS_OSX
52+
+#if TARGET_OS_IOS || TARGET_OS_TV
53+
*major += 2;
54+
- else if (TARGET_OS_WATCH)
55+
+#elif TARGET_OS_WATCH
56+
*major += 9;
57+
- else
58+
+#else
59+
UNREACHABLE("unsupported platform");
60+
+#endif
61+
62+
if (*major >= 16) { // macOS 11+
63+
*major -= 5;
64+
@@ -697,6 +702,7 @@ static void MapToMacos(u16 *major, u16 *minor) {
65+
*minor = *major;
66+
*major = 10;
67+
}
68+
+#endif
69+
}
70+
71+
static MacosVersion GetMacosAlignedVersionInternal() {

0 commit comments

Comments
 (0)