Revision: 828
http://python-ogre.svn.sourceforge.net/python-ogre/?rev=828&view=rev
Author: andy_miller
Date: 2008-12-05 07:54:34 +0000 (Fri, 05 Dec 2008)
Log Message:
-----------
First version of Canvas code generator
Added Paths:
-----------
trunk/python-ogre/code_generators/canvas/
trunk/python-ogre/code_generators/canvas/customization_data.py
trunk/python-ogre/code_generators/canvas/generate_code.py
trunk/python-ogre/code_generators/canvas/hand_made_wrappers.py
trunk/python-ogre/code_generators/canvas/python_canvas.h
trunk/python-ogre/code_generators/canvas/python_canvas_aliases.h
trunk/python-ogre/code_generators/canvas/python_canvas_sizeof.h
Added: trunk/python-ogre/code_generators/canvas/customization_data.py
===================================================================
--- trunk/python-ogre/code_generators/canvas/customization_data.py (rev 0)
+++ trunk/python-ogre/code_generators/canvas/customization_data.py 2008-12-05 07:54:34 UTC (rev 828)
@@ -0,0 +1,7 @@
+
+def header_files( version ):
+ return [ 'Canvas.h']
+
+def huge_classes( version ):
+ return []
+
\ No newline at end of file
Added: trunk/python-ogre/code_generators/canvas/generate_code.py
===================================================================
--- trunk/python-ogre/code_generators/canvas/generate_code.py (rev 0)
+++ trunk/python-ogre/code_generators/canvas/generate_code.py 2008-12-05 07:54:34 UTC (rev 828)
@@ -0,0 +1,303 @@
+#!/usr/bin/env python
+# -----------------------------------------------------------------------------
+# This source file is part of Python-Ogre and is covered by the LGPL
+# For the latest info, see http://python-ogre.org/
+#
+# -----------------------------------------------------------------------------
+
+## STARTER TEMPLATE..
+## replace mygui with lowercase project name
+## set MAIN_NAMESPACE
+## rename and configure .h files
+
+
+import os, sys, time, shutil
+try:
+ import psyco
+ psyco.full()
+except ImportError:
+ pass
+
+#add environment to the path
+sys.path.append( os.path.join( '..', '..' ) )
+#add common utils to the pass
+sys.path.append( '..' )
+sys.path.append( '.' )
+
+import environment
+import common_utils
+import customization_data
+import hand_made_wrappers
+
+
+from pygccxml import parser
+from pygccxml import declarations
+from pyplusplus import messages
+from pyplusplus import module_builder
+from pyplusplus import decl_wrappers
+
+from pyplusplus import function_transformers as ft
+from pyplusplus.module_builder import call_policies
+from pyplusplus.module_creator import sort_algorithms
+
+import common_utils.extract_documentation as exdoc
+import common_utils.var_checker as varchecker
+import common_utils.ogre_properties as ogre_properties
+from common_utils import docit
+
+MAIN_NAMESPACE = 'CanvasNS'
+
+############################################################
+##
+## Here is where we manually exclude stuff
+##
+############################################################
+
+def ManualExclude ( mb ):
+ global_ns = mb.global_ns
+ if MAIN_NAMESPACE:
+ main_ns = global_ns.namespace( MAIN_NAMESPACE )
+ else:
+ main_ns = global_ns
+
+############################################################
+##
+## And there are things that manually need to be INCLUDED
+##
+############################################################
+
+def ManualInclude ( mb ):
+ global_ns = mb.global_ns
+ if MAIN_NAMESPACE:
+ main_ns = global_ns.namespace( MAIN_NAMESPACE )
+ else:
+ main_ns = global_ns
+
+############################################################
+##
+## And things that need manual fixes, but not necessarly hand wrapped
+##
+############################################################
+def ManualFixes ( mb ):
+ global_ns = mb.global_ns
+ if MAIN_NAMESPACE:
+ main_ns = global_ns.namespace( MAIN_NAMESPACE )
+ else:
+ main_ns = global_ns
+ for c in main_ns.constructors('Fill'):
+ if not c.arguments: continue
+ if c.arguments[-1].name=='orientation':
+ c.arguments[-1].default_value='CanvasNS::Coloring::Vertical'
+ print "Fixed Dafault value for :", c
+
+
+############################################################
+##
+## And things that need to have their argument and call values fixed.
+## ie functions that pass pointers in the argument list and of course we need
+## to read the updated values - so instead we pass them back
+## as new values in a tuple (ETC ETC)
+##
+############################################################
+
+def ManualTransformations ( mb ):
+ global_ns = mb.global_ns
+ if MAIN_NAMESPACE:
+ main_ns = global_ns.namespace( MAIN_NAMESPACE )
+ else:
+ main_ns = global_ns
+
+ def create_output( size ):
+ return [ ft.output( i ) for i in range( size ) ]
+
+
+###############################################################################
+##
+## Now for the AUTOMATIC stuff that should just work
+##
+###############################################################################
+
+def AutoFixes ( mb, MAIN_NAMESPACE ):
+ """ now we fix a range of things automatically - typically by going through
+ the entire name space trying to guess stuff and fix it:)
+ """
+ global_ns = mb.global_ns
+ if MAIN_NAMESPACE:
+ main_ns = global_ns.namespace( MAIN_NAMESPACE )
+ else:
+ main_ns = global_ns
+
+# # # Functions that have void pointers in their argument list need to change to unsigned int's
+# # pointee_types=[]
+# # ignore_names=[]
+# # common_utils.Fix_Void_Ptr_Args ( main_ns ) # , pointee_types, ignore_names )
+
+ # and change functions that return a variety of pointers to instead return unsigned int's
+ pointee_types=[]
+ ignore_names=[] # these are function names we know it's cool to exclude
+ common_utils.Fix_Pointer_Returns ( main_ns ) # , pointee_types, ignore_names )
+
+ # functions that need to have implicit conversions turned off
+ ImplicitClasses=[]
+ common_utils.Fix_Implicit_Conversions ( main_ns, ImplicitClasses )
+
+ if os.name =='nt':
+ Fix_NT( mb )
+ elif os.name =='posix':
+ Fix_Posix( mb )
+
+ common_utils.Auto_Document( mb, MAIN_NAMESPACE )
+
+
+###############################################################################
+##
+## here are the helper functions that do much of the work
+##
+###############################################################################
+def Fix_Posix ( mb ):
+ """ fixup for posix specific stuff -- note only expect to be called on a posix machine
+ """
+ ## we could do more here if need be...
+ if sys.platform == 'darwin':
+ pass
+ elif sys.platform.startswith ('linux'):
+ pass
+
+
+def Fix_NT ( mb ):
+ """ fixup for NT systems
+ """
+
+
+#
+# the 'main'function
+#
+def generate_code():
+# messages.disable(
+## Warnings 1020 - 1031 are all about why Py++ generates wrapper for class X
+# messages.W1020
+# , messages.W1021
+# , messages.W1022
+# , messages.W1023
+# , messages.W1024
+# , messages.W1025
+# , messages.W1026
+# , messages.W1027
+# , messages.W1028
+# , messages.W1029
+# , messages.W1030
+# , messages.W1031
+# , messages.W1035
+# , messages.W1040
+# , messages.W1038
+# , messages.W1041
+# , messages.W1036 # pointer to Python immutable member
+# , messages.W1033 # unnamed variables
+# , messages.W1018 # expose unnamed classes
+# , messages.W1049 # returns reference to local variable
+# , messages.W1014 # unsupported '=' operator
+# )
+ #
+ # Use GCCXML to create the controlling XML file.
+ # If the cache file (../cache/*.xml) doesn't exist it gets created, otherwise it just gets loaded
+ # NOTE: If you update the source library code you need to manually delete the cache .XML file
+ #
+ xml_cached_fc = parser.create_cached_source_fc(
+ os.path.join( environment.canvas.root_dir, "python_canvas.h" )
+ , environment.canvas.cache_file )
+
+ defined_symbols = ['WIN32','OGRE_NONCLIENT_BUILD', 'OGRE_GCC_VISIBILITY', '__PYTHONOGRE_BUILD_CODE']
+
+ defined_symbols.append( 'VERSION_' + environment.canvas.version )
+
+ if environment._USE_THREADS:
+ defined_symbols.append('BOOST_HAS_THREADS')
+ if environment.isWindows():
+ defined_symbols.append('BOOST_HAS_WINTHREADS')
+
+ #
+ # build the core Py++ system from the GCCXML created source
+ #
+ mb = module_builder.module_builder_t( [ xml_cached_fc ]
+ , gccxml_path=environment.gccxml_bin
+ , working_directory=environment.root_dir
+ , include_paths=environment.canvas.include_dirs
+ , define_symbols=defined_symbols
+ , indexing_suite_version=2
+ , cflags=environment.canvas.cflags
+ )
+
+ # if this module depends on another set it here
+ mb.register_module_dependency ( environment.ogre.generated_dir )
+
+ # normally implicit conversions work OK, however they can cause strange things to happen so safer to leave off
+ mb.constructors().allow_implicit_conversion = False
+
+ mb.BOOST_PYTHON_MAX_ARITY = 25
+ mb.classes().always_expose_using_scope = True
+
+ #
+ # We filter (both include and exclude) specific classes and functions that we want to wrap
+ #
+ global_ns = mb.global_ns
+ global_ns.exclude()
+ main_ns = global_ns.namespace( MAIN_NAMESPACE )
+ main_ns.include()
+
+ common_utils.AutoExclude ( mb, MAIN_NAMESPACE )
+ ManualExclude ( mb )
+ common_utils.AutoInclude ( mb, MAIN_NAMESPACE )
+ ManualInclude ( mb )
+ # here we fixup functions that expect to modifiy their 'passed' variables
+ ManualTransformations ( mb )
+ AutoFixes ( mb, MAIN_NAMESPACE )
+ ManualFixes ( mb )
+
+ common_utils.Auto_Functional_Transformation ( main_ns, special_vars=['::Ogre::Real &','::Ogre::ushort &','size_t &'] )
+
+ #
+ # We need to tell boost how to handle calling (and returning from) certain functions
+ #
+ common_utils.Set_DefaultCall_Policies ( mb.global_ns.namespace ( MAIN_NAMESPACE ) )
+
+ #
+ # the manual stuff all done here !!!
+ #
+ hand_made_wrappers.apply( mb )
+
+ NoPropClasses = [""]
+ for cls in main_ns.classes():
+ if cls.name not in NoPropClasses:
+ cls.add_properties( recognizer=ogre_properties.ogre_property_recognizer_t() )
+
+ ## add additional version information to the module to help identify it correctly
+ common_utils.addDetailVersion ( mb, environment, environment.canvas )
+
+ ##########################################################################################
+ #
+ # Creating the code. After this step you should not modify/customize declarations.
+ #
+ ##########################################################################################
+ extractor = exdoc.doc_extractor() # I'm excluding the UTFstring docs as lots about nothing
+ mb.build_code_creator (module_name='_canvas_' , doc_extractor= extractor )
+
+ for inc in environment.canvas.include_dirs:
+ mb.code_creator.user_defined_directories.append(inc )
+ mb.code_creator.user_defined_directories.append( environment.canvas.generated_dir )
+ mb.code_creator.replace_included_headers( customization_data.header_files( environment.canvas.version ) )
+
+ huge_classes = map( mb.class_, customization_data.huge_classes( environment.canvas.version ) )
+
+ mb.split_module(environment.canvas.generated_dir, huge_classes, use_files_sum_repository=False)
+
+ ## now we need to ensure a series of headers and additional source files are
+ ## copied to the generated directory..
+
+ common_utils.copyTree ( sourcePath = environment.Config.PATH_INCLUDE_canvas,
+ destPath = environment.canvas.generated_dir,
+ recursive=False )
+
+if __name__ == '__main__':
+ start_time = time.clock()
+ generate_code()
+ print 'Source code was updated( %f minutes ).' % ( ( time.clock() - start_time )/60 )
Added: trunk/python-ogre/code_generators/canvas/hand_made_wrappers.py
===================================================================
--- trunk/python-ogre/code_generators/canvas/hand_made_wrappers.py (rev 0)
+++ trunk/python-ogre/code_generators/canvas/hand_made_wrappers.py 2008-12-05 07:54:34 UTC (rev 828)
@@ -0,0 +1,15 @@
+import os
+import environment
+
+
+
+#################################################################################################
+#################################################################################################
+
+def apply_reg ( class_, code ):
+ for c in code:
+ class_.add_registration_code ( c )
+
+def apply( mb ):
+ pass
+
\ No newline at end of file
Added: trunk/python-ogre/code_generators/canvas/python_canvas.h
===================================================================
--- trunk/python-ogre/code_generators/canvas/python_canvas.h (rev 0)
+++ trunk/python-ogre/code_generators/canvas/python_canvas.h 2008-12-05 07:54:34 UTC (rev 828)
@@ -0,0 +1,19 @@
+
+#include "Canvas.h"
+
+// First we create a magic namespace to hold all our aliases
+namespace pyplusplus { namespace aliases {
+
+ #include "python_canvas_aliases.h"
+} }
+
+// then we exposed everything needed (and more) to ensure GCCXML makes them visible to Py++
+//
+namespace python_canvas{ namespace details{
+inline void instantiate(){
+ using namespace CanvasNS;
+ #include "python_canvas_sizeof.h"
+
+} } }
+
+
Added: trunk/python-ogre/code_generators/canvas/python_canvas_aliases.h
===================================================================
--- trunk/python-ogre/code_generators/canvas/python_canvas_aliases.h (rev 0)
+++ trunk/python-ogre/code_generators/canvas/python_canvas_aliases.h 2008-12-05 07:54:34 UTC (rev 828)
@@ -0,0 +1 @@
+// typedef name nicename;
Added: trunk/python-ogre/code_generators/canvas/python_canvas_sizeof.h
===================================================================
--- trunk/python-ogre/code_generators/canvas/python_canvas_sizeof.h (rev 0)
+++ trunk/python-ogre/code_generators/canvas/python_canvas_sizeof.h 2008-12-05 07:54:34 UTC (rev 828)
@@ -0,0 +1 @@
+// sizeof ( variable );
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|