nixpkgs/pkgs/development/compilers/llvm
Peter Waller 6ba1b5b0b3 llvmPackages_15, llvmPackages_16: Make the pkgsLLVM.stdenv work
What changed:

* Fixed crtbeginS.o and crtendS.o missing
  (they may or may not be called crt{begin_end},{,_shared}.

* Fixed implicit function declaration causing build errors for various
  builds by supplying -Wno-implicit-function-declaration.

* Fixed __cxxabi_config.h missing, by adding -I${cxxabi}/include/c++/v1
  in the wrapper.

* Fixed libcxx failing to build due to missing libunwind symbols by
  including libunwind as a buildInput, and setting
  -DLIBCXX_ADDITIONAL_LIBRARIES=unwind for stdenv.hostPlatform.useLLVM == true.

* libcxxabi wants to find libunwind at libunwind_shared.so, so symlink
  it there in libunwind.

* llvmPackages_16.libcxxabi: Pass -nostdlib via CMAKE_*_LINKER_FLAGS

  Without this flag, the link of libcxxabi.so tries to pull in libgcc and
  friends, from the clang compiler driver.

* Drop unneeded musl hack patch from libcxx.

* Pass -Wno-error=implicit-function-declaration only to compiler-rt

  See LLVM forum discussion:

  https://discourse.llvm.org/t/configure-script-breakage-with-the-new-werror-implicit-function-declaration/65213

  In summary, LLVM 16 made implicit function declaration an error. This
  happens a lot in configure scripts which can break things.

* llvmPackages_16: !isDarwin: Supply -DLIBCXX_ABI_USE_LLVM_UNWINDER=On

  Otherwise it fails with various undefined references to _Unwind_*
  functions: (full list: _Unwind_DeleteException _Unwind_GetIP
  _Unwind_GetLanguageSpecificData _Unwind_GetRegionStart
  _Unwind_RaiseException _Unwind_Resume _Unwind_SetGR _Unwind_SetIP).

* 16.libcxxabi: Only pass -nostdlib for useLLVM and Darwin builds

What was tested:

* x86_64-linux, aarch64-linux, the stdenv builds.
  * Additionally I was able to get nix to build, with an overlay to fix
    a couple of minor issues in downstream packages (overlay supplied in
    PR #246577.

* aarch64-darwin fails spuriously in a single LLVM test
  strip-preserve-atime.test checking atime timestamps.

* The same for pkgsLLVM with llvmPackages = llvmPackages_15.

Signed-off-by: Peter Waller <p@pwaller.net>
2023-08-22 17:33:24 +01:00
..
5 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
6 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
7 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
8 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
9 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
10 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
11 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
12 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
13 Merge master into staging-next 2023-08-04 00:02:04 +00:00
14 Merge pull request #191801 from ShamrockLee/clang-python-scan-view 2023-07-18 14:18:49 +00:00
15 llvmPackages_15, llvmPackages_16: Make the pkgsLLVM.stdenv work 2023-08-22 17:33:24 +01:00
16 llvmPackages_15, llvmPackages_16: Make the pkgsLLVM.stdenv work 2023-08-22 17:33:24 +01:00
common llvmPackages.lldb: deduplicate >10 2023-05-09 19:59:45 +03:00
git llvmPackages_15, llvmPackages_16: Make the pkgsLLVM.stdenv work 2023-08-22 17:33:24 +01:00
rocm llvmPackages_rocm.llvm: build on big-parallel 2023-05-16 14:12:02 -04:00
aarch64.patch
clang-6-10-LLVMgold-path.patch
clang-11-12-LLVMgold-path.patch
exegesis-force-bdver2.patch
libcxx-0001-musl-hacks.patch
llvm-7-musl.patch llvm_7: backport patch for musl 1.2.4 2023-05-03 09:37:13 +00:00
llvm-config-link-static.patch
multi.nix wrapClangMulti: link include/c++ into gcc_multi_sysroot 2023-05-09 00:16:24 -07:00
README.md
TLI-musl.patch
update-git.py llvm: use versionhistory.googleapis.com over omahaproxy.appspot.com 2023-04-21 21:36:35 +02:00
update.sh

How to upgrade llvm_git

  • Run update-git.py. This will set the github revision and sha256 for llvmPackages_git.llvm to whatever the latest chromium build is using. For a more recent, commit run nix-prefetch-github and change the rev and sha256 accordingly.

  • That was the easy part. The hard part is updating the patch files.

    The general process is:

    1. Try to build llvmPackages_git.llvm and associated packages such as clang and compiler-rt. You can use the -L and --keep-failed flags to make debugging patch errors easy, e.g., nix build .#llvmPackages_git.clang -L --keep-failed

    2. The build will error out with something similar to this:

      ...
      clang-unstable> patching sources
      clang-unstable> applying patch /nix/store/nndv6gq6w608n197fndvv5my4a5zg2qi-purity.patch
      clang-unstable> patching file lib/Driver/ToolChains/Gnu.cpp
      clang-unstable> Hunk #1 FAILED at 487.
      clang-unstable> 1 out of 1 hunk FAILED -- saving rejects to file lib/Driver/ToolChains/Gnu.cpp.rej
      note: keeping build directory '/tmp/nix-build-clang-unstable-2022-25-07.drv-17'
      error: builder for '/nix/store/zwi123kpkyz52fy7p6v23azixd807r8c-clang-unstable-2022-25-07.drv' failed with exit code 1;
             last 8 log lines:
             > unpacking sources
             > unpacking source archive /nix/store/mrxadx11wv1ckjr2208qgxp472pmmg6g-clang-src-unstable-2022-25-07
             > source root is clang-src-unstable-2022-25-07/clang
             > patching sources
             > applying patch /nix/store/nndv6gq6w608n197fndvv5my4a5zg2qi-purity.patch
             > patching file lib/Driver/ToolChains/Gnu.cpp
             > Hunk #1 FAILED at 487.
             > 1 out of 1 hunk FAILED -- saving rejects to file lib/Driver/ToolChains/Gnu.cpp.rej
             For full logs, run 'nix log /nix/store/zwi123kpkyz52fy7p6v23azixd807r8c-clang-unstable-2022-25-07.drv'.
      note: keeping build directory '/tmp/nix-build-compiler-rt-libc-unstable-2022-25-07.drv-20'
      error: 1 dependencies of derivation '/nix/store/ndbbh3wrl0l39b22azf46f1n7zlqwmag-clang-wrapper-unstable-2022-25-07.drv' failed to build
      

      Notice the Hunk #1 Failed at 487 line. The lines above show us that the purity.patch failed on lib/Driver/ToolChains/Gnu.cpp when compiling clang.

  1. The task now is to cross reference the hunks in the purity patch with lib/Driver/ToolCahins/Gnu.cpp.orig to see why the patch failed. The .orig file will be in the build directory referenced in the line note: keeping build directory ...; this message results from the --keep-failed flag.

  2. Now you should be able to open whichever patch failed, and the foo.orig file that it failed on. Correct the patch by adapting it to the new code and be mindful of whitespace; which can be an easily missed reason for failures. For cases where the hunk is no longer needed you can simply remove it from the patch.

This is fine for small corrections, but when more serious changes are needed its better to use git.

  1. Clone the LLVM monorepo at https://github.com/llvm/llvm-project/

  2. Check out the revision we were using before.

  3. Use patch -p1 < path/to-path in the project subdirectories to apply the patches and commit.

  4. Use git rebase HEAD^ --onto <dest> to rebase the patches onto the new revision we are trying to build, and fix all conflicts.

  5. Use git diff HEAD^:<project> HEAD:<project> to get subdir diff to write back to Nixpkgs.

Information on our current patch sets

"GNU Install Dirs" patches

Use CMake's GNUInstallDirs to support multiple outputs.

Previously, LLVM Just hard-coded bin, include, and lib${LLVM_TARGET_PREFIX}. We are making it use these variables.

For the older LLVM versions, these patches live in https://github.com/Ericson2314/llvm-project branches split-prefix. Instead of applying the patches to the worktree per the above instructions, one can checkout those directly and rebase those instead.

For newer LLVM versions, enough has has been upstreamed, (see https://reviews.llvm.org/differential/query/5UAfpj_9zHwY/ for my progress upstreaming), that I have just assembled new gnu-install-dirs patches from the remaining unmerged patches instead of rebasing from the prior LLVM's gnu install dirs patch.