forked from OSchip/llvm-project
prepare_bindings.py: enable static bindings
Added a new flag, --allow-static-binding. When specified, if (and only if) the swig binary cannot be found, then the LLDBWrapPython.cpp and lldb.py from the scripts/Python/{static-binding-dir} are copied into the place where swig would have generated them. {static-binding-dir} defaults to static-binding, and can be overridden with the --static-binding-dir command line argument. The static bindings checked in are from r253424. llvm-svn: 253448
This commit is contained in:
parent
5574730454
commit
d434a1d3e0
|
@ -6226,7 +6226,7 @@
|
|||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/bash;
|
||||
shellScript = "/usr/bin/python $SRCROOT/scripts/prepare_bindings.py --find-swig --framework --src-root $SRCROOT --target-dir $TARGET_BUILD_DIR --config-build-dir $CONFIGURATION_BUILD_DIR";
|
||||
shellScript = "/usr/bin/python $SRCROOT/scripts/prepare_bindings.py --find-swig --framework --src-root $SRCROOT --target-dir $TARGET_BUILD_DIR --config-build-dir $CONFIGURATION_BUILD_DIR --allow-static-binding";
|
||||
};
|
||||
4959511A1A1ACE9500F6F8FC /* Install Clang compiler headers */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
|
|
|
@ -251,6 +251,42 @@ def do_swig_rebuild(options, dependency_file, config_build_dir, settings):
|
|||
sys.exit(-10)
|
||||
|
||||
|
||||
def copy_static_bindings(options, config_build_dir, settings):
|
||||
"""Copies the static Python bindings over to the build dir.
|
||||
"""
|
||||
|
||||
# Copy the LLDBWrapPython.cpp C++ binding file impl over.
|
||||
lldb_wrap_python_src_path = os.path.join(
|
||||
options.src_root,
|
||||
"scripts",
|
||||
"Python",
|
||||
options.static_binding_dir,
|
||||
"LLDBWrapPython.cpp")
|
||||
if not os.path.exists(lldb_wrap_python_src_path):
|
||||
logging.error(
|
||||
"failed to find static Python binding .cpp file at '%s'",
|
||||
lldb_wrap_python_src_path)
|
||||
sys.exit(-12)
|
||||
shutil.copyfile(lldb_wrap_python_src_path, settings.output_file)
|
||||
|
||||
# Copy the lldb.py impl over.
|
||||
lldb_py_src_path = os.path.join(
|
||||
options.src_root,
|
||||
"scripts",
|
||||
"Python",
|
||||
options.static_binding_dir,
|
||||
"lldb.py")
|
||||
if not os.path.exists(lldb_py_src_path):
|
||||
logging.error(
|
||||
"failed to find static Python binding .py file at '%s'",
|
||||
lldb_py_src_path)
|
||||
sys.exit(-13)
|
||||
lldb_py_dest_path = os.path.join(
|
||||
os.path.dirname(settings.output_file),
|
||||
"lldb.py")
|
||||
shutil.copyfile(lldb_py_src_path, lldb_py_dest_path)
|
||||
|
||||
|
||||
def run_python_script(script_and_args):
|
||||
"""Runs a python script, logging appropriately.
|
||||
|
||||
|
@ -418,7 +454,14 @@ def main(options):
|
|||
"Skipping Python binding generation: everything is up to date")
|
||||
return
|
||||
|
||||
# Generate the Python binding with swig.
|
||||
# Generate the Python binding with swig, or use the static bindings if no swig.
|
||||
if not options.swig_executable or not os.path.exists(options.swig_executable):
|
||||
# Copy over the static bindings. We capture the the modified (i.e. post-processed)
|
||||
# binding, so we don't do the modify step here - the modifications have
|
||||
# already been applied.
|
||||
copy_static_bindings(options, config_build_dir, settings)
|
||||
else:
|
||||
# Generate the bindings with swig.
|
||||
logging.info("Python binding is out of date, regenerating")
|
||||
do_swig_rebuild(options, dependency_file, config_build_dir, settings)
|
||||
if options.generate_dependency_file:
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -158,6 +158,19 @@ def process_args(args):
|
|||
"Specifies the build dir where the language binding "
|
||||
"should be placed"))
|
||||
|
||||
group = parser.add_argument_group("static binding usage")
|
||||
group.add_argument(
|
||||
"--allow-static-binding",
|
||||
action="store_true",
|
||||
help=(
|
||||
"Specify the pre-baked binding can be used if "
|
||||
"swig cannot be found."))
|
||||
group.add_argument(
|
||||
"--static-binding-dir",
|
||||
default="static-binding",
|
||||
help="script-relative directory for appropriate static bindings"
|
||||
)
|
||||
|
||||
# Process args.
|
||||
options = parser.parse_args(args)
|
||||
|
||||
|
@ -196,9 +209,14 @@ def find_file_in_paths(paths, exe_basename):
|
|||
return None
|
||||
|
||||
|
||||
def find_swig_executable(options):
|
||||
def find_swig_executable(options, must_exist):
|
||||
"""Finds the swig executable in the PATH or known good locations.
|
||||
|
||||
:param options the command line options returned by argparse.
|
||||
|
||||
:param must_exist if True, this method exits the program if
|
||||
swig is not found; otherwise, always returns whether swig is found.
|
||||
|
||||
Replaces options.swig_executable with the full swig executable path.
|
||||
"""
|
||||
# Figure out what we're looking for.
|
||||
|
@ -219,19 +237,27 @@ def find_swig_executable(options):
|
|||
# Add in the extra dirs
|
||||
paths_to_check.extend(extra_dirs)
|
||||
if len(paths_to_check) < 1:
|
||||
if must_exist:
|
||||
logging.error(
|
||||
"swig executable was not specified, PATH has no "
|
||||
"contents, and there are no extra directories to search")
|
||||
sys.exit(-6)
|
||||
else:
|
||||
logging.info("failed to find swig: no paths available")
|
||||
return
|
||||
|
||||
# Find the swig executable
|
||||
options.swig_executable = find_file_in_paths(paths_to_check, exe_basename)
|
||||
if not options.swig_executable or len(options.swig_executable) < 1:
|
||||
if must_exist:
|
||||
logging.error(
|
||||
"failed to find exe='%s' in paths='%s'",
|
||||
exe_basename,
|
||||
paths_to_check)
|
||||
sys.exit(-6)
|
||||
else:
|
||||
logging.info("%s not found in paths %s", exe_basename, paths_to_check)
|
||||
else:
|
||||
logging.info("found swig executable: %s", options.swig_executable)
|
||||
|
||||
|
||||
|
@ -247,7 +273,8 @@ def main(args):
|
|||
# Ensure we have a swig executable.
|
||||
if not options.swig_executable or len(options.swig_executable) == 0:
|
||||
if options.find_swig:
|
||||
find_swig_executable(options)
|
||||
must_exist = not options.allow_static_binding
|
||||
find_swig_executable(options, must_exist)
|
||||
else:
|
||||
logging.error(
|
||||
"The --find-swig option must be specified "
|
||||
|
|
Loading…
Reference in New Issue