| #! /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_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) |
| 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 $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 |
| ;; |
| esac |
| |
| # If we make it here, all went well. Hopefully. |
| exit 0 |