Limit the number of includes fed into the header generator

Use [`direct_headers`](https://bazel.build/rules/lib/CompilationContext#direct_headers)
from the Bazel/Blaze compilation context instead of _all_ transitive headers.

For the clang based generator, this means we don't try to parse
`textual_headers`, which will fail (they are by definition not
stand-alone, after all).

PiperOrigin-RevId: 431899423
Change-Id: I7a9dfa0dd93eba14b506b0e7ca6db3ed59b55dd6
This commit is contained in:
Christian Blichmann 2022-03-02 03:41:10 -08:00 committed by Copybara-Service
parent 6de30ea27f
commit 60fcc5b63e

View File

@ -55,12 +55,13 @@ def sapi_interface_impl(ctx):
append_arg(args, "--sapi_isystem", isystem.path) append_arg(args, "--sapi_isystem", isystem.path)
input_files += [isystem] input_files += [isystem]
if ctx.attr.limit_scan_depth:
args.append("--sapi_limit_scan_depth")
# Parse provided files. # Parse provided files.
# The parser doesn't need the entire set of transitive headers # The parser doesn't need the entire set of transitive headers
# here, just the top-level cc_library headers. It would be nice # here, just the top-level cc_library headers.
# if Skylark or Bazel provided this, but it is surprisingly hard
# to get.
# #
# Allow all headers through that contain the dependency's # Allow all headers through that contain the dependency's
# package path. Including extra headers is harmless except that # package path. Including extra headers is harmless except that
@ -68,43 +69,36 @@ def sapi_interface_impl(ctx):
# pass a lot through that we don't strictly need. # pass a lot through that we don't strictly need.
extra_flags = [] extra_flags = []
if ctx.attr.lib[CcInfo]: cc_ctx = ctx.attr.lib[CcInfo].compilation_context
cc_ctx = ctx.attr.lib[CcInfo].compilation_context
# Append system headers as dependencies # Append all headers as dependencies
input_files += cc_ctx.headers.to_list() input_files += cc_ctx.headers.to_list()
append_all(extra_flags, "-D", cc_ctx.defines.to_list())
append_all(extra_flags, "-isystem", cc_ctx.system_includes.to_list())
append_all(extra_flags, "-iquote", cc_ctx.quote_includes.to_list())
if ctx.attr.input_files: quote_includes = cc_ctx.quote_includes.to_list()
for h in cc_ctx.headers.to_list(): append_all(extra_flags, "-D", cc_ctx.defines.to_list())
# Collect all headers as dependency in case libclang needs them. append_all(extra_flags, "-isystem", cc_ctx.system_includes.to_list())
if h.extension == "h" and "/PROTECTED/" not in h.path: append_all(extra_flags, "-iquote", quote_includes)
input_files.append(h)
for target in ctx.attr.input_files:
if target.files:
for f in target.files.to_list():
input_files_paths.append(f.path)
input_files.append(f)
# Try to find files automatically. if ctx.attr.input_files:
else: for target in ctx.attr.input_files:
for h in cc_ctx.headers.to_list(): if target.files:
# Collect all headers as dependency in case clang needs them. for f in target.files.to_list():
if h.extension == "h" and "/PROTECTED/" not in h.path: input_files_paths.append(f.path)
input_files.append(h) input_files.append(f)
# Include only headers coming from the target
# not ones that it depends on by comparing the label packages.
if (h.owner.package == ctx.attr.lib.label.package):
input_files_paths.append(h.path)
append_arg(args, "--sapi_in", ",".join(input_files_paths))
args += ["--"] + extra_flags
else: else:
# TODO(szwl): Error out if the lib has no cc. # Try to find files automatically
pass for h in cc_ctx.direct_headers:
# Collect all headers as dependency.
if h.extension != "h" or "/PROTECTED/" in h.path:
continue
# Include only headers coming from the target
# not ones that it depends on by comparing the label packages.
if (h.owner.package == ctx.attr.lib.label.package):
input_files_paths.append(h.path)
append_arg(args, "--sapi_in", ",".join(input_files_paths))
args += ["--"] + extra_flags
progress_msg = ("Generating {} from {} header files." + progress_msg = ("Generating {} from {} header files." +
"").format(ctx.outputs.out.short_path, len(input_files_paths)) "").format(ctx.outputs.out.short_path, len(input_files_paths))
@ -126,10 +120,11 @@ sapi_interface = rule(
"functions": attr.string_list(allow_empty = True, default = []), "functions": attr.string_list(allow_empty = True, default = []),
"include_prefix": attr.string(), "include_prefix": attr.string(),
"input_files": attr.label_list(allow_files = True), "input_files": attr.label_list(allow_files = True),
"lib": attr.label(mandatory = True), "lib": attr.label(providers = [CcInfo], mandatory = True),
"lib_name": attr.string(mandatory = True), "lib_name": attr.string(mandatory = True),
"namespace": attr.string(), "namespace": attr.string(),
"isystem": attr.label(), "isystem": attr.label(),
"limit_scan_depth": attr.bool(default = False),
"_sapi_generator": attr.label( "_sapi_generator": attr.label(
executable = True, executable = True,
cfg = "host", cfg = "host",