mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Create and populate OS/2 EMX port build directory:
PC/os2emx/ Makefile README.os2emx config.c dlfcn.c // libdl emulation code for loadable extensions dlfcn.h dllentry.c // DLL initialisation routine for Python DLL getpath.c pyconfig.h python23.def // Python DLL symbol export definitions pythonpm.c // console-less PM interpreter wrapper
This commit is contained in:
parent
18e6778bcd
commit
41d97d6777
10 changed files with 3424 additions and 0 deletions
622
PC/os2emx/Makefile
Normal file
622
PC/os2emx/Makefile
Normal file
|
@ -0,0 +1,622 @@
|
|||
#####################==================----------------úúúúúúúúúúúúú
|
||||
#
|
||||
# Top-Level Makefile for Building Python 2.3 for OS/2 using GCC/EMX
|
||||
# Originally written by Andrew Zabolotny, <bit@eltech.ru> for Python 1.5.2
|
||||
# Modified by Andrew MacIntyre, <andymac@pcug.org.au> for Python 2.3
|
||||
#
|
||||
# This makefile was developed for use with [P]GCC/EMX compiler any
|
||||
# version and GNU Make.
|
||||
#
|
||||
# The output of the build is a largish Python23.DLL containing the
|
||||
# essential modules of Python and a small Python.exe program to start
|
||||
# the interpreter. When embedding Python within another program, only
|
||||
# Python23.DLL is needed. We also build python_s.a static library (which
|
||||
# can be converted into OMF (.lib) format using emxomf tool) and both
|
||||
# python.a and python.lib import libraries. Then the optional
|
||||
# extension modules, which are OS/2 DLLs renamed with a PYD file extension.
|
||||
#
|
||||
# Recommended build order:
|
||||
# make depend (if you have makedep)
|
||||
# make all
|
||||
# make lx (if you have lxlite)
|
||||
# make test (optional)
|
||||
#
|
||||
#####################==================----------------úúúúúúúúúúúúú
|
||||
|
||||
# === Compilation mode: debug or release ===
|
||||
MODE= optimize
|
||||
#MODE= debug
|
||||
# === Assert() enabled ===
|
||||
#ASSERTIONS=no
|
||||
ASSERTIONS=yes
|
||||
|
||||
# === Optional modules ===
|
||||
# Do you have the InfoZip compression library installed?
|
||||
ZLIB= no
|
||||
# Do you have the Ultra Fast Crypt (UFC) library installed?
|
||||
UFC= no
|
||||
# Do you have the Tcl/Tk library installed?
|
||||
TCLTK= no
|
||||
# Do you have the GNU multiprecision library installed?
|
||||
GMPZ= no
|
||||
# Do you have the GNU readline library installed?
|
||||
# NOTE: I'm using a modified version of Kai Uwe Rommel's port that
|
||||
# - is compiled with multithreading enabled
|
||||
# - is linked statically
|
||||
# I have had no success trying to use a DLL version, even with
|
||||
# the multithreading switch.
|
||||
GREADLINE= no
|
||||
# Do you have the BSD DB library (v1.85) as included in the EMXBSD package?
|
||||
# NOTE: this library needs to be recompiled with a structure member
|
||||
# renamed to avoid problems with the multithreaded errno support
|
||||
# (there is a structure member called errno, used for shadowing the
|
||||
# real errno, which conflicts with the errno redefinition of -Zmt)
|
||||
BSDDB= no
|
||||
# Do you have the ncurses library installed? EMX's BSD curses aren't enough!
|
||||
CURSES= no
|
||||
# Do you have the expat XML parsing library installed?
|
||||
EXPAT= no
|
||||
# Do you have the GDBM library installed?
|
||||
GDBM= no
|
||||
|
||||
# === The Tools ===
|
||||
CC= gcc
|
||||
CFLAGS= -Zmt -Wall $(INCLUDE)
|
||||
CFLAGS.LIB= $(CFLAGS)
|
||||
LD= gcc
|
||||
LDFLAGS= -Zmt -Zcrtdll -L. -lgcc
|
||||
LDFLAGS.EXE= $(LDFLAGS)
|
||||
LDFLAGS.DLL= $(LDFLAGS) -Zdll
|
||||
LDFLAGS.A= $(LDFLAGS) $(LIBS)
|
||||
ARFLAGS= crs
|
||||
IMPLIB= emximp
|
||||
EXPLIB= emxexp
|
||||
|
||||
# adjust C compiler settings based on build options
|
||||
ifeq ($(MODE),debug)
|
||||
CFLAGS+= -g -O
|
||||
LDFLAGS+= -g
|
||||
else
|
||||
CFLAGS+= -s -O2
|
||||
LDFLAGS+= -s
|
||||
endif
|
||||
ifeq ($(ASSERTIONS),no)
|
||||
CFLAGS+= -DNDEBUG
|
||||
endif
|
||||
|
||||
# We're using the OMF format since EMX's ld has a obscure bug
|
||||
# because of which it sometimes fails to build relocations
|
||||
# in .data segment that point to another .data locations
|
||||
# (except for the final linking if the .EXEs)
|
||||
OMF= yes
|
||||
|
||||
# if fork() support is required, the main executable must be linked with ld
|
||||
EXEOMF= no
|
||||
|
||||
# File extensions
|
||||
MODULE.EXT= .pyd
|
||||
ifeq ($(OMF),yes)
|
||||
O= .obj
|
||||
A= .lib
|
||||
AR= emxomfar
|
||||
CFLAGS+= -Zomf
|
||||
LDFLAGS+= -Zomf
|
||||
ifeq ($(MODE),debug)
|
||||
ARFLAGS= -p64 crs
|
||||
else
|
||||
ARFLAGS= -p32 crs
|
||||
endif
|
||||
else
|
||||
O= .o
|
||||
A= .a
|
||||
AR= ar
|
||||
endif
|
||||
|
||||
# Source file paths
|
||||
SRCPATH=.;../../Python;../../Parser;../../Objects;../../Include;../../Modules
|
||||
# Python contains the central core, containing the builtins and interpreter.
|
||||
# Parser contains Python's Internal Parser and
|
||||
# Standalone Parser Generator Program (Shares Some of Python's Modules)
|
||||
# Objects contains Python Object Types
|
||||
# Modules contains extension Modules (Built-In or as Separate DLLs)
|
||||
|
||||
# Unix shells tend to use "$" as delimiter for variable names.
|
||||
# Test for this behaviour and set $(BUCK) variable correspondigly ...
|
||||
__TMP__:=$(shell echo $$$$)
|
||||
ifeq ($(__TMP__),$$$$)
|
||||
BUCK= $$
|
||||
BRO= (
|
||||
BRC= )
|
||||
else
|
||||
BUCK= \$$
|
||||
BRO= \(
|
||||
BRC= \)
|
||||
endif
|
||||
# Compute the "double quote" variable
|
||||
__TMP__:=$(shell echo "")
|
||||
ifeq ($(__TMP__),"")
|
||||
DQUOTE= "
|
||||
else
|
||||
DQUOTE= \"
|
||||
endif
|
||||
|
||||
# Include paths
|
||||
#INCLUDE= -I$(subst ;, -I, $(SRCPATH))
|
||||
INCLUDE= -I. -I../../Include
|
||||
|
||||
# Path to search for .c files
|
||||
vpath %.c .;..;$(SRCPATH)
|
||||
|
||||
# Top of the package tree
|
||||
TOP= ../../
|
||||
|
||||
# Directory for output files
|
||||
OUTBASE= out/
|
||||
OUT= $(OUTBASE)$(MODE)/
|
||||
|
||||
# Additional libraries
|
||||
LIBS= -lsocket
|
||||
|
||||
# Utility macro: replacement for $^
|
||||
^^= $(filter-out %$A,$^)
|
||||
# Use $(L^) to link with all libraries specified as dependencies
|
||||
L^= $(addprefix -l,$(basename $(notdir $(filter %$A,$+))))
|
||||
|
||||
# Build rules
|
||||
$(OUT)%$O: %.c
|
||||
$(CC) $(CFLAGS.LIB) -c $< -o $@
|
||||
|
||||
%.a:
|
||||
$(LD) $(LDFLAGS.A) -o $@ $(^^) $(L^)
|
||||
|
||||
%.dll:
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
%.pyd: $(OUT)%module$O $(OUT)%_m.def
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(PYTHON.IMPLIB) $(LIBS)
|
||||
|
||||
%.exe:
|
||||
$(LD) $(LDFLAGS.EXE) -o $@ $(^^) $(L^)
|
||||
|
||||
%_m.def:
|
||||
@echo Creating .DEF file: $@
|
||||
@echo LIBRARY $(notdir $*) INITINSTANCE TERMINSTANCE >$@
|
||||
ifeq ($(DESCRIPTION.$(notdir $*)$(MODULE.EXT)),)
|
||||
@echo DESCRIPTION $(DQUOTE)Python standard module $(notdir $*)$(DQUOTE) >>$@
|
||||
else
|
||||
@echo DESCRIPTION $(DQUOTE)$(DESCRIPTION.$(notdir $*)$(MODULE.EXT))$(DQUOTE) >>$@
|
||||
endif
|
||||
@echo DATA MULTIPLE NONSHARED >>$@
|
||||
@echo EXPORTS >>$@
|
||||
@echo init$(notdir $*) >>$@
|
||||
|
||||
%.def:
|
||||
@echo Creating .DEF file: $@
|
||||
@echo NAME $(notdir $*) $(EXETYPE.$(notdir $*).exe) >$@
|
||||
@echo DESCRIPTION $(DQUOTE)$(DESCRIPTION.$(notdir $*).exe)$(DQUOTE) >>$@
|
||||
@echo STACKSIZE 1048576 >>$@
|
||||
|
||||
# Output file names
|
||||
PYTHON_VER= 2.3
|
||||
PYTHON_LIB= python23
|
||||
PYTHON.LIB= $(PYTHON_LIB)_s$A
|
||||
PYTHON.IMPLIB= $(PYTHON_LIB)$A
|
||||
ifeq ($(EXEOMF),yes)
|
||||
PYTHON.EXEIMP= $(PYTHON.IMPLIB)
|
||||
LDMODE.EXE= -Zomf
|
||||
else
|
||||
PYTHON.EXEIMP= $(PYTHON_LIB).a
|
||||
LDMODE.EXE =
|
||||
endif
|
||||
PYTHON.DLL= $(PYTHON_LIB).dll
|
||||
PYTHON.DEF= $(PYTHON_LIB).def
|
||||
PYTHON.EXE= python.exe
|
||||
PYTHONPM.EXE= pythonpm.exe
|
||||
PGEN.EXE= pgen.exe
|
||||
LIBRARY= $(PYTHON.LIB)
|
||||
LD_LIBRARY= $(PYTHON.IMPLIB)
|
||||
|
||||
# Additional executable parameters
|
||||
EXETYPE.$(PYTHON.EXE)= WINDOWCOMPAT
|
||||
EXETYPE.$(PYTHONPM.EXE)= WINDOWAPI
|
||||
EXETYPE.$(PGEN.EXE)= WINDOWCOMPAT
|
||||
DESCRIPTION.$(PYTHON.EXE)= Python object-oriented programming language interpreter for OS/2
|
||||
DESCRIPTION.$(PYTHONPM.EXE)= $(DESCRIPTION.$(PYTHON.EXE))
|
||||
DESCRIPTION.$(PGEN.EXE)= Python object-oriented programming language parser generator for OS/2
|
||||
|
||||
# Module descriptions
|
||||
DESCRIPTION.zlib$(MODULE.EXT)= Python Extension DLL for accessing the InfoZip compression library
|
||||
DESCRIPTION.crypt$(MODULE.EXT)= Python Extension DLL implementing the crypt$(BRO)$(BRC) function
|
||||
DESCRIPTION._tkinter$(MODULE.EXT)= Python Extension DLL for access to Tcl/Tk Environment
|
||||
DESCRIPTION.mpz$(MODULE.EXT)= Python Extension DLL for access to GNU multi-precision library
|
||||
DESCRIPTION.readline$(MODULE.EXT)= Python Extension DLL for access to GNU ReadLine library
|
||||
DESCRIPTION.bsddb$(MODULE.EXT)= Python Extension DLL for access to BSD DB (v1.85) library
|
||||
DESCRIPTION._curses$(MODULE.EXT)= Python Extension DLL for access to ncurses library
|
||||
DESCRIPTION.pyexpat$(MODULE.EXT)= Python Extension DLL for access to expat library
|
||||
|
||||
# Source files
|
||||
SRC.PGEN= $(addprefix ../../Parser/, \
|
||||
pgenmain.c \
|
||||
pgen.c \
|
||||
printgrammar.c \
|
||||
grammar.c \
|
||||
bitset.c \
|
||||
firstsets.c)
|
||||
OBJ.PGEN= $(addprefix $(OUT),$(notdir $(SRC.PGEN:.c=$O)))
|
||||
|
||||
SRC.OS2EMX= config.c dlfcn.c getpathp.c
|
||||
SRC.MAIN= $(addprefix $(TOP), \
|
||||
Modules/getbuildinfo.c \
|
||||
Modules/main.c)
|
||||
SRC.MODULES= $(addprefix $(TOP), \
|
||||
Modules/gcmodule.c \
|
||||
Modules/signalmodule.c \
|
||||
Modules/posixmodule.c \
|
||||
Modules/threadmodule.c \
|
||||
Modules/_sre.c)
|
||||
SRC.PARSER= $(addprefix $(TOP), \
|
||||
Parser/acceler.c \
|
||||
Parser/grammar1.c \
|
||||
Parser/listnode.c \
|
||||
Parser/node.c \
|
||||
Parser/parser.c \
|
||||
Parser/parsetok.c \
|
||||
Parser/tokenizer.c \
|
||||
Parser/bitset.c \
|
||||
Parser/metagrammar.c \
|
||||
Parser/myreadline.c)
|
||||
SRC.PYTHON= $(addprefix $(TOP), \
|
||||
Python/bltinmodule.c \
|
||||
Python/exceptions.c \
|
||||
Python/ceval.c \
|
||||
Python/compile.c \
|
||||
Python/codecs.c \
|
||||
Python/errors.c \
|
||||
Python/frozen.c \
|
||||
Python/frozenmain.c \
|
||||
Python/future.c \
|
||||
Python/getargs.c \
|
||||
Python/getcompiler.c \
|
||||
Python/getcopyright.c \
|
||||
Python/getmtime.c \
|
||||
Python/getplatform.c \
|
||||
Python/getversion.c \
|
||||
Python/graminit.c \
|
||||
Python/import.c \
|
||||
Python/importdl.c \
|
||||
Python/marshal.c \
|
||||
Python/modsupport.c \
|
||||
Python/mysnprintf.c \
|
||||
Python/mystrtoul.c \
|
||||
Python/pyfpe.c \
|
||||
Python/pystate.c \
|
||||
Python/pythonrun.c \
|
||||
Python/structmember.c \
|
||||
Python/symtable.c \
|
||||
Python/sysmodule.c \
|
||||
Python/traceback.c \
|
||||
Python/getopt.c \
|
||||
Python/dynload_shlib.c \
|
||||
Python/thread.c)
|
||||
SRC.OBJECT= $(addprefix $(TOP), \
|
||||
Objects/abstract.c \
|
||||
Objects/bufferobject.c \
|
||||
Objects/cellobject.c \
|
||||
Objects/classobject.c \
|
||||
Objects/cobject.c \
|
||||
Objects/complexobject.c \
|
||||
Objects/descrobject.c \
|
||||
Objects/dictobject.c \
|
||||
Objects/fileobject.c \
|
||||
Objects/floatobject.c \
|
||||
Objects/frameobject.c \
|
||||
Objects/funcobject.c \
|
||||
Objects/intobject.c \
|
||||
Objects/iterobject.c \
|
||||
Objects/listobject.c \
|
||||
Objects/longobject.c \
|
||||
Objects/methodobject.c \
|
||||
Objects/moduleobject.c \
|
||||
Objects/object.c \
|
||||
Objects/rangeobject.c \
|
||||
Objects/sliceobject.c \
|
||||
Objects/stringobject.c \
|
||||
Objects/structseq.c \
|
||||
Objects/tupleobject.c \
|
||||
Objects/typeobject.c \
|
||||
Objects/unicodeobject.c \
|
||||
Objects/unicodectype.c \
|
||||
Objects/weakrefobject.c)
|
||||
|
||||
SRC.LIB= $(SRC.OS2EMX) \
|
||||
$(SRC.MAIN) \
|
||||
$(SRC.PARSER) \
|
||||
$(SRC.OBJECT) \
|
||||
$(SRC.PYTHON) \
|
||||
$(SRC.MODULES)
|
||||
OBJ.LIB= $(addprefix $(OUT),$(notdir $(SRC.LIB:.c=$O)))
|
||||
|
||||
SRC.EXE= $(TOP)Modules/python.c
|
||||
SRC.PMEXE= pythonpm.c
|
||||
|
||||
# Python modules to be dynamically loaded that:
|
||||
# 1) have only single source file and require no extra libs
|
||||
# 2) use the standard module naming convention
|
||||
# (the 'module' in ?????module.c is assumed)
|
||||
# - these can be built with implicit rules
|
||||
EASYEXTMODULES= array \
|
||||
cmath \
|
||||
_codecs \
|
||||
dl \
|
||||
errno \
|
||||
fcntl \
|
||||
fpectl \
|
||||
fpetest \
|
||||
_locale \
|
||||
math \
|
||||
new \
|
||||
parser \
|
||||
pwd \
|
||||
rgbimg \
|
||||
rotor \
|
||||
select \
|
||||
sha \
|
||||
strop \
|
||||
struct \
|
||||
time \
|
||||
timing
|
||||
|
||||
# Python modules to be dynamically loaded that need explicit build rules
|
||||
# (either multiple source files and/or non-standard module naming)
|
||||
# (NOTE: use shortened names for modules affected by 8 char name limit)
|
||||
HARDEXTMODULES= binascii \
|
||||
cPickle \
|
||||
cStringI \
|
||||
_hotshot \
|
||||
imageop \
|
||||
md5 \
|
||||
operator \
|
||||
pcre \
|
||||
regex \
|
||||
_socket \
|
||||
termios \
|
||||
_testcap \
|
||||
unicoded \
|
||||
_weakref \
|
||||
xreadlin
|
||||
|
||||
# Python external ($(MODULE.EXT)) modules - can be EASY or HARD
|
||||
ifeq ($(ZLIB),yes)
|
||||
HARDEXTMODULES+= zlib
|
||||
endif
|
||||
ifeq ($(UFC),yes)
|
||||
HARDEXTMODULES+= crypt
|
||||
endif
|
||||
ifeq ($(TCLTK),yes)
|
||||
HARDEXTMODULES+= _tkinter
|
||||
CFLAGS+= -DHAS_DIRENT -I/TclTk80/include
|
||||
TK_LIBS+= -L/TclTk80/lib -ltcl80 -ltk80
|
||||
endif
|
||||
ifeq ($(GMPZ),yes)
|
||||
HARDEXTMODULES+= mpz
|
||||
endif
|
||||
ifeq ($(GREADLINE),yes)
|
||||
HARDEXTMODULES+= readline
|
||||
endif
|
||||
ifeq ($(BSDDB),yes)
|
||||
HARDEXTMODULES+= bsddb
|
||||
endif
|
||||
ifeq ($(CURSES),yes)
|
||||
HARDEXTMODULES+= _curses _curses_
|
||||
endif
|
||||
ifeq ($(EXPAT),yes)
|
||||
HARDEXTMODULES+= pyexpat
|
||||
endif
|
||||
ifeq ($(GDBM),yes)
|
||||
HARDEXTMODULES+= gdbm dbm
|
||||
endif
|
||||
|
||||
EXTERNDLLS= $(addsuffix $(MODULE.EXT),$(patsubst %module,%,$(EASYEXTMODULES)))
|
||||
EXTERNDLLS+= $(addsuffix $(MODULE.EXT),$(patsubst %module,%,$(HARDEXTMODULES)))
|
||||
|
||||
# Targets
|
||||
all: $(OUT) $(PYTHON.LIB) $(PYTHON.DEF) $(PYTHON.IMPLIB) $(PYTHON.DLL) \
|
||||
$(PYTHON.EXE) $(PYTHONPM.EXE) $(PGEN.EXE) $(EXTERNDLLS)
|
||||
|
||||
clean:
|
||||
rm -f $(OUT)*
|
||||
rm -f $(PYTHON.LIB) $(PYTHON.IMPLIB) $(PYTHON.EXEIMP) $(PYTHON.DLL) \
|
||||
$(PYTHON.EXE) $(PYTHONPM.EXE) $(PGEN.EXE) *$(MODULE.EXT)
|
||||
|
||||
lx:
|
||||
@echo Packing everything with lxLite...
|
||||
lxlite $(PYTHON.DLL) $(PYTHON.EXE) $(PYTHONPM.EXE) $(PGEN.EXE)
|
||||
|
||||
depend: $(OUTBASE)
|
||||
makedep -f $(OUTBASE)python.dep -o $(BUCK)O -p $(BUCK)\(OUT\) \
|
||||
-r -c $(INCLUDE) $(SRC.LIB) $(SRC.PGEN)
|
||||
|
||||
$(OUT): $(OUTBASE)
|
||||
|
||||
$(OUT) $(OUTBASE):
|
||||
mkdir.exe $@
|
||||
|
||||
$(PYTHON.LIB): $(OBJ.LIB)
|
||||
rm.exe -f $@
|
||||
$(AR) $(ARFLAGS) $@ $^
|
||||
|
||||
$(PYTHON.DEF): $(PYTHON.LIB)
|
||||
@echo Creating .DEF file: $@
|
||||
@echo LIBRARY $(PYTHON_LIB) INITINSTANCE TERMINSTANCE >$@
|
||||
@echo DESCRIPTION $(DQUOTE)Python $(PYTHON_VER) Core DLL$(DQUOTE) >>$@
|
||||
@echo PROTMODE >>$@
|
||||
@echo DATA MULTIPLE NONSHARED >>$@
|
||||
@echo EXPORTS >>$@
|
||||
$(EXPLIB) -u $(PYTHON.LIB) >>$@
|
||||
|
||||
$(PYTHON.IMPLIB): $(PYTHON.DEF)
|
||||
$(IMPLIB) -o $@ $^
|
||||
|
||||
$(PYTHON.EXEIMP): $(PYTHON.DEF)
|
||||
$(IMPLIB) -o $@ $^
|
||||
|
||||
$(PYTHON.DLL): $(OUT)dllentry$O $(PYTHON.LIB) $(PYTHON.DEF)
|
||||
|
||||
# Explicit make targets for the .EXEs to be able to use LD to link
|
||||
# (so that fork() will work if required)
|
||||
|
||||
$(PYTHON.EXE): $(SRC.EXE) $(PYTHON.EXEIMP) $(OUT)python.def
|
||||
$(CC) -Zmt $(LDMODE.EXE) -Zcrtdll -Wall $(INCLUDE) -L. -lgcc -o $@ $(SRC.EXE) $(PYTHON.EXEIMP) $(LIBS) $(OUT)python.def
|
||||
|
||||
$(PYTHONPM.EXE): $(SRC.PMEXE) $(PYTHON.EXEIMP) $(OUT)pythonpm.def
|
||||
$(CC) -Zmt $(LDMODE.EXE) -Zcrtdll -Wall $(INCLUDE) -L. -lgcc -o $@ $(SRC.PMEXE) $(PYTHON.EXEIMP) $(LIBS) $(OUT)pythonpm.def
|
||||
|
||||
$(PGEN.EXE): $(OBJ.PGEN) $(PYTHON.LIB) $(OUT)pgen.def
|
||||
|
||||
# Explicit building instructions for those external modules that require
|
||||
# awkward handling (due e.g. to non-std naming, or multiple source files)
|
||||
# - standard modules
|
||||
binascii$(MODULE.EXT): $(OUT)binascii$O $(OUT)binascii_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
cPickle$(MODULE.EXT): $(OUT)cPickle$O $(OUT)cPickle_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
# cStringIO needs to be renamed to be useful (8 char DLL name limit)
|
||||
cStringIO$(MODULE.EXT): $(OUT)cStringIO$O $(OUT)cStringIO_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
cStringI$(MODULE.EXT): cStringIO$(MODULE.EXT)
|
||||
cp $^ $@
|
||||
|
||||
_hotshot$(MODULE.EXT): $(OUT)_hotshot$O $(OUT)_hotshot_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
imageop$(MODULE.EXT): $(OUT)imageop$O $(OUT)imageop_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
md5$(MODULE.EXT): $(OUT)md5module$O $(OUT)md5c$O $(OUT)md5_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
operator$(MODULE.EXT): $(OUT)operator$O $(OUT)operator_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
pcre$(MODULE.EXT): $(OUT)pcremodule$O $(OUT)pypcre$O $(OUT)pcre_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
regex$(MODULE.EXT): $(OUT)regexmodule$O $(OUT)regexpr$O $(OUT)regex_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
_socket$(MODULE.EXT): $(OUT)socketmodule$O $(OUT)_socket_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
# _symtable needs to be renamed to be useful
|
||||
_symtable$(MODULE.EXT): $(OUT)symtablemodule$O $(OUT)_symtable_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
_symtabl$(MODULE.EXT): _symtable$(MODULE.EXT)
|
||||
cp $^ $@
|
||||
|
||||
termios$(MODULE.EXT): $(OUT)termios$O $(OUT)termios_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
# _testcapi needs to be renamed to be useful
|
||||
_testcapi$(MODULE.EXT): $(OUT)_testcapimodule$O $(OUT)_testcapi_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
_testcap$(MODULE.EXT): _testcapi$(MODULE.EXT)
|
||||
cp $^ $@
|
||||
|
||||
# unicodedata needs to be renamed to be useful
|
||||
unicodedata$(MODULE.EXT): $(OUT)unicodedata$O $(OUT)unicodedata_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) $(MODULE_LIBS)
|
||||
|
||||
unicoded$(MODULE.EXT): unicodedata$(MODULE.EXT)
|
||||
cp $^ $@
|
||||
|
||||
_weakref$(MODULE.EXT): $(OUT)_weakref$O $(OUT)_weakref_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
# xreadlines needs to be renamed to be useful
|
||||
xreadlines$(MODULE.EXT): $(OUT)xreadlinesmodule$O $(OUT)xreadlines_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS)
|
||||
|
||||
xreadlin$(MODULE.EXT): xreadlines$(MODULE.EXT)
|
||||
cp $^ $@
|
||||
|
||||
# - optional modules (requiring other software to be installed)
|
||||
bsddb$(MODULE.EXT): $(OUT)bsddbmodule$O $(OUT)bsddb_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) -ldb $(LIBS)
|
||||
|
||||
crypt$(MODULE.EXT): $(OUT)cryptmodule$O $(OUT)crypt_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) -lufc $(LIBS)
|
||||
|
||||
# The _curses_panel module requires a couple of ncurses library entry
|
||||
# points, which are best exposed as exports from the _curses module DLL
|
||||
$(OUT)_curses_m.def:
|
||||
@echo Creating .DEF file: $@
|
||||
@echo LIBRARY $(notdir $*) INITINSTANCE TERMINSTANCE >$@
|
||||
@echo DESCRIPTION $(DQUOTE)$(DESCRIPTION.$(notdir $*)$(MODULE.EXT))$(DQUOTE) >>$@
|
||||
@echo DATA MULTIPLE NONSHARED >>$@
|
||||
@echo EXPORTS >>$@
|
||||
@echo init_curses >>$@
|
||||
@echo wnoutrefresh >>$@
|
||||
@echo _nc_panelhook >>$@
|
||||
@echo is_linetouched >>$@
|
||||
@echo mvwin >>$@
|
||||
@echo stdscr >>$@
|
||||
@echo wtouchln >>$@
|
||||
|
||||
$(OUT)_curses_panel_m.def:
|
||||
@echo Creating .DEF file: $@
|
||||
@echo LIBRARY $(notdir $*) INITINSTANCE TERMINSTANCE >$@
|
||||
@echo DESCRIPTION $(DQUOTE)Python standard module $(notdir $*)$(DQUOTE) >>$@
|
||||
@echo DATA MULTIPLE NONSHARED >>$@
|
||||
@echo IMPORTS >>$@
|
||||
@echo _curses.wnoutrefresh >>$@
|
||||
@echo _curses._nc_panelhook >>$@
|
||||
@echo _curses.is_linetouched >>$@
|
||||
@echo _curses.mvwin >>$@
|
||||
@echo _curses.stdscr >>$@
|
||||
@echo _curses.wtouchln >>$@
|
||||
@echo EXPORTS >>$@
|
||||
@echo init_curses_panel >>$@
|
||||
|
||||
_curses$(MODULE.EXT): $(OUT)_cursesmodule$O $(OUT)_curses_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lncurses
|
||||
|
||||
# curses_panel needs to be renamed to be useful
|
||||
_curses_panel$(MODULE.EXT): $(OUT)_curses_panel$O $(OUT)_curses_panel_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lpanel
|
||||
|
||||
_curses_$(MODULE.EXT): _curses_panel$(MODULE.EXT)
|
||||
cp $^ $@
|
||||
|
||||
dbm$(MODULE.EXT): $(OUT)dbmmodule$O $(OUT)dbm_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lgdbm
|
||||
|
||||
gdbm$(MODULE.EXT): $(OUT)gdbmmodule$O $(OUT)gdbm_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lgdbm
|
||||
|
||||
mpz$(MODULE.EXT): $(OUT)mpzmodule$O $(OUT)mpz_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lgmp
|
||||
|
||||
pyexpat$(MODULE.EXT): $(OUT)pyexpat$O $(OUT)pyexpat_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lexpat
|
||||
|
||||
readline$(MODULE.EXT): $(OUT)readline$O $(OUT)readline_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lreadline -lncurses
|
||||
|
||||
#_tkinter$(MODULE.EXT): $(OUT)_tkinter$O $(OUT)tclNotify$O $(OUT)tkappinit$O
|
||||
_tkinter$(MODULE.EXT): $(OUT)_tkinter$O $(OUT)tclNotify$O \
|
||||
$(OUT)_tkinter_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) $(TK_LIBS)
|
||||
|
||||
zlib$(MODULE.EXT): $(OUT)zlibmodule$O $(OUT)zlib_m.def $(PYTHON.IMPLIB)
|
||||
$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lz
|
||||
|
||||
# the test target
|
||||
test:
|
||||
./python -tt ../../lib/test/regrtest.py -l -u "network"
|
||||
|
||||
-include $(OUTBASE)python.dep
|
570
PC/os2emx/README.os2emx
Normal file
570
PC/os2emx/README.os2emx
Normal file
|
@ -0,0 +1,570 @@
|
|||
This is a port of Python 2.3 to OS/2 using the EMX development tools
|
||||
=========================================================================
|
||||
|
||||
What's new since the previous release
|
||||
-------------------------------------
|
||||
|
||||
This release of the port incorporates the following changes from the
|
||||
December 24, 2001 release of the Python 2.2 port:
|
||||
|
||||
- based on the Python v2.3 final release source.
|
||||
|
||||
|
||||
Licenses and info about Python and EMX
|
||||
--------------------------------------
|
||||
|
||||
Please read the file README.Python-2.3 included in this package for
|
||||
information about Python 2.3. This file is the README file from the
|
||||
Python 2.3 source distribution available via http://www.python.org/
|
||||
and its mirrors. The file LICENCE.Python-2.3 is the text of the Licence
|
||||
from the Python 2.3 source distribution.
|
||||
|
||||
Note that the EMX package that this package depends on is released under
|
||||
the GNU General Public Licence. Please refer to the documentation
|
||||
accompanying the EMX Runtime libraries for more information about the
|
||||
implications of this. A copy of version 2 of the GPL is included as the
|
||||
file COPYING.gpl2.
|
||||
|
||||
Readline and GDBM are covered by the GNU General Public Licence. I think
|
||||
Eberhard Mattes' porting changes to BSD DB v1.85 are also GPL'ed (BSD DB
|
||||
itself is BSD Licenced). ncurses and expat appear to be covered by MIT
|
||||
style licences - please refer to the source distributions for more detail.
|
||||
zlib is distributable under a very free license. GNU MP and GNU UFC are
|
||||
under the GNU LGPL (see file COPYING.lib).
|
||||
|
||||
My patches to the Python-2.x source distributions, and any other packages
|
||||
used in this port, are placed in the public domain.
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the author be held liable for any damages arising from the
|
||||
use of the software.
|
||||
|
||||
I do hope however that it proves useful to someone.
|
||||
|
||||
|
||||
Other ports
|
||||
-----------
|
||||
|
||||
There have been ports of previous versions of Python to OS/2.
|
||||
|
||||
The best known would be that by Jeff Rush, most recently of version
|
||||
1.5.2. Jeff used IBM's Visual Age C++ (v3) for his ports, and his
|
||||
patches have been included in the Python 2.3 source distribution.
|
||||
|
||||
Andrew Zabolotny implemented a port of Python v1.5.2 using the EMX
|
||||
development tools. His patches against the Python v1.5.2 source
|
||||
distribution have become the core of this port, and without his efforts
|
||||
this port wouldn't exist. Andrew's port also appears to have been
|
||||
compiled with his port of gcc 2.95.2 to EMX, which I have but have
|
||||
chosen not to use for the binary distribution of this port (see item 21
|
||||
of the "YOU HAVE BEEN WARNED" section below).
|
||||
|
||||
Previous Python port releases by me:-
|
||||
- v2.0 on March 31, 2001;
|
||||
- v2.0 on April 25, 2001 (cleanup release + Stackless variant);
|
||||
- v2.1 on June 17, 2001;
|
||||
- v2.0 (Stackless re-release) on June 18, 2001.
|
||||
- v2.1.1 on August 5, 2001;
|
||||
- v2.1.1 on August 12, 2001 (cleanup release);
|
||||
- v2.1.1 (updated DLL) on August 14, 2001.
|
||||
- v2.2b2 on December 8, 2001 (not uploaded to archive sites)
|
||||
- v2.2c1 on December 16, 2001 (not uploaded to archive sites)
|
||||
- v2.2 on December 24, 2001
|
||||
|
||||
It is possible to have these earlier ports still usable after installing
|
||||
this port - see the README.os2emx.multiple_versions file, contributed by
|
||||
Dr David Mertz, for a suggested approach to achieving this.
|
||||
|
||||
|
||||
Software requirements
|
||||
---------------------
|
||||
|
||||
This package requires the EMX Runtime package, available from the
|
||||
Hobbes (http://hobbes.nmsu.edu/) and LEO (http://archiv.leo.org/)
|
||||
archives of OS/2 software. I have used EMX version 0.9d fix04 in
|
||||
developing this port.
|
||||
|
||||
My development system is running OS/2 v4 with fixpack 12.
|
||||
|
||||
3rd party software which has been linked into dynamically loaded modules:
|
||||
- ncurses (see http://dickey.his.com/ for more info, v5.2)
|
||||
- GNU Readline (Kai Uwe Rommel's port available from Hobbes or LEO, v2.1)
|
||||
- GNU GDBM (Kai Uwe Rommel's port available from Hobbes or LEO, v1.7.3)
|
||||
- zlib (Hung-Chi Chu's port available from Hobbes or LEO, v1.1.3)
|
||||
- expat (from ftp://ftp.jclark.com/pub/xml/, v1.2)
|
||||
- GNU MP (Peter Meerwald's port available from LEO, v2.0.2)
|
||||
- GNU UFC (Kai Uwe Rommel's port available from LEO, v2.0.4)
|
||||
|
||||
The zlib module requires the Z.DLL to be installed - see the Installation
|
||||
section and item 12 of the "YOU HAVE BEEN WARNED" section for more
|
||||
information.
|
||||
|
||||
About this port
|
||||
---------------
|
||||
|
||||
I have attempted to make this port as complete and functional as I can,
|
||||
notwithstanding the issues in the "YOU HAVE BEEN WARNED" section below.
|
||||
|
||||
Core components:
|
||||
|
||||
Python.exe is linked as an a.out executable, ie using EMX method E1
|
||||
to compile & link the executable. This is so that fork() works (see
|
||||
"YOU HAVE BEEN WARNED" item 2).
|
||||
|
||||
Python23.dll is created as a normal OMF DLL, with an OMF import
|
||||
library and module definition file. There is also an a.out (.a) import
|
||||
library to support linking the DLL to a.out executables.
|
||||
|
||||
This port has been built with complete support for multithreading.
|
||||
|
||||
Modules:
|
||||
|
||||
As far as possible, extension modules have been made dynamically loadable
|
||||
when the module is intended to be built this way. I haven't yet changed
|
||||
the building of Python's standard modules over to using the DistUtils.
|
||||
|
||||
See "YOU HAVE BEEN WARNED" item 5 for notes about the fcntl module, and
|
||||
"YOU HAVE BEEN WARNED" item 14 for notes about the pwd and grp modules.
|
||||
|
||||
Support for case sensitive module import semantics has been added to match
|
||||
the Windows release. This can be deactivated by setting the PYTHONCASEOK
|
||||
environment variable (the value doesn't matter) - see "YOU HAVE BEEN WARNED"
|
||||
item 16.
|
||||
|
||||
Optional modules:
|
||||
|
||||
Where I've been able to locate the required 3rd party packages already
|
||||
ported to OS/2, I've built and included them.
|
||||
|
||||
These include ncurses (_curses, _curses_panel), BSD DB (bsddb),
|
||||
GNU GDBM (gdbm, dbm), zlib (zlib), GNU Readline (readline), expat
|
||||
(pyexpat), GNU MP (mpz) and GNU UFC (crypt).
|
||||
|
||||
I have built these modules statically linked against the 3rd party
|
||||
libraries, with the exception of zlib. Unfortunately my attempts to use
|
||||
the dll version of GNU readline have been a dismal failure, in that when
|
||||
the dynamically linked readline module is active other modules
|
||||
immediately provoke a core dump when imported.
|
||||
|
||||
Only the BSD DB package (part of the BSD package distributed with EMX)
|
||||
needed source modifications to be used for this port, pertaining to use
|
||||
of errno with multithreading.
|
||||
|
||||
The other packages, except for ncurses and zlib, needed Makefile changes
|
||||
for multithreading support but no source changes.
|
||||
|
||||
The _curses_panel module is a potential problem - see "YOU HAVE BEEN
|
||||
WARNED" item 17.
|
||||
|
||||
Upstream source patches:
|
||||
|
||||
No updates to the Python 2.3 release have become available.
|
||||
|
||||
Eberhard Mattes' EMXFIX04 update to his EMX 0.9d tools suite includes
|
||||
bug fixes for the BSD DB library. The bsddb module included in this
|
||||
port incorporates these fixes.
|
||||
|
||||
Library and other distributed Python code:
|
||||
|
||||
The Python standard library lives in the Lib directory. All the standard
|
||||
library code included with the Python 2.3 source distribution is included
|
||||
in the binary archive, with the exception of the dos-8x3 and tkinter
|
||||
subdirectories which have been omitted to reduce the size of the binary
|
||||
archive - the dos-8x3 components are unnecessary duplicates and Tkinter
|
||||
is not supported by this port (yet). All the plat-* subdirectories in the
|
||||
source distribution have also been omitted, and a plat-os2emx directory
|
||||
included.
|
||||
|
||||
The Tools and Demo directories contain a collection of Python scripts.
|
||||
To reduce the size of the binary archive, the Demo/sgi, Demo/Tix,
|
||||
Demo/tkinter, Tools/audiopy and Tools/IDLE subdirectories have been
|
||||
omitted as not being supported by this port. The Misc directory has
|
||||
also been omitted.
|
||||
|
||||
All subdirectories omitted from the binary archive can be reconstituted
|
||||
from the Python 2.3 source distribution, if desired.
|
||||
|
||||
Support for building Python extensions:
|
||||
|
||||
The Config subdirectory contains the files describing the configuration
|
||||
of the interpreter and the Makefile, import libraries for the Python DLL,
|
||||
and the module definition file used to create the Python DLL. The
|
||||
Include subdirectory contains all the standard Python header files
|
||||
needed for building extensions.
|
||||
|
||||
As I don't have the Visual Age C++ compiler, I've made no attempt to
|
||||
have this port support extensions built with that compiler.
|
||||
|
||||
|
||||
Packaging
|
||||
---------
|
||||
|
||||
This port is packaged into several archives:
|
||||
- python-2.3-os2emx-bin-02????.zip (binaries, library modules)
|
||||
- python-2.3-os2emx-src-03????.zip (source patches and makefiles)
|
||||
|
||||
Documentation for the Python language, as well as the Python 2.3
|
||||
source distibution, can be obtained from the Python website
|
||||
(http://www.python.org/) or the Python project pages at Sourceforge
|
||||
(http://sf.net/projects/python/).
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Obtain and install, as per the included instructions, the EMX runtime
|
||||
package.
|
||||
|
||||
If you wish to use the zlib module, you will need to obtain and install
|
||||
the Z.DLL from Hung-Chi Chu's port of zlib v1.1.3 (zlib113.zip). See also
|
||||
"YOU HAVE BEEN WARNED" item 12 below.
|
||||
|
||||
Unpack this archive, preserving the subdirectories, in the root directory
|
||||
of the drive where you want Python to live.
|
||||
|
||||
Add the Python directory (eg C:\Python23) to the PATH and LIBPATH
|
||||
variables in CONFIG.SYS.
|
||||
|
||||
You should then set the PYTHONHOME and PYTHONPATH environment variables
|
||||
in CONFIG.SYS.
|
||||
|
||||
PYTHONHOME should be set to Python's top level directory. PYTHONPATH
|
||||
should be set to the semicolon separated list of principal Python library
|
||||
directories.
|
||||
I use:
|
||||
SET PYTHONHOME=F:/Python23
|
||||
SET PYTHONPATH=F:/Python23/Lib;F:/Python23/Lib/plat-os2emx;
|
||||
F:/Python23/Lib/lib-dynload;F:/Python23/Lib/site-packages
|
||||
|
||||
NOTE!: the PYTHONPATH setting above is linewrapped for this document - it
|
||||
should all be on one line in CONFIG.SYS!
|
||||
|
||||
If you wish to use the curses module, you should set the TERM and TERMINFO
|
||||
environment variables appropriately.
|
||||
|
||||
If you don't already have ncurses installed, I have included a copy of the
|
||||
EMX subset of the Terminfo database included with the ncurses-5.2 source
|
||||
distribution. This can be used by setting the TERMINFO environment variable
|
||||
to the path of the Terminfo subdirectory below the Python home directory.
|
||||
On my system this looks like:
|
||||
SET TERMINFO=F:/Python23/Terminfo
|
||||
|
||||
For the TERM environment variable, I would try one of the following:
|
||||
SET TERM=ansi
|
||||
SET TERM=os2
|
||||
SET TERM=window
|
||||
|
||||
You will have to reboot your system for these changes to CONFIG.SYS to take
|
||||
effect.
|
||||
|
||||
If you wish to compile all the included Python library modules to bytecode,
|
||||
you can change into the Python home directory and run the COMPILEALL.CMD
|
||||
batch file.
|
||||
|
||||
You can execute the regression tests included with the Python 2.3 source
|
||||
distribution by changing to the Python 2.3 home directory and executing the
|
||||
REGRTEST.CMD batch file. The following tests are known to fail at this
|
||||
time:
|
||||
- test_longexp (see "YOU HAVE BEEN WARNED" item 1);
|
||||
- test_mhlib (I don't know of any port of MH to OS/2);
|
||||
- test_pwd (see "YOU HAVE BEEN WARNED" item 14, probably a bug in my code);
|
||||
- test_grp (as per test_pwd);
|
||||
- test_strftime (see "YOU HAVE BEEN WARNED" item 20);
|
||||
- test_socketserver (fork() related, see "YOU HAVE BEEN WARNED" item 2).
|
||||
|
||||
|
||||
YOU HAVE BEEN WARNED!!
|
||||
----------------------
|
||||
|
||||
I know about a number of nasties in this port.
|
||||
|
||||
1. EMX's malloc() and/or the underlying OS/2 VM system aren't particularly
|
||||
comfortable with Python's use of heap memory. The test_longexp regression
|
||||
test exhausts the available swap space on a machine with 64MB of RAM with
|
||||
150MB of available swap space.
|
||||
|
||||
Using a crudely instrumented wrapper around malloc()/realloc()/free(), the
|
||||
heap memory usage of the expression at the core of the test
|
||||
(eval('[' + '2,' * NUMREPS + ']')) is as follows (approximately):
|
||||
NUMREPS = 1 => 300k
|
||||
NUMREPS = 10000 => 22MB
|
||||
NUMREPS = 20500 => 59MB
|
||||
|
||||
I don't even have enough memory to try for NUMREPS = 25000 :-(, let alone
|
||||
the NUMREPS = 65580 in test_longexp! I do have a report that the test
|
||||
succeeds in the presence of sufficient memory (~200MB RAM).
|
||||
|
||||
During the course of running the test routine, the Python parser
|
||||
allocates lots of 21 byte memory chunks, each of which is actually
|
||||
a 64 byte allocation. There are a smaller number of 3 byte allocations
|
||||
which consume 12 bytes each. Consequently, more than 3 times as much
|
||||
memory is allocated than is actually used.
|
||||
|
||||
The Python Object Allocator code (PyMalloc) was introduced in Python 2.1
|
||||
for Python's core to be able to wrap the malloc() system to deal with
|
||||
problems with "unfriendly" malloc() behaviour, such as this. Unfortunately
|
||||
for the OS/2 port, it is only supported for the allocation of memory for
|
||||
objects, whereas my research into this problem indicates it is the parser
|
||||
which is source of this particular malloc() frenzy.
|
||||
|
||||
I have attempted using PyMalloc to manage all of Python's memory
|
||||
allocation. While this works fine (modulo the socket regression test
|
||||
failing in the absence of a socket.pyc), it is a significant performance
|
||||
hit - the time to run the regression test blows out from ~3.5 minutes to
|
||||
~5.75 minutes on my system.
|
||||
|
||||
I therefore don't plan to pursue this any further for the time being.
|
||||
|
||||
Be aware that certain types of expressions could well bring your system
|
||||
to its knees as a result of this issue. I have modified the longexp test
|
||||
to report failure to highlight this.
|
||||
|
||||
2. Eberhard Mattes, author of EMX, writes in his documentation that fork()
|
||||
is very inefficient in the OS/2 environment. It also requires that the
|
||||
executable be linked in a.out format rather than OMF. Use the os.exec
|
||||
and/or the os.spawn family of functions where possible.
|
||||
|
||||
{3. Issue resolved...}
|
||||
|
||||
4. In the absence of GNU Readline, terminating the interpreter requires a
|
||||
control-Z (^Z) followed by a carriage return. Jeff Rush documented this
|
||||
problem in his Python 1.5.2 port. With Readline, a control-D (^D) works
|
||||
as per the standard Unix environment.
|
||||
|
||||
5. EMX only has a partial implementation of fcntl(). The fcntl module
|
||||
in this port supports what EMX supports. If fcntl is important to you,
|
||||
please review the EMX C Library Reference (included in .INF format in the
|
||||
EMXVIEW.ZIP archive as part of the complete EMX development tools suite).
|
||||
Because of other side-effects I have modified the test_fcntl.py test
|
||||
script to deactivate the exercising of the missing functionality.
|
||||
|
||||
6. The BSD DB module is linked against DB v1.85. This version is widely
|
||||
known to have bugs, although some patches have become available (and are
|
||||
incorporated into the included bsddb module). Unless you have problems
|
||||
with software licenses which would rule out GDBM (and the dbm module
|
||||
because it is linked against the GDBM library) or need it for file format
|
||||
compatibility, you may be better off deleting it and relying on GDBM. I
|
||||
haven't looked at porting the version of the module supporting the later
|
||||
SleepyCat releases of BSD DB, which would also require a port of the
|
||||
SleepyCat DB package.
|
||||
|
||||
7. The readline module has been linked against ncurses rather than the
|
||||
termcap library supplied with EMX.
|
||||
|
||||
{8. Workaround implemented}
|
||||
|
||||
9. I have configured this port to use "/" as the preferred path separator
|
||||
character, rather than "\" ('\\'), in line with the convention supported
|
||||
by EMX. Backslashes are still supported of course, and still appear in
|
||||
unexpected places due to outside sources that don't get normalised.
|
||||
|
||||
10. While the DistUtils components are now functional, other
|
||||
packaging/binary handling tools and utilities such as those included in
|
||||
the Demo and Tools directories - freeze in particular - are unlikely to
|
||||
work. If you do get them going, I'd like to know about your success.
|
||||
|
||||
11. I haven't set out to support the [BEGIN|END]LIBPATH functionality
|
||||
supported by one of the earlier ports (Rush's??). If it works let me know.
|
||||
|
||||
12. There appear to be several versions of Z.DLL floating around - the one
|
||||
I have is 45061 bytes and dated January 22, 1999. I have a report that
|
||||
another version causes SYS3175s when the zlib module is imported.
|
||||
|
||||
14. As a result of the limitations imposed by EMX's library routines, the
|
||||
standard extension module pwd only synthesises a simple passwd database,
|
||||
and the grp module cannot be supported at all.
|
||||
|
||||
I have written substitutes, in Python naturally, which can process real
|
||||
passwd and group files for those applications (such as MailMan) that
|
||||
require more than EMX emulates. I have placed pwd.py and grp.py in
|
||||
Lib/plat-os2emx, which is usually before Lib/lib-dynload (which contains
|
||||
pwd.pyd) in the PYTHONPATH. If you have become attached to what pwd.pyd
|
||||
supports, you can put Lib/lib-dynload before Lib/plat-os2emx in PYTHONPATH
|
||||
or delete/rename pwd.py & grp.py.
|
||||
|
||||
pwd.py & grp.py support locating their data files by looking in the
|
||||
environment for them in the following sequence:
|
||||
pwd.py: $ETC_PASSWD (%ETC_PASSWD%)
|
||||
$ETC/passwd (%ETC%/passwd)
|
||||
$PYTHONHOME/Etc/passwd (%PYTHONHOME%/Etc/passwd)
|
||||
grp.py: $ETC_GROUP (%ETC_GROUP%)
|
||||
$ETC/group (%ETC%/group)
|
||||
$PYTHONHOME/Etc/group (%PYTHONHOME%/Etc/group)
|
||||
|
||||
Both modules support using either the ":" character (Unix standard) or
|
||||
";" (OS/2, DOS, Windows standard) field separator character, and pwd.py
|
||||
implements the following drive letter conversions for the home_directory and
|
||||
shell fields (for the ":" separator only):
|
||||
$x -> x:
|
||||
x; -> x:
|
||||
|
||||
Example versions of passwd and group are in the Etc subdirectory. Note
|
||||
that as of this release, this code fails the regression test. I'm looking
|
||||
into why, and hope to have this fixed.
|
||||
|
||||
15. As of Python 2.1, termios support has mutated. There is no longer a
|
||||
platform specific TERMIOS.py containing the symbolic constants - these
|
||||
now live in the termios module. EMX's termios routines don't support all
|
||||
of the functionality now exposed by the termios module - refer to the EMX
|
||||
documentation to find out what is supported.
|
||||
|
||||
16. The case sensitive import semantics introduced in Python 2.1 for other
|
||||
case insensitive but case preserving file/operating systems (Windows etc),
|
||||
have been incorporated into this port, and are active by default. Setting
|
||||
the PYTHONCASEOK environment variable (to any value) reverts to the
|
||||
previous (case insensitive) semantics.
|
||||
|
||||
17. Because I am statically linking ncurses, the _curses_panel
|
||||
module has potential problems arising from separate library data areas.
|
||||
To avoid this, I have configured the _curses_.pyd (imported as
|
||||
"_curses_panel") to import the ncurses symbols it needs from _curses.pyd.
|
||||
As a result the _curses module must be imported before the _curses_panel
|
||||
module. As far as I can tell, the modules in the curses package do this.
|
||||
If you have problems attempting to use the _curses_panel support please
|
||||
let me know, and I'll look into an alternative solution.
|
||||
|
||||
18. I tried enabling the Python Object Allocator (PYMALLOC) code. While
|
||||
the port built this way passes the regression test, the Numpy extension
|
||||
(I tested v19.0.0) as built with with the port's DistUtils code doesn't
|
||||
work. Specifically, attempting to "import Numeric" provokes a core dump.
|
||||
Supposedly Numpy v20.1.0 contains a fix for this, but for reason outlined
|
||||
in item 1 above, PYMALLOC is not enabled in this release.
|
||||
|
||||
19. sys.platform now reports "os2emx" instead of "os2". os.name still
|
||||
reports "os2". This change was to make it easier to distinguish between
|
||||
the VAC++ build (being maintained by Michael Muller) and the EMX build
|
||||
(this port), principally for DistUtils.
|
||||
|
||||
20. it appears that the %W substitution in the EMX strftime() routine has
|
||||
an off-by-one bug. strftime was listed as passing the regression tests
|
||||
in previous releases, but this fact appears to have been an oversight in
|
||||
the regression test suite. To fix this really requires a portable
|
||||
strftime routine - I'm looking into using one from FreeBSD, but its not
|
||||
ready yet.
|
||||
|
||||
21. previous releases of my Python ports have used the GCC optimisations
|
||||
"-O2 -fomit-frame-pointer". After experimenting with various optimisation
|
||||
settings, including deactivating assert()ions, I have concluded that "-O2"
|
||||
appears the best compromise for GCC 2.8.1 on my hardware. Curiously,
|
||||
deactivating assert() (via defining NDEBUG) _negatively_ impacts
|
||||
performance, allbeit only slightly, so I've chosen to leave the assert()s
|
||||
active.
|
||||
|
||||
I did try using Andrew Zabolotny's (p)gcc 2.95.2 compiler, and in
|
||||
general concluded that it produced larger objects that ran slower
|
||||
than Mattes' gcc 2.8.1 compiler.
|
||||
|
||||
Pystone ratings varied from just over 2000/s (no optimisation at all)
|
||||
to just under 3300/s (gcc 2.8.1, -O2) on my K6/2-300 system, for
|
||||
100,000 iterations per run (rather than the default 10000).
|
||||
|
||||
As a result of the optimisation change, the Python DLL is about 10%
|
||||
smaller than in the 2.1 release, and many of the dynamically loadable
|
||||
modules are smaller too.
|
||||
|
||||
[2001/08/12]
|
||||
|
||||
22. As of this release, os.spawnv() and os.spawnve() now expose EMX's
|
||||
library routines rather than use the emulation in os.py.
|
||||
|
||||
In order to make use of some of the features this makes available in
|
||||
the OS/2 environment, you should peruse the relevant EMX documentation
|
||||
(EMXLIB.INF in the EMXVIEW.ZIP archive accompanying the EMX archives
|
||||
on Hobbes or LEO). Be aware that I have exposed all the "mode" options
|
||||
supported by EMX, but there are combinations that either cannot be
|
||||
practically used by/in Python or have the potential to compromise your
|
||||
system's stability.
|
||||
|
||||
23. pythonpm.exe in previous releases was just python.exe with the
|
||||
WINDOWAPI linker option set in the pythonpm.def file. In practice,
|
||||
this turns out to do nothing useful.
|
||||
|
||||
I have written a replacement which wraps the Python DLL in a genuine
|
||||
Presentation Manager application. This version actually runs the
|
||||
Python interpreter in a separate thread from the PM shell, in order
|
||||
that PythonPM has a functioning message queue as good PM apps should.
|
||||
In its current state, PythonPM's window is hidden. It can be displayed,
|
||||
although it will have no content as nothing is ever written to the
|
||||
window. Only the "hide" button is available. Although the code
|
||||
has support for shutting PythonPM down when the Python interpreter is
|
||||
still busy (via the "control" menu), this is not well tested and given
|
||||
comments I've come across in EMX documentation suggesting that the
|
||||
thread killing operation has problems I would suggest caution in
|
||||
relying on this capability.
|
||||
|
||||
PythonPM processes commandline parameters normally. The standard input,
|
||||
output and error streams are only useful if redirected, as PythonPM's
|
||||
window is not a console in any form and so cannot accept or display
|
||||
anything. This means that the -i option is ineffective.
|
||||
|
||||
Because the Python thread doesn't create its own message queue, creating
|
||||
PM Windows and performing most PM operations is not possible from within
|
||||
this thread. How this will affect supporting PM extensions (such as
|
||||
Tkinter using a PM port of Tcl/Tk, or wxPython using the PM port of
|
||||
WxWindows) is still being researched.
|
||||
|
||||
Note that os.fork() _DOES_NOT_WORK_ in PythonPM - SYS3175s are the result
|
||||
of trying. os.spawnv() _does_ work. PythonPM passes all regression tests
|
||||
that the standard Python interpreter (python.exe) passes, with the exception
|
||||
of test_fork1 and test_socket which both attempt to use os.fork().
|
||||
|
||||
I very much want feedback on the performance, behaviour and utility of
|
||||
PythonPM. I would like to add a PM console capability to it, but that
|
||||
will be a non-trivial effort. I may be able to leverage the code in
|
||||
Illya Vaes' Tcl/Tk port, which would make it easier.
|
||||
|
||||
[2001/08/14]
|
||||
|
||||
24. os.chdir() now uses EMX's _chdir2(), which supports changing
|
||||
both drive and directory at once. Similarly, os.getcwd() now uses
|
||||
EMX's _getcwd() which returns drive as well as path.
|
||||
|
||||
[2001/12/08] - 2.2 Beta 2
|
||||
|
||||
25. pyconfig.h (previously known as config.h) is now located in the
|
||||
Include subdirectory with all other include files.
|
||||
|
||||
[2001/12/16] - 2.2 Release Candidate 1
|
||||
|
||||
[2001/12/08] - 2.2 Final
|
||||
|
||||
... probably other issues that I've not encountered, or don't remember :-(
|
||||
|
||||
If you encounter other difficulties with this port, which can be
|
||||
characterised as peculiar to this port rather than to the Python release,
|
||||
I would like to hear about them. However I cannot promise to be able to do
|
||||
anything to resolve such problems. See the Contact section below...
|
||||
|
||||
|
||||
To do...
|
||||
--------
|
||||
|
||||
In no particular order of apparent importance or likelihood...
|
||||
|
||||
- support Tkinter and/or alternative GUI (wxWindows??)
|
||||
|
||||
|
||||
Credits
|
||||
-------
|
||||
|
||||
In addition to people identified above, I'd like to thank:
|
||||
- the BDFL, Guido van Rossum, and crew for Python;
|
||||
- Dr David Mertz, for trying out a pre-release of this port;
|
||||
- the Python-list/comp.lang.python community;
|
||||
- John Poltorak, for input about pwd/grp.
|
||||
|
||||
Contact
|
||||
-------
|
||||
|
||||
Constructive feedback, negative or positive, about this port is welcome
|
||||
and should be addressed to me at the e-mail addresses below.
|
||||
|
||||
I intend creating a private mailing list for announcements of fixes &
|
||||
updates to this port. If you wish to receive such e-mail announcments,
|
||||
please send me an e-mail requesting that you be added to this list.
|
||||
|
||||
Andrew MacIntyre
|
||||
E-mail: andymac@bullseye.apana.org.au, or andymac@pcug.org.au
|
||||
Web: http://www.andymac.org/
|
||||
|
||||
24 December, 2001.
|
160
PC/os2emx/config.c
Normal file
160
PC/os2emx/config.c
Normal file
|
@ -0,0 +1,160 @@
|
|||
/* -*- C -*- ***********************************************
|
||||
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
||||
The Netherlands.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Stichting Mathematisch
|
||||
Centrum or CWI or Corporation for National Research Initiatives or
|
||||
CNRI not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
While CWI is the initial source for this software, a modified version
|
||||
is made available by the Corporation for National Research Initiatives
|
||||
(CNRI) at the Internet address ftp://ftp.python.org.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
|
||||
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/* Module configuration */
|
||||
|
||||
/* This file contains the table of built-in modules.
|
||||
See init_builtin() in import.c. */
|
||||
|
||||
#include "Python.h"
|
||||
|
||||
extern void init_codecs();
|
||||
extern void init_curses();
|
||||
extern void init_curses_panel();
|
||||
extern void init_hotshot();
|
||||
extern void init_locale();
|
||||
extern void init_socket();
|
||||
extern void init_sre();
|
||||
extern void init_testcapi();
|
||||
extern void init_weakref();
|
||||
extern void initarray();
|
||||
extern void initbinascii();
|
||||
extern void initbsddb();
|
||||
extern void initcPickle();
|
||||
extern void initcStringIO();
|
||||
extern void initcmath();
|
||||
extern void initdl();
|
||||
extern void initerrno();
|
||||
extern void initfcntl();
|
||||
extern void initfpectl();
|
||||
extern void initfpetest();
|
||||
extern void initgc();
|
||||
extern void initimageop();
|
||||
extern void initmath();
|
||||
extern void initmd5();
|
||||
extern void initnew();
|
||||
extern void initos2();
|
||||
extern void initoperator();
|
||||
extern void initparser();
|
||||
extern void initpcre();
|
||||
extern void initpwd();
|
||||
extern void initregex();
|
||||
extern void initrgbimg();
|
||||
extern void initrotor();
|
||||
extern void initselect();
|
||||
extern void initsha();
|
||||
extern void initsignal();
|
||||
extern void initstrop();
|
||||
extern void initstruct();
|
||||
extern void inittermios();
|
||||
extern void initthread();
|
||||
extern void inittime();
|
||||
extern void inittiming();
|
||||
extern void initunicodedata();
|
||||
extern void initxreadlines();
|
||||
extern void initzlib();
|
||||
|
||||
/* -- ADDMODULE MARKER 1 -- */
|
||||
|
||||
extern void PyMarshal_Init();
|
||||
extern void initimp();
|
||||
|
||||
struct _inittab _PyImport_Inittab[] = {
|
||||
|
||||
{"gc", initgc},
|
||||
{"os2", initos2},
|
||||
{"_sre", init_sre},
|
||||
{"signal", initsignal},
|
||||
#ifdef WITH_THREAD
|
||||
{"thread", initthread},
|
||||
#endif
|
||||
#if !HAVE_DYNAMIC_LOADING
|
||||
{"_codecs", init_codecs},
|
||||
{"_curses", init_curses},
|
||||
{"_curses_panel", init_curses_panel},
|
||||
{"_hotshot", init_hotshot},
|
||||
{"_locale", init_locale},
|
||||
{"_testcapi", init_testcapi},
|
||||
{"_weakref", init_weakref},
|
||||
{"array", initarray},
|
||||
{"binascii", initbinascii},
|
||||
{"bsddb", initbsddb},
|
||||
{"cPickle", initcPickle},
|
||||
{"cStringIO", initcStringIO},
|
||||
{"cmath", initcmath},
|
||||
{"dl", initdl},
|
||||
{"errno", initerrno},
|
||||
{"fcntl", initfcntl},
|
||||
{"fpectl", initfpectl},
|
||||
{"fpetest", initfpetest},
|
||||
{"imageop", initimageop},
|
||||
{"math", initmath},
|
||||
{"md5", initmd5},
|
||||
{"new", initnew},
|
||||
{"operator", initoperator},
|
||||
{"parser", initparser},
|
||||
{"pcre", initpcre},
|
||||
{"pwd", initpwd},
|
||||
{"regex", initregex},
|
||||
{"rgbimg", initrgbimg},
|
||||
{"rotor", initrotor},
|
||||
{"sha", initsha},
|
||||
{"strop", initstrop},
|
||||
{"struct", initstruct},
|
||||
{"termios", inittermios},
|
||||
{"time", inittime},
|
||||
{"timing", inittiming},
|
||||
{"unicodedata", initunicodedata},
|
||||
{"xreadlines", initxreadlines},
|
||||
{"zlib", initzlib},
|
||||
#ifdef USE_SOCKET
|
||||
{"_socket", init_socket},
|
||||
{"select", initselect},
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* -- ADDMODULE MARKER 2 -- */
|
||||
|
||||
/* This module "lives in" with marshal.c */
|
||||
{"marshal", PyMarshal_Init},
|
||||
|
||||
/* This lives it with import.c */
|
||||
{"imp", initimp},
|
||||
|
||||
/* These entries are here for sys.builtin_module_names */
|
||||
{"__main__", NULL},
|
||||
{"__builtin__", NULL},
|
||||
{"sys", NULL},
|
||||
{"exceptions", NULL},
|
||||
|
||||
/* Sentinel */
|
||||
{0, 0}
|
||||
};
|
224
PC/os2emx/dlfcn.c
Normal file
224
PC/os2emx/dlfcn.c
Normal file
|
@ -0,0 +1,224 @@
|
|||
/* -*- C -*- ***********************************************
|
||||
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
||||
The Netherlands.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Stichting Mathematisch
|
||||
Centrum or CWI or Corporation for National Research Initiatives or
|
||||
CNRI not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
While CWI is the initial source for this software, a modified version
|
||||
is made available by the Corporation for National Research Initiatives
|
||||
(CNRI) at the Internet address ftp://ftp.python.org.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
|
||||
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/*
|
||||
This library implements dlopen() - functions for OS/2 using
|
||||
DosLoadModule() and company.
|
||||
*/
|
||||
|
||||
#define INCL_DOS
|
||||
#define INCL_DOSERRORS
|
||||
#define INCL_DOSSESMGR
|
||||
#define INCL_WINPROGRAMLIST
|
||||
#define INCL_WINFRAMEMGR
|
||||
#include <os2.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
|
||||
/*-------------------------------------- Unix-like dynamic linking emulation -*/
|
||||
|
||||
typedef struct _track_rec {
|
||||
char *name;
|
||||
HMODULE handle;
|
||||
void *id;
|
||||
struct _track_rec *next;
|
||||
} tDLLchain, *DLLchain;
|
||||
|
||||
static DLLchain dlload = NULL; /* A simple chained list of DLL names */
|
||||
static char dlerr [256]; /* last error text string */
|
||||
static void *last_id;
|
||||
|
||||
static DLLchain find_id(void *id)
|
||||
{
|
||||
DLLchain tmp;
|
||||
|
||||
for (tmp = dlload; tmp; tmp = tmp->next)
|
||||
if (id == tmp->id)
|
||||
return (tmp);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* load a dynamic-link library and return handle */
|
||||
void *dlopen (char *filename, int flags)
|
||||
{
|
||||
HMODULE hm;
|
||||
DLLchain tmp;
|
||||
char err[256];
|
||||
char *errtxt;
|
||||
int rc = 0, set_chain = 0;
|
||||
|
||||
for (tmp = dlload; tmp; tmp = tmp->next)
|
||||
if (strnicmp(tmp->name, filename, 999) == 0)
|
||||
break;
|
||||
|
||||
if (!tmp)
|
||||
{
|
||||
tmp = (DLLchain)malloc (sizeof (tDLLchain));
|
||||
if (!tmp)
|
||||
goto nomem;
|
||||
tmp->name = strdup (filename);
|
||||
tmp->next = dlload;
|
||||
set_chain = 1;
|
||||
}
|
||||
|
||||
switch (rc = DosLoadModule((PSZ)&err, sizeof(err), filename, &hm))
|
||||
{
|
||||
case NO_ERROR:
|
||||
tmp->handle = hm;
|
||||
if (set_chain) {
|
||||
do {
|
||||
last_id++;
|
||||
} while ((last_id == 0) || (find_id(last_id)));
|
||||
tmp->id = last_id;
|
||||
dlload = tmp;
|
||||
}
|
||||
return (tmp->id);
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
case ERROR_PATH_NOT_FOUND:
|
||||
errtxt = "module `%s' not found";
|
||||
break;
|
||||
case ERROR_TOO_MANY_OPEN_FILES:
|
||||
case ERROR_NOT_ENOUGH_MEMORY:
|
||||
case ERROR_SHARING_BUFFER_EXCEEDED:
|
||||
nomem:
|
||||
errtxt = "out of system resources";
|
||||
break;
|
||||
case ERROR_ACCESS_DENIED:
|
||||
errtxt = "access denied";
|
||||
break;
|
||||
case ERROR_BAD_FORMAT:
|
||||
case ERROR_INVALID_SEGMENT_NUMBER:
|
||||
case ERROR_INVALID_ORDINAL:
|
||||
case ERROR_INVALID_MODULETYPE:
|
||||
case ERROR_INVALID_EXE_SIGNATURE:
|
||||
case ERROR_EXE_MARKED_INVALID:
|
||||
case ERROR_ITERATED_DATA_EXCEEDS_64K:
|
||||
case ERROR_INVALID_MINALLOCSIZE:
|
||||
case ERROR_INVALID_SEGDPL:
|
||||
case ERROR_AUTODATASEG_EXCEEDS_64K:
|
||||
case ERROR_RELOCSRC_CHAIN_EXCEEDS_SEGLIMIT:
|
||||
errtxt = "invalid module format";
|
||||
break;
|
||||
case ERROR_INVALID_NAME:
|
||||
errtxt = "filename doesn't match module name";
|
||||
break;
|
||||
case ERROR_SHARING_VIOLATION:
|
||||
case ERROR_LOCK_VIOLATION:
|
||||
errtxt = "sharing violation";
|
||||
break;
|
||||
case ERROR_INIT_ROUTINE_FAILED:
|
||||
errtxt = "module initialization failed";
|
||||
break;
|
||||
default:
|
||||
errtxt = "cause `%s', error code = %d";
|
||||
break;
|
||||
}
|
||||
snprintf (dlerr, sizeof (dlerr), errtxt, &err, rc);
|
||||
if (tmp) {
|
||||
if (tmp->name)
|
||||
free(tmp->name);
|
||||
free (tmp);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* return a pointer to the `symbol' in DLL */
|
||||
void *dlsym (void *handle, char *symbol)
|
||||
{
|
||||
int rc = 0;
|
||||
PFN addr;
|
||||
char *errtxt;
|
||||
int symord = 0;
|
||||
DLLchain tmp = find_id (handle);
|
||||
|
||||
if (!tmp)
|
||||
goto inv_handle;
|
||||
|
||||
if (*symbol == '#')
|
||||
symord = atoi (symbol + 1);
|
||||
|
||||
switch (rc = DosQueryProcAddr(tmp->handle, symord, symbol, &addr))
|
||||
{
|
||||
case NO_ERROR:
|
||||
return ((void *)addr);
|
||||
case ERROR_INVALID_HANDLE:
|
||||
inv_handle:
|
||||
errtxt = "invalid module handle";
|
||||
break;
|
||||
case ERROR_PROC_NOT_FOUND:
|
||||
case ERROR_INVALID_NAME:
|
||||
errtxt = "no symbol `%s' in module";
|
||||
break;
|
||||
default:
|
||||
errtxt = "symbol `%s', error code = %d";
|
||||
break;
|
||||
}
|
||||
snprintf (dlerr, sizeof (dlerr), errtxt, symbol, rc);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* free dynamicaly-linked library */
|
||||
int dlclose (void *handle)
|
||||
{
|
||||
int rc;
|
||||
DLLchain tmp = find_id (handle);
|
||||
|
||||
if (!tmp)
|
||||
goto inv_handle;
|
||||
|
||||
switch (rc = DosFreeModule (tmp->handle))
|
||||
{
|
||||
case NO_ERROR:
|
||||
free (tmp->name);
|
||||
dlload = tmp->next;
|
||||
free (tmp);
|
||||
return (0);
|
||||
case ERROR_INVALID_HANDLE:
|
||||
inv_handle:
|
||||
strcpy(dlerr, "invalid module handle");
|
||||
return (-1);
|
||||
case ERROR_INVALID_ACCESS:
|
||||
strcpy (dlerr, "access denied");
|
||||
return (-1);
|
||||
default:
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
/* return a string describing last occured dl error */
|
||||
char *dlerror()
|
||||
{
|
||||
return (dlerr);
|
||||
}
|
50
PC/os2emx/dlfcn.h
Normal file
50
PC/os2emx/dlfcn.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* -*- C -*- ***********************************************
|
||||
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
||||
The Netherlands.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Stichting Mathematisch
|
||||
Centrum or CWI or Corporation for National Research Initiatives or
|
||||
CNRI not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
While CWI is the initial source for this software, a modified version
|
||||
is made available by the Corporation for National Research Initiatives
|
||||
(CNRI) at the Internet address ftp://ftp.python.org.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
|
||||
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/*
|
||||
This library implements dlopen() - functions for OS/2 using
|
||||
DosLoadModule() and company.
|
||||
*/
|
||||
|
||||
#ifndef _DLFCN_H
|
||||
#define _DLFCN_H
|
||||
|
||||
/*-------------------------------------- Unix-like dynamic linking emulation -*/
|
||||
/* load a dynamic-link library and return handle */
|
||||
void *dlopen (char *filename, int flags);
|
||||
/* return a pointer to the `symbol' in DLL */
|
||||
void *dlsym (void *handle, char *symbol);
|
||||
/* free dynamicaly-linked library */
|
||||
int dlclose (void *handle);
|
||||
/* return a string describing last occured dl error */
|
||||
char *dlerror(void);
|
||||
|
||||
#endif /* !_DLFCN_H */
|
54
PC/os2emx/dllentry.c
Normal file
54
PC/os2emx/dllentry.c
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
This is the entry point for Python DLL(s).
|
||||
It also provides an getenv() function that works from within DLLs.
|
||||
*/
|
||||
|
||||
#define NULL 0
|
||||
|
||||
/* Make references to imported symbols to pull them from static library */
|
||||
#define REF(s) extern void s (); void *____ref_##s = &s;
|
||||
|
||||
REF (Py_Main);
|
||||
|
||||
#if defined (__EMX__)
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
extern int _CRT_init (void);
|
||||
extern void _CRT_term (void);
|
||||
extern void __ctordtorInit (void);
|
||||
extern void __ctordtorTerm (void);
|
||||
|
||||
unsigned long _DLL_InitTerm (unsigned long mod_handle, unsigned long flag)
|
||||
{
|
||||
switch (flag)
|
||||
{
|
||||
case 0:
|
||||
if (_CRT_init ()) return 0;
|
||||
__ctordtorInit ();
|
||||
/* Ignore fatal signals */
|
||||
signal (SIGSEGV, SIG_IGN);
|
||||
signal (SIGFPE, SIG_IGN);
|
||||
return 1;
|
||||
case 1:
|
||||
__ctordtorTerm ();
|
||||
_CRT_term ();
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* A version of getenv() that works from DLLs */
|
||||
extern int DosScanEnv (const char *pszName, char **ppszValue);
|
||||
|
||||
char *getenv (const char *name)
|
||||
{
|
||||
char *value;
|
||||
if (DosScanEnv (name, &value))
|
||||
return NULL;
|
||||
else
|
||||
return value;
|
||||
}
|
383
PC/os2emx/getpathp.c
Normal file
383
PC/os2emx/getpathp.c
Normal file
|
@ -0,0 +1,383 @@
|
|||
|
||||
/* Return the initial module search path. */
|
||||
/* This version used by OS/2+EMX */
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
PATH RULES FOR OS/2+EMX:
|
||||
This describes how sys.path is formed on OS/2+EMX. It describes the
|
||||
functionality, not the implementation (ie, the order in which these
|
||||
are actually fetched is different)
|
||||
|
||||
* Python always adds an empty entry at the start, which corresponds
|
||||
to the current directory.
|
||||
|
||||
* If the PYTHONPATH env. var. exists, it's entries are added next.
|
||||
|
||||
* We attempt to locate the "Python Home" - if the PYTHONHOME env var
|
||||
is set, we believe it. Otherwise, we use the path of our host .EXE's
|
||||
to try and locate our "landmark" (lib\\os.py) and deduce our home.
|
||||
- If we DO have a Python Home: The relevant sub-directories (Lib,
|
||||
plat-win, lib-tk, etc) are based on the Python Home
|
||||
- If we DO NOT have a Python Home, the core Python Path is
|
||||
loaded from the registry. This is the main PythonPath key,
|
||||
and both HKLM and HKCU are combined to form the path)
|
||||
|
||||
* Iff - we can not locate the Python Home, and have not had a PYTHONPATH
|
||||
specified (ie, we have _nothing_ we can assume is a good path), a
|
||||
default path with relative entries is used (eg. .\Lib;.\plat-win, etc)
|
||||
|
||||
|
||||
The end result of all this is:
|
||||
* When running python.exe, or any other .exe in the main Python directory
|
||||
(either an installed version, or directly from the PCbuild directory),
|
||||
the core path is deduced.
|
||||
|
||||
* When Python is hosted in another exe (different directory, embedded via
|
||||
COM, etc), the Python Home will not be deduced, so the core path from
|
||||
the registry is used. Other "application paths "in the registry are
|
||||
always read.
|
||||
|
||||
* If Python can't find its home and there is no registry (eg, frozen
|
||||
exe, some very strange installation setup) you get a path with
|
||||
some default, but relative, paths.
|
||||
|
||||
---------------------------------------------------------------- */
|
||||
|
||||
|
||||
#include "Python.h"
|
||||
#include "osdefs.h"
|
||||
|
||||
#ifndef PYOS_OS2
|
||||
#error This file only compilable on OS/2
|
||||
#endif
|
||||
|
||||
#define INCL_DOS
|
||||
#include <os2.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
|
||||
#if HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
|
||||
/* Search in some common locations for the associated Python libraries.
|
||||
*
|
||||
* Py_GetPath() tries to return a sensible Python module search path.
|
||||
*
|
||||
* The approach is an adaptation for Windows of the strategy used in
|
||||
* ../Modules/getpath.c; it uses the Windows Registry as one of its
|
||||
* information sources.
|
||||
*/
|
||||
|
||||
#ifndef LANDMARK
|
||||
#if defined(PYCC_GCC)
|
||||
#define LANDMARK "lib/os.py"
|
||||
#else
|
||||
#define LANDMARK "lib\\os.py"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static char prefix[MAXPATHLEN+1];
|
||||
static char progpath[MAXPATHLEN+1];
|
||||
static char *module_search_path = NULL;
|
||||
|
||||
|
||||
static int
|
||||
is_sep(char ch) /* determine if "ch" is a separator character */
|
||||
{
|
||||
#ifdef ALTSEP
|
||||
return ch == SEP || ch == ALTSEP;
|
||||
#else
|
||||
return ch == SEP;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* assumes 'dir' null terminated in bounds. Never writes
|
||||
beyond existing terminator.
|
||||
*/
|
||||
static void
|
||||
reduce(char *dir)
|
||||
{
|
||||
size_t i = strlen(dir);
|
||||
while (i > 0 && !is_sep(dir[i]))
|
||||
--i;
|
||||
dir[i] = '\0';
|
||||
}
|
||||
|
||||
static int
|
||||
exists(char *filename)
|
||||
{
|
||||
struct stat buf;
|
||||
return stat(filename, &buf) == 0;
|
||||
}
|
||||
|
||||
/* Assumes 'filename' MAXPATHLEN+1 bytes long -
|
||||
may extend 'filename' by one character.
|
||||
*/
|
||||
static int
|
||||
ismodule(char *filename) /* Is module -- check for .pyc/.pyo too */
|
||||
{
|
||||
if (exists(filename))
|
||||
return 1;
|
||||
|
||||
/* Check for the compiled version of prefix. */
|
||||
if (strlen(filename) < MAXPATHLEN) {
|
||||
strcat(filename, Py_OptimizeFlag ? "o" : "c");
|
||||
if (exists(filename))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* guarantees buffer will never overflow MAXPATHLEN+1 bytes */
|
||||
static void
|
||||
join(char *buffer, char *stuff)
|
||||
{
|
||||
size_t n, k;
|
||||
if (is_sep(stuff[0]))
|
||||
n = 0;
|
||||
else {
|
||||
n = strlen(buffer);
|
||||
if (n > 0 && !is_sep(buffer[n-1]) && n < MAXPATHLEN)
|
||||
buffer[n++] = SEP;
|
||||
}
|
||||
k = strlen(stuff);
|
||||
if (n + k > MAXPATHLEN)
|
||||
k = MAXPATHLEN - n;
|
||||
strncpy(buffer+n, stuff, k);
|
||||
buffer[n+k] = '\0';
|
||||
}
|
||||
|
||||
/* gotlandmark only called by search_for_prefix, which ensures
|
||||
'prefix' is null terminated in bounds. join() ensures
|
||||
'landmark' can not overflow prefix if too long.
|
||||
*/
|
||||
static int
|
||||
gotlandmark(char *landmark)
|
||||
{
|
||||
int n, ok;
|
||||
|
||||
n = strlen(prefix);
|
||||
join(prefix, landmark);
|
||||
ok = ismodule(prefix);
|
||||
prefix[n] = '\0';
|
||||
return ok;
|
||||
}
|
||||
|
||||
/* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd.
|
||||
assumption provided by only caller, calculate_path() */
|
||||
static int
|
||||
search_for_prefix(char *argv0_path, char *landmark)
|
||||
{
|
||||
/* Search from argv0_path, until landmark is found */
|
||||
strcpy(prefix, argv0_path);
|
||||
do {
|
||||
if (gotlandmark(landmark))
|
||||
return 1;
|
||||
reduce(prefix);
|
||||
} while (prefix[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
get_progpath(void)
|
||||
{
|
||||
extern char *Py_GetProgramName(void);
|
||||
char *path = getenv("PATH");
|
||||
char *prog = Py_GetProgramName();
|
||||
|
||||
PPIB pib;
|
||||
if ((DosGetInfoBlocks(NULL, &pib) == 0) &&
|
||||
(DosQueryModuleName(pib->pib_hmte, sizeof(progpath), progpath) == 0))
|
||||
return;
|
||||
|
||||
if (prog == NULL || *prog == '\0')
|
||||
prog = "python";
|
||||
|
||||
/* If there is no slash in the argv0 path, then we have to
|
||||
* assume python is on the user's $PATH, since there's no
|
||||
* other way to find a directory to start the search from. If
|
||||
* $PATH isn't exported, you lose.
|
||||
*/
|
||||
#ifdef ALTSEP
|
||||
if (strchr(prog, SEP) || strchr(prog, ALTSEP))
|
||||
#else
|
||||
if (strchr(prog, SEP))
|
||||
#endif
|
||||
strncpy(progpath, prog, MAXPATHLEN);
|
||||
else if (path) {
|
||||
while (1) {
|
||||
char *delim = strchr(path, DELIM);
|
||||
|
||||
if (delim) {
|
||||
size_t len = delim - path;
|
||||
/* ensure we can't overwrite buffer */
|
||||
#if !defined(PYCC_GCC)
|
||||
len = min(MAXPATHLEN,len);
|
||||
#else
|
||||
len = MAXPATHLEN < len ? MAXPATHLEN : len;
|
||||
#endif
|
||||
strncpy(progpath, path, len);
|
||||
*(progpath + len) = '\0';
|
||||
}
|
||||
else
|
||||
strncpy(progpath, path, MAXPATHLEN);
|
||||
|
||||
/* join() is safe for MAXPATHLEN+1 size buffer */
|
||||
join(progpath, prog);
|
||||
if (exists(progpath))
|
||||
break;
|
||||
|
||||
if (!delim) {
|
||||
progpath[0] = '\0';
|
||||
break;
|
||||
}
|
||||
path = delim + 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
progpath[0] = '\0';
|
||||
}
|
||||
|
||||
static void
|
||||
calculate_path(void)
|
||||
{
|
||||
char argv0_path[MAXPATHLEN+1];
|
||||
char *buf;
|
||||
size_t bufsz;
|
||||
char *pythonhome = Py_GetPythonHome();
|
||||
char *envpath = getenv("PYTHONPATH");
|
||||
|
||||
get_progpath();
|
||||
/* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */
|
||||
strcpy(argv0_path, progpath);
|
||||
reduce(argv0_path);
|
||||
if (pythonhome == NULL || *pythonhome == '\0') {
|
||||
if (search_for_prefix(argv0_path, LANDMARK))
|
||||
pythonhome = prefix;
|
||||
else
|
||||
pythonhome = NULL;
|
||||
}
|
||||
else
|
||||
strncpy(prefix, pythonhome, MAXPATHLEN);
|
||||
|
||||
if (envpath && *envpath == '\0')
|
||||
envpath = NULL;
|
||||
|
||||
/* We need to construct a path from the following parts.
|
||||
(1) the PYTHONPATH environment variable, if set;
|
||||
(2) the PYTHONPATH config macro, with the leading "."
|
||||
of each component replaced with pythonhome, if set;
|
||||
(3) the directory containing the executable (argv0_path).
|
||||
The length calculation calculates #2 first.
|
||||
*/
|
||||
|
||||
/* Calculate size of return buffer */
|
||||
if (pythonhome != NULL) {
|
||||
char *p;
|
||||
bufsz = 1;
|
||||
for (p = PYTHONPATH; *p; p++) {
|
||||
if (*p == DELIM)
|
||||
bufsz++; /* number of DELIM plus one */
|
||||
}
|
||||
bufsz *= strlen(pythonhome);
|
||||
}
|
||||
else
|
||||
bufsz = 0;
|
||||
bufsz += strlen(PYTHONPATH) + 1;
|
||||
bufsz += strlen(argv0_path) + 1;
|
||||
if (envpath != NULL)
|
||||
bufsz += strlen(envpath) + 1;
|
||||
|
||||
module_search_path = buf = malloc(bufsz);
|
||||
if (buf == NULL) {
|
||||
/* We can't exit, so print a warning and limp along */
|
||||
fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n");
|
||||
if (envpath) {
|
||||
fprintf(stderr, "Using environment $PYTHONPATH.\n");
|
||||
module_search_path = envpath;
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "Using default static path.\n");
|
||||
module_search_path = PYTHONPATH;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (envpath) {
|
||||
strcpy(buf, envpath);
|
||||
buf = strchr(buf, '\0');
|
||||
*buf++ = DELIM;
|
||||
}
|
||||
|
||||
if (pythonhome == NULL) {
|
||||
strcpy(buf, PYTHONPATH);
|
||||
buf = strchr(buf, '\0');
|
||||
}
|
||||
else {
|
||||
char *p = PYTHONPATH;
|
||||
char *q;
|
||||
size_t n;
|
||||
for (;;) {
|
||||
q = strchr(p, DELIM);
|
||||
if (q == NULL)
|
||||
n = strlen(p);
|
||||
else
|
||||
n = q-p;
|
||||
if (p[0] == '.' && is_sep(p[1])) {
|
||||
strcpy(buf, pythonhome);
|
||||
buf = strchr(buf, '\0');
|
||||
p++;
|
||||
n--;
|
||||
}
|
||||
strncpy(buf, p, n);
|
||||
buf += n;
|
||||
if (q == NULL)
|
||||
break;
|
||||
*buf++ = DELIM;
|
||||
p = q+1;
|
||||
}
|
||||
}
|
||||
if (argv0_path) {
|
||||
*buf++ = DELIM;
|
||||
strcpy(buf, argv0_path);
|
||||
buf = strchr(buf, '\0');
|
||||
}
|
||||
*buf = '\0';
|
||||
}
|
||||
|
||||
|
||||
/* External interface */
|
||||
|
||||
char *
|
||||
Py_GetPath(void)
|
||||
{
|
||||
if (!module_search_path)
|
||||
calculate_path();
|
||||
return module_search_path;
|
||||
}
|
||||
|
||||
char *
|
||||
Py_GetPrefix(void)
|
||||
{
|
||||
if (!module_search_path)
|
||||
calculate_path();
|
||||
return prefix;
|
||||
}
|
||||
|
||||
char *
|
||||
Py_GetExecPrefix(void)
|
||||
{
|
||||
return Py_GetPrefix();
|
||||
}
|
||||
|
||||
char *
|
||||
Py_GetProgramFullPath(void)
|
||||
{
|
||||
if (!module_search_path)
|
||||
calculate_path();
|
||||
return progpath;
|
||||
}
|
306
PC/os2emx/pyconfig.h
Normal file
306
PC/os2emx/pyconfig.h
Normal file
|
@ -0,0 +1,306 @@
|
|||
#ifndef Py_CONFIG_H
|
||||
#define Py_CONFIG_H
|
||||
|
||||
/*
|
||||
config.h.
|
||||
At some time in the past, generated automatically by configure.
|
||||
Maintained manually for better results.
|
||||
*/
|
||||
|
||||
#define PLATFORM "os2emx"
|
||||
#define COMPILER "[EMX GCC " __VERSION__ "]"
|
||||
#define PYOS_OS2
|
||||
#define PYCC_GCC
|
||||
#define PREFIX "/usr"
|
||||
|
||||
/* Debugging */
|
||||
#ifndef Py_DEBUG
|
||||
/*#define Py_DEBUG 1*/
|
||||
#endif
|
||||
|
||||
/* so that emx socket headers will define IP V4 socket types */
|
||||
#define TCPIPV4
|
||||
|
||||
/* Use OS/2 flavour of threads */
|
||||
#define WITH_THREAD
|
||||
#define OS2_THREADS
|
||||
|
||||
/* We want sockets */
|
||||
#define USE_SOCKET
|
||||
#define socklen_t int
|
||||
|
||||
/* enable the GC module */
|
||||
#define WITH_CYCLE_GC 1
|
||||
|
||||
/* Unicode related */
|
||||
#define Py_USING_UNICODE
|
||||
#define PY_UNICODE_TYPE wchar_t
|
||||
#define Py_UNICODE_SIZE SIZEOF_SHORT
|
||||
|
||||
/* enable the Python object allocator */
|
||||
/*#define WITH_PYMALLOC 1*/
|
||||
|
||||
#define PYTHONPATH ".;./Lib;./Lib/plat-" PLATFORM ";./Lib/lib-dynload;./Lib/site-packages"
|
||||
|
||||
#define HAVE_TTYNAME 1
|
||||
#define HAVE_WAIT 1
|
||||
#define HAVE_GETEGID 1
|
||||
#define HAVE_GETEUID 1
|
||||
#define HAVE_GETGID 1
|
||||
#define HAVE_GETPPID 1
|
||||
#define HAVE_GETUID 1
|
||||
#define HAVE_OPENDIR 1
|
||||
#define HAVE_PIPE 1
|
||||
#define HAVE_POPEN 1
|
||||
#define HAVE_SYSTEM 1
|
||||
#define HAVE_TTYNAME 1
|
||||
#define HAVE_DYNAMIC_LOADING 1
|
||||
|
||||
/* if port of GDBM installed, it includes NDBM emulation */
|
||||
#define HAVE_NDBM_H 1
|
||||
|
||||
/* need this for spawnv code in posixmodule (cloned from WIN32 def'n) */
|
||||
typedef long intptr_t;
|
||||
|
||||
/* we don't have tm_zone but do have the external array
|
||||
tzname. */
|
||||
#define HAVE_TZNAME 1
|
||||
|
||||
/* Define as the return type of signal handlers (int or void). */
|
||||
#define RETSIGTYPE void
|
||||
|
||||
/* Define if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Define if you can safely include both <sys/time.h> and <time.h>. */
|
||||
#define TIME_WITH_SYS_TIME 1
|
||||
|
||||
/* Used for BeOS configuration */
|
||||
/* #undef DL_EXPORT_HEADER */
|
||||
#ifdef DL_EXPORT_HEADER
|
||||
#include DL_EXPORT_HEADER
|
||||
#endif
|
||||
|
||||
/* Define this if you have the type long long */
|
||||
#define HAVE_LONG_LONG 1
|
||||
|
||||
/* Define if your compiler supports function prototypes */
|
||||
#define HAVE_PROTOTYPES 1
|
||||
|
||||
/* Define if your compiler supports variable length function prototypes
|
||||
(e.g. void fprintf(FILE *, char *, ...);) *and* <stdarg.h> */
|
||||
#define HAVE_STDARG_PROTOTYPES 1
|
||||
|
||||
/* Define if malloc(0) returns a NULL pointer */
|
||||
#define MALLOC_ZERO_RETURNS_NULL 1
|
||||
|
||||
/* Define to force use of thread-safe errno, h_errno, and other functions */
|
||||
#define _REENTRANT 1
|
||||
|
||||
/* Define if you can safely include both <sys/select.h> and <sys/time.h>
|
||||
(which you can't on SCO ODT 3.0). */
|
||||
#define SYS_SELECT_WITH_SYS_TIME 1
|
||||
|
||||
/* The number of bytes in an off_t. */
|
||||
#define SIZEOF_OFF_T 4
|
||||
|
||||
/* The number of bytes in an time_t. */
|
||||
#define SIZEOF_TIME_T 4
|
||||
|
||||
/* The number of bytes in a short. */
|
||||
#define SIZEOF_SHORT 2
|
||||
|
||||
/* The number of bytes in a int. */
|
||||
#define SIZEOF_INT 4
|
||||
|
||||
/* The number of bytes in a long. */
|
||||
#define SIZEOF_LONG 4
|
||||
|
||||
/* The number of bytes in a long long. */
|
||||
#define SIZEOF_LONG_LONG 8
|
||||
|
||||
/* The number of bytes in a void *. */
|
||||
#define SIZEOF_VOID_P 4
|
||||
|
||||
/* Define if you have the alarm function. */
|
||||
#define HAVE_ALARM 1
|
||||
|
||||
/* Define if you have the clock function. */
|
||||
#define HAVE_CLOCK 1
|
||||
|
||||
/* Define if you have the dup2 function. */
|
||||
#define HAVE_DUP2 1
|
||||
|
||||
/* Define if you have the execv function. */
|
||||
#define HAVE_EXECV 1
|
||||
|
||||
/* Define if you have the spawnv function. */
|
||||
#define HAVE_SPAWNV 1
|
||||
|
||||
/* Define if you have the flock function. */
|
||||
#define HAVE_FLOCK 1
|
||||
|
||||
/* Define if you have the fork function. */
|
||||
#define HAVE_FORK 1
|
||||
|
||||
/* Define if you have the fsync function. */
|
||||
#define HAVE_FSYNC 1
|
||||
|
||||
/* Define if you have the ftime function. */
|
||||
#define HAVE_FTIME 1
|
||||
|
||||
/* Define if you have the ftruncate function. */
|
||||
#define HAVE_FTRUNCATE 1
|
||||
|
||||
/* Define if you have the getcwd function. */
|
||||
#define HAVE_GETCWD 1
|
||||
|
||||
/* Define if you have the getpeername function. */
|
||||
#define HAVE_GETPEERNAME 1
|
||||
|
||||
/* Define if you have the getpgrp function. */
|
||||
#define HAVE_GETPGRP 1
|
||||
|
||||
/* Define if you have the getpid function. */
|
||||
#define HAVE_GETPID 1
|
||||
|
||||
/* Define if you have the getpwent function. */
|
||||
#define HAVE_GETPWENT 1
|
||||
|
||||
/* Define if you have the gettimeofday function. */
|
||||
#define HAVE_GETTIMEOFDAY 1
|
||||
|
||||
/* Define if you have the getwd function. */
|
||||
#define HAVE_GETWD 1
|
||||
|
||||
/* Define if you have the hypot function. */
|
||||
#define HAVE_HYPOT 1
|
||||
|
||||
/* Define if you have the kill function. */
|
||||
#define HAVE_KILL 1
|
||||
|
||||
/* Define if you have the memmove function. */
|
||||
#define HAVE_MEMMOVE 1
|
||||
|
||||
/* Define if you have the mktime function. */
|
||||
#define HAVE_MKTIME 1
|
||||
|
||||
/* Define if you have the pause function. */
|
||||
#define HAVE_PAUSE 1
|
||||
|
||||
/* Define if you have the putenv function. */
|
||||
#define HAVE_PUTENV 1
|
||||
|
||||
/* Define if you have the select function. */
|
||||
#define HAVE_SELECT 1
|
||||
|
||||
/* Define if you have the setgid function. */
|
||||
#define HAVE_SETGID 1
|
||||
|
||||
/* Define if you have the setlocale function. */
|
||||
#define HAVE_SETLOCALE 1
|
||||
|
||||
/* Define if you have the setpgid function. */
|
||||
#define HAVE_SETPGID 1
|
||||
|
||||
/* Define if you have the setuid function. */
|
||||
#define HAVE_SETUID 1
|
||||
|
||||
/* Define if you have the setvbuf function. */
|
||||
#define HAVE_SETVBUF 1
|
||||
|
||||
/* Define if you have the sigaction function. */
|
||||
#define HAVE_SIGACTION 1
|
||||
|
||||
/* Define if you have the strdup function. */
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
/* Define if you have the strerror function. */
|
||||
#define HAVE_STRERROR 1
|
||||
|
||||
/* Define if you have the strftime function. */
|
||||
#define HAVE_STRFTIME 1
|
||||
|
||||
/* Define if you have the strptime function. */
|
||||
#define HAVE_STRPTIME 1
|
||||
|
||||
/* Define if you have the tcgetpgrp function. */
|
||||
#define HAVE_TCGETPGRP 1
|
||||
|
||||
/* Define if you have the tcsetpgrp function. */
|
||||
#define HAVE_TCSETPGRP 1
|
||||
|
||||
/* Define if you have the times function. */
|
||||
#define HAVE_TIMES 1
|
||||
|
||||
/* Define if you have the truncate function. */
|
||||
#define HAVE_TRUNCATE 1
|
||||
|
||||
/* Define if you have the uname function. */
|
||||
#define HAVE_UNAME 1
|
||||
|
||||
/* Define if you have the waitpid function. */
|
||||
#define HAVE_WAITPID 1
|
||||
|
||||
/* Define if you have the <dirent.h> header file. */
|
||||
#define HAVE_DIRENT_H 1
|
||||
|
||||
/* Define if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define if you have the <limits.h> header file. */
|
||||
#define HAVE_LIMITS_H 1
|
||||
|
||||
/* Define if you have the <locale.h> header file. */
|
||||
#define HAVE_LOCALE_H 1
|
||||
|
||||
/* Define if you have the <ncurses.h> header file. */
|
||||
#define HAVE_NCURSES_H 1
|
||||
|
||||
/* Define if you have the <signal.h> header file. */
|
||||
#define HAVE_SIGNAL_H 1
|
||||
|
||||
/* Define if you have the <stdarg.h> header file. */
|
||||
#define HAVE_STDARG_H 1
|
||||
|
||||
/* Define if you have the <stddef.h> header file. */
|
||||
#define HAVE_STDDEF_H 1
|
||||
|
||||
/* Define if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define if you have the <sys/file.h> header file. */
|
||||
#define HAVE_SYS_FILE_H 1
|
||||
|
||||
/* Define if you have the <sys/param.h> header file. */
|
||||
#define HAVE_SYS_PARAM_H 1
|
||||
|
||||
/* Define if you have the <sys/select.h> header file. */
|
||||
#define HAVE_SYS_SELECT_H 1
|
||||
|
||||
/* Define if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define if you have the <sys/times.h> header file. */
|
||||
#define HAVE_SYS_TIMES_H 1
|
||||
|
||||
/* Define if you have the <sys/un.h> header file. */
|
||||
#define HAVE_SYS_UN_H 1
|
||||
|
||||
/* Define if you have the <sys/utsname.h> header file. */
|
||||
#define HAVE_SYS_UTSNAME_H 1
|
||||
|
||||
/* Define if you have the <sys/wait.h> header file. */
|
||||
#define HAVE_SYS_WAIT_H 1
|
||||
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define if you have the <utime.h> header file. */
|
||||
#define HAVE_UTIME_H 1
|
||||
|
||||
/* EMX has an snprintf() */
|
||||
#define HAVE_SNPRINTF
|
||||
|
||||
#endif /* !Py_CONFIG_H */
|
||||
|
931
PC/os2emx/python23.def
Normal file
931
PC/os2emx/python23.def
Normal file
|
@ -0,0 +1,931 @@
|
|||
LIBRARY python23 INITINSTANCE TERMINSTANCE
|
||||
DESCRIPTION "Python 2.3 Core DLL"
|
||||
PROTMODE
|
||||
DATA MULTIPLE NONSHARED
|
||||
EXPORTS
|
||||
|
||||
; From python23_s.lib(config)
|
||||
"_PyImport_Inittab"
|
||||
|
||||
; From python23_s.lib(dlfcn)
|
||||
"dlopen"
|
||||
"dlsym"
|
||||
"dlclose"
|
||||
"dlerror"
|
||||
|
||||
; From python23_s.lib(getpathp)
|
||||
"Py_GetPath"
|
||||
"Py_GetPrefix"
|
||||
"Py_GetExecPrefix"
|
||||
"Py_GetProgramFullPath"
|
||||
|
||||
; From python23_s.lib(getbuildinfo)
|
||||
"Py_GetBuildInfo"
|
||||
|
||||
; From python23_s.lib(main)
|
||||
"Py_Main"
|
||||
"Py_GetArgcArgv"
|
||||
|
||||
; From python23_s.lib(acceler)
|
||||
"PyGrammar_AddAccelerators"
|
||||
"PyGrammar_RemoveAccelerators"
|
||||
|
||||
; From python23_s.lib(grammar1)
|
||||
"PyGrammar_FindDFA"
|
||||
"PyGrammar_LabelRepr"
|
||||
|
||||
; From python23_s.lib(listnode)
|
||||
"PyNode_ListTree"
|
||||
|
||||
; From python23_s.lib(node)
|
||||
"PyNode_New"
|
||||
"PyNode_AddChild"
|
||||
"PyNode_Free"
|
||||
|
||||
; From python23_s.lib(parser)
|
||||
"PyParser_New"
|
||||
"PyParser_Delete"
|
||||
"PyParser_AddToken"
|
||||
|
||||
; From python23_s.lib(parsetok)
|
||||
"Py_TabcheckFlag"
|
||||
"PyParser_ParseString"
|
||||
"PyParser_ParseStringFlags"
|
||||
"PyParser_ParseFile"
|
||||
"PyParser_ParseFileFlags"
|
||||
|
||||
; From python23_s.lib(tokenizer)
|
||||
"PyTokenizer_FromString"
|
||||
"PyTokenizer_FromFile"
|
||||
"PyTokenizer_Free"
|
||||
"PyToken_OneChar"
|
||||
"PyToken_TwoChars"
|
||||
"PyToken_ThreeChars"
|
||||
"PyTokenizer_Get"
|
||||
"_PyParser_TokenNames"
|
||||
|
||||
; From python23_s.lib(bitset)
|
||||
"_Py_newbitset"
|
||||
"_Py_delbitset"
|
||||
"_Py_addbit"
|
||||
"_Py_samebitset"
|
||||
"_Py_mergebitset"
|
||||
|
||||
; From python23_s.lib(metagrammar)
|
||||
"_Py_meta_grammar"
|
||||
|
||||
; From python23_s.lib(myreadline)
|
||||
"PyOS_ReadlineFunctionPointer"
|
||||
"PyOS_StdioReadline"
|
||||
"PyOS_Readline"
|
||||
"PyOS_InputHook"
|
||||
|
||||
; From python23_s.lib(abstract)
|
||||
"PyObject_Cmp"
|
||||
"PyObject_Type"
|
||||
"PyObject_Size"
|
||||
"PyMapping_Size"
|
||||
"PyObject_Length"
|
||||
"PyObject_GetItem"
|
||||
"PySequence_GetItem"
|
||||
"PyObject_SetItem"
|
||||
"PySequence_SetItem"
|
||||
"PyObject_DelItem"
|
||||
"PySequence_DelItem"
|
||||
"PyObject_DelItemString"
|
||||
"PyObject_AsCharBuffer"
|
||||
"PyObject_CheckReadBuffer"
|
||||
"PyObject_AsReadBuffer"
|
||||
"PyObject_AsWriteBuffer"
|
||||
"PyNumber_Check"
|
||||
"PyNumber_Or"
|
||||
"PyNumber_Xor"
|
||||
"PyNumber_And"
|
||||
"PyNumber_Lshift"
|
||||
"PyNumber_Rshift"
|
||||
"PyNumber_Subtract"
|
||||
"PyNumber_Multiply"
|
||||
"PyNumber_Divide"
|
||||
"PyNumber_Divmod"
|
||||
"PyNumber_Add"
|
||||
"PyNumber_FloorDivide"
|
||||
"PyNumber_TrueDivide"
|
||||
"PyNumber_Remainder"
|
||||
"PyNumber_Power"
|
||||
"PyNumber_InPlaceOr"
|
||||
"PyNumber_InPlaceXor"
|
||||
"PyNumber_InPlaceAnd"
|
||||
"PyNumber_InPlaceLshift"
|
||||
"PyNumber_InPlaceRshift"
|
||||
"PyNumber_InPlaceSubtract"
|
||||
"PyNumber_InPlaceDivide"
|
||||
"PyNumber_InPlaceFloorDivide"
|
||||
"PyNumber_InPlaceTrueDivide"
|
||||
"PyNumber_InPlaceAdd"
|
||||
"PyNumber_InPlaceMultiply"
|
||||
"PyNumber_InPlaceRemainder"
|
||||
"PyNumber_InPlacePower"
|
||||
"PyNumber_Negative"
|
||||
"PyNumber_Positive"
|
||||
"PyNumber_Invert"
|
||||
"PyNumber_Absolute"
|
||||
"PyNumber_Int"
|
||||
"PyNumber_Long"
|
||||
"PyNumber_Float"
|
||||
"PySequence_Check"
|
||||
"PySequence_Size"
|
||||
"PySequence_Length"
|
||||
"PySequence_Concat"
|
||||
"PySequence_Repeat"
|
||||
"PySequence_InPlaceConcat"
|
||||
"PySequence_InPlaceRepeat"
|
||||
"PySequence_GetSlice"
|
||||
"PySequence_SetSlice"
|
||||
"PySequence_DelSlice"
|
||||
"PySequence_Tuple"
|
||||
"PyObject_GetIter"
|
||||
"PyIter_Next"
|
||||
"PySequence_List"
|
||||
"PySequence_Fast"
|
||||
"_PySequence_IterSearch"
|
||||
"PySequence_Count"
|
||||
"PySequence_Contains"
|
||||
"PySequence_In"
|
||||
"PySequence_Index"
|
||||
"PyMapping_Check"
|
||||
"PyMapping_Length"
|
||||
"PyMapping_GetItemString"
|
||||
"PyMapping_SetItemString"
|
||||
"PyMapping_HasKeyString"
|
||||
"PyMapping_HasKey"
|
||||
"PyObject_CallObject"
|
||||
"PyObject_Call"
|
||||
"PyObject_CallFunction"
|
||||
"PyObject_CallMethod"
|
||||
"PyObject_CallMethodObjArgs"
|
||||
"PyObject_CallFunctionObjArgs"
|
||||
"PyObject_IsInstance"
|
||||
"PyObject_IsSubclass"
|
||||
|
||||
; From python23_s.lib(bufferobject)
|
||||
"PyBuffer_FromObject"
|
||||
"PyBuffer_FromReadWriteObject"
|
||||
"PyBuffer_FromMemory"
|
||||
"PyBuffer_FromReadWriteMemory"
|
||||
"PyBuffer_New"
|
||||
"PyBuffer_Type"
|
||||
|
||||
; From python23_s.lib(cellobject)
|
||||
"PyCell_New"
|
||||
"PyCell_Get"
|
||||
"PyCell_Set"
|
||||
"PyCell_Type"
|
||||
|
||||
; From python23_s.lib(classobject)
|
||||
"PyClass_New"
|
||||
"PyMethod_Function"
|
||||
"PyMethod_Self"
|
||||
"PyMethod_Class"
|
||||
"PyClass_IsSubclass"
|
||||
"PyInstance_New"
|
||||
"PyInstance_NewRaw"
|
||||
"PyMethod_New"
|
||||
"PyMethod_Fini"
|
||||
"PyClass_Type"
|
||||
"PyMethod_Type"
|
||||
"PyInstance_Type"
|
||||
|
||||
; From python23_s.lib(cobject)
|
||||
"PyCObject_FromVoidPtr"
|
||||
"PyCObject_FromVoidPtrAndDesc"
|
||||
"PyCObject_AsVoidPtr"
|
||||
"PyCObject_GetDesc"
|
||||
"PyCObject_Import"
|
||||
"PyCObject_Type"
|
||||
|
||||
; From python23_s.lib(complexobject)
|
||||
"_Py_c_sum"
|
||||
"_Py_c_diff"
|
||||
"_Py_c_neg"
|
||||
"_Py_c_prod"
|
||||
"_Py_c_quot"
|
||||
"_Py_c_pow"
|
||||
"PyComplex_FromCComplex"
|
||||
"PyComplex_FromDoubles"
|
||||
"PyComplex_RealAsDouble"
|
||||
"PyComplex_ImagAsDouble"
|
||||
"PyComplex_AsCComplex"
|
||||
"PyComplex_Type"
|
||||
|
||||
; From python23_s.lib(descrobject)
|
||||
"PyWrapper_New"
|
||||
"PyDescr_NewMethod"
|
||||
"PyDescr_NewMember"
|
||||
"PyDescr_NewGetSet"
|
||||
"PyDescr_NewWrapper"
|
||||
"PyDescr_IsData"
|
||||
"PyDictProxy_New"
|
||||
"PyWrapperDescr_Type"
|
||||
"PyProperty_Type"
|
||||
|
||||
; From python23_s.lib(dictobject)
|
||||
"PyDict_New"
|
||||
"PyDict_GetItem"
|
||||
"PyDict_SetItem"
|
||||
"PyDict_DelItem"
|
||||
"PyDict_Clear"
|
||||
"PyDict_Next"
|
||||
"PyDict_Update"
|
||||
"PyDict_MergeFromSeq2"
|
||||
"PyDict_Merge"
|
||||
"PyDict_Copy"
|
||||
"PyDict_Size"
|
||||
"PyDict_Keys"
|
||||
"PyDict_Values"
|
||||
"PyDict_Items"
|
||||
"PyDict_GetItemString"
|
||||
"PyDict_SetItemString"
|
||||
"PyDict_DelItemString"
|
||||
"PyDict_Type"
|
||||
"PyDictIter_Type"
|
||||
|
||||
; From python23_s.lib(fileobject)
|
||||
"PyFile_AsFile"
|
||||
"PyFile_Name"
|
||||
"PyFile_FromFile"
|
||||
"PyFile_FromString"
|
||||
"PyFile_SetBufSize"
|
||||
"PyFile_GetLine"
|
||||
"PyFile_SoftSpace"
|
||||
"PyFile_WriteObject"
|
||||
"PyFile_WriteString"
|
||||
"PyObject_AsFileDescriptor"
|
||||
"PyFile_Type"
|
||||
|
||||
; From python23_s.lib(floatobject)
|
||||
"PyFloat_FromDouble"
|
||||
"PyFloat_FromString"
|
||||
"PyFloat_AsDouble"
|
||||
"PyFloat_AsStringEx"
|
||||
"PyFloat_AsString"
|
||||
"PyFloat_AsReprString"
|
||||
"PyFloat_Fini"
|
||||
"PyFloat_Type"
|
||||
|
||||
; From python23_s.lib(frameobject)
|
||||
"PyFrame_FastToLocals"
|
||||
"PyFrame_New"
|
||||
"PyFrame_BlockSetup"
|
||||
"PyFrame_BlockPop"
|
||||
"PyFrame_LocalsToFast"
|
||||
"PyFrame_Fini"
|
||||
"PyFrame_Type"
|
||||
|
||||
; From python23_s.lib(funcobject)
|
||||
"PyFunction_New"
|
||||
"PyFunction_GetCode"
|
||||
"PyFunction_GetGlobals"
|
||||
"PyFunction_GetDefaults"
|
||||
"PyFunction_SetDefaults"
|
||||
"PyFunction_GetClosure"
|
||||
"PyFunction_SetClosure"
|
||||
"PyClassMethod_New"
|
||||
"PyStaticMethod_New"
|
||||
"PyFunction_Type"
|
||||
"PyClassMethod_Type"
|
||||
"PyStaticMethod_Type"
|
||||
|
||||
; From python23_s.lib(intobject)
|
||||
"PyInt_GetMax"
|
||||
"PyInt_FromLong"
|
||||
"PyInt_AsLong"
|
||||
"PyInt_FromString"
|
||||
"PyInt_FromUnicode"
|
||||
"PyInt_Fini"
|
||||
"_Py_ZeroStruct"
|
||||
"PyInt_Type"
|
||||
"_Py_TrueStruct"
|
||||
|
||||
; From python23_s.lib(iterobject)
|
||||
"PySeqIter_New"
|
||||
"PyCallIter_New"
|
||||
"PySeqIter_Type"
|
||||
"PyCallIter_Type"
|
||||
|
||||
; From python23_s.lib(listobject)
|
||||
"PyList_New"
|
||||
"PyList_Size"
|
||||
"PyList_GetItem"
|
||||
"PyList_SetItem"
|
||||
"PyList_Insert"
|
||||
"PyList_Append"
|
||||
"PyList_GetSlice"
|
||||
"PyList_SetSlice"
|
||||
"PyList_Sort"
|
||||
"PyList_Reverse"
|
||||
"PyList_AsTuple"
|
||||
"PyList_Type"
|
||||
|
||||
; From python23_s.lib(longobject)
|
||||
"_PyLong_New"
|
||||
"_PyLong_Copy"
|
||||
"PyLong_FromLong"
|
||||
"PyLong_FromUnsignedLong"
|
||||
"PyLong_FromDouble"
|
||||
"PyLong_AsLong"
|
||||
"PyLong_AsUnsignedLong"
|
||||
"_PyLong_FromByteArray"
|
||||
"_PyLong_AsByteArray"
|
||||
"_PyLong_AsScaledDouble"
|
||||
"PyLong_AsDouble"
|
||||
"PyLong_FromVoidPtr"
|
||||
"PyLong_AsVoidPtr"
|
||||
"PyLong_FromLongLong"
|
||||
"PyLong_FromUnsignedLongLong"
|
||||
"PyLong_AsLongLong"
|
||||
"PyLong_AsUnsignedLongLong"
|
||||
"PyLong_FromString"
|
||||
"PyLong_FromUnicode"
|
||||
"PyLong_Type"
|
||||
|
||||
; From python23_s.lib(methodobject)
|
||||
"PyCFunction_New"
|
||||
"PyCFunction_GetFunction"
|
||||
"PyCFunction_GetSelf"
|
||||
"PyCFunction_GetFlags"
|
||||
"PyCFunction_Call"
|
||||
"Py_FindMethodInChain"
|
||||
"Py_FindMethod"
|
||||
"PyCFunction_Fini"
|
||||
"PyCFunction_Type"
|
||||
|
||||
; From python23_s.lib(moduleobject)
|
||||
"PyModule_New"
|
||||
"PyModule_GetDict"
|
||||
"PyModule_GetName"
|
||||
"PyModule_GetFilename"
|
||||
"_PyModule_Clear"
|
||||
"PyModule_Type"
|
||||
|
||||
; From python23_s.lib(object)
|
||||
"Py_DivisionWarningFlag"
|
||||
"PyObject_Init"
|
||||
"PyObject_InitVar"
|
||||
"_PyObject_New"
|
||||
"_PyObject_NewVar"
|
||||
"_PyObject_Del"
|
||||
"PyObject_Print"
|
||||
"PyObject_Str"
|
||||
"PyObject_Repr"
|
||||
"_PyObject_Dump"
|
||||
"PyObject_Unicode"
|
||||
"PyObject_GetAttr"
|
||||
"PyObject_IsTrue"
|
||||
"PyNumber_CoerceEx"
|
||||
"PyObject_Compare"
|
||||
"PyObject_RichCompare"
|
||||
"PyObject_RichCompareBool"
|
||||
"_Py_HashDouble"
|
||||
"PyObject_Hash"
|
||||
"_Py_HashPointer"
|
||||
"PyObject_GetAttrString"
|
||||
"PyObject_HasAttrString"
|
||||
"PyObject_SetAttrString"
|
||||
"PyObject_SetAttr"
|
||||
"PyObject_HasAttr"
|
||||
"_PyObject_GetDictPtr"
|
||||
"PyObject_GenericGetAttr"
|
||||
"PyObject_GenericSetAttr"
|
||||
"PyObject_Not"
|
||||
"PyNumber_Coerce"
|
||||
"PyCallable_Check"
|
||||
"PyObject_Dir"
|
||||
"_Py_ReadyTypes"
|
||||
"PyMem_Malloc"
|
||||
"PyMem_Realloc"
|
||||
"PyMem_Free"
|
||||
"PyObject_Malloc"
|
||||
"PyObject_Realloc"
|
||||
"PyObject_Free"
|
||||
"Py_ReprEnter"
|
||||
"Py_ReprLeave"
|
||||
"_PyTrash_deposit_object"
|
||||
"_PyTrash_destroy_chain"
|
||||
"_Py_NotImplementedStruct"
|
||||
"_Py_NoneStruct"
|
||||
"_Py_cobject_hack"
|
||||
"_Py_abstract_hack"
|
||||
"_PyTrash_delete_nesting"
|
||||
"_PyTrash_delete_later"
|
||||
|
||||
; From python23_s.lib(rangeobject)
|
||||
"PyRange_New"
|
||||
"PyRange_Type"
|
||||
|
||||
; From python23_s.lib(sliceobject)
|
||||
"PySlice_New"
|
||||
"PySlice_GetIndices"
|
||||
"_Py_EllipsisObject"
|
||||
"PySlice_Type"
|
||||
|
||||
; From python23_s.lib(stringobject)
|
||||
"PyString_FromStringAndSize"
|
||||
"PyString_InternInPlace"
|
||||
"PyString_FromString"
|
||||
"PyString_FromFormatV"
|
||||
"PyString_AsString"
|
||||
"_PyString_Resize"
|
||||
"PyString_FromFormat"
|
||||
"PyString_Decode"
|
||||
"PyString_AsDecodedString"
|
||||
"PyString_AsDecodedObject"
|
||||
"PyString_Encode"
|
||||
"PyString_AsEncodedString"
|
||||
"PyString_AsEncodedObject"
|
||||
"PyString_AsStringAndSize"
|
||||
"PyString_Size"
|
||||
"_PyString_Eq"
|
||||
"_PyString_Join"
|
||||
"PyString_Concat"
|
||||
"PyString_ConcatAndDel"
|
||||
"_PyString_FormatLong"
|
||||
"PyString_Format"
|
||||
"PyString_InternFromString"
|
||||
"PyString_Fini"
|
||||
"_Py_ReleaseInternedStrings"
|
||||
"PyString_Type"
|
||||
|
||||
; From python23_s.lib(structseq)
|
||||
"PyStructSequence_New"
|
||||
"PyStructSequence_InitType"
|
||||
|
||||
; From python23_s.lib(tupleobject)
|
||||
"PyTuple_New"
|
||||
"PyTuple_Size"
|
||||
"PyTuple_GetItem"
|
||||
"PyTuple_SetItem"
|
||||
"PyTuple_GetSlice"
|
||||
"_PyTuple_Resize"
|
||||
"PyTuple_Fini"
|
||||
"PyTuple_Type"
|
||||
|
||||
; From python23_s.lib(typeobject)
|
||||
"PyType_IsSubtype"
|
||||
"PyType_GenericAlloc"
|
||||
"PyType_GenericNew"
|
||||
"_PyType_Lookup"
|
||||
"PyType_Ready"
|
||||
"_PyObject_SlotCompare"
|
||||
"PyType_Type"
|
||||
"PyBaseObject_Type"
|
||||
"PySuper_Type"
|
||||
|
||||
; From python23_s.lib(unicodeobject)
|
||||
"PyUnicodeUCS2_GetMax"
|
||||
"PyUnicodeUCS2_Resize"
|
||||
"PyUnicodeUCS2_FromUnicode"
|
||||
"PyUnicodeUCS2_FromObject"
|
||||
"PyUnicodeUCS2_FromEncodedObject"
|
||||
"PyUnicodeUCS2_Decode"
|
||||
"PyUnicodeUCS2_GetDefaultEncoding"
|
||||
"PyUnicodeUCS2_DecodeUTF8"
|
||||
"PyUnicodeUCS2_DecodeLatin1"
|
||||
"PyUnicodeUCS2_DecodeASCII"
|
||||
"PyUnicodeUCS2_Encode"
|
||||
"PyUnicodeUCS2_AsEncodedString"
|
||||
"PyUnicodeUCS2_AsUTF8String"
|
||||
"PyUnicodeUCS2_AsLatin1String"
|
||||
"PyUnicodeUCS2_AsASCIIString"
|
||||
"_PyUnicodeUCS2_AsDefaultEncodedString"
|
||||
"PyUnicodeUCS2_AsUnicode"
|
||||
"PyUnicodeUCS2_GetSize"
|
||||
"PyUnicodeUCS2_SetDefaultEncoding"
|
||||
"PyUnicode_DecodeUTF7"
|
||||
"PyUnicode_EncodeUTF7"
|
||||
"PyUnicodeUCS2_EncodeUTF8"
|
||||
"PyUnicodeUCS2_DecodeUTF16"
|
||||
"PyUnicodeUCS2_EncodeUTF16"
|
||||
"PyUnicodeUCS2_AsUTF16String"
|
||||
"PyUnicodeUCS2_DecodeUnicodeEscape"
|
||||
"PyUnicodeUCS2_EncodeUnicodeEscape"
|
||||
"PyUnicodeUCS2_AsUnicodeEscapeString"
|
||||
"PyUnicodeUCS2_DecodeRawUnicodeEscape"
|
||||
"PyUnicodeUCS2_EncodeRawUnicodeEscape"
|
||||
"PyUnicodeUCS2_AsRawUnicodeEscapeString"
|
||||
"PyUnicodeUCS2_EncodeLatin1"
|
||||
"PyUnicodeUCS2_EncodeASCII"
|
||||
"PyUnicodeUCS2_DecodeCharmap"
|
||||
"PyUnicodeUCS2_EncodeCharmap"
|
||||
"PyUnicodeUCS2_AsCharmapString"
|
||||
"PyUnicodeUCS2_TranslateCharmap"
|
||||
"PyUnicodeUCS2_Translate"
|
||||
"PyUnicodeUCS2_EncodeDecimal"
|
||||
"PyUnicodeUCS2_Count"
|
||||
"PyUnicodeUCS2_Find"
|
||||
"PyUnicodeUCS2_Tailmatch"
|
||||
"PyUnicodeUCS2_Join"
|
||||
"PyUnicodeUCS2_Splitlines"
|
||||
"PyUnicodeUCS2_Compare"
|
||||
"PyUnicodeUCS2_Contains"
|
||||
"PyUnicodeUCS2_Concat"
|
||||
"PyUnicodeUCS2_Replace"
|
||||
"PyUnicodeUCS2_Split"
|
||||
"PyUnicodeUCS2_Format"
|
||||
"_PyUnicodeUCS2_Init"
|
||||
"_PyUnicodeUCS2_Fini"
|
||||
"PyUnicode_Type"
|
||||
|
||||
; From python23_s.lib(unicodectype)
|
||||
"_PyUnicode_TypeRecords"
|
||||
"_PyUnicodeUCS2_IsLinebreak"
|
||||
"_PyUnicodeUCS2_ToTitlecase"
|
||||
"_PyUnicodeUCS2_IsTitlecase"
|
||||
"_PyUnicodeUCS2_ToDecimalDigit"
|
||||
"_PyUnicodeUCS2_IsDecimalDigit"
|
||||
"_PyUnicodeUCS2_ToDigit"
|
||||
"_PyUnicodeUCS2_IsDigit"
|
||||
"_PyUnicodeUCS2_ToNumeric"
|
||||
"_PyUnicodeUCS2_IsNumeric"
|
||||
"_PyUnicodeUCS2_IsWhitespace"
|
||||
"_PyUnicodeUCS2_IsLowercase"
|
||||
"_PyUnicodeUCS2_IsUppercase"
|
||||
"_PyUnicodeUCS2_ToUppercase"
|
||||
"_PyUnicodeUCS2_ToLowercase"
|
||||
"_PyUnicodeUCS2_IsAlpha"
|
||||
|
||||
; From python23_s.lib(weakrefobject)
|
||||
"_PyWeakref_GetWeakrefCount"
|
||||
"PyWeakref_NewRef"
|
||||
"PyWeakref_NewProxy"
|
||||
"PyWeakref_GetObject"
|
||||
"PyObject_ClearWeakRefs"
|
||||
"_PyWeakref_RefType"
|
||||
"_PyWeakref_ProxyType"
|
||||
"_PyWeakref_CallableProxyType"
|
||||
|
||||
; From python23_s.lib(bltinmodule)
|
||||
"_PyBuiltin_Init"
|
||||
"Py_FileSystemDefaultEncoding"
|
||||
|
||||
; From python23_s.lib(exceptions)
|
||||
"PyExc_TypeError"
|
||||
"PyExc_Exception"
|
||||
"PyExc_StopIteration"
|
||||
"PyExc_StandardError"
|
||||
"PyExc_SystemExit"
|
||||
"PyExc_KeyboardInterrupt"
|
||||
"PyExc_ImportError"
|
||||
"PyExc_EnvironmentError"
|
||||
"PyExc_IOError"
|
||||
"PyExc_OSError"
|
||||
"PyExc_EOFError"
|
||||
"PyExc_RuntimeError"
|
||||
"PyExc_NotImplementedError"
|
||||
"PyExc_NameError"
|
||||
"PyExc_UnboundLocalError"
|
||||
"PyExc_AttributeError"
|
||||
"PyExc_SyntaxError"
|
||||
"PyExc_IndentationError"
|
||||
"PyExc_TabError"
|
||||
"PyExc_AssertionError"
|
||||
"PyExc_LookupError"
|
||||
"PyExc_IndexError"
|
||||
"PyExc_KeyError"
|
||||
"PyExc_ArithmeticError"
|
||||
"PyExc_OverflowError"
|
||||
"PyExc_ZeroDivisionError"
|
||||
"PyExc_FloatingPointError"
|
||||
"PyExc_ValueError"
|
||||
"PyExc_UnicodeError"
|
||||
"PyExc_ReferenceError"
|
||||
"PyExc_SystemError"
|
||||
"PyExc_MemoryError"
|
||||
"PyExc_Warning"
|
||||
"PyExc_UserWarning"
|
||||
"PyExc_DeprecationWarning"
|
||||
"PyExc_SyntaxWarning"
|
||||
"PyExc_OverflowWarning"
|
||||
"PyExc_RuntimeWarning"
|
||||
"PyExc_MemoryErrorInst"
|
||||
"_PyExc_Init"
|
||||
"_PyExc_Fini"
|
||||
|
||||
; From python23_s.lib(ceval)
|
||||
"PyEval_InitThreads"
|
||||
"PyEval_AcquireLock"
|
||||
"PyEval_ReleaseLock"
|
||||
"PyEval_AcquireThread"
|
||||
"PyEval_ReleaseThread"
|
||||
"PyEval_ReInitThreads"
|
||||
"PyEval_SaveThread"
|
||||
"PyEval_RestoreThread"
|
||||
"Py_AddPendingCall"
|
||||
"Py_MakePendingCalls"
|
||||
"Py_GetRecursionLimit"
|
||||
"Py_SetRecursionLimit"
|
||||
"PyEval_EvalCode"
|
||||
"PyEval_EvalCodeEx"
|
||||
"PyEval_CallObjectWithKeywords"
|
||||
"PyEval_SetProfile"
|
||||
"PyEval_SetTrace"
|
||||
"PyEval_GetBuiltins"
|
||||
"PyEval_GetLocals"
|
||||
"PyEval_GetGlobals"
|
||||
"PyEval_GetFrame"
|
||||
"PyEval_GetRestricted"
|
||||
"PyEval_MergeCompilerFlags"
|
||||
"Py_FlushLine"
|
||||
"PyEval_CallObject"
|
||||
"PyEval_GetFuncName"
|
||||
"PyEval_GetFuncDesc"
|
||||
"_PyEval_SliceIndex"
|
||||
|
||||
; From python23_s.lib(compile)
|
||||
"PyCode_New"
|
||||
"PyNode_Compile"
|
||||
"PyNode_CompileFlags"
|
||||
"PyNode_CompileSymtable"
|
||||
"PySymtable_Free"
|
||||
"PyCode_Addr2Line"
|
||||
"Py_OptimizeFlag"
|
||||
"PyCode_Type"
|
||||
|
||||
; From python23_s.lib(codecs)
|
||||
"PyCodec_Register"
|
||||
"_PyCodec_Lookup"
|
||||
"PyCodec_Encoder"
|
||||
"PyCodec_Decoder"
|
||||
"PyCodec_StreamReader"
|
||||
"PyCodec_StreamWriter"
|
||||
"PyCodec_Encode"
|
||||
"PyCodec_Decode"
|
||||
"_PyCodecRegistry_Init"
|
||||
"_PyCodecRegistry_Fini"
|
||||
|
||||
; From python23_s.lib(errors)
|
||||
"PyErr_Restore"
|
||||
"PyErr_SetObject"
|
||||
"PyErr_SetNone"
|
||||
"PyErr_SetString"
|
||||
"PyErr_Occurred"
|
||||
"PyErr_GivenExceptionMatches"
|
||||
"PyErr_ExceptionMatches"
|
||||
"PyErr_NormalizeException"
|
||||
"PyErr_Fetch"
|
||||
"PyErr_Clear"
|
||||
"PyErr_BadArgument"
|
||||
"PyErr_NoMemory"
|
||||
"PyErr_SetFromErrnoWithFilename"
|
||||
"PyErr_SetFromErrno"
|
||||
"_PyErr_BadInternalCall"
|
||||
"PyErr_Format"
|
||||
"PyErr_BadInternalCall"
|
||||
"PyErr_NewException"
|
||||
"PyErr_WriteUnraisable"
|
||||
"PyErr_Warn"
|
||||
"PyErr_WarnExplicit"
|
||||
"PyErr_SyntaxLocation"
|
||||
"PyErr_ProgramText"
|
||||
|
||||
; From python23_s.lib(frozen)
|
||||
"PyImport_FrozenModules"
|
||||
|
||||
; From python23_s.lib(frozenmain)
|
||||
"Py_FrozenMain"
|
||||
|
||||
; From python23_s.lib(future)
|
||||
"PyNode_Future"
|
||||
|
||||
; From python23_s.lib(getargs)
|
||||
"PyArg_Parse"
|
||||
"PyArg_ParseTuple"
|
||||
"PyArg_VaParse"
|
||||
"PyArg_ParseTupleAndKeywords"
|
||||
"PyArg_UnpackTuple"
|
||||
|
||||
; From python23_s.lib(getcompiler)
|
||||
"Py_GetCompiler"
|
||||
|
||||
; From python23_s.lib(getcopyright)
|
||||
"Py_GetCopyright"
|
||||
|
||||
; From python23_s.lib(getmtime)
|
||||
"PyOS_GetLastModificationTime"
|
||||
|
||||
; From python23_s.lib(getplatform)
|
||||
"Py_GetPlatform"
|
||||
|
||||
; From python23_s.lib(getversion)
|
||||
"Py_GetVersion"
|
||||
|
||||
; From python23_s.lib(graminit)
|
||||
"_PyParser_Grammar"
|
||||
|
||||
; From python23_s.lib(import)
|
||||
"_PyImport_Init"
|
||||
"_PyImport_Fini"
|
||||
"PyImport_GetModuleDict"
|
||||
"PyImport_Cleanup"
|
||||
"PyImport_GetMagicNumber"
|
||||
"_PyImport_FixupExtension"
|
||||
"_PyImport_FindExtension"
|
||||
"PyImport_AddModule"
|
||||
"PyImport_ExecCodeModule"
|
||||
"PyImport_ExecCodeModuleEx"
|
||||
"PyImport_ImportFrozenModule"
|
||||
"PyImport_ImportModule"
|
||||
"PyImport_Import"
|
||||
"PyImport_ImportModuleEx"
|
||||
"PyImport_ReloadModule"
|
||||
; "initimp"
|
||||
"PyImport_ExtendInittab"
|
||||
"PyImport_AppendInittab"
|
||||
"PyImport_Inittab"
|
||||
"_PyImport_Filetab"
|
||||
|
||||
; From python23_s.lib(importdl)
|
||||
"_PyImport_LoadDynamicModule"
|
||||
|
||||
; From python23_s.lib(marshal)
|
||||
"PyMarshal_WriteLongToFile"
|
||||
"PyMarshal_WriteObjectToFile"
|
||||
"PyMarshal_ReadShortFromFile"
|
||||
"PyMarshal_ReadLongFromFile"
|
||||
"PyMarshal_ReadLastObjectFromFile"
|
||||
"PyMarshal_ReadObjectFromString"
|
||||
"PyMarshal_ReadObjectFromFile"
|
||||
"PyMarshal_WriteObjectToString"
|
||||
"PyMarshal_Init"
|
||||
|
||||
; From python23_s.lib(modsupport)
|
||||
"Py_InitModule4"
|
||||
"Py_BuildValue"
|
||||
"Py_VaBuildValue"
|
||||
"PyEval_CallFunction"
|
||||
"PyEval_CallMethod"
|
||||
"PyModule_AddObject"
|
||||
"PyModule_AddIntConstant"
|
||||
"PyModule_AddStringConstant"
|
||||
"_Py_PackageContext"
|
||||
|
||||
; From python23_s.lib(mysnprintf)
|
||||
"PyOS_snprintf"
|
||||
"PyOS_vsnprintf"
|
||||
|
||||
; From python23_s.lib(mystrtoul)
|
||||
"PyOS_strtoul"
|
||||
"PyOS_strtol"
|
||||
|
||||
; From python23_s.lib(pyfpe)
|
||||
"PyFPE_dummy"
|
||||
|
||||
; From python23_s.lib(pystate)
|
||||
"PyInterpreterState_New"
|
||||
"PyInterpreterState_Clear"
|
||||
"PyThreadState_Clear"
|
||||
"PyThreadState_Delete"
|
||||
"PyInterpreterState_Delete"
|
||||
"PyThreadState_New"
|
||||
"PyThreadState_DeleteCurrent"
|
||||
"PyThreadState_Get"
|
||||
"PyThreadState_Swap"
|
||||
"PyThreadState_GetDict"
|
||||
"PyInterpreterState_Head"
|
||||
"PyInterpreterState_Next"
|
||||
"PyInterpreterState_ThreadHead"
|
||||
"PyThreadState_Next"
|
||||
"_PyThreadState_Current"
|
||||
|
||||
; From python23_s.lib(pythonrun)
|
||||
"Py_IgnoreEnvironmentFlag"
|
||||
"Py_DebugFlag"
|
||||
"Py_VerboseFlag"
|
||||
"Py_NoSiteFlag"
|
||||
"Py_InteractiveFlag"
|
||||
"Py_FrozenFlag"
|
||||
"Py_IsInitialized"
|
||||
"Py_Initialize"
|
||||
"Py_FatalError"
|
||||
"Py_Finalize"
|
||||
"Py_NewInterpreter"
|
||||
"PyErr_Print"
|
||||
"Py_EndInterpreter"
|
||||
"Py_SetProgramName"
|
||||
"Py_GetProgramName"
|
||||
"Py_SetPythonHome"
|
||||
"Py_GetPythonHome"
|
||||
"PyRun_AnyFile"
|
||||
"PyRun_AnyFileExFlags"
|
||||
"PyRun_AnyFileFlags"
|
||||
"PyRun_AnyFileEx"
|
||||
"Py_FdIsInteractive"
|
||||
"PyRun_InteractiveLoopFlags"
|
||||
"PyRun_SimpleFileExFlags"
|
||||
"PyRun_InteractiveLoop"
|
||||
"PyRun_InteractiveOneFlags"
|
||||
"PyRun_InteractiveOne"
|
||||
"PyRun_SimpleFile"
|
||||
"PyRun_SimpleFileEx"
|
||||
"PyRun_FileExFlags"
|
||||
"PyRun_SimpleString"
|
||||
"PyRun_SimpleStringFlags"
|
||||
"PyRun_StringFlags"
|
||||
"PyErr_PrintEx"
|
||||
"Py_Exit"
|
||||
"PyErr_Display"
|
||||
"PyRun_String"
|
||||
"PyParser_SimpleParseString"
|
||||
"PyRun_File"
|
||||
"PyRun_FileEx"
|
||||
"PyParser_SimpleParseFile"
|
||||
"PyParser_SimpleParseStringFlags"
|
||||
"PyRun_FileFlags"
|
||||
"PyParser_SimpleParseFileFlags"
|
||||
"Py_CompileString"
|
||||
"Py_CompileStringFlags"
|
||||
"Py_SymtableString"
|
||||
"Py_AtExit"
|
||||
"PyOS_getsig"
|
||||
"PyOS_setsig"
|
||||
"Py_UseClassExceptionsFlag"
|
||||
"Py_UnicodeFlag"
|
||||
"_Py_QnewFlag"
|
||||
"_PyThread_Started"
|
||||
|
||||
; From python23_s.lib(structmember)
|
||||
"PyMember_Get"
|
||||
"PyMember_GetOne"
|
||||
"PyMember_Set"
|
||||
"PyMember_SetOne"
|
||||
|
||||
; From python23_s.lib(symtable)
|
||||
"PySymtableEntry_New"
|
||||
"PySymtableEntry_Type"
|
||||
|
||||
; From python23_s.lib(sysmodule)
|
||||
"PySys_GetObject"
|
||||
"PySys_GetFile"
|
||||
"PySys_SetObject"
|
||||
"PySys_ResetWarnOptions"
|
||||
"PySys_AddWarnOption"
|
||||
"_PySys_Init"
|
||||
"PySys_SetPath"
|
||||
"PySys_SetArgv"
|
||||
"PySys_WriteStdout"
|
||||
"PySys_WriteStderr"
|
||||
|
||||
; From python23_s.lib(traceback)
|
||||
"PyTraceBack_Here"
|
||||
"PyTraceBack_Print"
|
||||
"PyTraceBack_Type"
|
||||
|
||||
; From python23_s.lib(getopt)
|
||||
"_PyOS_GetOpt"
|
||||
"_PyOS_opterr"
|
||||
"_PyOS_optind"
|
||||
"_PyOS_optarg"
|
||||
|
||||
; From python23_s.lib(dynload_shlib)
|
||||
"_PyImport_DynLoadFiletab"
|
||||
"_PyImport_GetDynLoadFunc"
|
||||
|
||||
; From python23_s.lib(thread)
|
||||
"PyThread_init_thread"
|
||||
"PyThread_start_new_thread"
|
||||
"PyThread_get_thread_ident"
|
||||
"PyThread_exit_thread"
|
||||
"PyThread__exit_thread"
|
||||
"PyThread_allocate_lock"
|
||||
"PyThread_free_lock"
|
||||
"PyThread_acquire_lock"
|
||||
"PyThread_release_lock"
|
||||
|
||||
; From python23_s.lib(gcmodule)
|
||||
; "initgc"
|
||||
"_PyGC_Dump"
|
||||
"_PyObject_GC_Track"
|
||||
"_PyObject_GC_UnTrack"
|
||||
"_PyObject_GC_Malloc"
|
||||
"_PyObject_GC_New"
|
||||
"_PyObject_GC_NewVar"
|
||||
"_PyObject_GC_Resize"
|
||||
"_PyObject_GC_Del"
|
||||
"_PyGC_generation0"
|
||||
|
||||
; From python23_s.lib(signalmodule)
|
||||
"PyErr_CheckSignals"
|
||||
; "initsignal"
|
||||
"PyErr_SetInterrupt"
|
||||
"PyOS_InitInterrupts"
|
||||
"PyOS_FiniInterrupts"
|
||||
"PyOS_InterruptOccurred"
|
||||
"PyOS_AfterFork"
|
||||
|
||||
; From python23_s.lib(posixmodule)
|
||||
; "initos2"
|
||||
|
||||
; From python23_s.lib(threadmodule)
|
||||
; "initthread"
|
||||
|
||||
; From python23_s.lib(_sre)
|
||||
; "init_sre"
|
124
PC/os2emx/pythonpm.c
Normal file
124
PC/os2emx/pythonpm.c
Normal file
|
@ -0,0 +1,124 @@
|
|||
/* OS/2 PM main program - creates a hidden window, and starts Python
|
||||
* interpreter in a separate thread, so that Python scripts can be
|
||||
* run in PM process space without a console Window. The interpreter
|
||||
* is incorporated by linking in the Python DLL.
|
||||
*
|
||||
* As it stands, I don't think this is adequate for supporting Python
|
||||
* GUI modules, as the Python thread doesn't have its own message
|
||||
* queue - which is required of threads that want to create/use
|
||||
* PM windows.
|
||||
*
|
||||
* This code owes a lot to "OS/2 Presentation Manager Programming", by
|
||||
* Charles Petzold.
|
||||
*
|
||||
* Andrew MacIntyre <andymac@bullseye.apana.org.au>, August 2001.
|
||||
* Released under the terms of the Python 2.1.1 licence - see the LICENCE
|
||||
* file in the Python v2.1.1 (or later) source distribution.
|
||||
* Copyright assigned to the Python Software Foundation, 2001.
|
||||
*/
|
||||
|
||||
#define INCL_DOS
|
||||
#define INCL_WIN
|
||||
#include <os2.h>
|
||||
#include <process.h>
|
||||
|
||||
#include "Python.h"
|
||||
|
||||
/* use structure to pass command line to Python thread */
|
||||
typedef struct
|
||||
{
|
||||
int argc;
|
||||
char **argv;
|
||||
HWND Frame;
|
||||
int running;
|
||||
} arglist;
|
||||
|
||||
/* make this a global to simplify access.
|
||||
* it should only be set from the Python thread, or by the code that
|
||||
* initiates the Python thread when the thread cannot be created.
|
||||
*/
|
||||
int PythonRC;
|
||||
|
||||
extern DL_EXPORT(int) Py_Main(int, char **);
|
||||
void PythonThread(void *);
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
ULONG FrameFlags = FCF_TITLEBAR |
|
||||
FCF_SYSMENU |
|
||||
FCF_SIZEBORDER |
|
||||
FCF_HIDEBUTTON |
|
||||
FCF_SHELLPOSITION |
|
||||
FCF_TASKLIST;
|
||||
HAB hab;
|
||||
HMQ hmq;
|
||||
HWND Client;
|
||||
QMSG qmsg;
|
||||
arglist args;
|
||||
int python_tid;
|
||||
|
||||
/* init PM and create message queue */
|
||||
hab = WinInitialize(0);
|
||||
hmq = WinCreateMsgQueue(hab, 0);
|
||||
|
||||
/* create a (hidden) Window to house the window procedure */
|
||||
args.Frame = WinCreateStdWindow(HWND_DESKTOP,
|
||||
0,
|
||||
&FrameFlags,
|
||||
NULL,
|
||||
"PythonPM",
|
||||
0L,
|
||||
0,
|
||||
0,
|
||||
&Client);
|
||||
|
||||
/* run Python interpreter in a thread */
|
||||
args.argc = argc;
|
||||
args.argv = argv;
|
||||
args.running = 0;
|
||||
if (-1 == (python_tid = _beginthread(PythonThread, NULL, 1024 * 1024, &args)))
|
||||
{
|
||||
/* couldn't start thread */
|
||||
WinAlarm(HWND_DESKTOP, WA_ERROR);
|
||||
PythonRC = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* process PM messages, until Python exits */
|
||||
while (WinGetMsg(hab, &qmsg, NULLHANDLE, 0, 0))
|
||||
WinDispatchMsg(hab, &qmsg);
|
||||
if (args.running > 0)
|
||||
DosKillThread(python_tid);
|
||||
}
|
||||
|
||||
/* destroy window, shutdown message queue and PM */
|
||||
WinDestroyWindow(args.Frame);
|
||||
WinDestroyMsgQueue(hmq);
|
||||
WinTerminate(hab);
|
||||
|
||||
return PythonRC;
|
||||
}
|
||||
|
||||
void PythonThread(void *argl)
|
||||
{
|
||||
HAB hab;
|
||||
arglist *args;
|
||||
|
||||
/* PM initialisation */
|
||||
hab = WinInitialize(0);
|
||||
|
||||
/* start Python */
|
||||
args = (arglist *)argl;
|
||||
args->running = 1;
|
||||
PythonRC = Py_Main(args->argc, args->argv);
|
||||
|
||||
/* enter a critical section and send the termination message */
|
||||
DosEnterCritSec();
|
||||
args->running = 0;
|
||||
WinPostMsg(args->Frame, WM_QUIT, NULL, NULL);
|
||||
|
||||
/* shutdown PM and terminate thread */
|
||||
WinTerminate(hab);
|
||||
_endthread();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue