Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
9273ec72
Kaydet (Commit)
9273ec72
authored
Şub 06, 2002
tarafından
Marc-André Lemburg
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Forgot to add the new emxccompiler.py from Andrew I. MacIntyre's
distutils patch for OS/2. Here it is...
üst
dc724d6e
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
334 additions
and
0 deletions
+334
-0
emxccompiler.py
Lib/distutils/emxccompiler.py
+334
-0
No files found.
Lib/distutils/emxccompiler.py
0 → 100644
Dosyayı görüntüle @
9273ec72
"""distutils.emxccompiler
Provides the EMXCCompiler class, a subclass of UnixCCompiler that
handles the EMX port of the GNU C compiler to OS/2.
"""
# issues:
#
# * OS/2 insists that DLLs can have names no longer than 8 characters
# We put export_symbols in a def-file, as though the DLL can have
# an arbitrary length name, but truncate the output filename.
#
# * only use OMF objects and use LINK386 as the linker (-Zomf)
#
# * always build for multithreading (-Zmt) as the accompanying OS/2 port
# of Python is only distributed with threads enabled.
#
# tested configurations:
#
# * EMX gcc 2.81/EMX 0.9d fix03
# created 2001/5/7, Andrew MacIntyre, from Rene Liebscher's cywinccompiler.py
__revision__
=
"$Id$"
import
os
,
sys
,
copy
from
distutils.ccompiler
import
gen_preprocess_options
,
gen_lib_options
from
distutils.unixccompiler
import
UnixCCompiler
from
distutils.file_util
import
write_file
from
distutils.errors
import
DistutilsExecError
,
CompileError
,
UnknownFileError
class
EMXCCompiler
(
UnixCCompiler
):
compiler_type
=
'emx'
obj_extension
=
".obj"
static_lib_extension
=
".lib"
shared_lib_extension
=
".dll"
static_lib_format
=
"
%
s
%
s"
shared_lib_format
=
"
%
s
%
s"
res_extension
=
".res"
# compiled resource file
exe_extension
=
".exe"
def
__init__
(
self
,
verbose
=
0
,
dry_run
=
0
,
force
=
0
):
UnixCCompiler
.
__init__
(
self
,
verbose
,
dry_run
,
force
)
(
status
,
details
)
=
check_config_h
()
self
.
debug_print
(
"Python's GCC status:
%
s (details:
%
s)"
%
(
status
,
details
))
if
status
is
not
CONFIG_H_OK
:
self
.
warn
(
"Python's pyconfig.h doesn't seem to support your compiler. "
+
(
"Reason:
%
s."
%
details
)
+
"Compiling may fail because of undefined preprocessor macros."
)
(
self
.
gcc_version
,
self
.
ld_version
)
=
\
get_versions
()
self
.
debug_print
(
self
.
compiler_type
+
": gcc
%
s, ld
%
s
\n
"
%
(
self
.
gcc_version
,
self
.
ld_version
)
)
# Hard-code GCC because that's what this is all about.
# XXX optimization, warnings etc. should be customizable.
self
.
set_executables
(
compiler
=
'gcc -Zomf -Zmt -O2 -Wall'
,
compiler_so
=
'gcc -Zomf -Zmt -O2 -Wall'
,
linker_exe
=
'gcc -Zomf -Zmt -Zcrtdll'
,
linker_so
=
'gcc -Zomf -Zmt -Zcrtdll -Zdll'
)
# want the gcc library statically linked (so that we don't have
# to distribute a version dependent on the compiler we have)
self
.
dll_libraries
=
[
"gcc"
]
# __init__ ()
# not much different of the compile method in UnixCCompiler,
# but we have to insert some lines in the middle of it, so
# we put here a adapted version of it.
# (If we would call compile() in the base class, it would do some
# initializations a second time, this is why all is done here.)
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
)
# Figure out the options for the compiler command line.
pp_opts
=
gen_preprocess_options
(
macros
,
include_dirs
)
cc_args
=
pp_opts
+
[
'-c'
]
if
debug
:
cc_args
[:
0
]
=
[
'-g'
]
if
extra_preargs
:
cc_args
[:
0
]
=
extra_preargs
if
extra_postargs
is
None
:
extra_postargs
=
[]
# Compile all source files that weren't eliminated by
# '_prep_compile()'.
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
:
self
.
mkpath
(
os
.
path
.
dirname
(
obj
))
if
ext
==
'.rc'
:
# gcc requires '.rc' compiled to binary ('.res') files !!!
try
:
self
.
spawn
([
"rc"
,
"-r"
,
src
])
except
DistutilsExecError
,
msg
:
raise
CompileError
,
msg
else
:
# for other files use the C-compiler
try
:
self
.
spawn
(
self
.
compiler_so
+
cc_args
+
[
src
,
'-o'
,
obj
]
+
extra_postargs
)
except
DistutilsExecError
,
msg
:
raise
CompileError
,
msg
# Return *all* object filenames, not just the ones we just built.
return
objects
# compile ()
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
):
# use separate copies, so we can modify the lists
extra_preargs
=
copy
.
copy
(
extra_preargs
or
[])
libraries
=
copy
.
copy
(
libraries
or
[])
objects
=
copy
.
copy
(
objects
or
[])
# Additional libraries
libraries
.
extend
(
self
.
dll_libraries
)
# handle export symbols by creating a def-file
# with executables this only works with gcc/ld as linker
if
((
export_symbols
is
not
None
)
and
(
target_desc
!=
self
.
EXECUTABLE
)):
# (The linker doesn't do anything if output is up-to-date.
# So 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.)
# we want to put some files in the same directory as the
# object files are, build_temp doesn't help much
# where are the object files
temp_dir
=
os
.
path
.
dirname
(
objects
[
0
])
# name of dll to give the helper files the same base name
(
dll_name
,
dll_extension
)
=
os
.
path
.
splitext
(
os
.
path
.
basename
(
output_filename
))
# generate the filenames for these files
def_file
=
os
.
path
.
join
(
temp_dir
,
dll_name
+
".def"
)
lib_file
=
os
.
path
.
join
(
temp_dir
,
dll_name
+
".lib"
)
# Generate .def file
contents
=
[
"LIBRARY
%
s INITINSTANCE TERMINSTANCE"
%
os
.
path
.
splitext
(
os
.
path
.
basename
(
output_filename
))[
0
],
"DATA MULTIPLE NONSHARED"
,
"EXPORTS"
]
for
sym
in
export_symbols
:
contents
.
append
(
' "
%
s"'
%
sym
)
self
.
execute
(
write_file
,
(
def_file
,
contents
),
"writing
%
s"
%
def_file
)
# next add options for def-file and to creating import libraries
# for gcc/ld the def-file is specified as any other object files
objects
.
append
(
def_file
)
#end: if ((export_symbols is not None) and
# (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
# who wants symbols and a many times larger output file
# should explicitly switch the debug mode on
# otherwise we let dllwrap/ld strip the output file
# (On my machine: 10KB < stripped_file < ??100KB
# unstripped_file = stripped_file + XXX KB
# ( XXX=254 for a typical python extension))
if
not
debug
:
extra_preargs
.
append
(
"-s"
)
UnixCCompiler
.
link
(
self
,
target_desc
,
objects
,
output_filename
,
output_dir
,
libraries
,
library_dirs
,
runtime_library_dirs
,
None
,
# export_symbols, we do this in our def-file
debug
,
extra_preargs
,
extra_postargs
,
build_temp
)
# link ()
# -- Miscellaneous methods -----------------------------------------
# overwrite the one from CCompiler to support rc and res-files
def
object_filenames
(
self
,
source_filenames
,
strip_dir
=
0
,
output_dir
=
''
):
if
output_dir
is
None
:
output_dir
=
''
obj_names
=
[]
for
src_name
in
source_filenames
:
# use normcase to make sure '.rc' is really '.rc' and not '.RC'
(
base
,
ext
)
=
os
.
path
.
splitext
(
os
.
path
.
normcase
(
src_name
))
if
ext
not
in
(
self
.
src_extensions
+
[
'.rc'
]):
raise
UnknownFileError
,
\
"unknown file type '
%
s' (from '
%
s')"
%
\
(
ext
,
src_name
)
if
strip_dir
:
base
=
os
.
path
.
basename
(
base
)
if
ext
==
'.rc'
:
# these need to be compiled to object files
obj_names
.
append
(
os
.
path
.
join
(
output_dir
,
base
+
self
.
res_extension
))
else
:
obj_names
.
append
(
os
.
path
.
join
(
output_dir
,
base
+
self
.
obj_extension
))
return
obj_names
# object_filenames ()
# class EMXCCompiler
# Because these compilers aren't configured in Python's pyconfig.h file by
# default, we should at least warn the user if he is using a unmodified
# version.
CONFIG_H_OK
=
"ok"
CONFIG_H_NOTOK
=
"not ok"
CONFIG_H_UNCERTAIN
=
"uncertain"
def
check_config_h
():
"""Check if the current Python installation (specifically, pyconfig.h)
appears amenable to building extensions with GCC. Returns a tuple
(status, details), where 'status' is one of the following constants:
CONFIG_H_OK
all is well, go ahead and compile
CONFIG_H_NOTOK
doesn't look good
CONFIG_H_UNCERTAIN
not sure -- unable to read pyconfig.h
'details' is a human-readable string explaining the situation.
Note there are two ways to conclude "OK": either 'sys.version' contains
the string "GCC" (implying that this Python was built with GCC), or the
installed "pyconfig.h" contains the string "__GNUC__".
"""
# XXX since this function also checks sys.version, it's not strictly a
# "pyconfig.h" check -- should probably be renamed...
from
distutils
import
sysconfig
import
string
# if sys.version contains GCC then python was compiled with
# GCC, and the pyconfig.h file should be OK
if
string
.
find
(
sys
.
version
,
"GCC"
)
>=
0
:
return
(
CONFIG_H_OK
,
"sys.version mentions 'GCC'"
)
fn
=
sysconfig
.
get_config_h_filename
()
try
:
# It would probably better to read single lines to search.
# But we do this only once, and it is fast enough
f
=
open
(
fn
)
s
=
f
.
read
()
f
.
close
()
except
IOError
,
exc
:
# if we can't read this file, we cannot say it is wrong
# the compiler will complain later about this file as missing
return
(
CONFIG_H_UNCERTAIN
,
"couldn't read '
%
s':
%
s"
%
(
fn
,
exc
.
strerror
))
else
:
# "pyconfig.h" contains an "#ifdef __GNUC__" or something similar
if
string
.
find
(
s
,
"__GNUC__"
)
>=
0
:
return
(
CONFIG_H_OK
,
"'
%
s' mentions '__GNUC__'"
%
fn
)
else
:
return
(
CONFIG_H_NOTOK
,
"'
%
s' does not mention '__GNUC__'"
%
fn
)
def
get_versions
():
""" Try to find out the versions of gcc and ld.
If not possible it returns None for it.
"""
from
distutils.version
import
StrictVersion
from
distutils.spawn
import
find_executable
import
re
gcc_exe
=
find_executable
(
'gcc'
)
if
gcc_exe
:
out
=
os
.
popen
(
gcc_exe
+
' -dumpversion'
,
'r'
)
out_string
=
out
.
read
()
out
.
close
()
result
=
re
.
search
(
'(
\
d+
\
.
\
d+
\
.
\
d+)'
,
out_string
)
if
result
:
gcc_version
=
StrictVersion
(
result
.
group
(
1
))
else
:
gcc_version
=
None
else
:
gcc_version
=
None
# EMX ld has no way of reporting version number, and we use GCC
# anyway - so we can link OMF DLLs
ld_version
=
None
return
(
gcc_version
,
ld_version
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment