-
Notifications
You must be signed in to change notification settings - Fork 4.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bazel: Add pre-compiled clang header poc (#13788)
* bazel: Add pre-compiled clang header poc This adds a custom rule for producing clang pre-compiled headers. The hope is that by using these we reduce significant duplication in some larger headers that get recompiled by many dependees. This works by fetching the normal C++ configuration from bazel's crosstool, and adding custom flags to compile our pch in the right mode. This currently has a few limitations / rough edges: 1. It only supports clang 2. There's no way with the CcInfo provider to propagate compiler flags up the dependency tree. Because of this we instead add the required `-include-pch` flag to all macros. 3. Pch files are timestamp sensitive, this means if you add a include to the pch, build, then remove it and rebuild, it will currently fail. LLVM master has a flag to ignore this timestamp, but it isn't currently available in the release version of Xcode on macOS. 4. The logic to disable isn't implemented yet. Signed-off-by: Keith Smiley <keithbsmiley@gmail.com>
- Loading branch information
Showing
10 changed files
with
276 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
load("@rules_cc//cc:defs.bzl", "cc_library") | ||
|
||
# DO NOT LOAD THIS FILE. Load envoy_build_system.bzl instead. | ||
# Envoy library targets | ||
load( | ||
":envoy_internal.bzl", | ||
"envoy_copts", | ||
"envoy_external_dep_path", | ||
"envoy_linkstatic", | ||
) | ||
load(":pch.bzl", "pch") | ||
|
||
def envoy_pch_copts(repository, target): | ||
return select({ | ||
repository + "//bazel:clang_pch_build": [ | ||
"-include-pch", | ||
"$(location {}{})".format(repository, target), | ||
], | ||
"//conditions:default": [], | ||
}) | ||
|
||
def envoy_pch_library( | ||
name, | ||
includes, | ||
deps, | ||
external_deps, | ||
visibility, | ||
testonly = False, | ||
repository = ""): | ||
cc_library( | ||
name = name + "_libs", | ||
visibility = ["//visibility:private"], | ||
copts = envoy_copts(repository), | ||
deps = deps + [envoy_external_dep_path(dep) for dep in external_deps], | ||
alwayslink = 1, | ||
testonly = testonly, | ||
linkstatic = envoy_linkstatic(), | ||
) | ||
|
||
pch( | ||
name = name, | ||
deps = [name + "_libs"], | ||
includes = includes, | ||
visibility = visibility, | ||
testonly = testonly, | ||
tags = ["no-remote"], | ||
enabled = select({ | ||
repository + "//bazel:clang_pch_build": True, | ||
"//conditions:default": False, | ||
}), | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
load( | ||
"@bazel_tools//tools/build_defs/cc:action_names.bzl", | ||
"CPP_COMPILE_ACTION_NAME", | ||
) | ||
|
||
def _pch(ctx): | ||
deps_cc_info = cc_common.merge_cc_infos( | ||
cc_infos = [dep[CcInfo] for dep in ctx.attr.deps], | ||
) | ||
|
||
if not ctx.attr.enabled: | ||
return [deps_cc_info] | ||
|
||
cc_toolchain = ctx.attr._cc_toolchain[cc_common.CcToolchainInfo] | ||
feature_configuration = cc_common.configure_features( | ||
ctx = ctx, | ||
cc_toolchain = cc_toolchain, | ||
requested_features = ctx.features, | ||
unsupported_features = ctx.disabled_features, | ||
) | ||
|
||
cc_compiler_path = cc_common.get_tool_for_action( | ||
feature_configuration = feature_configuration, | ||
action_name = CPP_COMPILE_ACTION_NAME, | ||
) | ||
|
||
if "clang" not in cc_compiler_path: | ||
fail("error: attempting to use clang PCH without clang: {}".format(cc_compiler_path)) | ||
|
||
generated_header_file = ctx.actions.declare_file(ctx.label.name + ".h") | ||
ctx.actions.write( | ||
generated_header_file, | ||
"\n".join(["#include \"{}\"".format(include) for include in ctx.attr.includes]) + "\n", | ||
) | ||
|
||
# TODO: -fno-pch-timestamp / invalidation in that case doesn't work | ||
pch_flags = ["-x", "c++-header"] | ||
pch_file = ctx.actions.declare_file(ctx.label.name + ".pch") | ||
|
||
deps_ctx = deps_cc_info.compilation_context | ||
cc_compile_variables = cc_common.create_compile_variables( | ||
feature_configuration = feature_configuration, | ||
cc_toolchain = cc_toolchain, | ||
user_compile_flags = ctx.fragments.cpp.copts + ctx.fragments.cpp.cxxopts + pch_flags, | ||
source_file = generated_header_file.path, | ||
output_file = pch_file.path, | ||
preprocessor_defines = depset(deps_ctx.defines.to_list() + deps_ctx.local_defines.to_list()), | ||
include_directories = deps_ctx.includes, | ||
quote_include_directories = deps_ctx.quote_includes, | ||
system_include_directories = deps_ctx.system_includes, | ||
framework_include_directories = deps_ctx.framework_includes, | ||
) | ||
|
||
env = cc_common.get_environment_variables( | ||
feature_configuration = feature_configuration, | ||
action_name = CPP_COMPILE_ACTION_NAME, | ||
variables = cc_compile_variables, | ||
) | ||
|
||
command_line = cc_common.get_memory_inefficient_command_line( | ||
feature_configuration = feature_configuration, | ||
action_name = CPP_COMPILE_ACTION_NAME, | ||
variables = cc_compile_variables, | ||
) | ||
|
||
transitive_headers = [] | ||
for dep in ctx.attr.deps: | ||
transitive_headers.append(dep[CcInfo].compilation_context.headers) | ||
ctx.actions.run( | ||
executable = cc_compiler_path, | ||
arguments = command_line, | ||
env = env, | ||
inputs = depset( | ||
items = [generated_header_file], | ||
transitive = [cc_toolchain.all_files] + transitive_headers, | ||
), | ||
outputs = [pch_file], | ||
) | ||
|
||
return [ | ||
DefaultInfo(files = depset(items = [pch_file])), | ||
cc_common.merge_cc_infos( | ||
direct_cc_infos = [ | ||
CcInfo( | ||
compilation_context = cc_common.create_compilation_context( | ||
headers = depset([pch_file, generated_header_file]), | ||
), | ||
), | ||
], | ||
cc_infos = [deps_cc_info], | ||
), | ||
] | ||
|
||
pch = rule( | ||
attrs = dict( | ||
includes = attr.string_list( | ||
mandatory = True, | ||
allow_empty = False, | ||
), | ||
deps = attr.label_list( | ||
mandatory = True, | ||
allow_empty = False, | ||
providers = [CcInfo], | ||
), | ||
enabled = attr.bool( | ||
mandatory = True, | ||
), | ||
_cc_toolchain = attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")), | ||
), | ||
fragments = ["cpp"], | ||
provides = [CcInfo], | ||
toolchains = ["@bazel_tools//tools/cpp:toolchain_type"], | ||
implementation = _pch, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.