69 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
|  | #!/usr/bin/env python3 | ||
|  | 
 | ||
|  | """
 | ||
|  | Helper script to wrap C++ to Matlab. | ||
|  | This script is installed via CMake to the user's binary directory | ||
|  | and invoked during the wrapping by CMake. | ||
|  | """
 | ||
|  | 
 | ||
|  | import argparse | ||
|  | import os | ||
|  | 
 | ||
|  | import gtwrap.interface_parser as parser | ||
|  | import gtwrap.template_instantiator as instantiator | ||
|  | from gtwrap.matlab_wrapper import MatlabWrapper, generate_content | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     arg_parser = argparse.ArgumentParser( | ||
|  |         formatter_class=argparse.ArgumentDefaultsHelpFormatter) | ||
|  |     arg_parser.add_argument("--src", type=str, required=True, | ||
|  |                             help="Input interface .h file.") | ||
|  |     arg_parser.add_argument("--module_name", type=str, required=True, | ||
|  |                             help="Name of the C++ class being wrapped.") | ||
|  |     arg_parser.add_argument("--out", type=str, required=True, | ||
|  |                             help="Name of the output folder.") | ||
|  |     arg_parser.add_argument( | ||
|  |         "--top_module_namespaces", | ||
|  |         type=str, | ||
|  |         default="", | ||
|  |         help="C++ namespace for the top module, e.g. `ns1::ns2::ns3`. " | ||
|  |         "Only the content within this namespace and its sub-namespaces " | ||
|  |         "will be wrapped. The content of this namespace will be available at " | ||
|  |         "the top module level, and its sub-namespaces' in the submodules.\n" | ||
|  |         "For example, `import <module_name>` gives you access to a Python " | ||
|  |         "`<module_name>.Class` of the corresponding C++ `ns1::ns2::ns3::Class`" | ||
|  |         ", and `from <module_name> import ns4` gives you access to a Python " | ||
|  |         "`ns4.Class` of the C++ `ns1::ns2::ns3::ns4::Class`. ") | ||
|  |     arg_parser.add_argument("--ignore", | ||
|  |                             nargs='*', | ||
|  |                             type=str, | ||
|  |                             help="A space-separated list of classes to ignore. " | ||
|  |                                  "Class names must include their full namespaces.") | ||
|  |     args = arg_parser.parse_args() | ||
|  | 
 | ||
|  |     top_module_namespaces = args.top_module_namespaces.split("::") | ||
|  |     if top_module_namespaces[0]: | ||
|  |         top_module_namespaces = [''] + top_module_namespaces | ||
|  | 
 | ||
|  |     with open(args.src, 'r') as f: | ||
|  |         content = f.read() | ||
|  | 
 | ||
|  |     if not os.path.exists(args.src): | ||
|  |         os.mkdir(args.src) | ||
|  | 
 | ||
|  |     module = parser.Module.parseString(content) | ||
|  | 
 | ||
|  |     instantiator.instantiate_namespace_inplace(module) | ||
|  | 
 | ||
|  |     import sys | ||
|  | 
 | ||
|  |     print("Ignoring classes: {}".format(args.ignore), file=sys.stderr) | ||
|  |     wrapper = MatlabWrapper(module=module, | ||
|  |                             module_name=args.module_name, | ||
|  |                             top_module_namespace=top_module_namespaces, | ||
|  |                             ignore_classes=args.ignore) | ||
|  | 
 | ||
|  |     cc_content = wrapper.wrap() | ||
|  | 
 | ||
|  |     generate_content(cc_content, args.out) |