fork
Configure Feed
Select the types of activity you want to include in your feed.
lol
fork
Configure Feed
Select the types of activity you want to include in your feed.
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
9let
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.buildPlatform.canExecute stdenv.hostPlatform) [
40 "-DLLVM_TABLEGEN_EXE=${buildLlvmTools.llvm}/bin/llvm-tblgen"
41 "-DCLANG_TABLEGEN=${buildLlvmTools.libclang.dev}/bin/clang-tblgen"
42 # Added in LLVM15:
43 # `clang-tidy-confusable-chars-gen`: https://github.com/llvm/llvm-project/commit/c3574ef739fbfcc59d405985a3a4fa6f4619ecdb
44 # `clang-pseudo-gen`: https://github.com/llvm/llvm-project/commit/cd2292ef824591cc34cc299910a3098545c840c7
45 "-DCLANG_TIDY_CONFUSABLE_CHARS_GEN=${buildLlvmTools.libclang.dev}/bin/clang-tidy-confusable-chars-gen"
46 "-DCLANG_PSEUDO_GEN=${buildLlvmTools.libclang.dev}/bin/clang-pseudo-gen"
47 ];
48
49 patches = [
50 ./purity.patch
51 # https://reviews.llvm.org/D51899
52 ./gnu-install-dirs.patch
53 ../../common/clang/add-nostdlibinc-flag.patch
54 (substituteAll {
55 src = ../../clang-11-12-LLVMgold-path.patch;
56 libllvmLibdir = "${libllvm.lib}/lib";
57 })
58 ];
59
60 postPatch = ''
61 (cd tools && ln -s ../../clang-tools-extra extra)
62 '' + lib.optionalString stdenv.hostPlatform.isMusl ''
63 sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp
64 '';
65
66 outputs = [ "out" "lib" "dev" "python" ];
67
68 env = lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) {
69 # The following warning is triggered with (at least) gcc >=
70 # 12, but appears to occur only for cross compiles.
71 NIX_CFLAGS_COMPILE = "-Wno-maybe-uninitialized";
72 };
73
74 postInstall = ''
75 ln -sv $out/bin/clang $out/bin/cpp
76
77 # Move libclang to 'lib' output
78 moveToOutput "lib/libclang.*" "$lib"
79 moveToOutput "lib/libclang-cpp.*" "$lib"
80 substituteInPlace $dev/lib/cmake/clang/ClangTargets-release.cmake \
81 --replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
82 --replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
83
84 mkdir -p $python/bin $python/share/{clang,scan-view}
85 mv $out/bin/{git-clang-format,scan-view} $python/bin
86 if [ -e $out/bin/set-xcode-analyzer ]; then
87 mv $out/bin/set-xcode-analyzer $python/bin
88 fi
89 mv $out/share/clang/*.py $python/share/clang
90 mv $out/share/scan-view/*.py $python/share/scan-view
91 rm $out/bin/c-index-test
92 patchShebangs $python/bin
93
94 mkdir -p $dev/bin
95 cp bin/{clang-tblgen,clang-tidy-confusable-chars-gen,clang-pseudo-gen} $dev/bin
96 '';
97
98 passthru = {
99 inherit libllvm;
100 isClang = true;
101 hardeningUnsupportedFlags = [ "fortify3" ];
102 };
103
104 meta = llvm_meta // {
105 homepage = "https://clang.llvm.org/";
106 description = "A C language family frontend for LLVM";
107 longDescription = ''
108 The Clang project provides a language front-end and tooling
109 infrastructure for languages in the C language family (C, C++, Objective
110 C/C++, OpenCL, CUDA, and RenderScript) for the LLVM project.
111 It aims to deliver amazingly fast compiles, extremely useful error and
112 warning messages and to provide a platform for building great source
113 level tools. The Clang Static Analyzer and clang-tidy are tools that
114 automatically find bugs in your code, and are great examples of the sort
115 of tools that can be built using the Clang frontend as a library to
116 parse C/C++ code.
117 '';
118 mainProgram = "clang";
119 };
120 } // lib.optionalAttrs enableManpages {
121 pname = "clang-manpages";
122
123 ninjaFlags = [ "docs-clang-man" ];
124
125 installPhase = ''
126 mkdir -p $out/share/man/man1
127 # Manually install clang manpage
128 cp docs/man/*.1 $out/share/man/man1/
129 '';
130
131 outputs = [ "out" ];
132
133 doCheck = false;
134
135 meta = llvm_meta // {
136 description = "man page for Clang ${version}";
137 };
138 });
139in self