diff options
-rwxr-xr-x | BeOS/ar-fake | 209 |
1 files changed, 58 insertions, 151 deletions
diff --git a/BeOS/ar-fake b/BeOS/ar-fake index b4f5996..4a06e3b 100755 --- a/BeOS/ar-fake +++ b/BeOS/ar-fake @@ -1,157 +1,64 @@ -#! /bin/sh +#!/bin/sh # -# Fake "ar" to build the Python shared library on BeOS. This "ar" -# manipulates a .ar-libname file listing all the objects and regenerates -# the shared lib every time it's called. This is probably only suitable -# for things that get built like Python, and you'll probably have to make -# some small modifications here and there. +# Truly fake ar, using a directory to store object files. # -# This stupid hackery is necessary due to the brain-damaged __declspec() -# semantics on x86; on PowerPC, we could just build a static library -# and turn that into a shared library using an exports list. On x86, you'd -# need to use a fake table of pointers to every symbol you wanted to -# export, otherwise you'd end up with an empty shared lib. This is -# progress? -# -# Called via: -# -# ar-fake cr lib-name objects -# ar-fake d lib-name objects -# -# This fake "ar" DOES NOT support any other POSIX "ar" commands! DO NOT -# expect it to behave very intelligently, it's designed to build Python, -# not any old shared lib. - -AR_COMMAND=$1 ; shift -AR_LIB=$1 ; shift -AR_LIB_NAME=$(basename $AR_LIB) -AR_SO_LIB_NAME=${AR_LIB_NAME/.a/.so} -AR_LIB_PATH=${AR_LIB/$AR_LIB_NAME/} -if [ "$AR_LIB_PATH" = "" ] ; then - AR_LIB_PATH="." -fi -AR_CRUD=${AR_LIB_PATH}/.ar-${AR_LIB_NAME} - -AR_CWD=$(pwd) - -# Function to tell is if the arg is an absolute path. Use it like this: -# -# if is_abs pathname ; then ... -is_abs() { - if [ "$1" != "$(echo $1 | sed -e "s,^/,,")" ] ; then - return 0 - fi - return 1 -} - -# Function to build the shared library. It does the right thing for -# PowerPC or x86 systems running BeOS. -build_lib() { - LIB=$1 ; shift - SO_LIB=${LIB/.a/.so} - SO_NAME=$1 ; shift - CRUD_NAME=$1 ; shift - - # maybe too much... - EXTRA_LIBS="-lroot -lbe -lnet" - - case $BE_HOST_CPU in - ppc) - case $(uname -r) in - 4.0*) AR_CC="mwcc -xms -export pragma -nodup" ;; - *) AR_CC="mwcc -shared -export pragma -nodup" ;; - esac - GLUE_LOC=/boot/develop/lib/ppc - AR_GLUE="${GLUE_LOC}/glue-noinit.a ${GLUE_LOC}/init_term_dyn.o ${GLUE_LOC}/start_dyn.o" - ;; - - x86) - AR_CC="gcc -nostart -Wl,-soname=${SO_NAME}" - AR_GLUE= - ;; +# Donn Cave, donn@oz.net - *) - # Send me the mystery system (soo-pah aitch!), then we'll talk... - echo "No, no, no... $0 doesn't support $BE_HOST_CPU" - exit 2 - ;; - esac +usage='Usage: ar-fake cr libpython.dir obj.o ... + ar-fake d libpython.dir obj.o ... + ar-fake so libpython.dir libpython.so' - # Build a list of the objects... - PARTS="" - while read OBJ_FILE OBJ_PATH ; do - PARTS="$PARTS ${OBJ_PATH}${OBJ_FILE}" - done < $CRUD_NAME - - $AR_CC -o $SO_LIB $PARTS $AR_GLUE $EXTRA_LIBS > /dev/null 2>&1 - - return 0 -} - -# Make a backup of the old AR_CRUD file, just to be nice, and clean up -# any of our temp files that may be laying around. -if [ -e $AR_CRUD ] ; then - mv -f $AR_CRUD ${AR_CRUD}.old - cp ${AR_CRUD}.old $AR_CRUD -else - touch $AR_CRUD -fi - -if [ -e ${AR_CRUD}.grepper ] ; then - rm -f ${AR_CRUD}.grepper -fi - -case $AR_COMMAND in - cr) - # Add the extra bits to the $AR_CRUD file. - for OBJECT in "$@" ; do - OBJ_NAME=$(basename $OBJECT) - OBJ_PATH=${OBJECT%$OBJ_NAME} - if ! is_abs $OBJ_PATH ; then - OBJ_PATH=${AR_CWD}/${OBJECT} - OBJ_PATH=${OBJ_PATH%$OBJ_NAME} - fi - - # If this is already in there, we have to blow it away so - # we can replace it with the new one. - if egrep -q "^$OBJ_NAME " $AR_CRUD ; then - egrep -v "^$OBJ_NAME " < $AR_CRUD > ${AR_CRUD}.grepper - mv -f ${AR_CRUD}.grepper $AR_CRUD - fi - - echo $OBJ_NAME $OBJ_PATH >> $AR_CRUD - done - - # Now build a library from the files. - build_lib $AR_LIB $AR_SO_LIB_NAME $AR_CRUD - ;; - - d) - # Remove files from the $AR_CRUD file. This isn't terribly - # efficient. - for OBJECT in "$@" ; do - OBJ_NAME=$(basename $OBJECT) - OBJ_PATH=${OBJECT%$OBJ_NAME} - if ! is_abs $OBJ_PATH ; then - OBJ_PATH=${AR_CWD}/${OBJECT} - OBJ_PATH=${OBJ_PATH%$OBJ_NAME} - fi - - # Strip the objects from the list, if they're in there. - egrep -v "^$OBJ_NAME " < $AR_CRUD > ${AR_CRUD}.grepper - mv -f ${AR_CRUD}.grepper $AR_CRUD - done - - # Now build a library from the remaining objects. - build_lib $AR_LIB $AR_SO_LIB_NAME $AR_CRUD - ;; - - *) - echo "$0 error:" - echo " Unsupported command: $AR_COMMAND" - exit 1 - ;; +case $# in +0|1|2) + echo "$usage" >&2 + exit 1 + ;; esac -# If we make it here, all went well. Hopefully. -exit 0 +command=$1 +library=$2 +shift 2 + +case $command in +cr) + if test -d $library + then : + else + mkdir $library + fi + if cp -p $* $library + then + # To force directory modify date, create or delete a file. + if test -e $library/.tch + then rm $library/.tch + else echo tch > $library/.tch + fi + exit 0 + fi + ;; +d) + if test -d $library + then + cd $library + rm -f $* + fi + ;; +so) + case $BE_HOST_CPU in + ppc) + mwld -xms -export pragma -nodup -o $1 $library/* + ;; + x86) + gcc -nostart -Wl,-soname=$(basename $1) -o $1 $library/* + ;; + esac + status=$? + cd $(dirname $1) + ln -sf $PWD lib + exit $status + ;; +*) + echo "$usage" >&2 + exit 1 + ;; +esac |