summaryrefslogtreecommitdiffstats
path: root/BeOS/ar-fake
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-12-18 15:37:14 (GMT)
committerGuido van Rossum <guido@python.org>1998-12-18 15:37:14 (GMT)
commit060f24ce972f7f1ee3cf6f3444c09dd4869fa186 (patch)
treec46e72e69d5786ba6645888da7a57da3ad2ced74 /BeOS/ar-fake
parent33add0a95aa6c5ba5dbb8cae7b51a253209ecd6f (diff)
downloadcpython-060f24ce972f7f1ee3cf6f3444c09dd4869fa186.zip
cpython-060f24ce972f7f1ee3cf6f3444c09dd4869fa186.tar.gz
cpython-060f24ce972f7f1ee3cf6f3444c09dd4869fa186.tar.bz2
Forgot to check this in for Chris Herborth
Diffstat (limited to 'BeOS/ar-fake')
-rwxr-xr-xBeOS/ar-fake153
1 files changed, 153 insertions, 0 deletions
diff --git a/BeOS/ar-fake b/BeOS/ar-fake
new file mode 100755
index 0000000..a4c1f7f
--- /dev/null
+++ b/BeOS/ar-fake
@@ -0,0 +1,153 @@
+#! /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.
+#
+# 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_NAME=$1 ; shift
+ CRUD_NAME=$1 ; shift
+
+ # maybe too much...
+ EXTRA_LIBS="-lroot -lbe -lnet"
+
+ case $BE_HOST_CPU in
+ ppc)
+ AR_CC="mwcc -xms -export pragma -nodup"
+ 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=
+ ;;
+
+ *)
+ # 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
+
+ # 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 ${LIB%.a}.so $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
+ ;;
+esac
+
+# If we make it here, all went well. Hopefully.
+exit 0