forked from OSchip/llvm-project
82 lines
3.2 KiB
Python
82 lines
3.2 KiB
Python
# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
|
|
# See https://llvm.org/LICENSE.txt for license information.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
"""This file contains BUILD extensions for generating source code from LLVM's
|
|
table definition files using the TableGen tool.
|
|
|
|
See http://llvm.org/cmds/tblgen.html for more information on the TableGen
|
|
tool.
|
|
TODO(chandlerc): Currently this expresses include-based dependencies as
|
|
"sources", and has no transitive understanding due to these files not being
|
|
correctly understood by the build system.
|
|
"""
|
|
|
|
def gentbl(
|
|
name,
|
|
tblgen,
|
|
td_file,
|
|
td_srcs,
|
|
tbl_outs,
|
|
library = True,
|
|
tblgen_args = "",
|
|
**kwargs):
|
|
"""gentbl() generates tabular code from a table definition file.
|
|
|
|
Args:
|
|
name: The name of the build rule for use in dependencies.
|
|
tblgen: The binary used to produce the output.
|
|
td_file: The primary table definitions file.
|
|
td_srcs: A list of table definition files included transitively.
|
|
tbl_outs: A list of tuples (opts, out), where each opts is a string of
|
|
options passed to tblgen, and the out is the corresponding output file
|
|
produced.
|
|
library: Whether to bundle the generated files into a library.
|
|
tblgen_args: Extra arguments string to pass to the tblgen binary.
|
|
**kwargs: Keyword arguments to pass to subsidiary cc_library() rule.
|
|
"""
|
|
llvm_project_execroot_path = Label("//llvm:tblgen.bzl").workspace_root
|
|
|
|
if td_file not in td_srcs:
|
|
td_srcs += [td_file]
|
|
for (opts, out) in tbl_outs:
|
|
rule_suffix = "_".join(opts.replace("-", "_").replace("=", "_").split(" "))
|
|
native.genrule(
|
|
name = "%s_%s_genrule" % (name, rule_suffix),
|
|
srcs = td_srcs,
|
|
outs = [out],
|
|
tools = [tblgen],
|
|
message = "Generating code from table: %s" % td_file,
|
|
cmd = (("$(location %s) -I %s/llvm/include " +
|
|
"-I %s/clang/include " +
|
|
"-I $$(dirname $(location %s)) " +
|
|
"%s $(location %s) %s -o $@") % (
|
|
tblgen,
|
|
llvm_project_execroot_path,
|
|
llvm_project_execroot_path,
|
|
td_file,
|
|
opts,
|
|
td_file,
|
|
tblgen_args,
|
|
)),
|
|
)
|
|
|
|
# For now, all generated files can be assumed to comprise public interfaces.
|
|
# If this is not true, you should specify library = False
|
|
# and list the generated '.inc' files in "srcs".
|
|
if library:
|
|
native.cc_library(
|
|
name = name,
|
|
# FIXME: This should be `textual_hdrs` instead of `hdrs`, but
|
|
# unfortunately that doesn't work with `strip_include_prefix`:
|
|
# https://github.com/bazelbuild/bazel/issues/12424
|
|
#
|
|
# Once that issue is fixed and released, we can switch this to
|
|
# `textual_hdrs` and remove the feature disabling the various Bazel
|
|
# features (both current and under-development) that motivated the
|
|
# distinction between these two.
|
|
hdrs = [f for (_, f) in tbl_outs],
|
|
features = ["-parse_headers", "-header_modules"],
|
|
**kwargs
|
|
)
|