aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/cpp/cc_configure.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/cpp/cc_configure.bzl')
-rw-r--r--tools/cpp/cc_configure.bzl193
1 files changed, 75 insertions, 118 deletions
diff --git a/tools/cpp/cc_configure.bzl b/tools/cpp/cc_configure.bzl
index 7754c8376d..4e77db5e6b 100644
--- a/tools/cpp/cc_configure.bzl
+++ b/tools/cpp/cc_configure.bzl
@@ -13,7 +13,6 @@
# limitations under the License.
"""Rules for configuring the C++ toolchain (experimental)."""
-load("@bazel_tools//tools/osx:xcode_configure.bzl", "run_xcode_locator")
def _get_value(it):
"""Convert `it` in serialized protobuf format."""
@@ -111,7 +110,7 @@ def _execute(repository_ctx, command, environment = None,
return stripped_stdout
-def _get_tool_paths(repository_ctx, cc):
+def _get_tool_paths(repository_ctx, darwin, cc):
"""Compute the path to the various tools."""
return {k: _which(repository_ctx, k, "/usr/bin/" + k)
for k in [
@@ -125,7 +124,8 @@ def _get_tool_paths(repository_ctx, cc):
"strip",
]} + {
"gcc": cc,
- "ar": _which(repository_ctx, "ar", "/usr/bin/ar")
+ "ar": "/usr/bin/libtool"
+ if darwin else _which(repository_ctx, "ar", "/usr/bin/ar")
}
@@ -220,7 +220,7 @@ def _is_gold_supported(repository_ctx, cc):
])
return result.return_code == 0
-def _crosstool_content(repository_ctx, cc, cpu_value):
+def _crosstool_content(repository_ctx, cc, cpu_value, darwin):
"""Return the content for the CROSSTOOL file, in a dictionary."""
supports_gold_linker = _is_gold_supported(repository_ctx, cc)
return {
@@ -236,7 +236,7 @@ def _crosstool_content(repository_ctx, cc, cpu_value):
"supports_interface_shared_objects": False,
"supports_normalizing_ar": False,
"supports_start_end_lib": supports_gold_linker,
- "target_libc": _get_env_var(repository_ctx, "BAZEL_TARGET_LIBC", "local", False),
+ "target_libc": "macosx" if darwin else _get_env_var(repository_ctx, "BAZEL_TARGET_LIBC", "local", False),
"target_cpu": _get_env_var(repository_ctx, "BAZEL_TARGET_CPU", cpu_value, False),
"target_system_name": _get_env_var(repository_ctx, "BAZEL_TARGET_SYSTEM", "local", False),
"cxx_flag": [
@@ -252,17 +252,24 @@ def _crosstool_content(repository_ctx, cc, cpu_value):
repository_ctx, cc, "-Wl,-no-as-needed"
) + _add_option_if_supported(
repository_ctx, cc, "-Wl,-z,relro,-z,now"
- ) + (["-B" + str(repository_ctx.path(cc).dirname),
- # Always have -B/usr/bin, see https://github.com/bazelbuild/bazel/issues/760.
- "-B/usr/bin",
- # Gold linker only? Can we enable this by default?
- # "-Wl,--warn-execstack",
- # "-Wl,--detect-odr-violations"
- ] + _add_option_if_supported(
- # Have gcc return the exit code from ld.
- repository_ctx, cc, "-pass-exit-codes")
- ),
- "ar_flag": [],
+ ) + (
+ [
+ "-undefined",
+ "dynamic_lookup",
+ "-headerpad_max_install_names",
+ ] if darwin else [
+ "-B" + str(repository_ctx.path(cc).dirname),
+ # Always have -B/usr/bin, see https://github.com/bazelbuild/bazel/issues/760.
+ "-B/usr/bin",
+ # Gold linker only? Can we enable this by default?
+ # "-Wl,--warn-execstack",
+ # "-Wl,--detect-odr-violations"
+ ] + _add_option_if_supported(
+ # Have gcc return the exit code from ld.
+ repository_ctx, cc, "-pass-exit-codes"
+ )
+ ),
+ "ar_flag": ["-static", "-s", "-o"] if darwin else [],
"cxx_builtin_include_directory": _get_cxx_inc_directories(repository_ctx, cc),
"objcopy_embed_flag": ["-I", "binary"],
"unfiltered_cxx_flag":
@@ -285,7 +292,7 @@ def _crosstool_content(repository_ctx, cc, cpu_value):
# All warnings are enabled. Maybe enable -Werror as well?
"-Wall",
# Enable a few more warnings that aren't part of -Wall.
- ] + ([
+ ] + (["-Wthread-safety", "-Wself-assign"] if darwin else [
"-B" + str(repository_ctx.path(cc).dirname),
# Always have -B/usr/bin, see https://github.com/bazelbuild/bazel/issues/760.
"-B/usr/bin",
@@ -343,7 +350,7 @@ def _get_windows_msys_crosstool_content(repository_ctx):
' tool_path { name: "objdump" path: "%susr/bin/objdump" }\n' % msys_root +
' tool_path { name: "strip" path: "%susr/bin/strip" }'% msys_root )
-def _opt_content():
+def _opt_content(darwin):
"""Return the content of the opt specific section of the CROSSTOOL file."""
return {
"compiler_flag": [
@@ -369,7 +376,7 @@ def _opt_content():
"-ffunction-sections",
"-fdata-sections"
],
- "linker_flag": ["-Wl,--gc-sections"]
+ "linker_flag": [] if darwin else ["-Wl,--gc-sections"]
}
@@ -621,7 +628,23 @@ def _get_env(repository_ctx):
else:
return ""
-def _coverage_feature():
+def _coverage_feature(darwin):
+ if darwin:
+ compile_flags = """flag_group {
+ flag: '-fprofile-instr-generate'
+ flag: '-fcoverage-mapping'
+ }"""
+ link_flags = """flag_group {
+ flag: '-fprofile-instr-generate'
+ }"""
+ else:
+ compile_flags = """flag_group {
+ flag: '-fprofile-arcs'
+ flag: '-ftest-coverage'
+ }"""
+ link_flags = """flag_group {
+ flag: '-lgcov'
+ }"""
return """
feature {
name: 'coverage'
@@ -633,51 +656,17 @@ def _coverage_feature():
action: 'c++-header-parsing'
action: 'c++-header-preprocessing'
action: 'c++-module-compile'
- flag_group {
- flag: '-fprofile-arcs'
- flag: '-ftest-coverage'
- }
+ """ + compile_flags + """
}
flag_set {
action: 'c++-link-interface-dynamic-library'
action: 'c++-link-dynamic-library'
action: 'c++-link-executable'
- flag_group {
- flag: '-lgcov'
- }
+ """ + link_flags + """
}
}
"""
-def _get_darwin_cxx_inc_directories(repository_ctx, cc):
- """Compute the list of default C++ include directories on darwin.
-
- Uses the xcode-locator tool to add all xcode developer directories to the
- list of builtin include paths.
-
- This should only be invoked on a darwin OS, as xcode-locator cannot be built
- otherwise.
-
- Args:
- repository_ctx: The repository context.
- cc: The default C++ compiler on the local system.
- Returns:
- A 2-tuple containing:
- include_paths: A list of builtin include paths.
- err: An error string describing the error that occurred when attempting
- to build and run xcode-locator, or None if the run was successful.
- """
-
- (toolchains, xcodeloc_err) = run_xcode_locator(repository_ctx,
- Label("@bazel_tools//tools/osx:xcode_locator.m"))
-
- # TODO(cparsons): Falling back to the default C++ compiler builtin include
- # paths shouldn't be unnecessary once all actions are using xcrun.
- include_dirs = _get_cxx_inc_directories(repository_ctx, cc)
- for toolchain in toolchains:
- include_dirs.append(toolchain.developer_dir)
- return (include_dirs, xcodeloc_err)
-
def _impl(repository_ctx):
repository_ctx.file("tools/cpp/empty.cc", "int main() {}")
cpu_value = _get_cpu_value(repository_ctx)
@@ -746,69 +735,37 @@ def _impl(repository_ctx):
else:
darwin = cpu_value == "darwin"
cc = _find_cc(repository_ctx)
+ tool_paths = _get_tool_paths(repository_ctx, darwin,
+ "cc_wrapper.sh" if darwin else str(cc))
+ crosstool_content = _crosstool_content(repository_ctx, cc, cpu_value, darwin)
+ opt_content = _opt_content(darwin)
+ dbg_content = _dbg_content()
+ _tpl(repository_ctx, "BUILD", {
+ "%{name}": cpu_value,
+ "%{supports_param_files}": "0" if darwin else "1",
+ "%{cc_compiler_deps}": ":cc_wrapper" if darwin else ":empty",
+ "%{compiler}": _get_env_var(repository_ctx, "BAZEL_COMPILER", "compiler", False),
+ })
_tpl(repository_ctx,
- "osx_cc_wrapper.sh" if darwin else "linux_cc_wrapper.sh",
- {"%{cc}": str(cc), "%{env}": _get_env(repository_ctx)},
- "cc_wrapper.sh")
- if darwin:
- repository_ctx.symlink(
- Label("@bazel_tools//tools/objc:xcrunwrapper.sh"), "xcrunwrapper.sh")
- repository_ctx.symlink(
- Label("@bazel_tools//tools/objc:libtool.sh"), "libtool")
- repository_ctx.symlink(
- Label("@bazel_tools//tools/objc:make_hashed_objlist.py"),
- "make_hashed_objlist.py")
- repository_ctx.symlink(
- Label("@bazel_tools//tools/osx/crosstool:wrapped_clang.tpl"),
- "wrapped_clang")
- repository_ctx.symlink(
- Label("@bazel_tools//tools/osx/crosstool:wrapped_clang_pp.tpl"),
- "wrapped_clang_pp")
- repository_ctx.symlink(
- Label("@bazel_tools//tools/osx/crosstool:BUILD.tpl"),
- "BUILD")
- repository_ctx.symlink(
- Label("@bazel_tools//tools/osx/crosstool:osx_archs.bzl"),
- "osx_archs.bzl")
- (include_paths, xcodeloc_err) = _get_darwin_cxx_inc_directories(repository_ctx, cc)
- cxx_include_directories = []
- for path in include_paths:
- cxx_include_directories.append(("cxx_builtin_include_directory: \"%s\"" % path))
- if xcodeloc_err:
- cxx_include_directories.append("# Error: " + xcodeloc_err + "\n")
- repository_ctx.template(
- "CROSSTOOL",
- Label("@bazel_tools//tools/osx/crosstool:CROSSTOOL.tpl"),
- {"%{cxx_builtin_include_directory}": "\n".join(cxx_include_directories)})
- else:
- tool_paths = _get_tool_paths(repository_ctx, str(cc))
- crosstool_content = _crosstool_content(repository_ctx, cc, cpu_value)
- opt_content = _opt_content()
- dbg_content = _dbg_content()
- _tpl(repository_ctx, "BUILD", {
- "%{name}": cpu_value,
- "%{supports_param_files}": "1",
- "%{cc_compiler_deps}": ":empty",
- "%{compiler}": _get_env_var(repository_ctx, "BAZEL_COMPILER", "compiler", False),
- })
- _tpl(repository_ctx, "CROSSTOOL", {
- "%{cpu}": cpu_value,
- "%{default_toolchain_name}": _get_env_var(repository_ctx,
- "CC_TOOLCHAIN_NAME",
- "local",
- False),
- "%{toolchain_name}": _get_env_var(repository_ctx, "CC_TOOLCHAIN_NAME", "local", False),
- "%{content}": _build_crosstool(crosstool_content) + "\n" +
- _build_tool_path(tool_paths),
- "%{opt_content}": _build_crosstool(opt_content, " "),
- "%{dbg_content}": _build_crosstool(dbg_content, " "),
- "%{cxx_builtin_include_directory}": "",
- "%{coverage}": _coverage_feature(),
- "%{msvc_env_tmp}": "",
- "%{msvc_env_path}": "",
- "%{msvc_env_include}": "",
- "%{msvc_env_lib}": "",
- })
+ "osx_cc_wrapper.sh" if darwin else "linux_cc_wrapper.sh",
+ {"%{cc}": str(cc), "%{env}": _get_env(repository_ctx)},
+ "cc_wrapper.sh")
+ _tpl(repository_ctx, "CROSSTOOL", {
+ "%{cpu}": cpu_value,
+ "%{default_toolchain_name}": _get_env_var(repository_ctx, "CC_TOOLCHAIN_NAME", "local", False),
+ "%{toolchain_name}": _get_env_var(repository_ctx, "CC_TOOLCHAIN_NAME", "local", False),
+ "%{content}": _build_crosstool(crosstool_content) + "\n" +
+ _build_tool_path(tool_paths),
+ "%{opt_content}": _build_crosstool(opt_content, " "),
+ "%{dbg_content}": _build_crosstool(dbg_content, " "),
+ "%{cxx_builtin_include_directory}": "",
+ "%{coverage}": _coverage_feature(darwin),
+ "%{msvc_env_tmp}": "",
+ "%{msvc_env_path}": "",
+ "%{msvc_env_include}": "",
+ "%{msvc_env_lib}": "",
+ })
+
cc_autoconf = repository_rule(
implementation=_impl,