blob: cee92d899e787fd66652aebfc25a63dc998e494e [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 subprocess
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("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 "."
subprocess_environment = os.environ.copy()
if subprocess_environment.get("PYTHONPATH"):
subprocess_environment["PYTHONPATH"] = (
base_path + ":" + subprocess_environment.get("PYTHONPATH"))
else:
subprocess_environment["PYTHONPATH"] = base_path
front_end_args = [
sys.executable,
os.path.join(base_path, "compiler", "front_end", "emboss_front_end.py"),
"--output-ir-to-stdout",
"--color-output", flags.color_output,
]
for import_dir in flags.import_dirs:
front_end_args.extend(["--import-dir", import_dir])
front_end_args.append(flags.input_file[0])
front_end_status = subprocess.run(front_end_args,
stdout=subprocess.PIPE,
env=subprocess_environment)
if front_end_status.returncode != 0:
return front_end_status.returncode
back_end_status = subprocess.run(
[
sys.executable,
os.path.join(base_path, "compiler", "back_end", "cpp",
"emboss_codegen_cpp.py"),
],
input=front_end_status.stdout,
stdout=subprocess.PIPE,
env=subprocess_environment
)
if back_end_status.returncode != 0:
return back_end_status.returncode
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, "wb") as output:
output.write(back_end_status.stdout)
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))