forked from OSchip/llvm-project
197 lines
6.6 KiB
Python
197 lines
6.6 KiB
Python
|
#!/usr/bin/env python
|
||
|
"""
|
||
|
The LLVM Compiler Infrastructure
|
||
|
|
||
|
This file is distributed under the University of Illinois Open Source
|
||
|
License. See LICENSE.TXT for details.
|
||
|
|
||
|
Prepares language bindings for LLDB build process. Run with --help
|
||
|
to see a description of the supported command line arguments.
|
||
|
"""
|
||
|
|
||
|
# Python modules:
|
||
|
import argparse
|
||
|
import logging
|
||
|
import os
|
||
|
import sys
|
||
|
|
||
|
|
||
|
def prepare_binding_for_language(scripts_dir, script_lang, options):
|
||
|
"""Prepares the binding for a specific language.
|
||
|
|
||
|
@param scripts_dir the full path to the scripts source directory.
|
||
|
@param script_lang the name of the script language. Should be a child
|
||
|
directory within the scripts dir, and should contain a
|
||
|
prepare_scripts_{script_lang}.py script file in it.
|
||
|
@param options the dictionary of parsed command line options.
|
||
|
|
||
|
There is no return value. If it returns, the process succeeded; otherwise,
|
||
|
the process will exit where it fails.
|
||
|
"""
|
||
|
# Ensure the language-specific prepare module exists.
|
||
|
script_name = "prepare_binding_{}.py".format(script_lang)
|
||
|
lang_path = os.path.join(scripts_dir, script_lang)
|
||
|
script_path = os.path.join(lang_path, script_name)
|
||
|
if not os.path.exists(script_path):
|
||
|
logging.error(
|
||
|
"failed to find prepare script for language '%s' at '%s'",
|
||
|
script_lang,
|
||
|
script_path)
|
||
|
sys.exit(-9)
|
||
|
|
||
|
# Include this language-specific directory in the Python search
|
||
|
# path.
|
||
|
sys.path.append(os.path.normcase(lang_path))
|
||
|
|
||
|
# Execute the specific language script
|
||
|
module_name = os.path.splitext(script_name)[0]
|
||
|
module = __import__(module_name)
|
||
|
module.main(options)
|
||
|
|
||
|
# Remove the language-specific directory from the Python search path.
|
||
|
sys.path.remove(os.path.normcase(lang_path))
|
||
|
|
||
|
|
||
|
def prepare_all_bindings(options):
|
||
|
"""Prepares bindings for each of the languages supported.
|
||
|
|
||
|
@param options the parsed arguments from the command line
|
||
|
|
||
|
@return the exit value for the program. 0 is success, all othes
|
||
|
indicate some kind of failure.
|
||
|
"""
|
||
|
# Check for the existence of the SWIG scripts folder
|
||
|
scripts_dir = os.path.join(options.src_root, "scripts")
|
||
|
if not os.path.exists(scripts_dir):
|
||
|
logging.error("failed to find scripts dir: '%s'", scripts_dir)
|
||
|
sys.exit(-8)
|
||
|
|
||
|
# Collect list of child directories. We expect there to be one
|
||
|
# for each supported script language.
|
||
|
child_dirs = [f for f in os.listdir(scripts_dir)
|
||
|
if os.path.isdir(os.path.join(scripts_dir, f))]
|
||
|
|
||
|
# Remove directories that do not represent script languages.
|
||
|
for removal_dir in [".svn", "interface", "__pycache__", "sphinx"]:
|
||
|
if removal_dir in child_dirs:
|
||
|
child_dirs.remove(removal_dir)
|
||
|
|
||
|
logging.info("found script directories: %s", child_dirs)
|
||
|
|
||
|
# Iterate script directory find any script language directories
|
||
|
for script_lang in child_dirs:
|
||
|
logging.info("executing language script for: '%s'", script_lang)
|
||
|
prepare_binding_for_language(scripts_dir, script_lang, options)
|
||
|
|
||
|
|
||
|
def process_args(args):
|
||
|
"""Returns options processed from the provided command line.
|
||
|
|
||
|
@param args the command line to process.
|
||
|
"""
|
||
|
|
||
|
# Setup the parser arguments that are accepted.
|
||
|
parser = argparse.ArgumentParser(
|
||
|
description="Prepare language bindings for LLDB build.")
|
||
|
|
||
|
# Arguments to control logging verbosity.
|
||
|
parser.add_argument(
|
||
|
"--debug", "-d",
|
||
|
action="store_true",
|
||
|
help="Set program logging level to DEBUG.")
|
||
|
parser.add_argument(
|
||
|
"--verbose", "-v",
|
||
|
action="count",
|
||
|
default=0,
|
||
|
help=(
|
||
|
"Increase logging verbosity level. Default: only error and "
|
||
|
"higher are displayed. Each -v increases level of verbosity."))
|
||
|
|
||
|
# Arguments to control whether we're building an OS X-style
|
||
|
# framework. This is the opposite of the older "-m" (makefile)
|
||
|
# option.
|
||
|
parser.add_argument(
|
||
|
"--config-build-dir",
|
||
|
"--cfgBldDir",
|
||
|
help=(
|
||
|
"Configuration build dir, will use python module path "
|
||
|
"if unspecified."))
|
||
|
parser.add_argument(
|
||
|
"--framework",
|
||
|
action="store_true",
|
||
|
help="Prepare as OS X-style framework.")
|
||
|
parser.add_argument(
|
||
|
"--generate-dependency-file",
|
||
|
"-M",
|
||
|
action="store_true",
|
||
|
help="Make the dependency (.d) file for the wrappers.")
|
||
|
parser.add_argument(
|
||
|
"--prefix",
|
||
|
help="Override path where the LLDB module is placed.")
|
||
|
parser.add_argument(
|
||
|
"--src-root",
|
||
|
"--srcRoot",
|
||
|
"-s",
|
||
|
# Default to the parent directory of this script's directory.
|
||
|
default=os.path.abspath(
|
||
|
os.path.join(
|
||
|
os.path.dirname(os.path.realpath(__file__)),
|
||
|
os.path.pardir)),
|
||
|
help="Specifies the LLDB source root directory.")
|
||
|
parser.add_argument(
|
||
|
"--swig-executable",
|
||
|
"--swigExecutable",
|
||
|
help="Path to the swig executable.")
|
||
|
parser.add_argument(
|
||
|
"--target-dir",
|
||
|
"--targetDir",
|
||
|
required=True,
|
||
|
help=(
|
||
|
"Specifies the build dir where the language binding "
|
||
|
"should be placed"))
|
||
|
|
||
|
# Process args.
|
||
|
options = parser.parse_args(args)
|
||
|
|
||
|
# Set logging level based on verbosity count.
|
||
|
if options.debug:
|
||
|
log_level = logging.DEBUG
|
||
|
else:
|
||
|
# See logging documentation for error levels. We'll default
|
||
|
# to showing ERROR or higher error messages. For each -v
|
||
|
# specified, we'll shift to the next lower-priority log level.
|
||
|
log_level = logging.ERROR - 10 * options.verbose
|
||
|
if log_level < logging.NOTSET:
|
||
|
# Displays all logged messages.
|
||
|
log_level = logging.NOTSET
|
||
|
logging.basicConfig(level=log_level)
|
||
|
logging.info("logging is using level: %d", log_level)
|
||
|
|
||
|
return options
|
||
|
|
||
|
|
||
|
def main(args):
|
||
|
"""Drives the main script preparation steps.
|
||
|
|
||
|
@param args list of command line arguments.
|
||
|
"""
|
||
|
# Process command line arguments.
|
||
|
options = process_args(args)
|
||
|
logging.debug("Processed args: options=%s", options)
|
||
|
|
||
|
# Check if the swig file exists.
|
||
|
swig_path = os.path.normcase(
|
||
|
os.path.join(options.src_root, "scripts", "lldb.swig"))
|
||
|
if not os.path.isfile(swig_path):
|
||
|
logging.error("swig file not found at '%s'", swig_path)
|
||
|
sys.exit(-3)
|
||
|
|
||
|
# Prepare bindings for each supported language binding.
|
||
|
# This will error out if it doesn't succeed.
|
||
|
prepare_all_bindings(options)
|
||
|
sys.exit(0)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
# Run the main driver loop.
|
||
|
main(sys.argv[1:])
|