From 2f7f02260522d00ca8b091f905e3e4a548b748e5 Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Sun, 28 Feb 2016 13:31:23 +0000 Subject: [PATCH] Refactor ``mk_mem_initializer_cpp()`` so that it is usable externally via a new function ``mk_mem_initializer_cpp_internal()`` which is called by a new ``mk_mem_initializer_cpp.py`` script. This will allow other build systems to generate the ``mem_initializer.cpp`` files. --- scripts/mk_mem_initializer_cpp.py | 48 +++++++++++++++++++++++++++++++ scripts/mk_util.py | 14 ++++++--- 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100755 scripts/mk_mem_initializer_cpp.py diff --git a/scripts/mk_mem_initializer_cpp.py b/scripts/mk_mem_initializer_cpp.py new file mode 100755 index 000000000..c8b68049f --- /dev/null +++ b/scripts/mk_mem_initializer_cpp.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +""" +Scans the source directories for +memory initializers and finalizers and +emits and implementation of +``void mem_initialize()`` and +``void mem_finalize()`` into ``mem_initializer.cpp`` +in the destination directory. +""" +import mk_util +import argparse +import logging +import os +import sys + +def check_dir(path): + if not os.path.exists(path): + logging.error('"{}" does not exist'.format(path)) + return 1 + + if not os.path.isdir(path): + logging.error('"{}" is not a directory'.format(path)) + return 1 + + return 0 + + +def main(args): + logging.basicConfig(level=logging.INFO) + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("destination_dir", help="destination directory") + parser.add_argument("source_dirs", nargs="+", + help="One or more source directories to search") + pargs = parser.parse_args(args) + + if check_dir(pargs.destination_dir) != 0: + return 1 + + for source_dir in pargs.source_dirs: + if check_dir(source_dir) != 0: + return 1 + + mk_util.mk_mem_initializer_cpp_internal(pargs.source_dirs, pargs.destination_dir) + return 0 + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) + diff --git a/scripts/mk_util.py b/scripts/mk_util.py index 9060d37fc..ef652eab3 100644 --- a/scripts/mk_util.py +++ b/scripts/mk_util.py @@ -2752,6 +2752,13 @@ def mk_all_install_tactic_cpps(): # void mem_finalize() # These procedures are invoked by the Z3 memory_manager def mk_mem_initializer_cpp(cnames, path): + component_src_dirs = [] + for cname in cnames: + c = get_component(cname) + component_src_dirs.append(c.src_dir) + mk_mem_initializer_cpp_internal(component_src_dirs, path) + +def mk_mem_initializer_cpp_internal(component_src_dirs, path): initializer_cmds = [] finalizer_cmds = [] fullname = os.path.join(path, 'mem_initializer.cpp') @@ -2761,12 +2768,11 @@ def mk_mem_initializer_cpp(cnames, path): # ADD_INITIALIZER with priority initializer_prio_pat = re.compile('[ \t]*ADD_INITIALIZER\(\'([^\']*)\',[ \t]*(-?[0-9]*)\)') finalizer_pat = re.compile('[ \t]*ADD_FINALIZER\(\'([^\']*)\'\)') - for cname in cnames: - c = get_component(cname) - h_files = filter(lambda f: f.endswith('.h') or f.endswith('.hpp'), os.listdir(c.src_dir)) + for component_src_dir in component_src_dirs: + h_files = filter(lambda f: f.endswith('.h') or f.endswith('.hpp'), os.listdir(component_src_dir)) for h_file in h_files: added_include = False - fin = open(os.path.join(c.src_dir, h_file), 'r') + fin = open(os.path.join(component_src_dir, h_file), 'r') for line in fin: m = initializer_pat.match(line) if m: