--- /dev/null
+"""distutils.cygwinccompiler
+
+Contains the CygwinCCompiler class, a subclass of UnixCCompiler that handles
+the Gnu Win32 C compiler.
+It also contains the Mingw32CCompiler class which handles the mingw32 compiler
+(same as cygwin in no-cygwin mode.)
+
+"""
+
+# created 2000/05/05, Rene Liebscher
+
+__revision__ = "$Id$"
+
+import os,sys,string,tempfile
+from distutils import sysconfig
+from distutils.unixccompiler import UnixCCompiler
+
+# Because these compilers aren't configured in Python's config.h file by default
+# we should at least warn the user if he used this unmodified version.
+def check_if_config_h_is_gcc_ready():
+ """ checks, if the gcc-compiler is mentioned in config.h
+ if it is not, compiling probably doesn't work """
+ from distutils import sysconfig
+ import string,sys
+ try:
+ # It would probably better to read single lines to search.
+ # But we do this only once, and it is fast enough
+ f=open(sysconfig.get_config_h_filename())
+ s=f.read()
+ f.close()
+ try:
+ string.index(s,"__GNUC__") # is somewhere a #ifdef __GNUC__ or something similar
+ except:
+ sys.stderr.write ("warning: Python's config.h doesn't seem to support your compiler.\n")
+ except: # unspecific error => ignore
+ pass
+
+
+# This is called when the module is imported, so we make this check only once
+check_if_config_h_is_gcc_ready()
+
+
+# XXX Things not currently handled:
+# * see UnixCCompiler
+
+class CygwinCCompiler (UnixCCompiler):
+
+ compiler_type = 'cygwin'
+
+ def __init__ (self,
+ verbose=0,
+ dry_run=0,
+ force=0):
+
+ UnixCCompiler.__init__ (self, verbose, dry_run, force)
+
+ # our compiler uses other names
+ self.cc='gcc'
+ self.ld_shared='dllwrap'
+ self.ldflags_shared=[]
+
+ # some variables to manage the differences between cygwin and mingw32
+ self.dllwrap_options=["--target=i386-cygwin32"]
+ # specification of entry point is not necessary
+
+ self.dll_additional_libraries=[
+ # cygwin shouldn't need msvcrt, but without the dll's will crash
+ # perhaps something about initialization (Python uses it, too)
+ # mingw32 needs it in all cases
+ "msvcrt"
+ ]
+
+ # __init__ ()
+
+ def link_shared_object (self,
+ 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):
+
+ if libraries==None:
+ libraries=[]
+
+ python_library=["python"+str(sys.hexversion>>24)+str((sys.hexversion>>16)&0xff)]
+ libraries=libraries+python_library+self.dll_additional_libraries
+
+ # if you don't need the def-file afterwards, it is
+ # better to use for it tempfile.mktemp() as its name
+ # (unix-style compilers don't like backslashes in filenames)
+ win_dll_def_file=string.replace(tempfile.mktemp(),"\\","/")
+ #win_dll_def_file=output_filename[:-len(self.shared_lib_extension)]+".def"
+ #win_dll_exp_file=output_filename[:-len(self.shared_lib_extension)]+".exp"
+ #win_dll_lib_file=output_filename[:-len(self.shared_lib_extension)]+".a"
+
+ # Make .def file
+ # (It would probably better to check if we really need this, but for this we had to
+ # insert some unchanged parts of UnixCCompiler, and this is not what I want.)
+ f=open(win_dll_def_file,"w")
+ f.write("EXPORTS\n") # intro
+ # always export a function "init"+module_name
+ if not debug:
+ f.write("init"+os.path.basename(output_filename)[:-len(self.shared_lib_extension)]+"\n")
+ else: # in debug mode outfile_name is something like XXXXX_d.pyd
+ f.write("init"+os.path.basename(output_filename)[:-(len(self.shared_lib_extension)+2)]+"\n")
+ # if there are more symbols to export
+ # insert code here to write them in f
+ if export_symbols!=None:
+ for sym in export_symbols:
+ f.write(sym+"\n")
+ f.close()
+
+ if extra_preargs==None:
+ extra_preargs=[]
+
+ extra_preargs=extra_preargs+[
+ #"--verbose",
+ #"--output-exp",win_dll_exp_file,
+ #"--output-lib",win_dll_lib_file,
+ "--def",win_dll_def_file
+ ]+ self.dllwrap_options
+
+ # who wants symbols and a many times greater output file
+ # should explicitely switch the debug mode on
+ # otherwise we let dllwrap strip the outputfile
+ # (On my machine unstripped_file=stripped_file+254KB
+ # 10KB < stripped_file < ??100KB )
+ if not debug:
+ extra_preargs=extra_preargs+["-s"]
+
+ try:
+ UnixCCompiler.link_shared_object(self,
+ objects,
+ output_filename,
+ output_dir,
+ libraries,
+ library_dirs,
+ runtime_library_dirs,
+ None, # export_symbols, we do this with our def-file
+ debug,
+ extra_preargs,
+ extra_postargs)
+ finally:
+ # we don't need the def-file anymore
+ os.remove(win_dll_def_file)
+
+ # link_shared_object ()
+
+# class CygwinCCompiler
+
+# the same as cygwin plus some additional parameters
+class Mingw32CCompiler (CygwinCCompiler):
+
+ compiler_type = 'mingw32'
+
+ def __init__ (self,
+ verbose=0,
+ dry_run=0,
+ force=0):
+
+ CygwinCCompiler.__init__ (self, verbose, dry_run, force)
+
+ self.ccflags = self.ccflags + ["-mno-cygwin"]
+ self.dllwrap_options=[
+ # mingw32 doesn't really need 'target'
+ # and cygwin too (it seems, it is enough
+ # to specify a different entry point)
+ #"--target=i386-mingw32",
+ "--entry","_DllMain@12"
+ ]
+ # no additional libraries need
+ # (only msvcrt, which is already added by CygwinCCompiler)
+
+ # __init__ ()
+
+# class Mingw32CCompiler