Python for BeOS R5

This directory contains several useful things to help you build your own
version of Python for BeOS.

What's Here?

ar-fake - A shell script used by the build process to emulate a "real"
          POSIX ar command; helps to build the Python shared library.

dl_export.h - A header defining the evil magic declaration decorations
              required for dynamic loading.

linkcc - A shell script used by the build process to build the Python
         shared library.

linkmodule - A shell script used by the build process to build the
             shared library versions of the standard modules; you'll
             probably need this if you want to build dynamically loaded
             modules from the Python archives.

README - This file (obviously!).

README.readline-2.2 - Instructions for compiling/installing GNU readline 2.2.
                      You'll have to grab the GNU readline source code from 
                      prep.ai.mit.edu:/pub/GNU or any other GNU mirror.

                      The Python interpreter is much nicer to work with
                      interactively if you've got readline installed.  Highly
                      recommended.

Compiling Your Own Version

To compile your own version of Python 1.5.x for BeOS (with any luck,
Python 1.5.2 and later will compile "out of the box" on BeOS), try this:

1) Get the latest Python source code from ftp.python.org.

2) Configure with:

   ./configure --verbose --prefix=/boot/home/config --with-thread

3) Copy Modules/Setup.in to Modules/Setup.

4) Edit Modules/Setup to turn on all the modules you want built.

   Make sure you use _socket instead of socket for the name of the
   socketmodule on BeOS (at least, until we get the new BONE networking).

   If you want the modules to be built as shared libraries, instead of as
   part of the Python shared library, be sure to uncomment the #*shared*
   line.  I haven't done much testing with static linking, it's not as
   interesting.

   I've tried the following modules:

   array audioop binascii cmath _codecs cPickle crypt cStringIO _curses
   errno fcntl gdbm grp imageop _locale math md5 new operator parser
   pcre posix pwd pyexpat readline regex rgbimg rotor select sha signal
   _socket soundex _sre strop struct syslog termios time timing ucnhash
   unicodedata zlib
   
   Note that some of these require extra libraries that aren't supplied 
   with Python.  If you don't have the extra libs (you can probably get 
   them from GeekGadgets), don't try to use these modules; they won't 
   compile.

5) Make:

   make

6) Test:

   make test

   test_popen2 will probably hang; it's deadlocked on a semaphore.  I should
   probably disable popen2 support... it uses fork(), and fork() doesn't mix
   with threads on BeOS.  In *THEORY* you could use it in a single-threaded
   program, but I haven't tried.
   
   If test_popen2 does hang, you can find the semaphore it's hung on via the
   "ps" command.  Look for python and you'll find something like this:
   
./python -tt ../src/Lib/test/regrtest.py (team 26922) (uid 0) (gid 0)
  39472               python  sem  10    3785    1500 piperd(360526)
./python -tt ../src/Lib/test/regrtest.py (team 26923) (uid 0) (gid 0)
  39477               python  sem  10      25       4 python lock (1)(360022)
                                                                      ^^^^^^
   That last number is the semaphore the fork()'d python is stuck on
   (see how it's helpfully called "python lock (1)"? :-).  You can unblock
   that semaphore to let the tests continue using the "release" command
   with that semaphore number.  Be _very_ careful with "release" though,
   releasing the wrong semaphore can be hazardous.

   Expect the following errors:

   test * skipped -- an optional feature could not be imported (you'll see
                     quite a few of these, based on what optional modules
                     you've included)

   test test_fork1 skipped -- can't mix os.fork with  threads on BeOS

   test test_re failed -- Writing: '=== Failed incorrectly', expected: 
                          "('abc', 'abc', 0, 'fou"

   test test_select crashed -- select.error : (-2147459072, 'Bad file 
                               descriptor')

   test test_socket crashed -- exceptions.AttributeError : SOCK_RAW

   These are all due to either partial support for certain things (like
   sockets), or valid differences between systems.

   That test_re failure is a little worrysome though.

7) Install:

   make install

8) Enjoy!

- Chris Herborth (chrish@pobox.com)
  July 21, 2000
