Skip to content

Commit

Permalink
Add override point for cc_autoconf
Browse files Browse the repository at this point in the history
This adds `overriden_labels` to the `cc_autoconf` rule. This allows to
override specific tools that bazel uses when setting up
`local_config_cc`. The benefit there is that if you want to replace
pieces of the cc toolchain, without having to create your own crosstool
entirely, this allows you to do that.

Specifically for the osx toolchain sometimes overriding flags in
response to Xcode updates, without having to wait for a bazel release is
useful.
  • Loading branch information
keith committed Mar 28, 2019
1 parent 8ba86a0 commit d3b4c84
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 14 deletions.
11 changes: 10 additions & 1 deletion tools/cpp/cc_configure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
35 changes: 22 additions & 13 deletions tools/cpp/osx_cc_configure.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit d3b4c84

Please sign in to comment.