|
@@ -0,0 +1,183 @@
|
|
|
|
|
+""" This module implements genPyCode, which is itself a generated
|
|
|
|
|
+script with a few default parameters filled in. This module allows
|
|
|
|
|
+the user to specify alternate parameters on the command line. """
|
|
|
|
|
+
|
|
|
|
|
+import getopt
|
|
|
|
|
+import sys
|
|
|
|
|
+import os
|
|
|
|
|
+import glob
|
|
|
|
|
+from direct.ffi import FFIConstants
|
|
|
|
|
+
|
|
|
|
|
+# Define a help string for the user
|
|
|
|
|
+helpString ="""
|
|
|
|
|
+genPyCode -h
|
|
|
|
|
+genPyCode
|
|
|
|
|
+genPyCode [opts] -i libdtoolconfig libcode1 libcode2 ...
|
|
|
|
|
+
|
|
|
|
|
+This script generates Python wrappers to interface with the C++
|
|
|
|
|
+libraries that have already been run through interrogate. It is
|
|
|
|
|
+necessary to run this script after building the Panda tools for the
|
|
|
|
|
+first time, or after any major change in which some of the interface
|
|
|
|
|
+may have changed.
|
|
|
|
|
+
|
|
|
|
|
+The default options are baked into genPyCode by ppremake and need not
|
|
|
|
|
+be specified. However, it is possible to override these on the
|
|
|
|
|
+command line if you need to fine-tune the behavior of genPyCode for
|
|
|
|
|
+some reason. Most often, the only needed change will be to add one or
|
|
|
|
|
+more additional libraries to the list of libraries instrumented by
|
|
|
|
|
+default.
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+Options:
|
|
|
|
|
+ -h print this message
|
|
|
|
|
+ -v verbose
|
|
|
|
|
+ -d dir directory to write output code
|
|
|
|
|
+ -x dir directory to pull extension code from
|
|
|
|
|
+ -i lib interrogate library
|
|
|
|
|
+ -e dir directory to search for *.in files (may be repeated)
|
|
|
|
|
+ -O no C++ comments or assertion statements
|
|
|
|
|
+ -n Don't use squeezeTool to squeeze the result into one .pyz file
|
|
|
|
|
+
|
|
|
|
|
+Any additional names listed on the command line are taken to be names
|
|
|
|
|
+of libraries that are to be instrumented.
|
|
|
|
|
+
|
|
|
|
|
+"""
|
|
|
|
|
+
|
|
|
|
|
+# Initialize variables
|
|
|
|
|
+outputDir = ''
|
|
|
|
|
+extensionsDir = ''
|
|
|
|
|
+interrogateLib = ''
|
|
|
|
|
+codeLibs = []
|
|
|
|
|
+doSqueeze = True
|
|
|
|
|
+etcPath = []
|
|
|
|
|
+
|
|
|
|
|
+def doGetopts():
|
|
|
|
|
+ global outputDir
|
|
|
|
|
+ global extensionsDir
|
|
|
|
|
+ global interrogateLib
|
|
|
|
|
+ global codeLibs
|
|
|
|
|
+ global doSqueeze
|
|
|
|
|
+ global etcPath
|
|
|
|
|
+
|
|
|
|
|
+ # These options are allowed but are ignored (they are deprecated with
|
|
|
|
|
+ # the new genPyCode script):
|
|
|
|
|
+
|
|
|
|
|
+ # -g adds libgateway
|
|
|
|
|
+ # -t adds libtoontown
|
|
|
|
|
+ # -p adds libpirates
|
|
|
|
|
+ # -o adds libopt
|
|
|
|
|
+
|
|
|
|
|
+ FFIConstants.notify.setDebug(0)
|
|
|
|
|
+ FFIConstants.notify.setInfo(0)
|
|
|
|
|
+
|
|
|
|
|
+ # Extract the args the user passed in
|
|
|
|
|
+ try:
|
|
|
|
|
+ opts, pargs = getopt.getopt(sys.argv[1:], 'hvOd:x:i:e:ngtpo')
|
|
|
|
|
+ except Exception, e:
|
|
|
|
|
+ # User passed in a bad option, print the error and the help, then exit
|
|
|
|
|
+ print e
|
|
|
|
|
+ print helpString
|
|
|
|
|
+ sys.exit()
|
|
|
|
|
+
|
|
|
|
|
+ # Store the option values into our variables
|
|
|
|
|
+ for opt in opts:
|
|
|
|
|
+ flag, value = opt
|
|
|
|
|
+ if (flag == '-h'):
|
|
|
|
|
+ print helpString
|
|
|
|
|
+ sys.exit()
|
|
|
|
|
+ elif (flag == '-v'):
|
|
|
|
|
+ if not FFIConstants.notify.getInfo():
|
|
|
|
|
+ FFIConstants.notify.setInfo(1)
|
|
|
|
|
+ else:
|
|
|
|
|
+ FFIConstants.notify.setDebug(1)
|
|
|
|
|
+ elif (flag == '-d'):
|
|
|
|
|
+ outputDir = value
|
|
|
|
|
+ elif (flag == '-x'):
|
|
|
|
|
+ extensionsDir = value
|
|
|
|
|
+ elif (flag == '-i'):
|
|
|
|
|
+ interrogateLib = value
|
|
|
|
|
+ elif (flag == '-e'):
|
|
|
|
|
+ etcPath.append(value)
|
|
|
|
|
+ elif (flag == '-O'):
|
|
|
|
|
+ FFIConstants.wantComments = 0
|
|
|
|
|
+ FFIConstants.wantTypeChecking = 0
|
|
|
|
|
+ elif (flag == '-n'):
|
|
|
|
|
+ doSqueeze = False
|
|
|
|
|
+ elif (flag in ['-g', '-t', '-p', '-o']):
|
|
|
|
|
+ FFIConstants.notify.warning("option is deprecated: %s" % (flag))
|
|
|
|
|
+
|
|
|
|
|
+ else:
|
|
|
|
|
+ FFIConstants.notify.error('illegal option: ' + flag)
|
|
|
|
|
+
|
|
|
|
|
+ # Check for old, no-longer-used parameter:
|
|
|
|
|
+ invalidParameters = [
|
|
|
|
|
+ 'linux', 'win-debug', 'win-release', 'win-publish',
|
|
|
|
|
+ 'install', 'release'
|
|
|
|
|
+ ]
|
|
|
|
|
+ if pargs and pargs[0] in invalidParameters:
|
|
|
|
|
+ FFIConstants.notify.warning("parameter is deprecated: %s" % (pargs[0]))
|
|
|
|
|
+ del pargs[0]
|
|
|
|
|
+
|
|
|
|
|
+ # Store the program arguments into the codeLibs
|
|
|
|
|
+ codeLibs += pargs
|
|
|
|
|
+
|
|
|
|
|
+def doErrorCheck():
|
|
|
|
|
+ global outputDir
|
|
|
|
|
+ global extensionsDir
|
|
|
|
|
+ global interrogateLib
|
|
|
|
|
+ global codeLibs
|
|
|
|
|
+ global doSqueeze
|
|
|
|
|
+ global etcPath
|
|
|
|
|
+
|
|
|
|
|
+ # Now do some error checking and verbose output
|
|
|
|
|
+ if (not interrogateLib):
|
|
|
|
|
+ FFIConstants.notify.error('You must specify an interrogate library (-i lib)')
|
|
|
|
|
+ else:
|
|
|
|
|
+ FFIConstants.notify.debug('Setting interrogate library to: ' + interrogateLib)
|
|
|
|
|
+ FFIConstants.InterrogateModuleName = interrogateLib
|
|
|
|
|
+
|
|
|
|
|
+ if (not outputDir):
|
|
|
|
|
+ FFIConstants.notify.info('Setting output directory to current directory')
|
|
|
|
|
+ outputDir = '.'
|
|
|
|
|
+ elif (not os.path.exists(outputDir)):
|
|
|
|
|
+ FFIConstants.notify.info('Directory does not exist, creating: ' + outputDir)
|
|
|
|
|
+ os.mkdir(outputDir)
|
|
|
|
|
+ FFIConstants.notify.info('Setting output directory to: ' + outputDir)
|
|
|
|
|
+ else:
|
|
|
|
|
+ FFIConstants.notify.info('Setting output directory to: ' + outputDir)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ if (not extensionsDir):
|
|
|
|
|
+ FFIConstants.notify.debug('Setting extensions directory to current directory')
|
|
|
|
|
+ extensionsDir = '.'
|
|
|
|
|
+ elif (not os.path.exists(extensionsDir)):
|
|
|
|
|
+ FFIConstants.notify.error('Directory does not exist: ' + extensionsDir)
|
|
|
|
|
+ else:
|
|
|
|
|
+ FFIConstants.notify.debug('Setting extensions directory to: ' + extensionsDir)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ if (not codeLibs):
|
|
|
|
|
+ FFIConstants.notify.error('You must specify one or more libraries to generate code from')
|
|
|
|
|
+ else:
|
|
|
|
|
+ FFIConstants.notify.debug('Generating code for: ' + `codeLibs`)
|
|
|
|
|
+ FFIConstants.CodeModuleNameList = codeLibs
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def run():
|
|
|
|
|
+ global outputDir
|
|
|
|
|
+ global extensionsDir
|
|
|
|
|
+ global interrogateLib
|
|
|
|
|
+ global codeLibs
|
|
|
|
|
+ global doSqueeze
|
|
|
|
|
+ global etcPath
|
|
|
|
|
+
|
|
|
|
|
+ doGetopts()
|
|
|
|
|
+ doErrorCheck()
|
|
|
|
|
+
|
|
|
|
|
+ # Ok, now we can start generating code
|
|
|
|
|
+ from direct.ffi import FFIInterrogateDatabase
|
|
|
|
|
+ db = FFIInterrogateDatabase.FFIInterrogateDatabase(etcPath = etcPath)
|
|
|
|
|
+ db.generateCode(outputDir, extensionsDir)
|
|
|
|
|
+
|
|
|
|
|
+ if doSqueeze:
|
|
|
|
|
+ db.squeezeGeneratedCode(outputDir)
|