| #####################==================---------------- | |
| # | |
| # Top-Level Makefile for Building Python 2.6 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.6 | |
| # | |
| # This makefile was developed for use with [P]GCC/EMX compiler any | |
| # version and GNU Make. | |
| # | |
| # The output of the build is a largish Python26.DLL containing the | |
| # essential modules of Python and a small Python.exe program to start | |
| # the interpreter. When embedding Python within another program, only | |
| # Python26.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 | |
| # === Hard-wire installation location === | |
| FIXED_PYHOME=no | |
| #FIXED_PYHOME=yes | |
| # === Optional modules === | |
| # Do you have the InfoZip compression library installed? | |
| HAVE_ZLIB= no | |
| # Do you have the Ultra Fast Crypt (UFC) library installed? | |
| HAVE_UFC= no | |
| # Do you have the Tcl/Tk library installed? | |
| HAVE_TCLTK= 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 when | |
| # compiled with multithreading enabled. | |
| HAVE_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) | |
| HAVE_BSDDB= no | |
| # Do you have the ncurses library installed? EMX's BSD curses aren't enough! | |
| HAVE_NCURSES= no | |
| # Do you have the GDBM library installed? | |
| HAVE_GDBM= no | |
| # Do you have the BZ2 compression library installed? | |
| HAVE_BZ2= no | |
| # Do you have the OpenSSL libraries installed | |
| HAVE_OPENSSL= no | |
| # === install locations === | |
| # default value of PYTHONHOME | |
| LIB_DIR=C:/Python26 | |
| # default is to have everything in or under PYTHONHOME | |
| EXE_DIR=$(LIB_DIR) | |
| DLL_DIR=$(EXE_DIR) | |
| # === 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 | |
| EXEOPT= emxbind | |
| PY_DEF= -DPy_BUILD_CORE | |
| # adjust C compiler settings based on build options | |
| ifeq ($(MODE),debug) | |
| CFLAGS+= -g -O | |
| LDFLAGS+= -g | |
| else | |
| CFLAGS+= -s -O3 -fomit-frame-pointer -mprobe | |
| LDFLAGS+= -s | |
| endif | |
| CFLAGS+= $(PY_DEF) | |
| ifeq ($(ASSERTIONS),no) | |
| CFLAGS+= -DNDEBUG | |
| endif | |
| ifeq ($(FIXED_PYHOME),yes) | |
| CFLAGS+= -DPREFIX=$(DQUOTE)$(LIB_DIR)$(DQUOTE) | |
| endif | |
| # We're using the OMF format since EMX's ld has an 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 | |
| MODLIB.EXT= .dll | |
| 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 | |
| # === Build time resource settings === | |
| # EMX's default number of file handles is 40, which is sometimes insufficient | |
| # (the tempfile regression test tries to create 100 temporary files) | |
| NFILES=250 | |
| # The default stack size for child threads is 64k bytes, which is | |
| # insufficient for some applications which do a lot of work in threads | |
| # (such as Zope, especially in conjunction with Plone). | |
| # Note that this setting is distinct from the stack size for the main | |
| # thread, which is set via the %.def rule below. | |
| # EMX documents that the thread stack size should be at least 32768 bytes; | |
| # for Zope/Plone at least 128k bytes is recommended. | |
| # Uncomment & adjust the next line to override the default stack size: | |
| #CFLAGS+= -DTHREAD_STACK_SIZE=0x20000 | |
| # === The environment === | |
| # 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 2097152 >>$@ | |
| # Output file names | |
| PYTHON_VER= 2.6 | |
| PYTHON_LIB= python27 | |
| 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.readline$(MODULE.EXT)= Python Extension DLL for access to GNU ReadLine library | |
| DESCRIPTION.bsddb185$(MODULE.EXT)= Python Extension DLL for access to BSD DB (v1.85) library | |
| DESCRIPTION._curses$(MODLIB.EXT)= Python Extension DLL for access to ncurses library | |
| DESCRIPTION.pyexpat$(MODULE.EXT)= Python Extension DLL for access to expat library | |
| DESCRIPTION.bz2$(MODULE.EXT)= Python Extension DLL for accessing the bz2 compression library | |
| # Source files | |
| 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/arraymodule.c \ | |
| Modules/binascii.c \ | |
| Modules/cmathmodule.c \ | |
| Modules/_codecsmodule.c \ | |
| Modules/_collectionsmodule.c \ | |
| Modules/cPickle.c \ | |
| Modules/cStringIO.c \ | |
| Modules/_csv.c \ | |
| Modules/datetimemodule.c \ | |
| Modules/dlmodule.c \ | |
| Modules/errnomodule.c \ | |
| Modules/fcntlmodule.c \ | |
| Modules/_fileio.c \ | |
| Modules/_functoolsmodule.c \ | |
| Modules/_heapqmodule.c \ | |
| Modules/imageop.c \ | |
| Modules/itertoolsmodule.c \ | |
| Modules/_localemodule.c \ | |
| Modules/mathmodule.c \ | |
| Modules/md5.c \ | |
| Modules/md5module.c \ | |
| Modules/operator.c \ | |
| Modules/_randommodule.c \ | |
| Modules/shamodule.c \ | |
| Modules/sha256module.c \ | |
| Modules/sha512module.c \ | |
| Modules/_sre.c \ | |
| Modules/stropmodule.c \ | |
| Modules/_struct.c \ | |
| Modules/symtablemodule.c \ | |
| Modules/termios.c \ | |
| Modules/timemodule.c \ | |
| Modules/timingmodule.c \ | |
| Modules/_weakref.c \ | |
| Modules/xxsubtype.c \ | |
| Modules/zipimport.c) | |
| SRC.PARSE1= $(addprefix $(TOP), \ | |
| Parser/acceler.c \ | |
| Parser/grammar1.c \ | |
| Parser/listnode.c \ | |
| Parser/node.c \ | |
| Parser/parser.c \ | |
| Parser/parsetok.c \ | |
| Parser/bitset.c \ | |
| Parser/metagrammar.c) | |
| SRC.PARSE2= $(addprefix $(TOP), \ | |
| Parser/tokenizer.c \ | |
| Parser/myreadline.c) | |
| SRC.PARSER= $(SRC.PARSE1) \ | |
| $(SRC.PARSE2) | |
| SRC.PYTHON= $(addprefix $(TOP), \ | |
| Python/Python-ast.c \ | |
| Python/asdl.c \ | |
| Python/ast.c \ | |
| Python/bltinmodule.c \ | |
| Python/exceptions.c \ | |
| Python/ceval.c \ | |
| Python/compile.c \ | |
| Python/codecs.c \ | |
| Python/errors.c \ | |
| Python/formatter_string.c \ | |
| Python/formatter_unicode.c \ | |
| Python/frozen.c \ | |
| Python/frozenmain.c \ | |
| Python/future.c \ | |
| Python/getargs.c \ | |
| Python/getcompiler.c \ | |
| Python/getcopyright.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/peephole.c \ | |
| Python/pyarena.c \ | |
| Python/pyctype.c \ | |
| Python/pyfpe.c \ | |
| Python/pymath.c \ | |
| Python/pystate.c \ | |
| Python/pystrtod.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 \ | |
| Python/_warnings.c) | |
| SRC.OBJECT= $(addprefix $(TOP), \ | |
| Objects/abstract.c \ | |
| Objects/boolobject.c \ | |
| Objects/bufferobject.c \ | |
| Objects/bytearrayobject.c \ | |
| Objects/bytes_methods.c \ | |
| Objects/cellobject.c \ | |
| Objects/classobject.c \ | |
| Objects/capsule.c \ | |
| Objects/cobject.c \ | |
| Objects/codeobject.c \ | |
| Objects/complexobject.c \ | |
| Objects/descrobject.c \ | |
| Objects/dictobject.c \ | |
| Objects/enumobject.c \ | |
| Objects/fileobject.c \ | |
| Objects/floatobject.c \ | |
| Objects/frameobject.c \ | |
| Objects/funcobject.c \ | |
| Objects/genobject.c \ | |
| Objects/intobject.c \ | |
| Objects/iterobject.c \ | |
| Objects/listobject.c \ | |
| Objects/longobject.c \ | |
| Objects/methodobject.c \ | |
| Objects/moduleobject.c \ | |
| Objects/object.c \ | |
| Objects/obmalloc.c \ | |
| Objects/rangeobject.c \ | |
| Objects/setobject.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.PGEN= $(SRC.PARSE1) \ | |
| $(addprefix $(TOP), \ | |
| Objects/obmalloc.c) \ | |
| $(addprefix $(TOP), \ | |
| Python/mysnprintf.c) \ | |
| $(addprefix $(TOP), \ | |
| Parser/tokenizer_pgen.c \ | |
| Parser/pgenmain.c \ | |
| Parser/pgen.c \ | |
| Parser/printgrammar.c \ | |
| Parser/grammar.c \ | |
| Parser/firstsets.c) \ | |
| OBJ.PGEN= $(addprefix $(OUT),$(notdir $(SRC.PGEN:.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= fpectl \ | |
| fpetest \ | |
| parser \ | |
| pwd \ | |
| select | |
| # 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= _hotshot \ | |
| _socket \ | |
| _testcap \ | |
| unicoded | |
| # Python modules that are used as libraries and therefore must use | |
| # a .DLL extension | |
| LIBEXTMODULES= | |
| # Python external ($(MODULE.EXT)) modules - can be EASY or HARD | |
| ifeq ($(HAVE_ZLIB),yes) | |
| HARDEXTMODULES+= zlib | |
| endif | |
| ifeq ($(HAVE_UFC),yes) | |
| HARDEXTMODULES+= crypt | |
| endif | |
| ifeq ($(HAVE_TCLTK),yes) | |
| HARDEXTMODULES+= _tkinter | |
| CFLAGS+= -DHAS_DIRENT -I/TclTk80/include | |
| TK_LIBS+= -L/TclTk80/lib -ltcl80 -ltk80 | |
| endif | |
| ifeq ($(HAVE_GREADLINE),yes) | |
| HARDEXTMODULES+= readline | |
| endif | |
| ifeq ($(HAVE_BSDDB),yes) | |
| HARDEXTMODULES+= bsddb185 | |
| endif | |
| ifeq ($(HAVE_NCURSES),yes) | |
| LIBEXTMODULES+= _curses | |
| HARDEXTMODULES+= _curses_ | |
| endif | |
| ifeq ($(HAVE_GDBM),yes) | |
| HARDEXTMODULES+= gdbm dbm | |
| endif | |
| ifeq ($(HAVE_BZ2),yes) | |
| HARDEXTMODULES+= bz2 | |
| endif | |
| ifeq ($(HAVE_OPENSSL),yes) | |
| HARDEXTMODULES+= _ssl | |
| endif | |
| # Expat is now distributed with the Python source | |
| HARDEXTMODULES+= pyexpat | |
| EXPAT.INC= -I../../Modules/expat | |
| EXPAT.DEF= -DHAVE_EXPAT_H -DXML_NS=1 -DXML_DTD=1 -DXML_BYTE_ORDER=12 \ | |
| -DXML_CONTENT_BYTES=1024 -DHAVE_MEMMOVE=1 -DHAVE_BCOPY=1 | |
| EXPAT.SRC= $(addprefix ../../Modules/expat/, \ | |
| xmlparse.c \ | |
| xmlrole.c \ | |
| xmltok.c) | |
| # all the external modules | |
| EXTERNDLLS= $(addsuffix $(MODULE.EXT),$(patsubst %module,%,$(EASYEXTMODULES))) | |
| EXTERNDLLS+= $(addsuffix $(MODULE.EXT),$(patsubst %module,%,$(HARDEXTMODULES))) | |
| EXTERNDLLS+= $(addsuffix $(MODLIB.EXT),$(patsubst %module,%,$(LIBEXTMODULES))) | |
| # Targets | |
| all: $(OUT) $(PYTHON.LIB) $(PYTHON.DEF) $(PYTHON.IMPLIB) $(PYTHON.DLL) \ | |
| python_noncore | |
| python_noncore: | |
| make PY_DEF= $(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) *.dll | |
| find ../../Lib -name "*.py[co]" -exec rm {} ";" | |
| 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) $@ $^ | |
| # the Python core DLL .def file needs to have a number of non-static | |
| # symbols that aren't part of the Python C API removed (commented out) | |
| # from the DLL export list. | |
| $(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) |\ | |
| sed -e "/^ .init.*/s/^ /; /" \ | |
| -e "/^ .pcre_.*/s/^ /; /" \ | |
| -e "/^ .array_methods/s/^ /; /" \ | |
| -e "/^ .fast_save_leave/s/^ /; /" \ | |
| -e "/^ .dlopen/s/^ /; /" \ | |
| -e "/^ .dlsym/s/^ /; /" \ | |
| -e "/^ .dlclose/s/^ /; /" \ | |
| -e "/^ .dlerror/s/^ /; /" \ | |
| -e "/^ ._Py_re_.*/s/^ /; /" \ | |
| -e "/^ ._Py_MD5.*/s/^ /; /" >>$@ | |
| $(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 | |
| $(EXEOPT) -aq $(PYTHON.EXE) -h$(NFILES) | |
| $(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 | |
| $(EXEOPT) -aq $(PYTHONPM.EXE) -h$(NFILES) | |
| $(PGEN.EXE): $(OBJ.PGEN) $(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 | |
| _hotshot$(MODULE.EXT): $(OUT)_hotshot$O $(OUT)_hotshot_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) | |
| # _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 $^ $@ | |
| # - optional modules (requiring other software to be installed) | |
| bsddb185$(MODULE.EXT): $(OUT)bsddbmodule$O $(OUT)bsddb185_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 $*)$(MODLIB.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$(MODLIB.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 | |
| # Expat is now distributed with Python, so use the included version | |
| $(OUT)pyexpat$O: ../../Modules/pyexpat.c | |
| $(CC) $(CFLAGS) $(EXPAT.INC) -c -o $@ $^ | |
| $(OUT)xmlparse$O: ../../Modules/expat/xmlparse.c | |
| $(CC) $(CFLAGS) $(EXPAT.INC) $(EXPAT.DEF) -c -o $@ $^ | |
| $(OUT)xmlrole$O: ../../Modules/expat/xmlrole.c | |
| $(CC) $(CFLAGS) $(EXPAT.INC) $(EXPAT.DEF) -c -o $@ $^ | |
| $(OUT)xmltok$O: ../../Modules/expat/xmltok.c | |
| $(CC) $(CFLAGS) $(EXPAT.INC) $(EXPAT.DEF) -c -o $@ $^ | |
| pyexpat$(MODULE.EXT): $(OUT)pyexpat$O $(OUT)xmlparse$O $(OUT)xmlrole$O \ | |
| $(OUT)xmltok$O $(OUT)pyexpat_m.def $(PYTHON.IMPLIB) | |
| $(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) | |
| 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 | |
| bz2$(MODULE.EXT): $(OUT)bz2module$O $(OUT)bz2_m.def $(PYTHON.IMPLIB) | |
| $(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lbz2 | |
| _ssl$(MODULE.EXT): $(OUT)_ssl$O $(OUT)_ssl_m.def $(PYTHON.IMPLIB) | |
| $(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lssl -lcrypto | |
| # the test target | |
| test: | |
| -find ../../Lib -name "*.py[co]" -exec rm {} ";" | |
| -./python -E -tt ../../lib/test/regrtest.py -l -u "network" | |
| ./python -E -tt ../../lib/test/regrtest.py -l -u "network" | |
| -include $(OUTBASE)python.dep |