summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/distutils/cygwinccompiler.py208
1 files changed, 113 insertions, 95 deletions
diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py
index cc2ed5d..7d43f02 100644
--- a/Lib/distutils/cygwinccompiler.py
+++ b/Lib/distutils/cygwinccompiler.py
@@ -1,48 +1,55 @@
"""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.)
-
+Provides the CygwinCCompiler class, a subclass of UnixCCompiler that
+handles the Cygwin port of the GNU C compiler to Windows. It also contains
+the Mingw32CCompiler class which handles the mingw32 port of GCC (same as
+cygwin in no-cygwin mode).
"""
# created 2000/05/05, Rene Liebscher
__revision__ = "$Id$"
-import os,sys,string,tempfile
+import os,sys,string
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
+# Because these compilers aren't configured in Python's config.h file by
+# default we should at least warn the user if he is using a unmodified
+# version.
+
+def check_config_h():
+ """Checks if the GCC compiler is mentioned in config.h. If it is not,
+ compiling probably doesn't work, so print a warning to stderr.
+ """
+
+ # XXX the result of the check should be returned!
+
+ 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:
- # 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
+ # is somewhere a #ifdef __GNUC__ or something similar
+ string.index(s,"__GNUC__")
+ except ValueError:
+ sys.stderr.write ("warning: "+
+ "Python's config.h doesn't seem to support your compiler.\n")
+ except IOError:
+ # if we can't read this file, we cannot say it is wrong
+ # the compiler will complain later about this file as missing
+ pass
# This is called when the module is imported, so we make this check only once
-check_if_config_h_is_gcc_ready()
+# XXX why not make it only when the compiler is needed?
+check_config_h()
-# XXX Things not currently handled:
-# * see UnixCCompiler
-
class CygwinCCompiler (UnixCCompiler):
compiler_type = 'cygwin'
@@ -54,21 +61,22 @@ class CygwinCCompiler (UnixCCompiler):
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)
+ # Hard-code GCC because that's what this is all about.
+ # XXX optimization, warnings etc. should be customizable.
+ self.set_executables(compiler='gcc -O -Wall',
+ compiler_so='gcc -O -Wall',
+ linker_exe='gcc',
+ linker_so='dllwrap --target=i386-cygwin32')
+
+ # cygwin and mingw32 need different sets of libraries
+ self.dll_libraries=[
+ # cygwin shouldn't need msvcrt,
+ # but without the dll's will crash
+ # ( gcc version 2.91.57 )
+ # perhaps something about initialization
# mingw32 needs it in all cases
- "msvcrt"
- ]
+ "msvcrt"
+ ]
# __init__ ()
@@ -80,79 +88,88 @@ class CygwinCCompiler (UnixCCompiler):
library_dirs=None,
runtime_library_dirs=None,
export_symbols=None,
- debug=0,
+ debug=0,
extra_preargs=None,
- extra_postargs=None):
+ extra_postargs=None,
+ build_temp=None):
- if libraries==None:
- libraries=[]
+ 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"
+ # Additional libraries: the python library is always needed on
+ # Windows we need the python version without the dot, eg. '15'
+
+ pythonlib = ("python%d%d" %
+ (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
+ libraries.append(pythonlib)
+ libraries.extend(self.dll_libraries)
+
+ # name of extension
+
+ # XXX WRONG WRONG WRONG
+ # this is NOT the place to make guesses about Python namespaces;
+ # that MUST be done in build_ext.py
+
+ if not debug:
+ ext_name = os.path.basename(output_filename)[:-len(".pyd")]
+ else:
+ ext_name = os.path.basename(output_filename)[:-len("_d.pyd")]
+
+ def_file = os.path.join(build_temp, ext_name + ".def")
+ #exp_file = os.path.join(build_temp, ext_name + ".exp")
+ #lib_file = os.path.join(build_temp, 'lib' + ext_name + ".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")
+ # (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 we want.)
+ f = open(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:
+ if export_symbols == None:
+ # export a function "init" + ext_name
+ f.write("init" + ext_name + "\n")
+ else:
+ # if there are more symbols to export write them into f
for sym in export_symbols:
- f.write(sym+"\n")
+ f.write(sym+"\n")
f.close()
- if extra_preargs==None:
- extra_preargs=[]
+ if extra_preargs == None:
+ extra_preargs = []
- extra_preargs=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
+ #"--output-exp",exp_file,
+ #"--output-lib",lib_file,
+ "--def",def_file
+ ]
- # who wants symbols and a many times greater output file
+ # who wants symbols and a many times larger output file
# should explicitely switch the debug mode on
- # otherwise we let dllwrap strip the outputfile
- # (On my machine unstripped_file=stripped_file+254KB
+ # otherwise we let dllwrap strip the output file
+ # (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,
+ extra_preargs = extra_preargs + ["-s"]
+
+ 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
+ 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)
+ extra_postargs,
+ build_temp)
# link_shared_object ()
# class CygwinCCompiler
+
# the same as cygwin plus some additional parameters
class Mingw32CCompiler (CygwinCCompiler):
@@ -165,14 +182,15 @@ class Mingw32CCompiler (CygwinCCompiler):
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"
- ]
+ self.set_executables(compiler='gcc -mno-cygwin -O -Wall',
+ compiler_so='gcc -mno-cygwin -O -Wall',
+ linker_exe='gcc -mno-cygwin',
+ linker_so='dllwrap'
+ + ' --target=i386-mingw32'
+ + ' --entry _DllMain@12')
+ # mingw32 doesn't really need 'target' and cygwin too (it seems,
+ # it is enough to specify a different entry point)
+
# no additional libraries need
# (only msvcrt, which is already added by CygwinCCompiler)