diff --git a/tools/cpp/cc_configure.bzl b/tools/cpp/cc_configure.bzl index 9d30b422ce6cd2..95a3b550c2c07a 100644 --- a/tools/cpp/cc_configure.bzl +++ b/tools/cpp/cc_configure.bzl @@ -52,11 +52,20 @@ def cc_autoconf_impl(repository_ctx, overriden_tools = dict()): configure_windows_toolchain(repository_ctx) elif (cpu_value == "darwin" and ("BAZEL_USE_CPP_ONLY_TOOLCHAIN" not in env or env["BAZEL_USE_CPP_ONLY_TOOLCHAIN"] != "1")): - configure_osx_toolchain(repository_ctx, overriden_tools) + configure_osx_toolchain(repository_ctx, overriden_tools, repository_ctx.attr.overriden_labels) else: configure_unix_toolchain(repository_ctx, cpu_value, overriden_tools) cc_autoconf = repository_rule( + attrs = { + "overriden_labels": attr.string_dict( + doc = """ +A dictionary of labels bazel wants to use for setting up the cc_toolchain to the actual labels to override +the tools with instead. This allows you to override single pieces of the toolchain without creating your +own crosstool. +""", + ), + }, environ = [ "ABI_LIBC_VERSION", "ABI_VERSION", diff --git a/tools/cpp/osx_cc_configure.bzl b/tools/cpp/osx_cc_configure.bzl index b4b2e227e20904..948b99c7e80c50 100644 --- a/tools/cpp/osx_cc_configure.bzl +++ b/tools/cpp/osx_cc_configure.bzl @@ -49,9 +49,16 @@ def _get_escaped_xcode_cxx_inc_directories(repository_ctx, cc, xcode_toolchains) include_dirs.append("/Applications/") return include_dirs -def configure_osx_toolchain(repository_ctx, overriden_tools): +def _resolve_overriden_labels(labels, overriden_tools): + resolved_labels = {label: label for label in labels} + for override, actual in overriden_tools.items(): + resolved_labels[override] = actual + + return resolved_labels + +def configure_osx_toolchain(repository_ctx, overriden_tools, overriden_labels): """Configure C++ toolchain on macOS.""" - paths = resolve_labels(repository_ctx, [ + resolved_labels = _resolve_overriden_labels([ "@bazel_tools//tools/cpp:osx_cc_wrapper.sh.tpl", "@bazel_tools//tools/objc:libtool.sh", "@bazel_tools//tools/objc:make_hashed_objlist.py", @@ -62,50 +69,52 @@ def configure_osx_toolchain(repository_ctx, overriden_tools): "@bazel_tools//tools/osx/crosstool:wrapped_ar.tpl", "@bazel_tools//tools/osx/crosstool:wrapped_clang.cc", "@bazel_tools//tools/osx:xcode_locator.m", - ]) + ], overriden_labels) + + paths = resolve_labels(repository_ctx, resolved_labels.values()) xcode_toolchains = [] (xcode_toolchains, xcodeloc_err) = run_xcode_locator( repository_ctx, - paths["@bazel_tools//tools/osx:xcode_locator.m"], + paths[resolved_labels["@bazel_tools//tools/osx:xcode_locator.m"]], ) if xcode_toolchains: cc = find_cc(repository_ctx, overriden_tools = {}) repository_ctx.template( "cc_wrapper.sh", - paths["@bazel_tools//tools/cpp:osx_cc_wrapper.sh.tpl"], + paths[resolved_labels["@bazel_tools//tools/cpp:osx_cc_wrapper.sh.tpl"]], { "%{cc}": escape_string(str(cc)), "%{env}": escape_string(get_env(repository_ctx)), }, ) repository_ctx.symlink( - paths["@bazel_tools//tools/objc:xcrunwrapper.sh"], + paths[resolved_labels["@bazel_tools//tools/objc:xcrunwrapper.sh"]], "xcrunwrapper.sh", ) repository_ctx.symlink( - paths["@bazel_tools//tools/objc:libtool.sh"], + paths[resolved_labels["@bazel_tools//tools/objc:libtool.sh"]], "libtool", ) repository_ctx.symlink( - paths["@bazel_tools//tools/objc:make_hashed_objlist.py"], + paths[resolved_labels["@bazel_tools//tools/objc:make_hashed_objlist.py"]], "make_hashed_objlist.py", ) repository_ctx.symlink( - paths["@bazel_tools//tools/osx/crosstool:wrapped_ar.tpl"], + paths[resolved_labels["@bazel_tools//tools/osx/crosstool:wrapped_ar.tpl"]], "wrapped_ar", ) repository_ctx.symlink( - paths["@bazel_tools//tools/osx/crosstool:BUILD.tpl"], + paths[resolved_labels["@bazel_tools//tools/osx/crosstool:BUILD.tpl"]], "BUILD", ) repository_ctx.symlink( - paths["@bazel_tools//tools/osx/crosstool:osx_archs.bzl"], + paths[resolved_labels["@bazel_tools//tools/osx/crosstool:osx_archs.bzl"]], "osx_archs.bzl", ) wrapped_clang_src_path = str(repository_ctx.path( - paths["@bazel_tools//tools/osx/crosstool:wrapped_clang.cc"], + paths[resolved_labels["@bazel_tools//tools/osx/crosstool:wrapped_clang.cc"]], )) xcrun_result = repository_ctx.execute([ "env", @@ -140,7 +149,7 @@ def configure_osx_toolchain(repository_ctx, overriden_tools): escaped_cxx_include_directories.append("# Error: " + xcodeloc_err + "\n") repository_ctx.template( "cc_toolchain_config.bzl", - paths["@bazel_tools//tools/osx/crosstool:cc_toolchain_config.bzl.tpl"], + paths[resolved_labels["@bazel_tools//tools/osx/crosstool:cc_toolchain_config.bzl.tpl"]], {"%{cxx_builtin_include_directories}": "\n".join(escaped_cxx_include_directories)}, ) else: