| # Copyright 2017-2020 The Verible Authors. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """Build rule for generating C or C++ sources with Bison. | |
| """ | |
| def _genyacc_impl(ctx): | |
| """Implementation for genyacc rule.""" | |
| # Argument list | |
| args = ctx.actions.args() | |
| args.add("--defines=%s" % ctx.outputs.header_out.path) | |
| args.add("--output-file=%s" % ctx.outputs.source_out.path) | |
| if ctx.attr.prefix: | |
| args.add("--name-prefix=%s" % ctx.attr.prefix) | |
| args.add_all([ctx.expand_location(opt) for opt in ctx.attr.extra_options]) | |
| args.add(ctx.file.src.path) | |
| # Output files | |
| outputs = ctx.outputs.extra_outs + [ | |
| ctx.outputs.header_out, | |
| ctx.outputs.source_out, | |
| ] | |
| ctx.actions.run( | |
| executable = ctx.executable._bison, | |
| env = { | |
| "M4": ctx.executable._m4.path, | |
| }, | |
| arguments = [args], | |
| inputs = ctx.files.src, | |
| tools = [ctx.executable._m4], | |
| outputs = outputs, | |
| mnemonic = "Yacc", | |
| progress_message = "Generating %s and %s from %s" % | |
| ( | |
| ctx.outputs.source_out.short_path, | |
| ctx.outputs.header_out.short_path, | |
| ctx.file.src.short_path, | |
| ), | |
| ) | |
| genyacc = rule( | |
| attrs = { | |
| "src": attr.label( | |
| mandatory = True, | |
| allow_single_file = [ | |
| ".y", | |
| ".yy", | |
| ".yc", | |
| ".ypp", | |
| ], | |
| doc = "The .y, .yy, or .yc source file for this rule", | |
| ), | |
| "header_out": attr.output( | |
| mandatory = True, | |
| doc = "The generated 'defines' header file", | |
| ), | |
| "source_out": attr.output( | |
| mandatory = True, | |
| doc = "The generated source file", | |
| ), | |
| "prefix": attr.string( | |
| doc = "External symbol prefix for Bison. This string is " + | |
| "passed to bison as the -p option, causing the resulting C " + | |
| "file to define external functions named 'prefix'parse, " + | |
| "'prefix'lex, etc. instead of yyparse, yylex, etc.", | |
| ), | |
| "extra_outs": attr.output_list(doc = "A list of extra generated output files."), | |
| "extra_options": attr.string_list( | |
| doc = "A list of extra options to pass to Bison. These are " + | |
| "subject to $(location ...) expansion.", | |
| ), | |
| "_bison": attr.label( | |
| default = Label("//bazel:bison_bin"), | |
| executable = True, | |
| cfg = "host", | |
| ), | |
| "_m4": attr.label( | |
| default = Label("//bazel:m4_bin"), | |
| executable = True, | |
| cfg = "host", | |
| ), | |
| }, | |
| doc = "Generate C/C++-language sources from a Yacc file using Bison.", | |
| output_to_genfiles = True, | |
| implementation = _genyacc_impl, | |
| ) |