blob: 7bc022720439106dcd814a2578d531f04793ac77 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2019 Google LLC
#
# 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
#
# https://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.
"""Main driver program for the Emboss compiler."""
import argparse
import os
import sys
def _parse_args(argv):
parser = argparse.ArgumentParser(description="Emboss compiler")
parser.add_argument("--color-output",
default="if_tty",
choices=["always", "never", "if_tty", "auto"],
help="Print error messages using color. 'auto' is a "
"synonym for 'if_tty'.")
parser.add_argument("--import-dir", "-I",
dest="import_dirs",
action="append",
default=["."],
help="A directory to use when searching for imported "
"embs. If no import-dirs are specified, the "
"current directory will be used.")
parser.add_argument("--generate",
nargs=1,
choices=["cc"],
default="cc",
help="Which back end to use. Currently only C++ is "
"supported.")
parser.add_argument("--output-path",
nargs=1,
default=".",
help="""Prefix path to use for the generated output file.
Defaults to '.'""")
parser.add_argument("--output-file",
nargs=1,
help="""File name to be used for the generated output
file. Defaults to input_file suffixed by '.h'""")
parser.add_argument("--cc-enum-traits",
action=argparse.BooleanOptionalAction,
default=True,
help="""Controls generation of EnumTraits by the C++
backend""")
parser.add_argument("input_file",
type=str,
nargs=1,
help=".emb file to compile.")
return parser.parse_args(argv[1:])
def main(argv):
flags = _parse_args(argv)
base_path = os.path.dirname(__file__) or "."
sys.path.append(base_path)
from compiler.back_end.cpp import ( # pylint:disable=import-outside-toplevel
emboss_codegen_cpp, header_generator
)
from compiler.front_end import ( # pylint:disable=import-outside-toplevel
emboss_front_end
)
ir, _, errors = emboss_front_end.parse_and_log_errors(
flags.input_file[0], flags.import_dirs, flags.color_output)
if errors:
return 1
config = header_generator.Config(include_enum_traits=flags.cc_enum_traits)
header, errors = emboss_codegen_cpp.generate_headers_and_log_errors(
ir, flags.color_output, config)
if errors:
return 1
if flags.output_file:
output_file = flags.output_file[0]
else:
output_file = flags.input_file[0] + ".h"
output_filepath = os.path.join(flags.output_path[0], output_file)
os.makedirs(os.path.dirname(output_filepath), exist_ok=True)
with open(output_filepath, "w") as output:
output.write(header)
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))