Skip to content

Commit 2c627d9

Browse files
committed
llvmPackages_16: init
1 parent ce35e61 commit 2c627d9

35 files changed

Lines changed: 2525 additions & 0 deletions
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{ lib, runCommand, stdenv, llvm, lld, version }:
2+
3+
let
4+
prefix = lib.optionalString (stdenv.hostPlatform != stdenv.targetPlatform) "${stdenv.targetPlatform.config}-";
5+
in runCommand "llvm-binutils-${version}" {
6+
preferLocalBuild = true;
7+
passthru = {
8+
isLLVM = true;
9+
};
10+
} ''
11+
mkdir -p $out/bin
12+
for prog in ${lld}/bin/*; do
13+
ln -s $prog $out/bin/${prefix}$(basename $prog)
14+
done
15+
for prog in ${llvm}/bin/*; do
16+
ln -sf $prog $out/bin/${prefix}$(basename $prog)
17+
done
18+
19+
ln -s ${llvm}/bin/llvm-ar $out/bin/${prefix}ar
20+
ln -s ${llvm}/bin/llvm-ar $out/bin/${prefix}dlltool
21+
ln -s ${llvm}/bin/llvm-ar $out/bin/${prefix}ranlib
22+
ln -s ${llvm}/bin/llvm-cxxfilt $out/bin/${prefix}c++filt
23+
ln -s ${llvm}/bin/llvm-debuginfod $out/bin/${prefix}debuginfod
24+
ln -s ${llvm}/bin/llvm-debuginfod-find $out/bin/${prefix}debuginfod-find
25+
ln -s ${llvm}/bin/llvm-dwp $out/bin/${prefix}dwp
26+
ln -s ${llvm}/bin/llvm-nm $out/bin/${prefix}nm
27+
ln -s ${llvm}/bin/llvm-objcopy $out/bin/${prefix}objcopy
28+
ln -s ${llvm}/bin/llvm-objcopy $out/bin/${prefix}strip
29+
ln -s ${llvm}/bin/llvm-objdump $out/bin/${prefix}objdump
30+
ln -s ${llvm}/bin/llvm-rc $out/bin/${prefix}windres
31+
ln -s ${llvm}/bin/llvm-readobj $out/bin/${prefix}readelf
32+
ln -s ${llvm}/bin/llvm-size $out/bin/${prefix}size
33+
ln -s ${llvm}/bin/llvm-strings $out/bin/${prefix}strings
34+
ln -s ${llvm}/bin/llvm-symbolizer $out/bin/${prefix}addr2line
35+
36+
ln -s ${lld}/bin/lld $out/bin/${prefix}ld
37+
''
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
{ lib, stdenv, llvm_meta
2+
, monorepoSrc, runCommand
3+
, substituteAll, 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+
] ++ lib.optionals enableManpages [
34+
"-DCLANG_INCLUDE_DOCS=ON"
35+
"-DLLVM_ENABLE_SPHINX=ON"
36+
"-DSPHINX_OUTPUT_MAN=ON"
37+
"-DSPHINX_OUTPUT_HTML=OFF"
38+
"-DSPHINX_WARNINGS_AS_ERRORS=OFF"
39+
] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
40+
"-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
41+
"-DCLANG_TABLEGEN=${buildLlvmTools.libclang.dev}/bin/clang-tblgen"
42+
];
43+
44+
patches = [
45+
./purity.patch
46+
# https://reviews.llvm.org/D51899
47+
./gnu-install-dirs.patch
48+
../../common/clang/add-nostdlibinc-flag.patch
49+
# FIMXE: do we need this patch?
50+
# (substituteAll {
51+
# src = ../../clang-11-12-LLVMgold-path.patch;
52+
# libllvmLibdir = "${libllvm.lib}/lib";
53+
# })
54+
];
55+
56+
postPatch = ''
57+
(cd tools && ln -s ../../clang-tools-extra extra)
58+
'' + lib.optionalString stdenv.hostPlatform.isMusl ''
59+
sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp
60+
'';
61+
62+
outputs = [ "out" "lib" "dev" "python" ];
63+
64+
postInstall = ''
65+
ln -sv $out/bin/clang $out/bin/cpp
66+
67+
# Move libclang to 'lib' output
68+
moveToOutput "lib/libclang.*" "$lib"
69+
moveToOutput "lib/libclang-cpp.*" "$lib"
70+
substituteInPlace $dev/lib/cmake/clang/ClangTargets-release.cmake \
71+
--replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
72+
--replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
73+
74+
mkdir -p $python/bin $python/share/clang/
75+
mv $out/bin/{git-clang-format,scan-view} $python/bin
76+
if [ -e $out/bin/set-xcode-analyzer ]; then
77+
mv $out/bin/set-xcode-analyzer $python/bin
78+
fi
79+
mv $out/share/clang/*.py $python/share/clang
80+
rm $out/bin/c-index-test
81+
patchShebangs $python/bin
82+
83+
mkdir -p $dev/bin
84+
cp bin/clang-tblgen $dev/bin
85+
'';
86+
87+
passthru = {
88+
inherit libllvm;
89+
isClang = true;
90+
hardeningUnsupportedFlags = [ "fortify3" ];
91+
};
92+
93+
meta = llvm_meta // {
94+
homepage = "https://clang.llvm.org/";
95+
description = "A C language family frontend for LLVM";
96+
longDescription = ''
97+
The Clang project provides a language front-end and tooling
98+
infrastructure for languages in the C language family (C, C++, Objective
99+
C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project.
100+
It aims to deliver amazingly fast compiles, extremely useful error and
101+
warning messages and to provide a platform for building great source
102+
level tools. The Clang Static Analyzer and clang-tidy are tools that
103+
automatically find bugs in your code, and are great examples of the sort
104+
of tools that can be built using the Clang frontend as a library to
105+
parse C/C++ code.
106+
'';
107+
mainProgram = "clang";
108+
};
109+
} // lib.optionalAttrs enableManpages {
110+
pname = "clang-manpages";
111+
112+
ninjaFlags = [ "docs-clang-man" ];
113+
114+
installPhase = ''
115+
mkdir -p $out/share/man/man1
116+
# Manually install clang manpage
117+
cp docs/man/*.1 $out/share/man/man1/
118+
'';
119+
120+
outputs = [ "out" ];
121+
122+
doCheck = false;
123+
124+
meta = llvm_meta // {
125+
description = "man page for Clang ${version}";
126+
};
127+
});
128+
in self
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
diff --git a/CMakeLists.txt b/CMakeLists.txt
2+
index 090cfa352078..624b7c9f3400 100644
3+
--- a/CMakeLists.txt
4+
+++ b/CMakeLists.txt
5+
@@ -38,12 +38,26 @@ 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+
- set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
11+
- set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree")
12+
- set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree")
13+
- set(LLVM_TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin")
14+
- set(LLVM_LIBRARY_DIR "${LLVM_LIBRARY_DIR}" CACHE PATH "Path to llvm/lib")
15+
+ # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets
16+
+ # LLVM_CONFIG.
17+
+ if (NOT LLVM_CONFIG_FOUND)
18+
+ # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config
19+
+ # path is removed.
20+
+ set(INCLUDE_DIRS ${LLVM_INCLUDE_DIRS})
21+
+ set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}")
22+
+ # N.B. this is just a default value, the CACHE PATHs below can be overriden.
23+
+ set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")
24+
+ set(TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}")
25+
+ set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}")
26+
+ else()
27+
+ set(INCLUDE_DIRS "${LLVM_BINARY_DIR}/include" "${MAIN_INCLUDE_DIR}")
28+
+ endif()
29+
+
30+
+ set(LLVM_INCLUDE_DIRS ${INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
31+
+ set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree")
32+
+ set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree")
33+
+ set(LLVM_TOOLS_BINARY_DIR "${TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin")
34+
+ set(LLVM_LIBRARY_DIR "${LIBRARY_DIR}" CACHE PATH "Path to llvm/lib")
35+
36+
find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
37+
NO_DEFAULT_PATH)
38+
diff --git a/cmake/modules/AddClang.cmake b/cmake/modules/AddClang.cmake
39+
index 75b0080f6715..c895b884cd27 100644
40+
--- a/cmake/modules/AddClang.cmake
41+
+++ b/cmake/modules/AddClang.cmake
42+
@@ -119,8 +119,8 @@ macro(add_clang_library name)
43+
install(TARGETS ${lib}
44+
COMPONENT ${lib}
45+
${export_to_clangtargets}
46+
- LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
47+
- ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
48+
+ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
49+
+ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}"
50+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
51+
52+
if (NOT LLVM_ENABLE_IDE)
53+
diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt
54+
index bb9a11eabbef..e2de91c65fbb 100644
55+
--- a/lib/Headers/CMakeLists.txt
56+
+++ b/lib/Headers/CMakeLists.txt
57+
@@ -437,7 +437,7 @@ add_header_target("openmp-resource-headers" ${openmp_wrapper_files})
58+
add_header_target("windows-resource-headers" ${windows_only_files})
59+
add_header_target("utility-resource-headers" ${utility_files})
60+
61+
-set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include)
62+
+set(header_install_dir ${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include)
63+
64+
#############################################################
65+
# Install rules for the catch-all clang-resource-headers target
66+
diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt
67+
index 4f23065a2472..6a0f55991e24 100644
68+
--- a/tools/libclang/CMakeLists.txt
69+
+++ b/tools/libclang/CMakeLists.txt
70+
@@ -234,7 +234,7 @@ foreach(PythonVersion ${CLANG_PYTHON_BINDINGS_VERSIONS})
71+
COMPONENT
72+
libclang-python-bindings
73+
DESTINATION
74+
- "lib${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
75+
+ "${CMAKE_INSTALL_LIBDIR}${LLVM_LIBDIR_SUFFIX}/python${PythonVersion}/site-packages")
76+
endforeach()
77+
if(NOT LLVM_ENABLE_IDE)
78+
add_custom_target(libclang-python-bindings)
79+
diff --git a/tools/scan-build-py/CMakeLists.txt b/tools/scan-build-py/CMakeLists.txt
80+
index 3aca22c0b0a8..3115353e3fe3 100644
81+
--- a/tools/scan-build-py/CMakeLists.txt
82+
+++ b/tools/scan-build-py/CMakeLists.txt
83+
@@ -88,7 +88,7 @@ foreach(lib ${LibScanbuild})
84+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/${lib})
85+
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/${lib})
86+
install(FILES lib/libscanbuild/${lib}
87+
- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild
88+
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild"
89+
COMPONENT scan-build-py)
90+
endforeach()
91+
92+
@@ -106,7 +106,7 @@ foreach(resource ${LibScanbuildResources})
93+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libscanbuild/resources/${resource})
94+
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libscanbuild/resources/${resource})
95+
install(FILES lib/libscanbuild/resources/${resource}
96+
- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libscanbuild/resources
97+
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libscanbuild/resources"
98+
COMPONENT scan-build-py)
99+
endforeach()
100+
101+
@@ -122,7 +122,7 @@ foreach(lib ${LibEar})
102+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/lib/libear/${lib})
103+
list(APPEND Depends ${CMAKE_BINARY_DIR}/lib/libear/${lib})
104+
install(FILES lib/libear/${lib}
105+
- DESTINATION lib${CLANG_LIBDIR_SUFFIX}/libear
106+
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/libear"
107+
COMPONENT scan-build-py)
108+
endforeach()
109+
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)$")

0 commit comments

Comments
 (0)