python/lib/gen_external.py: use os.path.join
[aubio.git] / python / lib / gen_external.py
index ce7f11b..2486994 100644 (file)
@@ -1,6 +1,9 @@
-import os
+import os, glob
 
-header = """// this file is generated! do not modify
+header = os.path.join('src', 'aubio.h')
+output_path = os.path.join('python', 'gen')
+
+source_header = """// this file is generated! do not modify
 #include "aubio-types.h"
 """
 
@@ -41,9 +44,9 @@ skip_objects = [
   ]
 
 
-def get_cpp_objects():
+def get_cpp_objects(header=header):
 
-    cpp_output = [l.strip() for l in os.popen('cpp -DAUBIO_UNSTABLE=1 -I../build/src ../src/aubio.h').readlines()]
+    cpp_output = [l.strip() for l in os.popen('cpp -DAUBIO_UNSTABLE=1 {:s}'.format(header)).readlines()]
     #cpp_output = [l.strip() for l in os.popen('cpp -DAUBIO_UNSTABLE=0 -I../build/src ../src/onset/onset.h').readlines()]
     #cpp_output = [l.strip() for l in os.popen('cpp -DAUBIO_UNSTABLE=0 -I../build/src ../src/pitch/pitch.h').readlines()]
 
@@ -66,10 +69,11 @@ def get_cpp_objects():
 
     return cpp_output, cpp_objects
 
-def generate_external(output_path):
-    os.mkdir(output_path)
+def generate_external(header=header, output_path=output_path, usedouble=False, overwrite=True):
+    if not os.path.isdir(output_path): os.mkdir(output_path)
+    elif overwrite == False: return glob.glob(os.path.join(output_path, '*.c'))
     sources_list = []
-    cpp_output, cpp_objects = get_cpp_objects()
+    cpp_output, cpp_objects = get_cpp_objects(header)
     lib = {}
 
     for o in cpp_objects:
@@ -120,10 +124,13 @@ def generate_external(output_path):
                 print ( "{:15s} {:10s} {:d}".format(o, family, len(lib[o][family]) ) )
     """
 
-    from .gen_code import MappedObject
+    try:
+        from .gen_code import MappedObject
+    except (SystemError, ValueError) as e:
+        from gen_code import MappedObject
     for o in lib:
-        out = header
-        mapped = MappedObject(lib[o])
+        out = source_header
+        mapped = MappedObject(lib[o], usedouble = usedouble)
         out += mapped.gen_code()
         output_file = os.path.join(output_path, 'gen-%s.c' % o)
         with open(output_file, 'w') as f:
@@ -131,7 +138,7 @@ def generate_external(output_path):
             print ("wrote %s" % output_file )
             sources_list.append(output_file)
 
-    out = header
+    out = source_header
     out += "#include \"aubio-generated.h\""
     check_types = "\n     ||  ".join(["PyType_Ready(&Py_%sType) < 0" % o for o in lib])
     out += """
@@ -160,10 +167,17 @@ void add_generated_objects ( PyObject *m )
         sources_list.append(output_file)
 
     objlist = "".join(["extern PyTypeObject Py_%sType;\n" % p for p in lib])
-    out = """
-// generated list of objects created with gen_external.py
-#include <Python.h>
+    out = """// generated list of objects created with gen_external.py
 
+#include <Python.h>
+"""
+    if usedouble:
+        out += """
+#ifndef HAVE_AUBIO_DOUBLE
+#define HAVE_AUBIO_DOUBLE 1
+#endif
+"""
+    out += """
 {objlist}
 int generated_objects ( void );
 void add_generated_objects( PyObject *m );
@@ -178,5 +192,7 @@ void add_generated_objects( PyObject *m );
     return sources_list
 
 if __name__ == '__main__':
-    output_path = 'gen'
-    generate_external(output_path)
+    import sys
+    if len(sys.argv) > 1: header = sys.argv[1]
+    if len(sys.argv) > 2: output_path = sys.argv[2]
+    generate_external(header, output_path)