mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
3.0 KiB
76 lines
3.0 KiB
#/usr/bin/env python |
|
|
|
import sys, re, os, time |
|
from string import Template |
|
from hdr_parser import CppHeaderParser |
|
from parse_tree import ParseTree, todict |
|
from filters import * |
|
from jinja2 import Environment, PackageLoader |
|
|
|
class MatlabWrapperGenerator(object): |
|
|
|
def gen(self, input_files, output_dir): |
|
# parse each of the files and store in a dictionary |
|
# as a separate "namespace" |
|
parser = CppHeaderParser() |
|
ns = {} |
|
for file in input_files: |
|
# get the file name |
|
name = os.path.splitext(os.path.basename(file))[0] |
|
ns[name] = parser.parse(file) |
|
|
|
# cleanify the parser output |
|
parse_tree = ParseTree() |
|
parse_tree.build(ns) |
|
|
|
# setup the template engine |
|
jtemplate = Environment(loader=PackageLoader('templates', ''), trim_blocks=True, lstrip_blocks=True) |
|
|
|
# add the custom filters |
|
jtemplate.filters['toUpperCamelCase'] = toUpperCamelCase |
|
jtemplate.filters['toLowerCamelCase'] = toLowerCamelCase |
|
jtemplate.filters['toUnderCase'] = toUnderCase |
|
jtemplate.filters['comment'] = comment |
|
jtemplate.filters['inputs'] = inputs |
|
jtemplate.filters['ninputs'] = ninputs |
|
jtemplate.filters['outputs'] = outputs |
|
jtemplate.filters['noutputs'] = noutputs |
|
jtemplate.filters['only'] = only |
|
jtemplate.filters['void'] = void |
|
jtemplate.filters['not'] = flip |
|
|
|
|
|
# load the templates |
|
tfunction = jtemplate.get_template('template_function_base.cpp') |
|
tclassm = jtemplate.get_template('template_class_base.m') |
|
tclassc = jtemplate.get_template('template_class_base.cpp') |
|
tdoc = jtemplate.get_template('template_doc_base.m') |
|
|
|
# create the build directory |
|
output_source_dir = output_dir+'/src' |
|
output_private_dir = output_source_dir+'/private' |
|
output_class_dir = output_dir+'/+cv' |
|
if not os.path.isdir(output_source_dir): |
|
os.mkdir(output_source_dir) |
|
if not os.path.isdir(output_private_dir): |
|
os.mkdir(output_private_dir) |
|
if not os.path.isdir(output_class_dir): |
|
os.mkdir(output_class_dir) |
|
|
|
# populate templates |
|
for namespace in parse_tree.namespaces: |
|
# functions |
|
for function in namespace.functions: |
|
populated = tfunction.render(fun=function, time=time, includes=namespace.name) |
|
with open(output_source_dir+'/'+function.name+'.cpp', 'wb') as f: |
|
f.write(populated) |
|
# classes |
|
for clss in namespace.classes: |
|
# cpp converter |
|
populated = tclassc.render(clss=clss, time=time) |
|
with open(output_private_dir+'/'+clss.name+'Bridge.cpp', 'wb') as f: |
|
f.write(populated) |
|
# matlab classdef |
|
populated = tclassm.render(clss=clss, time=time) |
|
with open(output_class_dir+'/'+clss.name+'.m', 'wb') as f: |
|
f.write(populated)
|
|
|