import sys, os, string
from distutils.msvccompiler import MSVCCompiler
+from distutils.bcppcompiler import BCPPCompiler
from distutils.errors import \
DistutilsExecError, DistutilsPlatformError, \
+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 ()
+
#----------------------------------------------------------------------
'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
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
('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) )
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