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/compile.bzl b/haskell/private/actions/compile.bzl index ef5ba3dfe0..183d512674 100644 --- a/haskell/private/actions/compile.bzl +++ b/haskell/private/actions/compile.bzl @@ -124,6 +124,15 @@ def _compilation_defaults( compile_flags += hs.toolchain.ghcopts compile_flags += user_compile_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) + + compile_flags += [ + "-pgmotool=" + paths.join(ar_bindir, "otool"), + "-pgminstall_name_tool=" + paths.join(ar_bindir, "install_name_tool"), + ] + package_ids = [] all_plugins = plugins + non_default_plugins for plugin in all_plugins: 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)