From: Robin Dunn Date: Mon, 2 Apr 2001 03:37:08 +0000 (+0000) Subject: Applied patch for building with Borland C++ (untested by me) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/22d08289596acb73ca3f1af4d3ced0a43a9051e8 Applied patch for building with Borland C++ (untested by me) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9630 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/wxPython/my_distutils.py b/wxPython/my_distutils.py index a40ff6f66e..84edd6b547 100644 --- a/wxPython/my_distutils.py +++ b/wxPython/my_distutils.py @@ -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 + # + #################################################################### + + 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 diff --git a/wxPython/setup.py b/wxPython/setup.py index fd12fe6f94..cac623400a 100755 --- a/wxPython/setup.py +++ b/wxPython/setup.py @@ -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