Browse Source

omitted file

David Rose 21 years ago
parent
commit
cff6a5b6f3
1 changed files with 183 additions and 0 deletions
  1. 183 0
      direct/src/ffi/DoGenPyCode.py

+ 183 - 0
direct/src/ffi/DoGenPyCode.py

@@ -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)