Merge pull request #119126 from fabaff/pycomfoconnect
[NixPkgs.git] / pkgs / development / compilers / llvm / 11 / clang / default.nix
blob2e03112d827d4e76f3eba4aa0eeecedfdeed27e3
1 { lib, stdenv, fetch, cmake, libxml2, llvm, version, clang-tools-extra_src, python3, lld
2 , fixDarwinDylibNames
3 , enableManpages ? false
4 }:
6 let
7   self = stdenv.mkDerivation ({
8     pname = "clang";
9     inherit version;
11     src = fetch "clang" "12sm91qx2m79cvj75a9aazf2x8xybjbd593dv6v7rxficpq8i0ha";
12     inherit clang-tools-extra_src;
14     unpackPhase = ''
15       unpackFile $src
16       mv clang-* clang
17       sourceRoot=$PWD/clang
18       unpackFile ${clang-tools-extra_src}
19       mv clang-tools-extra-* $sourceRoot/tools/extra
20     '';
22     nativeBuildInputs = [ cmake python3 lld ]
23       ++ lib.optional enableManpages python3.pkgs.sphinx
24       ++ lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
26     buildInputs = [ libxml2 llvm ];
28     cmakeFlags = [
29       "-DCMAKE_CXX_FLAGS=-std=c++14"
30       "-DCLANGD_BUILD_XPC=OFF"
31     ] ++ lib.optionals enableManpages [
32       "-DCLANG_INCLUDE_DOCS=ON"
33       "-DLLVM_ENABLE_SPHINX=ON"
34       "-DSPHINX_OUTPUT_MAN=ON"
35       "-DSPHINX_OUTPUT_HTML=OFF"
36       "-DSPHINX_WARNINGS_AS_ERRORS=OFF"
37     ];
39     patches = [
40       ./purity.patch
41       # https://reviews.llvm.org/D51899
42     ];
44     postPatch = ''
45       sed -i -e 's/DriverArgs.hasArg(options::OPT_nostdlibinc)/true/' \
46              -e 's/Args.hasArg(options::OPT_nostdlibinc)/true/' \
47              lib/Driver/ToolChains/*.cpp
49       # Patch for standalone doc building
50       sed -i '1s,^,find_package(Sphinx REQUIRED)\n,' docs/CMakeLists.txt
51     '' + lib.optionalString stdenv.hostPlatform.isMusl ''
52       sed -i -e 's/lgcc_s/lgcc_eh/' lib/Driver/ToolChains/*.cpp
53     '' + lib.optionalString stdenv.hostPlatform.isDarwin ''
54       substituteInPlace tools/extra/clangd/CMakeLists.txt \
55         --replace "NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB" FALSE
56     '';
58     outputs = [ "out" "lib" "python" ];
60     # Clang expects to find LLVMgold in its own prefix
61     postInstall = ''
62       if [ -e ${llvm}/lib/LLVMgold.so ]; then
63         ln -sv ${llvm}/lib/LLVMgold.so $out/lib
64       fi
66       ln -sv $out/bin/clang $out/bin/cpp
68       # Move libclang to 'lib' output
69       moveToOutput "lib/libclang.*" "$lib"
70       moveToOutput "lib/libclang-cpp.*" "$lib"
71       substituteInPlace $out/lib/cmake/clang/ClangTargets-release.cmake \
72           --replace "\''${_IMPORT_PREFIX}/lib/libclang." "$lib/lib/libclang." \
73           --replace "\''${_IMPORT_PREFIX}/lib/libclang-cpp." "$lib/lib/libclang-cpp."
75       mkdir -p $python/bin $python/share/clang/
76       mv $out/bin/{git-clang-format,scan-view} $python/bin
77       if [ -e $out/bin/set-xcode-analyzer ]; then
78         mv $out/bin/set-xcode-analyzer $python/bin
79       fi
80       mv $out/share/clang/*.py $python/share/clang
81       rm $out/bin/c-index-test
82     '';
84     passthru = {
85       isClang = true;
86       inherit llvm;
87     };
89     meta = {
90       description = "A c, c++, objective-c, and objective-c++ frontend for the llvm compiler";
91       homepage    = "https://llvm.org/";
92       license     = lib.licenses.ncsa;
93       platforms   = lib.platforms.all;
94     };
95   } // lib.optionalAttrs enableManpages {
96     pname = "clang-manpages";
98     buildPhase = ''
99       make docs-clang-man
100     '';
102     installPhase = ''
103       mkdir -p $out/share/man/man1
104       # Manually install clang manpage
105       cp docs/man/*.1 $out/share/man/man1/
106     '';
108     outputs = [ "out" ];
110     doCheck = false;
112     meta.description = "man page for Clang ${version}";
113   });
114 in self