Merge remote branch 'origin/7.8'
[mesa.git] / bin / mklib
index fb160a2aae92e9dc56ce613971e0be24979ba743..c2760e5d892724b0c6a065695c1f3752605ab43f 100755 (executable)
--- a/bin/mklib
+++ b/bin/mklib
 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
+# Clear CDPATH as the 'cd' command will echo stuff
+# to stdout if it is set
+unset CDPATH
+
 # Given a list of files, look for .a archives and unpack them.
 # Return the original list of files minus the .a files plus the unpacked files.
+# first param:  name of a temp directory (to be deleted when finished)
+# remaining params:  list of .o and .a files
 expand_archives() {
+    DIR=$1
+    shift
     FILES=$@
     NEWFILES=""
+    ORIG_DIR=`pwd`
+    mkdir -p "$DIR"
+    cd "$DIR"
     for FILE in $FILES ; do
         case $FILE in
             *.a)
                 # extract the .o files from this .a archive
+                case $FILE in
+                    /*) ;;
+                    *)  FILE="$ORIG_DIR/$FILE" ;;
+                esac
                 MEMBERS=`ar t $FILE`
                 ar x $FILE
-                NEWFILES="$NEWFILES $MEMBERS"
+                for MEMBER in $MEMBERS ; do
+                    NEWFILES="$NEWFILES $DIR/$MEMBER"
+                done
                 ;;
             *)
                 # other file type, just add to list
@@ -44,28 +61,40 @@ expand_archives() {
                 ;;
         esac
     done
+    cd "$ORIG_DIR"
     echo $NEWFILES
 }
 
 
-# Given a list of files, look for .a archives and return a list of all objects
-# in the .a archives.
-contents_of_archives() {
-    FILES=$@
-    NEWFILES=""
-    for FILE in $FILES ; do
-        case $FILE in
-            *.a)
-                # get list of members in this .a archive
-                MEMBERS=`ar t $FILE`
-                NEWFILES="$NEWFILES $MEMBERS"
-                ;;
-            *)
-                # skip other file types
-                ;;
-        esac
-    done
-    echo $NEWFILES
+# Make static library with 'ar'
+# params:
+#    options to ar
+#    1 or 0 to indicate if ranlib should be run
+#    libname to make
+#    list of object files
+# Return name of library we made
+# Example: "make_ar_static_lib -ru 1 libfoo.a foo.o bar.o"
+make_ar_static_lib() {
+    OPTS=$1
+    shift;
+    RANLIB=$1
+    shift;
+    LIBNAME=$1
+    shift;
+    OBJECTS=$@
+
+    # remove existing lib, if present
+    rm -f ${LIBNAME}
+
+    # make static lib
+    ar ${OPTS} ${LIBNAME} ${OBJECTS}
+
+    # run ranlib
+    if [ ${RANLIB} = 1 ] ; then
+        ranlib ${LIBNAME}
+    fi
+
+    echo ${LIBNAME}
 }
 
 
@@ -328,18 +357,13 @@ case $ARCH in
             fi
 
            # expand .a into .o files
-           NEW_OBJECTS=`expand_archives $OBJECTS`
+           NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
 
             # make static lib
-            rm -f ${LIBNAME}
-            ar ${OPTS} ${LIBNAME} ${NEW_OBJECTS}
-            ranlib ${LIBNAME}
+           FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
 
            # remove temporary extracted .o files
-           rm -f `contents_of_archives $OBJECTS`
-
-            # finish up
-            FINAL_LIBS=${LIBNAME}
+           rm -rf ${LIBNAME}.obj
         else
            # make dynamic library
            LIBNAME="lib${LIBNAME}"     # prefix with "lib"
@@ -402,9 +426,7 @@ case $ARCH in
         if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}.a"
            echo "mklib: Making SunOS static library: " ${LIBNAME}
-           rm -f ${LIBNAME}
-           ar -ruv ${LIBNAME} ${OBJECTS}
-           FINAL_LIBS=${LIBNAME}
+           FINAL_LIBS=`make_ar_static_lib -ruc 0 ${LIBNAME} ${OBJECTS}`
        else
            if [ $NOPREFIX = 0 ] ; then
                LIBNAME="lib${LIBNAME}.so"
@@ -472,13 +494,16 @@ case $ARCH in
                OPTS="${OPTS} -Wl,-Mmapfile.scope"
            fi
 
-           # Check if objects are SPARC v9
+           # Check if objects are 64-bit
            # file says: ELF 64-bit MSB relocatable SPARCV9 Version 1
            set ${OBJECTS}
            if [ ${LINK} = "cc" -o ${LINK} = "CC" ] ; then
-               SPARCV9=`file $1 | grep SPARCV9`
-               if [ "${SPARCV9}" ] ; then
-                   OPTS="${OPTS} -xarch=v9"
+               ABI64=`file $1 | grep "ELF 64-bit"`
+               if [ "${ABI64}" ] ; then
+                   case `uname -p` in
+                       sparc)      OPTS="${OPTS} -xarch=v9" ;;
+                       i386)       OPTS="${OPTS} -xarch=amd64" ;;
+                   esac
                fi
            fi
             if [ "${ALTOPTS}" ] ; then
@@ -528,17 +553,12 @@ case $ARCH in
            echo "mklib: Making FreeBSD static library: " ${STLIB}
 
            # expand .a into .o files
-           NEW_OBJECTS=`expand_archives $OBJECTS`
+           NEW_OBJECTS=`expand_archives ${STLIB}.obj $OBJECTS`
 
-            # make static lib
-           rm -f ${STLIB}
-           ar cq ${STLIB} ${NEW_OBJECTS}
-           ranlib ${STLIB}
+           FINAL_LIBS=`make_ar_static_lib cq 1 ${STLIB} ${NEW_OBJECTS}`
 
            # remove temporary extracted .o files
-           rm -f `contents_of_archives $OBJECTS`
-
-           FINAL_LIBS=${STLIB}
+           rm -rf ${STLIB}.obj
        else
            # make dynamic library
            SHLIB="lib${LIBNAME}.so.${MAJOR}"
@@ -558,10 +578,7 @@ case $ARCH in
         if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}_pic.a"
            echo "mklib: Making NetBSD PIC static library: " ${LIBNAME}
-           rm -f ${LIBNAME}
-           ar cq ${LIBNAME} ${OBJECTS}
-           ranlib ${LIBNAME}
-           FINAL_LIBS=${LIBNAME}
+           FINAL_LIBS=`make_ar_static_lib cq 1 ${LIBNAME} ${OBJECTS}`
        else
            LIBNAME="lib${LIBNAME}.so.${MAJOR}.${MINOR}"
            echo "mklib: Making NetBSD PIC shared library: " ${LIBNAME}
@@ -574,9 +591,7 @@ case $ARCH in
     'IRIX' | 'IRIX64')
         if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}.a"
-           rm -f ${LIBNAME}
-           ar rc ${LIBNAME} ${OBJECTS}
-           FINAL_LIBS=${LIBNAME}
+           FINAL_LIBS=`make_ar_static_lib rc 0 ${LIBNAME} ${OBJECTS}`
        else
            LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
 
@@ -627,9 +642,7 @@ case $ARCH in
         if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}.a"
            echo "mklib: Making HP-UX static library: " ${LIBNAME}
-           rm -f ${LIBNAME}
-           ar -ruv ${LIBNAME} ${OBJECTS}
-           FINAL_LIBS=${LIBNAME}
+           FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
        else
             # HP uses a .2 for their current GL/GLU libraries
            if [ ${LIBNAME} = "GL" -o ${LIBNAME} = "GLU" ] ; then
@@ -659,8 +672,7 @@ case $ARCH in
        if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}.a"
            echo "mklib: Making AIX static library: " ${LIBNAME}
-           ar -ruv ${X64} ${LIBNAME} ${OBJECTS}
-           FINAL_LIBS=${LIBNAME}
+           FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
        else
            EXPFILE="lib${LIBNAME}.exp"
            LIBNAME="lib${LIBNAME}.a"  # shared objects are still stored in the .a libraries
@@ -711,9 +723,7 @@ case $ARCH in
         if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}.a"
            echo "mklib: Making OSF/1 static library: " ${LIBNAME}
-           rm -f ${LIBNAME}
-           ar -ruv ${LIBNAME} ${OBJECTS}
-           FINAL_LIBS=${LIBNAME}
+           FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
        else
            VERSION="${MAJOR}.${MINOR}"
            LIBNAME="lib${LIBNAME}.so"
@@ -736,12 +746,20 @@ case $ARCH in
         if [ $STATIC = 1 ] ; then
             LIBNAME="lib${LIBNAME}.a"
             echo "mklib: Making Darwin static library: " ${LIBNAME}
-            LINK="ar"
             OPTS="-ruvs"
             if [ "${ALTOPTS}" ] ; then
                 OPTS=${ALTOPTS}
             fi
-            ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
+
+            # expand .a into .o files
+            NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
+
+            # make static lib
+            FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
+
+            # remove temporary extracted .o files
+            rm -rf ${LIBNAME}.obj
+
             FINAL_LIBS=${LIBNAME}
         else
             # On Darwin a .bundle is used for a library that you want to dlopen
@@ -800,16 +818,14 @@ case $ARCH in
     'LynxOS')
        LIBNAME="lib${LIBNAME}.a"
        echo "mklib: Making LynxOS static library: " ${LIBNAME}
-       rm -f ${LIBNAME}
-       ar ru ${LIBNAME} ${OBJECTS}
-       FINAL_LIBS=${LIBNAME}
+        FINAL_LIBS=`make_ar_static_lib -ru 0 ${LIBNAME} ${OBJECTS}`
        ;;
 
     'BeOS')
         if [ $STATIC = 1 ] ; then
             LIBNAME="lib${LIBNAME}.a"
             echo "mklib: Making BeOS static library: " ${LIBNAME}
-            ar -cru "${LIBNAME}" ${OBJECTS}
+            FINAL_LIBS=`make_ar_static_lib -cru 0 ${LIBNAME} ${OBJECTS}`
         else
            LIBNAME="lib${LIBNAME}.so"
            echo "mklib: Making BeOS shared library: " ${LIBNAME}
@@ -888,9 +904,7 @@ case $ARCH in
         if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}.a"
            echo "mklib: Making AIX GCC static library: " ${LIBNAME}
-           rm -f ${LIBNAME}
-           ar ru ${LIBNAME} ${OBJECTS}
-           FINAL_LIBS=${LIBNAME}
+            FINAL_LIBS=`make_ar_static_lib ru 0 ${LIBNAME} ${OBJECTS}`
        else
            LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
            echo "mklib: Making AIX GCC shared library: " ${LIBNAME}
@@ -911,9 +925,7 @@ case $ARCH in
        fi
        LIBNAME="lib${LIBNAME}.a"
        echo "mklib: Making static library for Ultrix: " ${LIBNAME}
-       rm -f ${LIBNAME}
-       ar ru ${LIBNAME} ${OBJECTS}
-       FINAL_LIBS="${LIBNAME}"
+        FINAL_LIBS=`make_ar_static_lib ru 0 ${LIBNAME} ${OBJECTS}`
        ;;
 
      CYGWIN*)
@@ -933,17 +945,20 @@ case $ARCH in
        LIBNAME="lib${LIBNAME}"     # prefix with "lib"
 
         if [ $STATIC = 1 ] ; then
-            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}.a
-            LINK="ar"
+           LIBNAME=${LIBNAME}.a
+            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}
             OPTS="-ru"
             if [ "${ALTOPTS}" ] ; then
                 OPTS=${ALTOPTS}
             fi
-            # make lib
-            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
-           ranlib ${LIBNAME}.a
-            # finish up
-            FINAL_LIBS=${LIBNAME}.a
+
+            # expand .a into .o files
+            NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
+
+            FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
+
+            # remove temporary extracted .o files
+            rm -rf ${LIBNAME}.obj
         else
            OPTS="-shared -Wl,--enable-auto-image-base -Wl,-export-all -Wl,--out-implib=${LIBNAME}-${MAJOR}.dll.a"
             if [ "${ALTOPTS}" ] ; then
@@ -965,6 +980,11 @@ case $ARCH in
 
             # make lib
             ${LINK} ${OPTS} ${LDFLAGS} -o ${CYGNAME}-${MAJOR}.dll ${OBJECTS} ${DEPS}
+            # make build fail if link failed
+            es=$?
+            if [ "$es" -ne "0" ]; then
+                exit $es
+            fi
             # make usual symlinks
             ln -s ${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a
             # finish up
@@ -981,9 +1001,7 @@ case $ARCH in
         if [ $STATIC = 1 ] ; then
            LIBNAME="lib${LIBNAME}.a"
            echo "mklib: Making static library for example arch: " ${LIBNAME}
-           rm -f ${LIBNAME}
-           ar rv ${LIBNAME} ${OBJECTS}
-           FINAL_LIBS="${LIBNAME}"
+            FINAL_LIBS=`make_ar_static_lib rv 0 ${LIBNAME} ${OBJECTS}`
        else
            LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
            echo "mklib: Making shared library for example arch: " ${LIBNAME}