From b4c41fd56a17e7f004b998598db045bd00c9a904 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`. See https://github.com/NixOS/nixpkgs/issues/267250 and https://gitlab.haskell.org/ghc/ghc/-/issues/24211 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 | 9 +++++++++ haskell/experimental/private/module.bzl | 7 +++++++ haskell/private/actions/link.bzl | 16 ++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/haskell/cabal.bzl b/haskell/cabal.bzl index a935f23e7d..081ab0c021 100644 --- a/haskell/cabal.bzl +++ b/haskell/cabal.bzl @@ -289,6 +289,15 @@ def _prepare_cabal_inputs( ] extra_args = ["--flags=" + " ".join(flags)] + if hs.toolchain.is_darwin: + # assume `otool` and `install_name_tool` are available at the same location as `ar` + 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")) + extra_args.append("--haddock-option=--optghc=-pgmotool=" + paths.join(ar_bindir, "otool")) + extra_args.append("--haddock-option=--optghc=-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/experimental/private/module.bzl b/haskell/experimental/private/module.bzl index 8da21d4a27..e9c3e26133 100644 --- a/haskell/experimental/private/module.bzl +++ b/haskell/experimental/private/module.bzl @@ -302,6 +302,13 @@ def _build_haskell_module( args.add_all(hs.toolchain.ghcopts) args.add_all(user_ghcopts) + if hs.toolchain.is_darwin: + # assume `otool` and `install_name_tool` are available at the same location as `ar` + 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") + if plugins and not enable_th: # For #1681. These suppresses bogus warnings about missing libraries which # aren't really needed. diff --git a/haskell/private/actions/link.bzl b/haskell/private/actions/link.bzl index 2783148157..b581fc7e35 100644 --- a/haskell/private/actions/link.bzl +++ b/haskell/private/actions/link.bzl @@ -133,6 +133,14 @@ def link_binary( args.add_all(cc.linker_flags, format_each = "-optl%s") if with_profiling: args.add("-prof") + + if hs.toolchain.is_darwin: + # assume `otool` and `install_name_tool` are available at the same location as `ar` + 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) @@ -366,6 +374,14 @@ 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: + # assume `otool` and `install_name_tool` are available at the same location as `ar` + 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)