mirror of https://github.com/python/cpython
182 lines
6.8 KiB
Python
182 lines
6.8 KiB
Python
"""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
|