From 2e4dd52b4ffa3eb467b311f55c7d749182e74d5e Mon Sep 17 00:00:00 2001 From: Claudio Bley Date: Thu, 16 Nov 2023 09:07:19 +0100 Subject: [PATCH] Work around otool not set to nix store path in GHC settings In previous GHC versions from nixpkgs, the `otool` setting was referencing a tool in the nix store, but for GHC 9.6.2 it is just set to "otool" which means it must be in `$PATH`. The same applies to the `install_name_tool`. We work around by using the location of the `ar` command and assume the other tools (from the bintools package) are also available at the same place. --- haskell/cabal.bzl | 6 ++++++ haskell/private/actions/link.bzl | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/haskell/cabal.bzl b/haskell/cabal.bzl index 39bc3c39f2..cced9dd8a0 100644 --- a/haskell/cabal.bzl +++ b/haskell/cabal.bzl @@ -289,6 +289,12 @@ def _prepare_cabal_inputs( ] extra_args = ["--flags=" + " ".join(flags)] + if hs.toolchain.is_darwin: + ar_bindir = paths.dirname(cc.tools.ar) + + extra_args.append("--ghc-option=-pgmotool=" + paths.join(ar_bindir, "otool")) + extra_args.append("--ghc-option=-pgminstall_name_tool=" + paths.join(ar_bindir, "install_name_tool")) + ghc_version = [int(x) for x in hs.toolchain.version.split(".")] if dynamic_file: # See Note [No PIE when linking] in haskell/private/actions/link.bzl diff --git a/haskell/private/actions/link.bzl b/haskell/private/actions/link.bzl index 493627061e..13f0a38973 100644 --- a/haskell/private/actions/link.bzl +++ b/haskell/private/actions/link.bzl @@ -133,6 +133,13 @@ def link_binary( args.add_all(cc.linker_flags, format_each = "-optl%s") if with_profiling: args.add("-prof") + + if hs.toolchain.is_darwin: + ar_bindir = paths.dirname(cc.tools.ar) + + args.add(paths.join(ar_bindir, "otool"), format = "-pgmotool=%s") + args.add(paths.join(ar_bindir, "install_name_tool"), format = "-pgminstall_name_tool=%s") + args.add_all(hs.toolchain.ghcopts) args.add_all(compiler_flags) @@ -349,6 +356,13 @@ def link_library_dynamic(hs, cc, posix, dep_info, extra_srcs, object_files, my_p args = hs.actions.args() args.add_all(cc.linker_flags, format_each = "-optl%s") args.add_all(["-shared", "-dynamic"]) + + if hs.toolchain.is_darwin: + ar_bindir = paths.dirname(cc.tools.ar) + + args.add(paths.join(ar_bindir, "otool"), format = "-pgmotool=%s") + args.add(paths.join(ar_bindir, "install_name_tool"), format = "-pgminstall_name_tool=%s") + args.add_all(hs.toolchain.ghcopts) args.add_all(compiler_flags) extra_prefix = empty_lib_prefix