about summary refs log tree commit diff
path: root/pkgs/development/compilers/circt/circt-llvm.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/compilers/circt/circt-llvm.nix')
-rw-r--r--pkgs/development/compilers/circt/circt-llvm.nix37
1 files changed, 35 insertions, 2 deletions
diff --git a/pkgs/development/compilers/circt/circt-llvm.nix b/pkgs/development/compilers/circt/circt-llvm.nix
index a21b82d93376e..0043702fd8470 100644
--- a/pkgs/development/compilers/circt/circt-llvm.nix
+++ b/pkgs/development/compilers/circt/circt-llvm.nix
@@ -1,4 +1,5 @@
-{ stdenv
+{ lib
+, stdenv
 , cmake
 , ninja
 , circt
@@ -23,7 +24,7 @@
     "-DLLVM_BUILD_EXAMPLES=OFF"
     "-DLLVM_OPTIMIZED_TABLEGEN=ON"
     "-DLLVM_ENABLE_PROJECTS=mlir"
-    "-DLLVM_TARGETS_TO_BUILD="
+    "-DLLVM_TARGETS_TO_BUILD=Native"
 
     # This option is needed to install llvm-config
     "-DLLVM_INSTALL_UTILS=ON"
@@ -31,6 +32,14 @@
 
   outputs = [ "out" "lib" "dev" ];
 
+  # Get rid of ${extra_libdir} (which ends up containing a path to circt-llvm.dev
+  # in circt) so that we only have to remove the one fixed rpath.
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace llvm/llvm/cmake/modules/AddLLVM.cmake \
+      --replace-fail 'set(_install_rpath "@loader_path/../lib''${LLVM_LIBDIR_SUFFIX}" ''${extra_libdir})' \
+        'set(_install_rpath "@loader_path/../lib''${LLVM_LIBDIR_SUFFIX}")'
+  '';
+
   postInstall = ''
     # move llvm-config to $dev to resolve a circular dependency
     moveToOutput "bin/llvm-config*" "$dev"
@@ -50,6 +59,30 @@
       --replace "$out/bin/llvm-config" "$dev/bin/llvm-config" # patch path for llvm-config
   '';
 
+  # Replace all references to @rpath with absolute paths and remove the rpaths.
+  #
+  # This is different from what the regular LLVM package does, which is to make
+  # everything absolute from the start: however, that doesn't work for us because
+  # we have `-DBUILD_SHARED_LIBS=ON`, meaning that many more things are
+  # dynamically rather than statically linked. This includes TableGen, which then
+  # fails to run halfway through the build because it tries to reference $lib when
+  # it hasn't been populated yet.
+  #
+  # Inspired by fixDarwinDylibNames.
+  postFixup = lib.optionalString stdenv.isDarwin ''
+    local flags=(-delete_rpath @loader_path/../lib)
+    for file in "$lib"/lib/*.dylib; do
+      flags+=(-change @rpath/"$(basename "$file")" "$file")
+    done
+
+    for file in "$out"/bin/* "$lib"/lib/*.dylib; do
+      if [ -L "$file" ]; then continue; fi
+      echo "$file: fixing dylib references"
+      # note that -id does nothing on binaries
+      install_name_tool -id "$file" "''${flags[@]}" "$file"
+    done
+  '';
+
   # circt only use the mlir part of llvm, occasionally there are some unrelated failure from llvm,
   # disable the llvm check, but keep the circt check enabled.
   doCheck = false;