blob: 0259da57403dd3f7ca48fb9f3c85b0ca999ce196 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This script drives the execution of the Mojom parser."""
import os
import platform
import subprocess
import sys
# We assume this script is located in the Mojo SDK in
# tools/bindings/pylib/mojom/parse.
THIS_DIR = os.path.abspath(os.path.dirname(__file__))
SDK_ROOT = os.path.abspath(os.path.join(THIS_DIR, os.pardir, os.pardir,
os.pardir, os.pardir, os.pardir))
PYTHON_SDK_DIR = os.path.abspath(os.path.join(SDK_ROOT, "python"))
sys.path.insert(0, PYTHON_SDK_DIR)
# In order to use mojom_files_mojom we need to make sure the dummy mojo_system
# can be found on the python path.
sys.path.insert(0, os.path.join(PYTHON_SDK_DIR, "dummy_mojo_system"))
from mojom.generate.generated import mojom_files_mojom
from mojom.generate.generated import mojom_types_mojom
from mojo_bindings import serialization
def RunParser(sdk_root, file_names, import_directories=None,
meta_data_only=False):
"""Runs the mojom parser. Only 64-bit Linux and Mac is supported.
Args:
sdk_root: {str} Absolute path to the root of the Mojo SDK. The parser
binary is expected to be found in
<sdk_root>/tools/bindings/mojom_tool/bin/<platform>
file_names {list of str} Paths to mojom files to be parsed. May be either
absolute or relative to the current working directory.
import_directories: {list of str} Optional specification of import
directories where mojom imports should be searched. The elements of the
list should be absolute paths or paths relative to the current working
directory.
meta_data_only: {bool} If True then the flag -meta-data-only
will be passed to the parser.
Returns:
{str} The serialized mojom_files.MojomFileGraph returned by mojom parser,
or None if the mojom parser returned a non-zero error code.
"""
system_dirs = {
("Linux", "64bit"): "linux64",
("Darwin", "64bit"): "mac64",
}
system = (platform.system(), platform.architecture()[0])
if system not in system_dirs:
raise Exception("The mojom parser only supports Linux or Mac 64 bits.")
mojom_tool = os.path.join(sdk_root, "tools", "bindings", "mojom_tool",
"bin", system_dirs[system], "mojom")
if not os.path.exists(mojom_tool):
raise Exception(
"The mojom parser could not be found at %s. "
"You may need to run gclient sync."
% mojom_tool)
cmd = [mojom_tool, "parse"]
if import_directories:
cmd.extend(["-I", ",".join(import_directories)])
if meta_data_only:
cmd.extend(["-meta-data-only"])
cmd.extend(file_names)
try:
return subprocess.check_output(cmd)
except subprocess.CalledProcessError:
return None
def DeserializeMojomFileGraph(serialized_bytes):
"""Deserializes a mojom_files.MojomFileGraph.
Args:
serialized_bytes: {str} The serialized mojom_files.MojomFileGraph returned
by mojom parser
Returns:
{mojom_files.MojomFileGraph} The deserialized MojomFileGraph.
"""
data = bytearray(serialized_bytes)
context = serialization.RootDeserializationContext(data, [])
return mojom_files_mojom.MojomFileGraph.Deserialize(context)
def ParseToMojomFileGraph(sdk_root, file_names, import_directories=None,
meta_data_only=False):
"""Runs the mojom parser and deserializes the result. Only 64-bit Linux and
Mac is supported.
Args:
sdk_root: {str} Absolute path to the root of the Mojo SDK. The parser
binary is expected to be found in
<sdk_root>/tools/bindings/mojom_tool/bin/<platform>
file_names {list of str} Paths to mojom files to be parsed. May be either
absolute or relative to the current working directory.
import_directories: {list of str} Optional specification of import
directories where mojom imports should be searched. The elements of the
list should be absolute paths or paths relative to the current working
directory.
meta_data_only: {bool} If True then the flag -meta-data-only
will be passed to the parser.
Returns:
{mojom_files.MojomFileGraph} The deserialized MojomFileGraph obtained by
deserializing the bytes returned by mojom parser, or None if the mojom
parser returned a non-zero error code.
"""
serialized_bytes = RunParser(sdk_root, file_names, import_directories,
meta_data_only)
if serialized_bytes is None:
return None
return DeserializeMojomFileGraph(serialized_bytes)