Have swig_bot actually run swig, and send back the output.

llvm-svn: 254340
This commit is contained in:
Zachary Turner 2015-11-30 22:31:13 +00:00
parent db26b3ddfa
commit 24a95f852d
4 changed files with 74 additions and 36 deletions

View File

@ -11,6 +11,7 @@ from __future__ import print_function
# Python modules
import argparse
import io
import logging
import os
import socket
@ -23,8 +24,8 @@ from lldbsuite.support import fs
from lldbsuite.support import sockutil
# package imports
from . import config
from . import local
from . import remote
default_ip = "127.0.0.1"
default_port = 8537
@ -152,21 +153,32 @@ def run(args):
if not os.path.isfile(options.swig_executable):
logging.error("Swig executable '{}' does not exist."
.format(options.swig_executable))
gen_options = local.GenOptions()
gen_options.languages = options.languages
gen_options.src_root = options.src_root
gen_options.target_dir = options.target_dir
gen_options.swig_executable = options.swig_executable
local.generate(gen_options)
config = local.LocalConfig()
config.languages = options.languages
config.src_root = options.src_root
config.target_dir = options.target_dir
config.swig_executable = options.swig_executable
local.generate(config)
else:
logging.info("swig bot client using remote generation with server '{}'"
.format(options.remote))
connection = None
try:
config_json = config.generate_config_json(options)
packed_input = local.pack_archive(config_json, options)
config = remote.generate_config(options.languages)
logging.debug("Generated config json {}".format(config))
inputs = [("include/lldb", ".h"),
("include/lldb/API", ".h"),
("scripts", ".swig"),
("scripts/Python", ".swig"),
("scripts/interface", ".i")]
zip_data = io.BytesIO()
packed_input = local.pack_archive(zip_data, options.src_root, inputs)
logging.info("(null) -> config.json")
packed_input.writestr("config.json", config)
packed_input.close()
connection = establish_remote_connection(options.remote)
response = transmit_data(connection, packed_input)
response = transmit_data(connection, zip_data.getvalue())
logging.debug("Received {} byte response.".format(len(response)))
finally:
if connection is not None:

View File

@ -23,34 +23,32 @@ import zipfile
# LLDB modules
import use_lldb_suite
class GenOptions(object):
# Package imports
from lldbsuite.support import fs
class LocalConfig(object):
src_root = None
target_dir = None
languages = None
swig_executable = None
def pack_archive(config_json, options):
def pack_archive(bytes_io, src_root, filters):
logging.info("Creating input file package...")
zip_data = io.BytesIO()
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(zip_data, mode='w',
zip_file = zipfile.ZipFile(bytes_io, mode='w',
compression=zipfile.ZIP_DEFLATED)
except RuntimeError:
zip_file = zipfile.ZipFile(zip_data, mode='w',
zip_file = zipfile.ZipFile(bytes_io, mode='w',
compression=zipfile.ZIP_STORED)
filters = [("include/lldb", ".h"),
("scripts", ".swig"),
("scripts/Python", ".swig"),
("scripts/interface", ".i")]
def filter_func(t):
subfolder = t[0]
ext = t[1]
full_path = os.path.normpath(os.path.join(options.src_root, subfolder))
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(
@ -65,14 +63,11 @@ def pack_archive(config_json, options):
for file in files:
relative_path = os.path.normpath(os.path.join(subfolder, file))
full_path = os.path.normpath(
os.path.join(options.src_root, relative_path))
os.path.join(src_root, relative_path))
logging.info("{} -> {}".format(full_path, relative_path))
zip_file.write(full_path, relative_path)
logging.info("(null) -> config.json")
zip_file.writestr("config.json", config_json)
zip_file.close()
return zip_data.getvalue()
return zip_file
def unpack_archive(subfolder, archive_bytes):
tempfolder = os.path.join(tempfile.gettempdir(), subfolder)

View File

@ -2,7 +2,7 @@
"""
Shared functionality used by `client` and `server` when dealing with
configuration data
remote transmission
"""
# Future imports
@ -20,12 +20,11 @@ import sys
# LLDB modules
import use_lldb_suite
# package imports
from . import local
def generate_config_json(options):
config = {"languages": options.languages}
def generate_config(languages):
config = {"languages": languages}
return json.dumps(config)
def parse_config_json(option_json):
return json.loads(option_json)
def parse_config(json_reader):
json_data = json_reader.read()
options_dict = json.loads(json_data)
return options_dict

View File

@ -11,6 +11,7 @@ from __future__ import print_function
# Python modules
import argparse
import io
import logging
import os
import select
@ -23,10 +24,12 @@ import traceback
# LLDB modules
import use_lldb_suite
from lldbsuite.support import fs
from lldbsuite.support import sockutil
# package imports
from . import local
from . import remote
default_port = 8537
@ -40,6 +43,12 @@ def process_args(args):
default=default_port,
help=("The local port to bind to"))
parser.add_argument(
"--swig-executable",
action="store",
default=fs.find_executable("swig"),
dest="swig_executable")
# Process args.
return parser.parse_args(args)
@ -75,9 +84,31 @@ def accept_once(sock, options):
pack_location = local.unpack_archive("swig-bot", data)
logging.debug("Successfully unpacked archive...")
logging.info("Sending {} byte response".format(len(data)))
client.sendall(struct.pack("!I", len(data)))
client.sendall(data)
config_file = os.path.normpath(os.path.join(pack_location,
"config.json"))
parsed_config = remote.parse_config(io.open(config_file))
config = local.LocalConfig()
config.languages = parsed_config["languages"]
config.swig_executable = options.swig_executable
config.src_root = pack_location
config.target_dir = os.path.normpath(
os.path.join(config.src_root, "output"))
logging.info(
"Running swig. languages={}, swig={}, src_root={}, target={}"
.format(config.languages, config.swig_executable,
config.src_root, config.target_dir))
local.generate(config)
logging.debug("Finished running swig. Packaging up output")
zip_data = io.BytesIO()
zip_file = local.pack_archive(zip_data,
config.target_dir,
[(".", None)])
zip_file.close()
response_data = zip_data.getvalue()
logging.info("Sending {} byte response".format(len(response_data)))
client.sendall(struct.pack("!I", len(response_data)))
client.sendall(response_data)
finally:
if pack_location is not None:
logging.debug("Removing temporary folder {}"
@ -95,6 +126,7 @@ def accept_loop(sock, options):
def run(args):
options = process_args(args)
print(options)
sock = initialize_listening_socket(options)
accept_loop(sock, options)
return options