# The file Setup is used by the makesetup script to construct the files
# Makefile and config.c, from Makefile.pre and config.c.in,
# respectively.  The file Setup itself is initially copied from
# Setup.in; once it exists it will not be overwritten, so you can edit
# Setup to your heart's content.  One possibility is to overwrite it
# with a copy of Setup.sgi or Setup.sunos[45] before you start editing.
# Note that Makefile.pre is created from Makefile.pre.in by the toplevel
# configure script.

# (VPATH notes: Setup and Makefile.pre are in the build directory, as
# are Makefile and config.c; Setup.in and config.c.in are in the source
# directory.)

# Each line in this file describes one or more optional modules.
# Comment out lines to suppress modules.
# Lines have the following structure:
#
# <module> ... [<sourcefile> ...] [<cpparg> ...] [<library> ...]
#
# <sourcefile> is anything ending in .c (.C, .cc, .c++ are C++ files)
# <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 add any whitespace or comments!

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


# Modules with some UNIX dependencies -- on by default.
# (If you have a really backward UNIX, select and socket may not be
# supported...)

fcntl fcntlmodule.c	# fcntl(2) and ioctl(2)
pwd pwdmodule.c		# pwd(3) 
grp grpmodule.c		# grp(3)
crypt cryptmodule.c	# crypt(3)
select selectmodule.c	# select(2); not on ancient System V
socket socketmodule.c	# socket(2); not on ancient System V
signal signalmodule.c	# signal(2)


# Some more UNIX dependent modules -- off by default, since these
# are not supported by all UNIX systems.

#dbm dbmmodule.c 	# dbm(3) may require -lndbm or similar
#nis nismodule.c 	# Sun yellow pages -- not everywhere


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

audioop audioop.c	# Operations on audio samples
imageop imageop.c	# Operations on images
rgbimg rgbimgmodule.c   # 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=???
#stdwin stdwinmodule.c -I$(STDWIN)/H $(STDWIN)/Build/$(ARCH)/x11/lib/lib.a -lX11


# 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.c md5c.c


# The mpz module interfaces to the GNU Multiple Precision library.
# You need to ftp the GNU MP library.  
# The GMP variable must point to the GMP source directory.
# This was originally written and tested against GMP 1.2.  I have
# compiled it against GMP 1.3.2 (the latest I believe) and it seems to
# work OK, but I haven't tested it thoroughly (lacking knowledge about
# it).

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


# 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).

#                               # ADD THESE FOR IRIX5:
#al almodule.c -laudio
#cd cdmodule.c -lcdaudio -lds	# -lmediad
#cl clmodule.c -lcl		# -lawareaudio
#fm fmmodule.c -lfm_s -lgl_s
#gl glmodule.c -lgl_s -lX11_s
#imgfile imgfile.c -limage -lgutil
#sgi sgimodule.c
#sv svmodule.c yuvconvert.c -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.c -I$(FORMS) $(FORMS)/libforms.a


# SunOS specific modules -- off by default

# sunaudiodev sunaudiodev.c


# 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.c


# GNN's timing module
# timing timingmodule.c


# Lance Ellinghouse's modules
rotor rotormodule.c		# enigma-inspired en-, decryption
# syslog syslogmodule.c		# syslog daemon interface
# curses cursesmodule.c -lcurses -ltermcap	# guess what?


# Tommy Burnette's 'new' module (creates new empty objects of certain kinds)
# new newmodule.c


# John Redford's sybase module
# sybase sybasemodule.c


# Generic (SunOS / SVR4) dynamic loading module
# dl dlmodule.c


# Jack Jansen's imgformat module
# imgformat imgformat.c


# Anthony Baxter's gdbm module (derived from Jack's dbm module)
# GNU dbm(3) will require -lgdbm
# gdbm gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm


# Example -- included for reference only
# xx xxmodule.c
