Ignore:
Timestamp:
Jul 11, 2012, 2:09:20 AM (12 years ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
Children:
1458de5, 451b05d
Parents:
c325a11
Message:

updated setup to generate files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • interfaces/python/generator.py

    • Property mode changed from 100644 to 100755
    rc325a11 rc71e405  
    44
    55import os, sys
     6from gen_pyobject import write_msg, gen_new_init, gen_do, gen_members, gen_methods, gen_finish
    67
    7 skip_objects = ['fft', 'pvoc', 'filter', 'filterbank', 'resampler']
     8def get_cpp_objects():
    89
    9 cpp_output = [l.strip() for l in os.popen('cpp -DAUBIO_UNSTABLE=1 -I../../build/src ../../src/aubio.h').readlines()]
     10  cpp_output = [l.strip() for l in os.popen('cpp -DAUBIO_UNSTABLE=1 -I../../build/src ../../src/aubio.h').readlines()]
    1011
    11 cpp_output = filter(lambda y: len(y) > 1, cpp_output)
    12 cpp_output = filter(lambda y: not y.startswith('#'), cpp_output)
     12  cpp_output = filter(lambda y: len(y) > 1, cpp_output)
     13  cpp_output = filter(lambda y: not y.startswith('#'), cpp_output)
    1314
    14 i = 1
    15 while 1:
    16     if i >= len(cpp_output): break
    17     if cpp_output[i-1].endswith(',') or cpp_output[i-1].endswith('{') or cpp_output[i].startswith('}'):
    18         cpp_output[i] = cpp_output[i-1] + ' ' + cpp_output[i]
    19         cpp_output.pop(i-1)
    20     else:
    21         i += 1
     15  i = 1
     16  while 1:
     17      if i >= len(cpp_output): break
     18      if cpp_output[i-1].endswith(',') or cpp_output[i-1].endswith('{') or cpp_output[i].startswith('}'):
     19          cpp_output[i] = cpp_output[i-1] + ' ' + cpp_output[i]
     20          cpp_output.pop(i-1)
     21      else:
     22          i += 1
    2223
    23 typedefs = filter(lambda y: y.startswith ('typedef struct _aubio'), cpp_output)
     24  typedefs = filter(lambda y: y.startswith ('typedef struct _aubio'), cpp_output)
    2425
    25 objects = [a.split()[3][:-1] for a in typedefs]
     26  cpp_objects = [a.split()[3][:-1] for a in typedefs]
    2627
    27 print "-- INFO: %d objects in total" % len(objects)
     28  return cpp_output, cpp_objects
    2829
    29 generated_objects = []
     30def generate_object_files():
    3031
    31 for this_object in objects:
    32     lint = 0
    33  
    34     if this_object[-2:] == '_t':
    35         object_name = this_object[:-2]
    36     else:
    37         object_name = this_object
    38         print "-- WARNING: %s does not end in _t" % this_object
     32  generated_objects = []
     33  cpp_output, cpp_objects = get_cpp_objects()
     34  skip_objects = ['fft', 'pvoc', 'filter', 'filterbank', 'resampler']
    3935
    40     if object_name[:len('aubio_')] != 'aubio_':
    41         print "-- WARNING: %s does not start n aubio_" % this_object
     36  write_msg("-- INFO: %d objects in total" % len(cpp_objects))
    4237
    43     print "-- INFO: looking at", object_name
    44     object_methods = filter(lambda x: this_object in x, cpp_output)
    45     object_methods = [a.strip() for a in object_methods]
    46     object_methods = filter(lambda x: not x.startswith('typedef'), object_methods)
    47     #for method in object_methods:
    48     #    print method
     38  for this_object in cpp_objects:
     39      lint = 0
     40   
     41      if this_object[-2:] == '_t':
     42          object_name = this_object[:-2]
     43      else:
     44          object_name = this_object
     45          write_msg("-- WARNING: %s does not end in _t" % this_object)
    4946
    50     new_methods = filter(lambda x: 'new_'+object_name in x, object_methods)
    51     if len(new_methods) > 1:
    52         print "-- WARNING: more than one new method for", object_name
    53         for method in new_methods:
    54             print method
    55     elif len(new_methods) < 1:
    56         print "-- WARNING: no new method for", object_name
    57     elif 0:
    58         for method in new_methods:
    59             print method
     47      if object_name[:len('aubio_')] != 'aubio_':
     48          write_msg("-- WARNING: %s does not start n aubio_" % this_object)
    6049
    61     del_methods = filter(lambda x: 'del_'+object_name in x, object_methods)
    62     if len(del_methods) > 1:
    63         print "-- WARNING: more than one del method for", object_name
    64         for method in del_methods:
    65             print method
    66     elif len(del_methods) < 1:
    67         print "-- WARNING: no del method for", object_name
     50      write_msg("-- INFO: looking at", object_name)
     51      object_methods = filter(lambda x: this_object in x, cpp_output)
     52      object_methods = [a.strip() for a in object_methods]
     53      object_methods = filter(lambda x: not x.startswith('typedef'), object_methods)
     54      #for method in object_methods:
     55      #    write_msg(method)
     56      new_methods = filter(lambda x: 'new_'+object_name in x, object_methods)
     57      if len(new_methods) > 1:
     58          write_msg("-- WARNING: more than one new method for", object_name)
     59          for method in new_methods:
     60              write_msg(method)
     61      elif len(new_methods) < 1:
     62          write_msg("-- WARNING: no new method for", object_name)
     63      elif 0:
     64          for method in new_methods:
     65              write_msg(method)
    6866
    69     do_methods = filter(lambda x: object_name+'_do' in x, object_methods)
    70     if len(do_methods) > 1:
    71         pass
    72         #print "-- WARNING: more than one do method for", object_name
    73         #for method in do_methods:
    74         #    print method
    75     elif len(do_methods) < 1:
    76         print "-- WARNING: no do method for", object_name
    77     elif 0:
    78         for method in do_methods:
    79             print method
     67      del_methods = filter(lambda x: 'del_'+object_name in x, object_methods)
     68      if len(del_methods) > 1:
     69          write_msg("-- WARNING: more than one del method for", object_name)
     70          for method in del_methods:
     71              write_msg(method)
     72      elif len(del_methods) < 1:
     73          write_msg("-- WARNING: no del method for", object_name)
    8074
    81     # check do methods return void
    82     for method in do_methods:
    83         if (method.split()[0] != 'void'):
    84             print "-- ERROR: _do method does not return void:", method
     75      do_methods = filter(lambda x: object_name+'_do' in x, object_methods)
     76      if len(do_methods) > 1:
     77          pass
     78          #write_msg("-- WARNING: more than one do method for", object_name)
     79          #for method in do_methods:
     80          #    write_msg(method)
     81      elif len(do_methods) < 1:
     82          write_msg("-- WARNING: no do method for", object_name)
     83      elif 0:
     84          for method in do_methods:
     85              write_msg(method)
    8586
    86     get_methods = filter(lambda x: object_name+'_get_' in x, object_methods)
     87      # check do methods return void
     88      for method in do_methods:
     89          if (method.split()[0] != 'void'):
     90              write_msg("-- ERROR: _do method does not return void:", method )
    8791
    88     set_methods = filter(lambda x: object_name+'_set_' in x, object_methods)
    89     for method in set_methods:
    90         if (method.split()[0] != 'uint_t'):
    91             print "-- ERROR: _set method does not return uint_t:", method
     92      get_methods = filter(lambda x: object_name+'_get_' in x, object_methods)
    9293
    93     other_methods = filter(lambda x: x not in new_methods, object_methods)
    94     other_methods = filter(lambda x: x not in del_methods, other_methods)
    95     other_methods = filter(lambda x: x not in    do_methods, other_methods)
    96     other_methods = filter(lambda x: x not in get_methods, other_methods)
    97     other_methods = filter(lambda x: x not in set_methods, other_methods)
     94      set_methods = filter(lambda x: object_name+'_set_' in x, object_methods)
     95      for method in set_methods:
     96          if (method.split()[0] != 'uint_t'):
     97              write_msg("-- ERROR: _set method does not return uint_t:", method )
    9898
    99     if len(other_methods) > 0:
    100         print "-- WARNING: some methods for", object_name, "were unidentified"
    101         for method in other_methods:
    102             print method
     99      other_methods = filter(lambda x: x not in new_methods, object_methods)
     100      other_methods = filter(lambda x: x not in del_methods, other_methods)
     101      other_methods = filter(lambda x: x not in    do_methods, other_methods)
     102      other_methods = filter(lambda x: x not in get_methods, other_methods)
     103      other_methods = filter(lambda x: x not in set_methods, other_methods)
    103104
    104     # generate this_object
    105     if not os.path.isdir('generated'): os.mkdir('generated')
    106     from gen_pyobject import *
    107     short_name = object_name[len('aubio_'):]
    108     if short_name in skip_objects:
    109             print "-- INFO: skipping object", short_name
    110             continue
    111     if 1: #try:
    112         s = gen_new_init(new_methods[0], short_name)
    113         s += gen_do(do_methods[0], short_name)
    114         s += gen_members(new_methods[0], short_name)
    115         s += gen_methods(get_methods, set_methods, short_name)
    116         s += gen_finish(short_name)
    117         fd = open('generated/gen-'+short_name+'.c', 'w')
    118         fd.write(s)
    119     #except Exception, e:
    120     #        print "-- ERROR:", type(e), str(e), "in", short_name
    121     #        continue
    122     generated_objects += [this_object]
     105      if len(other_methods) > 0:
     106          write_msg("-- WARNING: some methods for", object_name, "were unidentified")
     107          for method in other_methods:
     108              write_msg(method)
    123109
    124110
    125 s = """// generated list of generated objects
     111      # generate this_object
     112      if not os.path.isdir('generated'): os.mkdir('generated')
     113      short_name = object_name[len('aubio_'):]
     114      if short_name in skip_objects:
     115              write_msg("-- INFO: skipping object", short_name )
     116              continue
     117      if 1: #try:
     118          s = gen_new_init(new_methods[0], short_name)
     119          s += gen_do(do_methods[0], short_name)
     120          s += gen_members(new_methods[0], short_name)
     121          s += gen_methods(get_methods, set_methods, short_name)
     122          s += gen_finish(short_name)
     123          generated_filepath = 'generated/gen-'+short_name+'.c'
     124          fd = open(generated_filepath, 'w')
     125          fd.write(s)
     126      #except Exception, e:
     127      #        write_msg("-- ERROR:", type(e), str(e), "in", short_name)
     128      #        continue
     129      generated_objects += [this_object]
     130
     131  s = """// generated list of objects created with generator.py
    126132
    127133"""
    128134
    129 for each in generated_objects:
    130     s += "extern PyTypeObject Py_%sType;\n" % \
    131             each.replace('aubio_','').replace('_t','')
     135  for each in generated_objects:
     136      s += "extern PyTypeObject Py_%sType;\n" % \
     137              each.replace('aubio_','').replace('_t','')
    132138
    133 types_ready = []
    134 for each in generated_objects:
    135     types_ready.append("  PyType_Ready (&Py_%sType) < 0" % \
    136             each.replace('aubio_','').replace('_t','') )
     139  types_ready = []
     140  for each in generated_objects:
     141      types_ready.append("  PyType_Ready (&Py_%sType) < 0" % \
     142              each.replace('aubio_','').replace('_t','') )
    137143
    138 s += """
    139 int
    140 generated_types_ready (void)
    141 {
    142     return ("""
    143 s += ('||\n').join(types_ready)
    144 s += """);
    145 }
    146 """
     144  s += """
     145  int
     146  generated_types_ready (void)
     147  {
     148    return (
     149  """
     150  s += ('\n     ||').join(types_ready)
     151  s += """);
     152  }
     153  """
    147154
    148 s += """
    149 void
    150 add_generated_objects ( PyObject *m )
    151 {"""
    152 for each in generated_objects:
    153     s += """  Py_INCREF (&Py_%(name)sType);
    154   PyModule_AddObject (m, "%(name)s", (PyObject *) & Py_%(name)sType);""" % \
    155           { 'name': ( each.replace('aubio_','').replace('_t','') ) }
     155  s += """
     156  void
     157  add_generated_objects ( PyObject *m )
     158  {"""
     159  for each in generated_objects:
     160      s += """  Py_INCREF (&Py_%(name)sType);
     161    PyModule_AddObject (m, "%(name)s", (PyObject *) & Py_%(name)sType);""" % \
     162            { 'name': ( each.replace('aubio_','').replace('_t','') ) }
    156163
    157 s += """
    158 }"""
     164  s += """
     165  }"""
    159166
    160 fd = open('generated/aubio-generated.h', 'w')
    161 fd.write(s)
     167  fd = open('generated/aubio-generated.h', 'w')
     168  fd.write(s)
     169
     170  from os import listdir
     171  generated_files = listdir('generated')
     172  generated_files = filter(lambda x: x.endswith('.c'), generated_files)
     173  generated_files = ['generated/'+f for f in generated_files]
     174  return generated_files
     175
     176if __name__ == '__main__':
     177  generate_object_files()
Note: See TracChangeset for help on using the changeset viewer.