Browse Source

separate out CompilationEnvironment structures

David Rose 16 years ago
parent
commit
d660b6934b
1 changed files with 155 additions and 143 deletions
  1. 155 143
      direct/src/showutil/FreezeTool.py

+ 155 - 143
direct/src/showutil/FreezeTool.py

@@ -40,92 +40,158 @@ reportedMissing = {}
 # Our own Python source trees to watch out for.
 sourceTrees = ['direct']
 
-# The command to compile a c to an object file.  Replace %(basename)s
-# with the basename of the source file, and an implicit .c extension.
-compileObj = 'error'
+class CompilationEnvironment:
+    """ Create an instance of this class to record the commands to
+    invoke the compiler on a given platform.  If needed, the caller
+    can create a custom instance of this class (or simply set the
+    compile strings directly) to customize the build environment. """
+
+    def __init__(self):
+        # The command to compile a c to an object file.  Replace %(basename)s
+        # with the basename of the source file, and an implicit .c extension.
+        self.compileObj = 'error'
+
+        # The command to link a single object file into an executable.  As
+        # above, replace $(basename)s with the basename of the original source
+        # file, and of the target executable.
+        self.linkExe = 'error'
+
+        # The command to link a single object file into a shared library.
+        self.linkDll = 'error'
+
+        # Paths to Python stuff.
+        self.Python = None
+        self.PythonIPath = get_python_inc()
+        self.PythonVersion = get_python_version()
+
+        # The VC directory of Microsoft Visual Studio (if relevant)
+        self.MSVC = None
+        # Directory to Windows Platform SDK (if relevant)
+        self.PSDK = None
+
+        # The setting to control release vs. debug builds.  Only relevant on
+        # Windows.
+        self.MD = None
+
+        # The _d extension to add to dll filenames on Windows in debug builds.
+        self.dllext = ''
+
+        self.determineStandardSetup()
+
+    def determineStandardSetup(self):
+        if sys.platform == 'win32':
+            self.Python = PREFIX
+
+            if ('VCINSTALLDIR' in os.environ):
+                self.MSVC = os.environ['VCINSTALLDIR']
+            elif (Filename('/c/Program Files/Microsoft Visual Studio 9.0/VC').exists()):
+                self.MSVC = Filename('/c/Program Files/Microsoft Visual Studio 9.0/VC').toOsSpecific()
+            elif (Filename('/c/Program Files/Microsoft Visual Studio .NET 2003/Vc7').exists()):
+                self.MSVC = Filename('/c/Program Files/Microsoft Visual Studio .NET 2003/Vc7').toOsSpecific()
+            else:
+                print 'Could not locate Microsoft Visual C++ Compiler! Try running from the Visual Studio Command Prompt.'
+                sys.exit(1)
+
+            if ('WindowsSdkDir' in os.environ):
+                self.PSDK = os.environ['WindowsSdkDir']
+            elif (platform.architecture()[0] == '32bit' and Filename('/c/Program Files/Microsoft Platform SDK for Windows Server 2003 R2').exists()):
+                self.PSDK = Filename('/c/Program Files/Microsoft Platform SDK for Windows Server 2003 R2').toOsSpecific()
+            elif (os.path.exists(os.path.join(self.MSVC, 'PlatformSDK'))):
+                self.PSDK = os.path.join(self.MSVC, 'PlatformSDK')
+            else:
+                print 'Could not locate the Microsoft Windows Platform SDK! Try running from the Visual Studio Command Prompt.'
+                sys.exit(1)
+
+            # We need to use the correct compiler setting for debug vs. release builds.
+            self.MD = '/MD'
+            if isDebugBuild:
+                self.MD = '/MDd'
+                self.dllext = '_d'
+
+            # If it is run by makepanda, it handles the MSVC and PlatformSDK paths itself.
+            if ('MAKEPANDA' in os.environ):
+                self.compileObj = 'cl /wd4996 /Fo%(basename)s.obj /nologo /c %(MD)s /Zi /O2 /Ob2 /EHsc /Zm300 /W3 /I"%(pythonIPath)s" %(filename)s'
+                self.linkExe = 'link /nologo /MAP:NUL /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO /LIBPATH:"%(python)s\libs"  /out:%(basename)s.exe %(basename)s.obj'
+                self.linkDll = 'link /nologo /DLL /MAP:NUL /FIXED:NO /OPT:REF /INCREMENTAL:NO /LIBPATH:"%(python)s\libs"  /out:%(basename)s%(dllext)s.pyd %(basename)s.obj'
+            else:
+                os.environ['PATH'] += ';' + self.MSVC + '\\bin;' + self.MSVC + '\\Common7\\IDE;' + self.PSDK + '\\bin'
 
-# The command to link a single object file into an executable.  As
-# above, replace $(basename)s with the basename of the original source
-# file, and of the target executable.
-linkExe = 'error'
+                self.compileObj = 'cl /wd4996 /Fo%(basename)s.obj /nologo /c %(MD)s /Zi /O2 /Ob2 /EHsc /Zm300 /W3 /I"%(pythonIPath)s" /I"%(PSDK)s\include" /I"%(MSVC)s\include" %(filename)s'
+                self.linkExe = 'link /nologo /MAP:NUL /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO /LIBPATH:"%(PSDK)s\lib" /LIBPATH:"%(MSVC)s\lib" /LIBPATH:"%(python)s\libs"  /out:%(basename)s.exe %(basename)s.obj'
+                self.linkDll = 'link /nologo /DLL /MAP:NUL /FIXED:NO /OPT:REF /INCREMENTAL:NO /LIBPATH:"%(PSDK)s\lib" /LIBPATH:"%(MSVC)s\lib" /LIBPATH:"%(python)s\libs"  /out:%(basename)s%(dllext)s.pyd %(basename)s.obj'
 
-# The command to link a single object file into a shared library.
-linkDll = 'error'
+        elif sys.platform == 'darwin':
+            # OSX
+            self.compileObj = "gcc -fPIC -c -o %(basename)s.o -O2 -I%(pythonIPath)s %(filename)s"
+            self.linkExe = "gcc -o %(basename)s %(basename)s.o -framework Python"
+            self.linkDll = "gcc -undefined dynamic_lookup -bundle -o %(basename)s.so %(basename)s.o"
 
-# Paths to Python stuff.
-Python = None
-PythonIPath = get_python_inc()
-PythonVersion = get_python_version()
+        else:
+            # Unix
+            self.compileObj = "gcc -fPIC -c -o %(basename)s.o -O2 %(filename)s -I %(pythonIPath)s"
+            self.linkExe = "gcc -o %(basename)s %(basename)s.o -lpython%(pythonVersion)s"
+            self.linkDll = "gcc -shared -o %(basename)s.so %(basename)s.o -lpython%(pythonVersion)s"
 
-# The VC directory of Microsoft Visual Studio (if relevant)
-MSVC = None
-# Directory to Windows Platform SDK (if relevant)
-PSDK = None
+            if (platform.uname()[1]=="pcbsd"):
+                self.linkExe += " -L/usr/PCBSD/local/lib"
+                self.linkDll += " -L/usr/PCBSD/local/lib"
 
-# The setting to control release vs. debug builds.  Only relevant on
-# Windows.
-MD = None
+    def compileExe(self, filename, basename):
+        compile = self.compileObj % {
+            'python' : self.Python,
+            'MSVC' : self.MSVC,
+            'PSDK' : self.PSDK,
+            'MD' : self.MD,
+            'pythonIPath' : self.PythonIPath,
+            'pythonVersion' : self.PythonVersion,
+            'filename' : filename,
+            'basename' : basename,
+            }
+        print >> sys.stderr, compile
+        if os.system(compile) != 0:
+            raise StandardError
 
-# The _d extension to add to dll filenames on Windows in debug builds.
-dllext = ''
+        link = self.linkExe % {
+            'python' : self.Python,
+            'MSVC' : self.MSVC,
+            'PSDK' : self.PSDK,
+            'pythonIPath' : self.PythonIPath,
+            'pythonVersion' : self.PythonVersion,
+            'filename' : filename,
+            'basename' : basename,
+            }
+        print >> sys.stderr, link
+        if os.system(link) != 0:
+            raise StandardError
 
+    def compileDll(self, filename, basename):
+        compile = self.compileObj % {
+            'python' : self.Python,
+            'MSVC' : self.MSVC,
+            'PSDK' : self.PSDK,
+            'MD' : self.MD,
+            'pythonIPath' : self.PythonIPath,
+            'pythonVersion' : self.PythonVersion,
+            'filename' : filename,
+            'basename' : basename,
+            }
+        print >> sys.stderr, compile
+        if os.system(compile) != 0:
+            raise StandardError
 
-if sys.platform == 'win32':
-    Python = PREFIX
-    
-    if ('VCINSTALLDIR' in os.environ):
-        MSVC = os.environ['VCINSTALLDIR']
-    elif (Filename('/c/Program Files/Microsoft Visual Studio 9.0/VC').exists()):
-        MSVC = Filename('/c/Program Files/Microsoft Visual Studio 9.0/VC').toOsSpecific()
-    elif (Filename('/c/Program Files/Microsoft Visual Studio .NET 2003/Vc7').exists()):
-        MSVC = Filename('/c/Program Files/Microsoft Visual Studio .NET 2003/Vc7').toOsSpecific()
-    else:
-        print 'Could not locate Microsoft Visual C++ Compiler! Try running from the Visual Studio Command Prompt.'
-        sys.exit(1)
-    
-    if ('WindowsSdkDir' in os.environ):
-        PSDK = os.environ['WindowsSdkDir']
-    elif (platform.architecture()[0] == '32bit' and Filename('/c/Program Files/Microsoft Platform SDK for Windows Server 2003 R2').exists()):
-        PSDK = Filename('/c/Program Files/Microsoft Platform SDK for Windows Server 2003 R2').toOsSpecific()
-    elif (os.path.exists(os.path.join(MSVC, 'PlatformSDK'))):
-        PSDK = os.path.join(MSVC, 'PlatformSDK')
-    else:
-        print 'Could not locate the Microsoft Windows Platform SDK! Try running from the Visual Studio Command Prompt.'
-        sys.exit(1)
-
-    # We need to use the correct compiler setting for debug vs. release builds.
-    MD = '/MD'
-    if isDebugBuild:
-        MD = '/MDd'
-        dllext = '_d'
-    
-    # If it is run by makepanda, it handles the MSVC and PlatformSDK paths itself.
-    if ('MAKEPANDA' in os.environ):
-        compileObj = 'cl /wd4996 /Fo%(basename)s.obj /nologo /c %(MD)s /Zi /O2 /Ob2 /EHsc /Zm300 /W3 /I"%(pythonIPath)s" %(filename)s'
-        linkExe = 'link /nologo /MAP:NUL /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO /LIBPATH:"%(python)s\libs"  /out:%(basename)s.exe %(basename)s.obj'
-        linkDll = 'link /nologo /DLL /MAP:NUL /FIXED:NO /OPT:REF /INCREMENTAL:NO /LIBPATH:"%(python)s\libs"  /out:%(basename)s%(dllext)s.pyd %(basename)s.obj'
-    else:
-        os.environ['PATH'] += ';' + MSVC + '\\bin;' + MSVC + '\\Common7\\IDE;' + PSDK + '\\bin'
-        
-        compileObj = 'cl /wd4996 /Fo%(basename)s.obj /nologo /c %(MD)s /Zi /O2 /Ob2 /EHsc /Zm300 /W3 /I"%(pythonIPath)s" /I"%(PSDK)s\include" /I"%(MSVC)s\include" %(filename)s'
-        linkExe = 'link /nologo /MAP:NUL /FIXED:NO /OPT:REF /STACK:4194304 /INCREMENTAL:NO /LIBPATH:"%(PSDK)s\lib" /LIBPATH:"%(MSVC)s\lib" /LIBPATH:"%(python)s\libs"  /out:%(basename)s.exe %(basename)s.obj'
-        linkDll = 'link /nologo /DLL /MAP:NUL /FIXED:NO /OPT:REF /INCREMENTAL:NO /LIBPATH:"%(PSDK)s\lib" /LIBPATH:"%(MSVC)s\lib" /LIBPATH:"%(python)s\libs"  /out:%(basename)s%(dllext)s.pyd %(basename)s.obj'
-
-elif sys.platform == 'darwin':
-    # OSX
-    compileObj = "gcc -fPIC -c -o %(basename)s.o -O2 -I%(pythonIPath)s %(filename)s"
-    linkExe = "gcc -o %(basename)s %(basename)s.o -framework Python"
-    linkDll = "gcc -undefined dynamic_lookup -bundle -o %(basename)s.so %(basename)s.o"
-
-else:
-    # Unix
-    compileObj = "gcc -fPIC -c -o %(basename)s.o -O2 %(filename)s -I %(pythonIPath)s"
-    linkExe = "gcc -o %(basename)s %(basename)s.o -lpython%(pythonVersion)s"
-    linkDll = "gcc -shared -o %(basename)s.so %(basename)s.o -lpython%(pythonVersion)s"
-    
-    if (platform.uname()[1]=="pcbsd"):
-        linkExe += " -L/usr/PCBSD/local/lib"
-        linkDll += " -L/usr/PCBSD/local/lib"
+        link = self.linkDll % {
+            'python' : self.Python,
+            'MSVC' : self.MSVC,
+            'PSDK' : self.PSDK,
+            'pythonIPath' : self.PythonIPath,
+            'pythonVersion' : self.PythonVersion,
+            'filename' : filename,
+            'basename' : basename,
+            'dllext' : self.dllext,
+            }
+        print >> sys.stderr, link
+        if os.system(link) != 0:
+            raise StandardError
 
 # The code from frozenmain.c in the Python source repository.
 frozenMainCode = """
@@ -459,11 +525,11 @@ class Freezer:
         # if untrue.
         self.platform = sys.platform
 
-        # You will also need to change these for a cross-compiler
-        # situation.
-        self.compileObj = compileObj
-        self.linkExe = linkExe
-        self.linkDll = linkDll
+        # This is the compilation environment.  Fill in your own
+        # object here if you have custom needs (for instance, for a
+        # cross-compiler or something).  If this is None, then a
+        # default object will be created when it is needed.
+        self.cenv = None
 
         # The filename extension to append to the source file before
         # compiling.
@@ -1134,6 +1200,9 @@ class Freezer:
             dllexport = '__declspec(dllexport) '
             dllimport = '__declspec(dllimport) '
 
+        if not self.cenv:
+            self.cenv = CompilationEnvironment()
+            
         if compileToExe:
             code = self.frozenMainCode
             if self.platform == 'win32':
@@ -1150,11 +1219,11 @@ class Freezer:
             else:
                 target = basename
 
-            compileFunc = self.compileExe
+            compileFunc = self.cenv.compileExe
             
         else:
             if self.platform == 'win32':
-                target = basename + dllext + '.pyd'
+                target = basename + self.cenv.dllext + '.pyd'
             else:
                 target = basename + '.so'
             
@@ -1164,7 +1233,7 @@ class Freezer:
                 'dllexport' : dllexport,
                 'dllimport' : dllimport,
                 }
-            compileFunc = self.compileDll
+            compileFunc = self.cenv.compileDll
 
         text = programFile % {
             'moduleDefs' : '\n'.join(moduleDefs),
@@ -1186,63 +1255,6 @@ class Freezer:
         
         return target
 
-    def compileExe(self, filename, basename):
-        compile = self.compileObj % {
-            'python' : Python,
-            'MSVC' : MSVC,
-            'PSDK' : PSDK,
-            'MD' : MD,
-            'pythonIPath' : PythonIPath,
-            'pythonVersion' : PythonVersion,
-            'filename' : filename,
-            'basename' : basename,
-            }
-        print >> sys.stderr, compile
-        if os.system(compile) != 0:
-            raise StandardError
-
-        link = self.linkExe % {
-            'python' : Python,
-            'MSVC' : MSVC,
-            'PSDK' : PSDK,
-            'pythonIPath' : PythonIPath,
-            'pythonVersion' : PythonVersion,
-            'filename' : filename,
-            'basename' : basename,
-            }
-        print >> sys.stderr, link
-        if os.system(link) != 0:
-            raise StandardError
-
-    def compileDll(self, filename, basename):
-        compile = self.compileObj % {
-            'python' : Python,
-            'MSVC' : MSVC,
-            'PSDK' : PSDK,
-            'MD' : MD,
-            'pythonIPath' : PythonIPath,
-            'pythonVersion' : PythonVersion,
-            'filename' : filename,
-            'basename' : basename,
-            }
-        print >> sys.stderr, compile
-        if os.system(compile) != 0:
-            raise StandardError
-
-        link = self.linkDll % {
-            'python' : Python,
-            'MSVC' : MSVC,
-            'PSDK' : PSDK,
-            'pythonIPath' : PythonIPath,
-            'pythonVersion' : PythonVersion,
-            'filename' : filename,
-            'basename' : basename,
-            'dllext' : dllext,
-            }
-        print >> sys.stderr, link
-        if os.system(link) != 0:
-            raise StandardError
-
     def makeModuleDef(self, mangledName, code):
         result = ''
         result += 'static unsigned char %s[] = {' % (mangledName)