Skip to content

Commit

Permalink
toolchains/cc: Fix process getting killed on aarch64-darwin during li…
Browse files Browse the repository at this point in the history
…nking

On aarch64 Darwin, when using a nixpkgs provided cc toolchain, we have [seen][1]
the linking step to fail as the process got killed:

```
bazel-out/darwin_arm64-opt-exec-2B5CBBC6/bin/external/rules_haskell/haskell/ghc_wrapper: line 80: 90734 Killed: 9
               "${compile_flags[@]}" "${extra_args[@]}" 2>&1
     90736 Done                    | drop_loaded_and_warning 1>&2
```

More specifically this happened when trying to add an rpath to a dylib calling the `install_name_tool`, but
running the same command manually succeeded.

This seems to be caused by mixing different tools from stdenv.cc and darwin.cctools, especially the fact that
the tools from the latter overwrote tools from the former.

Only add missing tools not provided by the current cc toolchain from the darwin.cctools package instead.

[1]: tweag/rules_haskell#2101
  • Loading branch information
avdv committed Feb 2, 2024
1 parent e04e209 commit dba298e
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion toolchains/cc/cc.nix
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,23 @@ let
name = "bazel-${cc.name}-wrapper";
# XXX: `gcov` is missing in `/bin`.
# It exists in `stdenv.cc.cc` but that collides with `stdenv.cc`.
paths = [ cc cc.bintools ] ++ pkgs.lib.optional pkgs.stdenv.isDarwin pkgs.darwin.cctools;
paths = [ cc cc.bintools ];
pathsToLink = [ "/bin" ];
passthru = {
inherit (cc) isClang targetPrefix;
orignalName = cc.name;
};
} // (pkgs.lib.optionalAttrs pkgs.stdenv.isDarwin {
# only add tools from darwin.cctools, but don't overwrite existing tools
postBuild = ''
for tool in libtool objdump; do
if [[ ! -e $out/bin/$tool ]]; then
ln -s -t $out/bin ${pkgs.darwin.cctools}/bin/$tool
fi
done
'';
}
)
)
;
in
Expand Down

0 comments on commit dba298e

Please sign in to comment.