diff options
Diffstat (limited to 'scripts/swig_bot_lib/local.py')
-rw-r--r-- | scripts/swig_bot_lib/local.py | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/scripts/swig_bot_lib/local.py b/scripts/swig_bot_lib/local.py new file mode 100644 index 000000000000..7cca0b3cabbb --- /dev/null +++ b/scripts/swig_bot_lib/local.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python + +""" +Shared functionality used by `client` and `server` when generating or preparing +to generate SWIG on the local machine. +""" + +# Future imports +from __future__ import absolute_import +from __future__ import print_function + +# Python modules +import argparse +import imp +import io +import logging +import os +import subprocess +import sys +import tempfile +import zipfile + +# LLDB modules +import use_lldb_suite + +# Package imports +from lldbsuite.support import fs + +class LocalConfig(object): + src_root = None + target_dir = None + languages = None + swig_executable = None + +def pack_archive(bytes_io, src_root, filters): + logging.info("Creating input file package...") + zip_file = None + try: + # It's possible that a custom-built interpreter will not have the + # standard zlib module. If so, we can only store, not compress. By + # try to compress since we usually have a standard Python distribution. + zip_file = zipfile.ZipFile(bytes_io, mode='w', + compression=zipfile.ZIP_DEFLATED) + except RuntimeError: + zip_file = zipfile.ZipFile(bytes_io, mode='w', + compression=zipfile.ZIP_STORED) + archive_entries = [] + if filters is not None: + def filter_func(t): + subfolder = t[0] + ext = t[1] + full_path = os.path.normpath(os.path.join(src_root, subfolder)) + candidates = [os.path.normpath(os.path.join(full_path, f)) + for f in os.listdir(full_path)] + actual = filter( + lambda f : os.path.isfile(f) and os.path.splitext(f)[1] == ext, + candidates) + return (subfolder, map(lambda f : os.path.basename(f), actual)) + archive_entries = map(filter_func, filters) + else: + for (root, dirs, files) in os.walk(src_root): + logging.debug("Adding files {} from directory {} to output package" + .format(files, root)) + if len(files) > 0: + rel_root = os.path.relpath(root, src_root) + archive_entries.append((rel_root, files)) + + archive_entries = list(archive_entries) + for entry in archive_entries: + subfolder = entry[0] + files = list(entry[1]) + for file in files: + rel_path = os.path.normpath(os.path.join(subfolder, file)) + full_path = os.path.join(src_root, rel_path) + logging.info("{} -> {}".format(full_path, rel_path)) + zip_file.write(full_path, rel_path) + + return zip_file + +def unpack_archive(folder, archive_bytes): + zip_data = io.BytesIO(archive_bytes) + logging.debug("Opening zip archive...") + zip_file = zipfile.ZipFile(zip_data, mode='r') + zip_file.extractall(folder) + zip_file.close() + +def generate(options): + include_folder = os.path.join(options.src_root, "include") + in_file = os.path.join(options.src_root, "scripts", "lldb.swig") + include_folder = os.path.normcase(include_folder) + + for lang in options.languages: + lang = lang.lower() + out_dir = os.path.join(options.target_dir, lang.title()) + if not os.path.exists(out_dir): + os.makedirs(out_dir) + out_file = os.path.join(out_dir, "LLDBWrap{}.cpp".format(lang.title())) + swig_command = [ + options.swig_executable, + "-c++", + ] + swig_command.append("-" + lang) + if lang == "python": + swig_command.append("-threads") + + swig_command.extend([ + "-I" + include_folder, + "-D__STDC_LIMIT_MACROS", + "-D__STDC_CONSTANT_MACROS", + "-outdir", out_dir, + "-o", out_file, + in_file + ]) + + logging.info("generating swig {} bindings into {}" + .format(lang, out_dir)) + logging.debug("swig command line: {}".format(swig_command)) + try: + # Execute swig + swig_output = subprocess.check_output( + swig_command, stderr=subprocess.STDOUT, universal_newlines=True) + + logging.info("swig generation succeeded") + if swig_output is not None and len(swig_output) > 0: + logging.info("swig output: %s", swig_output) + return (0, swig_output) + except subprocess.CalledProcessError as e: + logging.error("An error occurred executing swig. returncode={}" + .format(e.returncode)) + logging.error(e.output) + return (e.returncode, e.output)
\ No newline at end of file |