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
This commit is contained in:
parent
d74525f764
commit
22d0828959
@ -2,6 +2,7 @@
|
|||||||
import sys, os, string
|
import sys, os, string
|
||||||
|
|
||||||
from distutils.msvccompiler import MSVCCompiler
|
from distutils.msvccompiler import MSVCCompiler
|
||||||
|
from distutils.bcppcompiler import BCPPCompiler
|
||||||
|
|
||||||
from distutils.errors import \
|
from distutils.errors import \
|
||||||
DistutilsExecError, DistutilsPlatformError, \
|
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')
|
'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...
|
# make it look like it is part of the package...
|
||||||
import my_distutils
|
import my_distutils
|
||||||
sys.modules['distutils.my_distutils'] = my_distutils
|
sys.modules['distutils.my_distutils'] = my_distutils
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
# Run SWIG the way I want it done
|
# Run SWIG the way I want it done
|
||||||
|
|
||||||
|
@ -73,6 +73,15 @@ wxpExtensions = []
|
|||||||
force = '--force' in sys.argv or '-f' in sys.argv
|
force = '--force' in sys.argv or '-f' in sys.argv
|
||||||
debug = '--debug' in sys.argv or '-g' 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
|
# Check for build flags on the command line
|
||||||
@ -142,6 +151,23 @@ if os.name == 'nt':
|
|||||||
('WXP_USE_THREAD', '1'),
|
('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:
|
if not FINAL or HYBRID:
|
||||||
defines.append( ('__WXDEBUG__', None) )
|
defines.append( ('__WXDEBUG__', None) )
|
||||||
|
|
||||||
@ -155,18 +181,37 @@ if os.name == 'nt':
|
|||||||
wxdll = 'wx' + WXDLLVER + 'd'
|
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',
|
'winspool', 'winmm', 'shell32', 'oldnames', 'comctl32',
|
||||||
'ctl3d32', 'odbc32', 'ole32', 'oleaut32', 'uuid', 'rpcrt4',
|
'ctl3d32', 'odbc32', 'ole32', 'oleaut32', 'uuid', 'rpcrt4',
|
||||||
'advapi32', 'wsock32']
|
'advapi32', 'wsock32']
|
||||||
|
|
||||||
|
|
||||||
cflags = ['/GX-'] # workaround for internal compiler error in MSVC 5
|
cflags = ['/GX-'] # workaround for internal compiler error in MSVC 5
|
||||||
lflags = None
|
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']
|
cflags = cflags + ['/Od', '/Z7']
|
||||||
lflags = ['/DEBUG', ]
|
lflags = ['/DEBUG', ]
|
||||||
|
|
||||||
|
elif bcpp_compiling and not FINAL:
|
||||||
|
cflags = cflags + ['/Od', '/v', '/y']
|
||||||
|
lflags = lflags + ['/v', ] ## '/PDB:NONE']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
elif os.name == 'posix':
|
elif os.name == 'posix':
|
||||||
# Set flags for Unix type platforms
|
# Set flags for Unix type platforms
|
||||||
|
Loading…
Reference in New Issue
Block a user