From 489d242be5a86e7c145a24acabe38ddde4f6fe6d Mon Sep 17 00:00:00 2001 From: Claudio Bley Date: Wed, 6 Dec 2023 10:59:20 +0100 Subject: [PATCH] Do not rely on `/usr/bin/ar` on Darwin For nixpkgs GHC 9.6.2, this caused a bus error with ghc-iserv: ``` ERROR: /Users/runner/work/rules_haskell/rules_haskell/rules_haskell_tests/tests/haskell_module/dep-narrowing-th/BUILD.bazel:88:16: HaskellBuildObject @//tests/haskell_module/dep-narrowing-th:lib @//tests/haskell_module/dep-narrowing-th:TestModule2 failed: (Exit 1): ghc_wrapper failed: error executing command (from target //tests/haskell_module/dep-narrowing-th:lib) (cd /private/var/tmp/_bazel_runner/6f93c0710d32c05eb86fd5414239ece6/sandbox/processwrapper-sandbox/2954/execroot/rules_haskell_tests && \ exec env - \ LANG=C.UTF-8 \ MUST_EXTRACT_ABI=true \ PATH=/nix/store/f0hpls21prmic0kg5b4yz5wgg1jdradr-posix-toolchain/bin:/nix/store/f0hpls21prmic0kg5b4yz5wgg1jdradr-posix-toolchain/bin \ RULES_HASKELL_DOCDIR_PATH=/nix/store/slndd05yb65viiv9g7b05fb9y38rj0kq-ghc-9.6.2/lib/ghc-9.6.2/lib/../../../../qpzm6rba12ifz005ksjx302vyrzri7rq-ghc-9.6.2-doc/share/doc/ghc/html/libraries/base-4.18.0.0 \ RULES_HASKELL_GHC_PATH=external/rules_haskell_ghc_nixpkgs/bin/ghc \ RULES_HASKELL_GHC_PKG_PATH=external/rules_haskell_ghc_nixpkgs/bin/ghc-pkg \ RULES_HASKELL_LIBDIR_PATH=/nix/store/slndd05yb65viiv9g7b05fb9y38rj0kq-ghc-9.6.2/lib/ghc-9.6.2/lib \ bazel-out/darwin-opt-exec-C7777A24/bin/external/rules_haskell/haskell/ghc_wrapper bazel-out/darwin-dbg/bin/tests/haskell_module/dep-narrowing-th/compile_flags_lib_tests_haskell_module_dep-narrowing-th_TestModule2_HaskellBuildObjectProf bazel-out/darwin-dbg/bin/tests/haskell_module/dep-narrowing-th/extra_args_lib_tests_haskell_module_dep-narrowing-th_TestModule2_HaskellBuildObjectProf bazel-out/darwin-dbg/bin/tests/haskell_module/dep-narrowing-th/show_iface_lib_tests_haskell_module_dep-narrowing-th_TestModule2 bazel-out/darwin-dbg/bin/tests/haskell_module/dep-narrowing-th/testsZShaskellZUmoduleZSdep-narrowing-thZSlib/_iface/TestModule2.p_abi bazel-out/darwin-dbg/bin/tests/haskell_module/dep-narrowing-th/interfaces_lib_tests_haskell_module_dep-narrowing-th_TestModule2 bazel-out/darwin-dbg/bin/tests/haskell_module/dep-narrowing-th/unused_lib_tests_haskell_module_dep-narrowing-th_TestModule2) # Configuration: b90e686f7362f222f0a77fdd18c7cd52adae6ac6c043bbfd99dd47bb206c3ee8 # Execution platform: @rules_nixpkgs_core//platforms:host Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging tests/haskell_module/dep-narrowing-th/TestModule2.hs:1:1: error: [GHC-87897] Exception when trying to run compile-time code: ghc-iserv terminated (-10) Code: runIO foo >> return [] | 1 | {-# LANGUAGE TemplateHaskell #-} | ^ INFO: Elapsed time: 99.464s, Critical Path: 41.26s ``` See also https://github.com/tweag/rules_haskell/issues/2070 --- haskell/cabal.bzl | 5 +++-- haskell/cc.bzl | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/haskell/cabal.bzl b/haskell/cabal.bzl index 081ab0c021..2b65a72e58 100644 --- a/haskell/cabal.bzl +++ b/haskell/cabal.bzl @@ -164,8 +164,9 @@ def _cabal_toolchain_info(hs, cc, workspace_name, runghc): # TODO: remove this if Bazel fixes its behavior. # Upstream ticket: https://github.com/bazelbuild/bazel/issues/5127. ar = cc.tools.ar - if ar.find("libtool") >= 0: - ar = "/usr/bin/ar" + if paths.basename(ar) == "libtool": + # assume `ar` is available at the same place as `libtool` + ar = paths.join(paths.dirname(ar), "ar") return struct( ghc = hs.tools.ghc.path, diff --git a/haskell/cc.bzl b/haskell/cc.bzl index 201b9a18cc..fc56b342ea 100644 --- a/haskell/cc.bzl +++ b/haskell/cc.bzl @@ -9,6 +9,7 @@ load( "C_COMPILE_ACTION_NAME", ) load("@rules_cc//cc:find_cc_toolchain.bzl", "find_cc_toolchain") +load("@bazel_skylib//lib:paths.bzl", "paths") load( "//haskell:providers.bzl", "GhcPluginInfo", @@ -136,8 +137,10 @@ def cc_interop_info(ctx, override_cc_toolchain = None): # "/usr/bin/libtool". Since we call ar directly, override it. # TODO: remove this if Bazel fixes its behavior. # Upstream ticket: https://github.com/bazelbuild/bazel/issues/5127. - if tools["ar"].find("libtool") >= 0: - tools["ar"] = "/usr/bin/ar" + ar_tool = tools["ar"] + if paths.basename(ar_tool) == "libtool": + # assume `ar` is available at the same place as `libtool` + tools["ar"] = paths.join(paths.dirname(ar_tool), "ar") env = {} if hs_toolchain.is_darwin: