From 04f7cc3880912abb738d3d3bc20e7622a211f25e Mon Sep 17 00:00:00 2001 From: sterni Date: Thu, 7 Oct 2021 21:57:09 +0200 Subject: [PATCH] fix(3p): resolve linker issues with clang-compiled C++ packages The point where this broke is likely when llvmPackages_11.stdenv started respecting stdenv.hostPlatform.linker and thus using GNU binutils' ld.bfd for linking. That linker can't deal with clang's C++ ABI. To fix this we introduce a modified version of llvmPackages_11.stdenv which uses llvmPackages_11.bintools for linking purposes (I also aim to upstream this in some form, but am not sure about the details atm, so we'll just do this in the tvl overlay for now). This is the precondition for getting our C++ packages in //third_party to work again. Additionally the following fixes were necessary: * abseil-cpp needed to be updated (by overriding the version from nixpkgs for now, since I can't update the subtree on my own) to fulfill grpc's requirements (grpc 1.41.0 needs abseil-cpp LTS 20210324). * gtest needs a patch from nixpkgs which fixes the path to its include directory for CMake. * We need to build re2 with clang as well, otherwise linking will fail. Fixes b/132. Change-Id: I7b64579fe96451547babe070fd35db398581e49d Reviewed-on: https://cl.tvl.fyi/c/depot/+/3701 Tested-by: BuildkiteCI Reviewed-by: lukegb Reviewed-by: tazjin --- third_party/abseil_cpp/default.nix | 11 +++++++++-- third_party/glog/default.nix | 4 ++-- third_party/grpc/default.nix | 9 +++------ third_party/gtest/default.nix | 3 +-- third_party/nix/default.nix | 5 +---- third_party/overlays/tvl.nix | 7 +++++++ third_party/protobuf/default.nix | 4 ++-- third_party/rapidcheck/default.nix | 2 +- third_party/re2/default.nix | 5 +++++ 9 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 third_party/re2/default.nix diff --git a/third_party/abseil_cpp/default.nix b/third_party/abseil_cpp/default.nix index 5b99fbc56..c4c1ca174 100644 --- a/third_party/abseil_cpp/default.nix +++ b/third_party/abseil_cpp/default.nix @@ -1,7 +1,13 @@ { pkgs, lib, ... }: -let inherit (pkgs) cmake llvmPackages_11; -in llvmPackages_11.libcxxStdenv.mkDerivation rec { +let inherit (pkgs) cmake fullLlvm11Stdenv; +in pkgs.abseil-cpp.override { + stdenv = fullLlvm11Stdenv; +} + +/* TODO(tazjin): update abseil subtree + +fullLlvm11Stdenv.mkDerivation rec { pname = "abseil-cpp"; version = "20200519-768eb2ca+tvl-1"; src = ./.; @@ -21,3 +27,4 @@ in llvmPackages_11.libcxxStdenv.mkDerivation rec { maintainers = [ maintainers.andersk ]; }; } +*/ diff --git a/third_party/glog/default.nix b/third_party/glog/default.nix index 9fe9ce484..a28bcbaea 100644 --- a/third_party/glog/default.nix +++ b/third_party/glog/default.nix @@ -1,7 +1,7 @@ { pkgs, lib, ... }: -let inherit (pkgs) llvmPackages_11 cmake; -in llvmPackages_11.libcxxStdenv.mkDerivation { +let inherit (pkgs) fullLlvm11Stdenv cmake; +in fullLlvm11Stdenv.mkDerivation { name = "glog"; version = "20200527-unstable"; src = ./.; diff --git a/third_party/grpc/default.nix b/third_party/grpc/default.nix index 2914d8d8e..c41e66e58 100644 --- a/third_party/grpc/default.nix +++ b/third_party/grpc/default.nix @@ -2,14 +2,11 @@ (pkgs.grpc.override { protobuf = depot.third_party.protobuf; - stdenv = pkgs.llvmPackages_11.libcxxStdenv; + stdenv = pkgs.fullLlvm11Stdenv; abseil-cpp = depot.third_party.abseil_cpp; + re2 = depot.third_party.re2; }).overrideAttrs(orig: rec { cmakeFlags = orig.cmakeFlags ++ [ - "-DCMAKE_CXX_STANDARD=17" "-DCMAKE_CXX_STANDARD_REQUIRED=ON" ]; -}) // { - # TODO(b/132): Reenable when linker errors are fixed. - meta.ci = false; -} +}) diff --git a/third_party/gtest/default.nix b/third_party/gtest/default.nix index 5491450aa..70516853e 100644 --- a/third_party/gtest/default.nix +++ b/third_party/gtest/default.nix @@ -1,7 +1,7 @@ { pkgs, ... }: (pkgs.gtest.override { - stdenv = pkgs.llvmPackages_11.libcxxStdenv; + stdenv = pkgs.fullLlvm11Stdenv; }).overrideAttrs(_: { src = pkgs.fetchFromGitHub { owner = "google"; @@ -9,5 +9,4 @@ rev = "9dce5e5d878176dc0054ef381f5c6e705f43ef99"; sha256 = "05xi61j7j251dzkgk9965lqpbacsy44iblzql941kw9d4nk0q6jl"; }; - patches = []; }) diff --git a/third_party/nix/default.nix b/third_party/nix/default.nix index 909bff9be..3fc89fc7e 100644 --- a/third_party/nix/default.nix +++ b/third_party/nix/default.nix @@ -57,7 +57,7 @@ let cp ${pkgs.busybox}/bin/busybox $out/bin ''; -in lib.fix (self: pkgs.llvmPackages_11.libcxxStdenv.mkDerivation { +in lib.fix (self: pkgs.fullLlvm11Stdenv.mkDerivation { pname = "tvix"; version = "2.3.4"; inherit src; @@ -187,9 +187,6 @@ in lib.fix (self: pkgs.llvmPackages_11.libcxxStdenv.mkDerivation { # TODO(tazjin): integration test setup? # TODO(tazjin): docs generation? - # TODO(b/132): Reenable when linker errors are fixed. - meta.ci = false; - passthru = { build-shell = self.overrideAttrs (up: rec { run_clang_tidy = pkgs.writeShellScriptBin "run-clang-tidy" '' diff --git a/third_party/overlays/tvl.nix b/third_party/overlays/tvl.nix index dac84b9fd..ccf64924a 100644 --- a/third_party/overlays/tvl.nix +++ b/third_party/overlays/tvl.nix @@ -22,6 +22,13 @@ self: super: { llvmPackages = self.llvmPackages_11; }; + # stdenv which uses clang, lld and libc++; full is a slight exaggeration, + # we for example don't use LLVM's libunwind + fullLlvm11Stdenv = self.overrideCC self.stdenv + (self.llvmPackages_11.libcxxStdenv.cc.override { + inherit (self.llvmPackages_11) bintools; + }); + # Add our Emacs packages to the fixpoint emacsPackagesFor = emacs: ( (super.emacsPackagesFor emacs).overrideScope' (eself: esuper: { diff --git a/third_party/protobuf/default.nix b/third_party/protobuf/default.nix index 569cb269b..b30ff9de9 100644 --- a/third_party/protobuf/default.nix +++ b/third_party/protobuf/default.nix @@ -4,9 +4,9 @@ pkgs.callPackage "${pkgs.path}/pkgs/development/libraries/protobuf/generic-v3.nix" { version = "3.12.2"; sha256 = "1lp368aa206vpic9fmax4k6llnmf28plfvkkm4vqhgphmjqykvl2"; - stdenv = pkgs.llvmPackages_11.libcxxStdenv; + stdenv = pkgs.fullLlvm11Stdenv; buildPackages = { inherit (pkgs) which; - stdenv = pkgs.llvmPackages_11.libcxxStdenv; + stdenv = pkgs.fullLlvm11Stdenv; }; } diff --git a/third_party/rapidcheck/default.nix b/third_party/rapidcheck/default.nix index 79fd7fa12..ec8c01694 100644 --- a/third_party/rapidcheck/default.nix +++ b/third_party/rapidcheck/default.nix @@ -1,7 +1,7 @@ { pkgs, ... }: (pkgs.callPackage "${pkgs.path}/pkgs/development/libraries/rapidcheck" { - stdenv = pkgs.llvmPackages_11.libcxxStdenv; + stdenv = pkgs.fullLlvm11Stdenv; }).overrideAttrs (attrs: rec { # follows the versioning scheme of nixpkgs, since rapidcheck does not # provide versioned releases diff --git a/third_party/re2/default.nix b/third_party/re2/default.nix new file mode 100644 index 000000000..62bce9e2e --- /dev/null +++ b/third_party/re2/default.nix @@ -0,0 +1,5 @@ +{ pkgs, ... }: + +pkgs.re2.override { + stdenv = pkgs.fullLlvm11Stdenv; +}