diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/distutils/cygwinccompiler.py | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py new file mode 100644 index 0000000..cc2ed5d --- /dev/null +++ b/Lib/distutils/cygwinccompiler.py @@ -0,0 +1,181 @@ +"""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 |