# Each line in this file describes one or more optional modules.
# Comment out lines to suppress modules.
# Lines have the following structure:
#
# <module> ... [<objectfile> ...] [<cpparg> ...] [<library> ...]
#
# <objectfile> is anything ending in .o
# <cpparg> is anything starting with -I, -D, -U or -C
# <library> is anything ending in .a or beginning with -l or -L
# <module> is anything else but should be a valid Python
# identifier (letters, digits, underscores, beginning with non-digit)
#
# Lines can also have the form
#
# <name> = <value>
#
# which defines a Make variable definition inserted into Makefile.in
#
# NOTE: As a standard policy, as many modules as can be supported by a
# platform should be present.  The distribution comes with all modules
# enabled that are supported by most platforms and don't require you
# to ftp sources from elsewhere.  To make this easier for SGI
# platforms, you can copy Setup.sgi to Setup (or edit Makefile.in.in
# to use Setup.sgi instead of Setup).


# Some special rules to define PYTHONPATH
# Edit the definitions below to indicate which options you are using

# Don't edit this (usually)
DESTLIB=$(prefix)/lib/python

# Standard enabled (tests are always available)
TESTPATH=:$(DESTLIB)/test

# Enable this for SGI systems
ARCHPATH=:$(DESTLIB)/sgi

# Enable this for Sun systems
#ARCHPATH=:$(DESTLIB)/sun4

# Enable this if stdwin installed
STDWINPATH=:$(DESTLIB)/stdwin

PYTHONPATH=.:$(DESTLIB)$(TESTPATH)$(ARCHPATH)$(STDWINPATH)


# Modules that should always be present (non UNIX dependent)

array arraymodule.o	# array objects
math mathmodule.o	# math library functions, e.g. sin()
parser parsermodule.o	# raw interface to the Python parser
posix posixmodule.o	# posix (UNIX) system calls
regex regexmodule.o regexpr.o	# Regular expressions, GNU Emacs style
strop stropmodule.o	# fast string operations implemented in C
struct structmodule.o	# binary structure packing/unpacking
time timemodule.o	# time operations and variables


# Modules with some UNIX dependencies -- on by default.
# Note that some UNIX versions still don't support all of these
# so you may have to comment them out before the build completes.

dbm dbmmodule.o		# dbm(3) may require -ldbm or similar
fcntl fcntlmodule.o	# fcntl(2) and ioctl(2)
nis nismodule.o		# Sun yellow pages -- not everywhere
pwd grp pwdmodule.o	# pwd(3) and grp(3)
select selectmodule.o	# select(2); not on ancient System V
socket socketmodule.o	# socket(2); not on ancient System V


# Multimedia modules -- on by default
# These represent audio samples or images as strings

audioop audioopmodule.o # Operations on audio samples
imageop imageopmodule.o # Operations on images
rgbimg rgbimgmodule.o   # Read SGI RGB image files (but coded portably)


# The stdwin module provides a simple, portable (between X11 and Mac)
# windowing interface.  You need to ftp the STDWIN library, e.g. from
# ftp://ftp.cwi.nl/pub/stdwin.  The STDWIN variable must point to the
# STDWIN toplevel directory.  The ARCH variable must be set to the
# architecture identifier used to build STDWIN.  NB if you combine this
# with the gl module on an SGI machine, you should replace "-lX11" with
# "-lX11_s".

#STDWIN=/ufs/guido/src/stdwin
#ARCH=sgi
#stdwin stdwinmodule.o -I$(STDWIN)/H $(STDWIN)/Build/$(ARCH)/x11/lib/lib.a -lX11_s


# The md5 module implements the RSA Data Security, Inc. MD5
# Message-Digest Algorithm, described in RFC 1321.  The necessary files
# md5c.c and md5.h are included here.

md5 md5module.o md5c.o


# The mpz module interfaces to the GNU Multiple Precision library.
# You need to ftp the GNU MP library.  This was last tested with a
# somewhat modified (to get around bugs) version of GMP 1.2; it will
# likely need some work for more recent versions.  The GMP variable
# must point to the GMP source directory.

#GMP=/ufs/guido/src/gmp
#mpz mpzmodule.o -I$(GMP) $(GMP)/libgmp.a


# The rotor module (contributed by Lance Ellinghouse) implements a
# rotor-based encryption algorithm.  It is self-contained.

rotor rotormodule.o


# SGI IRIX specific modules -- off by default.
# Switch this on if you have an SGI machine.
# Note that some required libraries and header files aren't always
# installed; you may be better off switching on only 'fm' and 'gl'
# (Font Manager and Graphics Library).

#al almodule.o -laudio		# audio
#cd cdmodule.o -lcdaudio -lds	#
#cl clmodule.o -lcl
fm fmmodule.o -lfm_s -lgl_s
gl glmodule.o -lgl_s -lX11_s
#imgfile imgfilemodule.o -limage -lgutil -lm
sgi sgimodule.o
#sv svmodule.o yuvconvert.o -lsvideo -lXext -lX11_s

# The FORMS library, by Mark Overmars, implements user interface
# components such as dialogs and buttons using SGI's GL and FM
# libraries.  You must ftp the FORMS library separately from
# ftp://ftp.cs.ruu.nl/pub/SGI/FORMS.  It was tested with FORMS 2.2a.
# The FORMS variable must point to the FORMS subdirectory of the forms
# toplevel directory.

#FORMS=/ufs/guido/src/forms/FORMS
#fl flmodule.o -I$(FORMS) $(FORMS)/libforms.a


# SunOS specific modules -- off by default

# sunaudiodev sunaudiodevmodule.o


# Thread module -- works on SGI IRIX and on SunOS 5.x (SOLARIS) only.
# Note that you must have configured (and built!) Python with the
# --with-thread option passed to the configure script for this to work.

thread threadmodule.o


# GNN's timing module
timing timingmodule.o


# Example -- included for reference only

# xx xxmodule.o
