# 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 or "." 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 )