]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied patch for building with Borland C++ (untested by me)
authorRobin Dunn <robin@alldunn.com>
Mon, 2 Apr 2001 03:37:08 +0000 (03:37 +0000)
committerRobin Dunn <robin@alldunn.com>
Mon, 2 Apr 2001 03:37:08 +0000 (03:37 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9630 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

wxPython/my_distutils.py
wxPython/setup.py

index a40ff6f66e2dd11b003306b8892833f8c238a89f..84edd6b547919f955cfa80a4887a7b3ca4fd2d72 100644 (file)
@@ -2,6 +2,7 @@
 import sys, os, string
 
 from distutils.msvccompiler import MSVCCompiler
+from distutils.bcppcompiler import BCPPCompiler
 
 from distutils.errors import \
      DistutilsExecError, DistutilsPlatformError, \
@@ -115,6 +116,232 @@ class MyMSVCCompiler(MSVCCompiler):
 
 
 
+from distutils.file_util import write_file
+class MyBCPPCompiler(BCPPCompiler):
+
+    ##------------------------------------------------------------
+    ## Override the entire compile method just to add flags to the
+    ## RC command.  There should be an easier way to do this from
+    ## distutils directly or in a derived class...
+    ##------------------------------------------------------------
+
+    def compile (self,
+                 sources,
+                 output_dir=None,
+                 macros=None,
+                 include_dirs=None,
+                 debug=0,
+                 extra_preargs=None,
+                 extra_postargs=None):
+
+        (output_dir, macros, include_dirs) = \
+            self._fix_compile_args (output_dir, macros, include_dirs)
+        (objects, skip_sources) = self._prep_compile (sources, output_dir)
+
+        if extra_postargs is None:
+            extra_postargs = []
+
+        pp_opts = gen_preprocess_options (macros, include_dirs)
+        compile_opts = extra_preargs or []
+        compile_opts.append ('-c')
+        if debug:
+            compile_opts.extend (self.compile_options_debug)
+        else:
+            compile_opts.extend (self.compile_options)
+
+        for i in range (len (sources)):
+            src = sources[i] ; obj = objects[i]
+            ext = (os.path.splitext (src))[1]
+
+            if skip_sources[src]:
+                self.announce ("skipping %s (%s up-to-date)" % (src, obj))
+            else:
+                src = os.path.normpath(src)
+                obj = os.path.normpath(obj)
+                self.mkpath(os.path.dirname(obj))
+
+                if ext == '.res':
+                    # This is already a binary file -- skip it.
+                    continue # the 'for' loop
+                if ext == '.rc':
+                    # This needs to be compiled to a .res file -- do it now.
+                    try:
+                        self.spawn (["brcc32"] + pp_opts + ["-fo"] +
+                               [obj] + [src]) ### RPD changed this lines only
+                    except DistutilsExecError, msg:
+                        raise CompileError, msg
+                    continue # the 'for' loop
+
+                # The next two are both for the real compiler.
+                if ext in self._c_extensions:
+                    input_opt = ""
+                elif ext in self._cpp_extensions:
+                    input_opt = "-P"
+                else:
+                    # Unknown file type -- no extra options.  The compiler
+                    # will probably fail, but let it just in case this is a
+                    # file the compiler recognizes even if we don't.
+                    input_opt = ""
+
+                output_opt = "-o" + obj
+
+                # Compiler command line syntax is: "bcc32 [options] file(s)".
+                # Note that the source file names must appear at the end of
+                # the command line.
+                try:
+                    self.spawn ([self.cc] + compile_opts + pp_opts +
+                                [input_opt, output_opt] +
+                                extra_postargs + [src])
+                except DistutilsExecError, msg:
+                    raise CompileError, msg
+
+        return objects
+
+    # compile ()
+
+    ####################################################################
+    # Now we need to replace cw32mt library used by default by distutils
+    # with cw32mti library as in wxWindows DLL make file
+    # Othervise we obtain Windows "Core dump" ;-).
+    #
+    #          Evgeny A Cherkashin <eugeneai@icc.ru>
+    #
+    ####################################################################
+
+    def link (self,
+              target_desc,
+              objects,
+              output_filename,
+              output_dir=None,
+              libraries=None,
+              library_dirs=None,
+              runtime_library_dirs=None,
+              export_symbols=None,
+              debug=0,
+              extra_preargs=None,
+              extra_postargs=None,
+              build_temp=None):
+
+        # XXX this ignores 'build_temp'!  should follow the lead of
+        # msvccompiler.py
+
+        (objects, output_dir) = self._fix_object_args (objects, output_dir)
+        (libraries, library_dirs, runtime_library_dirs) = \
+            self._fix_lib_args (libraries, library_dirs, runtime_library_dirs)
+
+        if runtime_library_dirs:
+            self.warn ("I don't know what to do with 'runtime_library_dirs': "
+                       + str (runtime_library_dirs))
+
+        if output_dir is not None:
+            output_filename = os.path.join (output_dir, output_filename)
+
+        if self._need_link (objects, output_filename):
+
+            # Figure out linker args based on type of target.
+            if target_desc == CCompiler.EXECUTABLE:
+                startup_obj = 'c0w32'
+                if debug:
+                    ld_args = self.ldflags_exe_debug[:]
+                else:
+                    ld_args = self.ldflags_exe[:]
+            else:
+                startup_obj = 'c0d32'
+                if debug:
+                    ld_args = self.ldflags_shared_debug[:]
+                else:
+                    ld_args = self.ldflags_shared[:]
+
+
+            # Create a temporary exports file for use by the linker
+            if export_symbols is None:
+                def_file = ''
+            else:
+                head, tail = os.path.split (output_filename)
+                modname, ext = os.path.splitext (tail)
+                temp_dir = os.path.dirname(objects[0]) # preserve tree structure
+                def_file = os.path.join (temp_dir, '%s.def' % modname)
+                contents = ['EXPORTS']
+                for sym in (export_symbols or []):
+                    contents.append('  %s=_%s' % (sym, sym))
+                self.execute(write_file, (def_file, contents),
+                             "writing %s" % def_file)
+
+            # Borland C++ has problems with '/' in paths
+            objects2 = map(os.path.normpath, objects)
+            # split objects in .obj and .res files
+            # Borland C++ needs them at different positions in the command line
+            objects = [startup_obj]
+            resources = []
+            for file in objects2:
+                (base, ext) = os.path.splitext(os.path.normcase(file))
+                if ext == '.res':
+                    resources.append(file)
+                else:
+                    objects.append(file)
+
+
+            for l in library_dirs:
+                ld_args.append("/L%s" % os.path.normpath(l))
+            ld_args.append("/L.") # we sometimes use relative paths
+
+            # list of object files
+            ld_args.extend(objects)
+
+            # XXX the command-line syntax for Borland C++ is a bit wonky;
+            # certain filenames are jammed together in one big string, but
+            # comma-delimited.  This doesn't mesh too well with the
+            # Unix-centric attitude (with a DOS/Windows quoting hack) of
+            # 'spawn()', so constructing the argument list is a bit
+            # awkward.  Note that doing the obvious thing and jamming all
+            # the filenames and commas into one argument would be wrong,
+            # because 'spawn()' would quote any filenames with spaces in
+            # them.  Arghghh!.  Apparently it works fine as coded...
+
+            # name of dll/exe file
+            ld_args.extend([',',output_filename])
+            # no map file and start libraries
+            ld_args.append(',,')
+
+            for lib in libraries:
+                # see if we find it and if there is a bcpp specific lib
+                # (xxx_bcpp.lib)
+                libfile = self.find_library_file(library_dirs, lib, debug)
+                if libfile is None:
+                    ld_args.append(lib)
+                    # probably a BCPP internal library -- don't warn
+                    #    self.warn('library %s not found.' % lib)
+                else:
+                    # full name which prefers bcpp_xxx.lib over xxx.lib
+                    ld_args.append(libfile)
+
+            # some default libraries
+            ld_args.append ('import32')
+            ld_args.append ('cw32mti') ### mt->mti (as in wx2)
+
+            # def file for export symbols
+            ld_args.extend([',',def_file])
+            # add resource files
+            ld_args.append(',')
+            ld_args.extend(resources)
+
+
+            if extra_preargs:
+                ld_args[:0] = extra_preargs
+            if extra_postargs:
+                ld_args.extend(extra_postargs)
+
+            self.mkpath (os.path.dirname (output_filename))
+            try:
+                self.spawn ([self.linker] + ld_args)
+            except DistutilsExecError, msg:
+                raise LinkError, msg
+
+        else:
+            self.announce ("skipping %s (up-to-date)" % output_filename)
+
+    # link ()
+
 
 
 #----------------------------------------------------------------------
@@ -128,13 +355,15 @@ ccompiler.compiler_class['my_msvc'] = ('my_distutils',
                                        'My MSVC derived class')
 
 
+ccompiler.compiler_class['my_bcpp'] = ('my_distutils',
+                                       'MyBCPPCompiler',
+                                       'My BCPP derived class')
+
 # make it look like it is part of the package...
 import my_distutils
 sys.modules['distutils.my_distutils'] = my_distutils
 
 
-
-
 #----------------------------------------------------------------------
 # Run SWIG the way I want it done
 
index fd12fe6f941e6e7ecea31f983470f90f37e7a01e..cac623400a737238348114b1a9d7fd84990cf618 100755 (executable)
@@ -73,6 +73,15 @@ wxpExtensions = []
 force = '--force' in sys.argv or '-f' in sys.argv
 debug = '--debug' in sys.argv or '-g' in sys.argv
 
+bcpp_compiling = '-c' in sys.argv and 'my_bcpp' in sys.argv # Bad heuristic
+
+if bcpp_compiling:
+    print "Compiling wxPython by Borland C/C++ Compiler"
+    HYBRID=0
+    WXBCPPLIBVER = string.replace(WXDLLVER,"_","")
+    # Version part of BCPP build LIBRARY name
+    WXDLLVER="" # no dll ver path avaible
+
 
 #----------------------------------------------------------------------
 # Check for build flags on the command line
@@ -142,6 +151,23 @@ if os.name == 'nt':
                 ('WXP_USE_THREAD', '1'),
                 ]
 
+    if bcpp_compiling:  # overwrite it
+        defines = [
+            ('_WINDOWS', None),
+            ('WINVER', '0x0400'),
+            ('STRICT', None),
+
+            ('WXUSINGDLL', '1'),
+
+            ('SWIG_GLOBAL', None),
+            ('HAVE_CONFIG_H', None),
+            ('WXP_USE_THREAD', '1'),
+
+            ('WXUSE_DEFINE','1'),
+            ('_RTLDLL',None),
+            ]
+
+
     if not FINAL or HYBRID:
         defines.append( ('__WXDEBUG__', None) )
 
@@ -155,18 +181,37 @@ if os.name == 'nt':
         wxdll = 'wx' + WXDLLVER + 'd'
 
 
-    libs = [wxdll, 'kernel32', 'user32', 'gdi32', 'comdlg32',
+    libs = [wxdll]
+    if bcpp_compiling:
+        libs = ['wx'+WXBCPPLIBVER]
+
+    libs = libs + ['kernel32', 'user32', 'gdi32', 'comdlg32',
             'winspool', 'winmm', 'shell32', 'oldnames', 'comctl32',
             'ctl3d32', 'odbc32', 'ole32', 'oleaut32', 'uuid', 'rpcrt4',
             'advapi32', 'wsock32']
 
+
     cflags = ['/GX-']  # workaround for internal compiler error in MSVC 5
     lflags = None
 
-    if not FINAL and HYBRID:
+
+    if bcpp_compiling:  # overwrite it
+        cflags = ['-5', '-VF',  ### To supplort MSVC spurious semicolons in the class scope
+                  ### else, all semicolons at the end of all DECLARE_...CALLBACK... macros must be eliminated
+                  '-Hc', '-H='+WXDIR+'\src\msw\wx32.csm',
+                  '@'+WXDIR+'\src\msw\wxwin32.cfg'
+                  ]
+
+
+    if not FINAL and HYBRID and not bcpp_compiling:
         cflags = cflags + ['/Od', '/Z7']
         lflags = ['/DEBUG', ]
 
+    elif bcpp_compiling and not FINAL:
+        cflags = cflags + ['/Od', '/v', '/y']
+        lflags = lflags + ['/v', ]   ## '/PDB:NONE']
+
+
 
 elif os.name == 'posix':
     # Set flags for Unix type platforms