gallium: fix alignment parameter passed to u_mmAllocMem()
[mesa.git] / bin / mklib
index c183bbc57d3211ba02345362645e63cc438fcacc..031e049c615584ea026de641d30aa3e96e30518e 100755 (executable)
--- a/bin/mklib
+++ b/bin/mklib
@@ -1,34 +1,28 @@
 #!/bin/sh
 
 # Make a shared library.
-# Basically do a switch/case depending on the OS and make a shared
-# lib conforming to that OS.
-
-
-# Usage:
-#   mklib [options] objects ...
-# Options:
-#   -o LIBRARY    specifies the name of resulting library ("GL" for example)
-#   -major N      specifies major version number (default is 1)
-#   -minor N      specifies minor version number (default is 0)
-#   -patch N      specifies patch version number (default is 0)
-#   -lLIBRARY     specifies a dependency on LIBRARY
-#   -LDIR         search in DIR for library dependencies
-#   -cplusplus    link with C++ runtime
-#   -static       make a static library (default is dynamic/shared)
-#   -install DIR  move resulting library files to DIR
-#   -arch ARCH    override using `uname` to determine architecture
-#   -archopt OPT  specify an extra achitecture-specific option OPT
-#
-# The library name should just be "GL" or "GLU", etc.  The 'lib' prefix
-# will be added here if needed, as well as the ".so" or ".a" suffix, etc.
+# This script should be useful for projects other than Mesa.
+# Improvements/fixes are welcome.
+
+
+# Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
 #
-# objects should be:  foo.o bar.o etc.o
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
 #
-# Environment variables recognized:
-#   CC   C compiler command
-#   CXX  C++ compiler command
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
 #
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
 #
 LIBNAME=""
 MAJOR=1
 MINOR=0
-PATCH=0
+PATCH=""
 DEPS=""
+LINK=""
 CPLUSPLUS=0
 STATIC=0
+DLOPEN=0
 INSTALLDIR="."
 ARCH="auto"
 ARCHOPT=""
+NOPREFIX=0
+EXPORTS=""
 
 
 #
@@ -52,24 +50,104 @@ ARCHOPT=""
 while true
 do
     case $1 in
-       '-o')         shift 1; LIBNAME=$1;;
-       '-major')     shift 1; MAJOR=$1;;
-       '-minor')     shift 1; MINOR=$1;;
-       '-patch')     shift 1; PATCH=$1;;
-       -l*)          DEPS="$DEPS $1";;
-       -L*)          DEPS="$DEPS $1";;
-       '-cplusplus') CPLUSPLUS=1;;
-       '-static')    STATIC=1;;
-       '-install')   shift 1; INSTALLDIR=$1;;
-       '-arch')      shift 1; ARCH=$1;;
-       '-archopt')   shift 1; ARCHOPT=$1;;
-       -*)           echo "mklib: Unknown option: " $1 ; exit 1;;
-       *) break
+       '-h' | '--help')
+           echo 'Usage: mklib [options] objects'
+           echo 'Create a shared library from object files.'
+           echo '  -o LIBRARY    specifies the name of the resulting library, without'
+           echo '                the leading "lib" or any suffix.'
+           echo '                (eg: "-o GL" might result in "libGL.so" being made)'
+           echo '  -major N      specifies major version number (default is 1)'
+           echo '  -minor N      specifies minor version number (default is 0)'
+           echo '  -patch N      specifies patch version number (default is 0)'
+           echo '  -lLIBRARY     specifies a dependency on LIBRARY'
+           echo '  -LDIR         search in DIR for library dependencies'
+           echo '  -linker L     explicity specify the linker program to use (eg: gcc, g++)'
+           echo '                Not observed on all systems at this time.'
+           echo '  -cplusplus    link with C++ runtime'
+           echo '  -static       make a static library (default is dynamic/shared)'
+           echo '  -dlopen       make a shared library suitable for dynamic loading'
+           echo '  -install DIR  put resulting library file(s) in DIR'
+           echo '  -arch ARCH    override using `uname` to determine host system'
+           echo '  -archopt OPT  specify an extra achitecture-specific option OPT'
+           echo "  -noprefix     don't prefix library name with 'lib' nor add any suffix"
+           echo '  -exports FILE only export the symbols listed in FILE'
+           echo '  -h, --help    display this information and exit'
+           exit 1
+           ;;
+       '-o')
+           shift 1;
+           LIBNAME=$1
+           ;;
+       '-major')
+           shift 1;
+           MAJOR=$1
+           ;;
+       '-minor')
+           shift 1;
+           MINOR=$1
+           ;;
+       '-patch')
+           shift 1;
+           PATCH=$1
+           ;;
+       '-linker')
+           shift 1;
+           LINK=$1
+           ;;
+       -l*)
+           DEPS="$DEPS $1"
+           ;;
+       -L*)
+           DEPS="$DEPS $1"
+           ;;
+       -pthread)
+           # this is a special case (see bugzilla 10876)
+           DEPS="$DEPS $1"
+           ;;
+       '-pthread')
+           DEPS="$DEPS -pthread"
+           ;;
+       '-cplusplus')
+           CPLUSPLUS=1
+           ;;
+       '-static')
+           STATIC=1
+           ;;
+       '-dlopen')
+           DLOPEN=1
+           ;;
+       '-install')
+           shift 1;
+           INSTALLDIR=$1
+           ;;
+       '-arch')
+           shift 1;
+           ARCH=$1
+           ;;
+       '-archopt')
+           shift 1;
+           ARCHOPT=$1
+           ;;
+       '-noprefix')
+           NOPREFIX=1
+           ;;
+       '-exports')
+           shift 1;
+           EXPORTS=$1
+           ;;
+       -*)
+           echo "mklib: Unknown option: " $1 ;
+           exit 1
+           ;;
+       *)
+           # This should be the first object file, stop parsing
+           break
     esac
     shift 1
 done
 OBJECTS=$@
 
+
 if [ ${ARCH} = "auto" ] ; then
     ARCH=`uname`
 fi
@@ -99,6 +177,7 @@ if [  ]  ; then
     echo MINOR is $MINOR
     echo PATCH is $PATCH
     echo DEPS are $DEPS
+    echo "EXPORTS in" $EXPORTS
     echo "-----------------"
 fi
 
@@ -108,28 +187,90 @@ fi
 #
 case $ARCH in
 
-    'Linux')
-       LIBNAME="lib${LIBNAME}"     # prefix with "lib"
+    'Linux' | 'OpenBSD' | 'GNU' | GNU/*)
+       # we assume gcc
 
-        if [ $STATIC = 1 ] ; then
-            echo "mklib: Making Linux static library: " ${LIBNAME}.a
+       if [ "x$LINK" = "x" ] ; then
+           # -linker was not specified so set default link command now
+            if [ $CPLUSPLUS = 1 ] ; then
+                LINK=g++
+            else
+                LINK=gcc
+            fi
+       fi
+
+       if [ $NOPREFIX = 1 ] ; then
+           # No "lib" or ".so" part
+           echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}
+           case $ARCH in 'Linux' | 'GNU' | GNU/*)
+               OPTS="-Xlinker -Bsymbolic -shared"
+           ;;
+           *)
+               OPTS="-shared"
+           ;;
+           esac
+
+           # Check if objects are 32-bit and we're running in 64-bit
+           # environment.  If so, pass -m32 flag to linker.
+           set ${OBJECTS}
+           ABI32=`file $1 | grep 32-bit`
+           if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
+               OPTS="-m32 ${OPTS}"
+           fi
+
+            rm -f ${LIBNAME}
+            # make lib
+            ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+            # finish up
+            FINAL_LIBS="${LIBNAME}"
+        elif [ $STATIC = 1 ] ; then
+            LIBNAME="lib${LIBNAME}.a"     # prefix with "lib", suffix with ".a"
+            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}
             LINK="ar"
-            OPTS="-ruv"
+            OPTS="-ru"
+            rm -f ${LIBNAME}
             # make lib
-            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
+            ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
+            ranlib ${LIBNAME}
             # finish up
-            FINAL_LIBS="${LIBNAME}.a"
+            FINAL_LIBS=${LIBNAME}
         else
-            OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
-            VERSION="${MAJOR}.${MINOR}.${PATCH}"
+           LIBNAME="lib${LIBNAME}"     # prefix with "lib"
+           case $ARCH in 'Linux' | 'GNU' | GNU/*)
+               OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
+           ;;
+           *)
+               OPTS="-shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
+           ;;
+           esac
+           if [ $EXPORTS ] ; then
+               #OPTS="${OPTS} -Xlinker --retain-symbols-file ${EXPORTS}"
+               # Make the 'exptmp' file for --version-script option
+               echo "{" > exptmp
+               echo "global:" >> exptmp
+               sed 's/$/;/' ${EXPORTS} >> exptmp
+               echo "local:" >> exptmp
+               echo "*;" >> exptmp
+               echo "};" >> exptmp
+               OPTS="${OPTS} -Xlinker --version-script=exptmp"
+               # exptmp is removed below
+           fi
 
-            echo "mklib: Making Linux shared library: " ${LIBNAME}.so.${VERSION}
+           # Check if objects are 32-bit and we're running in 64-bit
+           # environment.  If so, pass -m32 flag to linker.
+           set ${OBJECTS}
+           ABI32=`file $1 | grep 32-bit`
+           if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
+               OPTS="-m32 ${OPTS}"
+           fi
 
-            if [ $CPLUSPLUS = 1 ] ; then
-                LINK="g++"
-            else
-                LINK="gcc"
-            fi
+           if [ x${PATCH} = "x" ] ; then
+               VERSION="${MAJOR}.${MINOR}"
+           else
+               VERSION="${MAJOR}.${MINOR}.${PATCH}"
+           fi
+
+            echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}.so.${VERSION}
 
             # rm any old libs
             rm -f ${LIBNAME}.so.${VERSION}
@@ -143,119 +284,257 @@ case $ARCH in
             ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
             # finish up
             FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
+#          rm -f exptmp
         fi
        ;;
 
     'SunOS')
-       LIBNAME="lib${LIBNAME}.so"
-       echo "mklib: Making SunOS shared library: " ${LIBNAME}
-       OPTS="-G"
-       if [ $CPLUSPLUS = 1 ] ; then
-           # link for C++
-           if [ "x${CXX}" = "xg++" ] ; then
-               LINK="g++"
-           elif [ "x${CXX}" = "xCC" ] ; then
-               LINK="CC"
-           elif [ `which c++` ] ; then
-               LINK="c++"
-           elif [ `type g++` ] ; then
-               LINK="g++"
+        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}
+       else
+           if [ $NOPREFIX = 0 ] ; then
+               LIBNAME="lib${LIBNAME}.so"
+           fi
+           echo "mklib: Making SunOS shared library: " ${LIBNAME}
+
+           if [ "x$LINK" = "x" ] ; then
+               # -linker was not specified, choose default linker now
+               if [ $CPLUSPLUS = 1 ] ; then
+                   # determine linker and options for C++ code
+                   if [ `which c++` ] ; then
+                       # use Sun c++
+                       LINK="c++"
+                   elif [ `type g++` ] ; then
+                       # use g++
+                       LINK="g++"
+                   else
+                       echo "mklib: warning: can't find C++ comiler, trying CC."
+                       LINK="CC"
+                   fi
+               else
+                   # use native Sun linker for C code
+                   LINK="ld"
+               fi
+           fi
+
+           # linker options
+           if [ ${LINK} = "ld" -o ${LINK} = "cc" -o ${LINK} = "CC" ] ; then
+               # SunOS tools, -G to make shared libs
+               OPTS="-G"
            else
-               echo "mklib: warning: can't find C++ comiler, trying CC."
-               LINK="CC"
+               # gcc linker
+               # Check if objects are 32-bit and we're running in 64-bit
+               # environment.  If so, pass -m32 flag to linker.
+               set ${OBJECTS}
+               ABI32=`file $1 | grep 32-bit`
+               if [ "${ABI32}" ] ; then
+                   OPTS="-m32 -shared -Wl,-Bdynamic"
+               else
+                   OPTS="-m64 -shared -Wl,-Bdynamic"
+               fi
            fi
-       elif [ "x${CC}" = "xgcc" ] ; then
-           # use gcc for linking
-           LINK="gcc"
-       else
-           # use native Sun linker
-           LINK="ld"
+
+           # Check if objects are SPARC v9
+           # file says: ELF 64-bit MSB relocatable SPARCV9 Version 1
+           set ${OBJECTS}
+           SPARCV9=`file $1 | grep SPARCV9`
+           if [ "${SPARCV9}" ] ; then
+               OPTS="${OPTS} -xarch=v9"
+           fi
+
+           # for debug:
+           #echo "mklib: linker is" ${LINK} ${OPTS}
+           if [ $NOPREFIX = 1 ] ; then
+               rm -f ${LIBNAME}
+               ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+           else
+               rm -f ${LIBNAME}.${MAJOR} ${LIBNAME}
+               ${LINK} ${OPTS} -o ${LIBNAME}.${MAJOR} ${OBJECTS} ${DEPS}
+               ln -s ${LIBNAME}.${MAJOR} ${LIBNAME}
+           fi
+           FINAL_LIBS="${LIBNAME}.${MAJOR} ${LIBNAME}"
        fi
-       echo "mklib: linker is " ${LINK}
-       rm -f ${LIBNAME}
-       ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-       FINAL_LIBS=${LIBNAME}
        ;;
 
     'FreeBSD')
-       SHLIB="lib${LIBNAME}.so.${MAJOR}.${MINOR}"
-       STLIB="lib${LIBNAME}.a"
-       echo "mklib: Making FreeBSD shared library: " ${SHLIB}
-       rm -f ${SHLIB} ${STLIB}
-       ar cq ${STLIB} ${OBJECTS}
-       ranlib ${STLIB}
-       ld -Bshareable -o ${SHLIB} ${OBJECTS}
-       # XXX make lib${LIBNAME}.so.${MAJOR} symlink?
-       FINAL_LIBS="${SHLIB} ${STLIB}"
-       ;;
+       # we assume gcc
 
-    'OpenBSD')
-       LIBNAME="lib${LIBNAME}"
-       VERSION="${MAJOR}.${MINOR}"
-       echo "Building OpenBSD PIC library: " ${LIBNAME}
-       rm -f ${LIBNAME}_pic.a ${LIBNAME}.so.${VERSION}
-       ar cq ${LIBNAME}_pic.a ${OBJECTS}
-       ranlib ${LIBNAME}_pic.a
-       ld -x -Bshareable -Bforcearchive -o ${LIBNAME}.so.${VERSION} ${LIBNAME}_pic.a
-       ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so
-       FINAL_LIBS="${LIBNAME}_pic.a ${LIBNAME}.so.${VERSION} ${LIBNAME}.so"
-       ;;
+       if [ "x$LINK" = "x" ] ; then
+           # -linker was not specified so set default link command now
+            if [ $CPLUSPLUS = 1 ] ; then
+                LINK=g++
+            else
+                LINK=gcc
+            fi
+       fi
 
-    'NetBSD')
-       LIBNAME="lib${LIBNAME}"
-       echo "mklib: Making NetBSD PIC shared library: " ${LIBNAME}
-       VERSION="${MAJOR}.${MINOR}"
-       rm -f ${LIBNAME}_pic.a ${LIBNAME}.so.${VERSION}
-       ar cq ${LIBNAME}_pic.a ${OBJECTS}
-       ranlib ${LIBNAME}_pic.a
-       ld -x -Bshareable -Bforcearchive -o ${LIBNAME}.so.${VERSION} ${LIBNAME}_pic.a
-       FINAL_LIBS="${LIBNAME}_pic.a ${LIBNAME}.so.${VERSION}"
+       if [ $NOPREFIX = 1 ] ; then
+           # No "lib" or ".so" part
+           echo "mklib: Making FreeBSD shared library: " ${LIBNAME}
+           OPTS="-shared"
+           rm -f ${LIBNAME}
+           ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+           FINAL_LIBS=${LIBNAME}
+        elif [ $STATIC = 1 ] ; then
+           STLIB="lib${LIBNAME}.a"
+           echo "mklib: Making FreeBSD static library: " ${STLIB}
+           rm -f ${STLIB}
+           ar cq ${STLIB} ${OBJECTS}
+           ranlib ${STLIB}
+           FINAL_LIBS=${STLIB}
+       else
+           SHLIB="lib${LIBNAME}.so.${MAJOR}"
+           OPTS="-shared -Wl,-soname,${SHLIB}"
+           echo "mklib: Making FreeBSD shared library: " ${SHLIB}
+           rm -f ${SHLIB}
+           ${LINK} ${OPTS} -o ${SHLIB} ${OBJECTS} ${DEPS}
+           ln -sf ${SHLIB} "lib${LIBNAME}.so"
+           FINAL_LIBS="${SHLIB} lib${LIBNAME}.so"
+       fi
        ;;
 
-    'IRIX')
-       LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
-       if [ $ARCHOPTS = "64" ] ; then
-           # 64-bit ABI
-           OPTS="-64 -shared -all"
-           echo "mklib: Making IRIX 64-bit shared library: " ${LIBNAME}
-       elif [ $ARCHOPTS = "o32" ] ; then
-           # old 32-bit ABI
-           OPTS="-32 -shared -all"
-           echo "mklib: Making IRIX o32-bit shared library: " ${LIBNAME}
+    'NetBSD')
+        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}
        else
-           # new 32-bit ABI
-           OPTS="-n32 -shared -all"
-           echo "mklib: Making IRIX n32-bit shared library: " ${LIBNAME}
+           LIBNAME="lib${LIBNAME}.so.${MAJOR}.${MINOR}"
+           echo "mklib: Making NetBSD PIC shared library: " ${LIBNAME}
+           rm -f ${LIBNAME}
+           ld -x -Bshareable -Bforcearchive -o ${LIBNAME} ${OBJECTS}
+           FINAL_LIBS=${LIBNAME}
        fi
-       ld ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-       FINAL_LIBS="${LIBNAME}"
        ;;
 
-    'IRIX64')
-       LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
-       echo "mklib: Making IRIX64 library: " ${LIBNAME}
-       # 64-bit ABI
-       OPTS="-64 -shared -all"
-       ld ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-       FINAL_LIBS="${LIBNAME}"
+    'IRIX' | 'IRIX64')
+        if [ $STATIC = 1 ] ; then
+           LIBNAME="lib${LIBNAME}.a"
+           rm -f ${LIBNAME}
+           ar rc ${LIBNAME} ${OBJECTS}
+           FINAL_LIBS=${LIBNAME}
+       else
+           LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
+
+           # examine first object to determine ABI
+           set ${OBJECTS}
+           ABI_O32=`file $1 | grep 'ELF 32-bit'`
+           ABI_N32=`file $1 | grep 'ELF N32'`
+           ABI_N64=`file $1 | grep 'ELF 64-bit'`
+           if [ "${ABI_O32}" ] ; then
+               OPTS="-32 -shared -all"
+               ABI="o32-bit"
+           elif [ "${ABI_N32}" ] ; then
+               OPTS="-n32 -shared -all"
+               ABI="n32-bit"
+           elif [ "${ABI_N64}" ] ; then
+               OPTS="-64 -shared -all"
+               ABI="64-bit"
+           else
+               echo "Error: Unexpected IRIX ABI!"
+               exit 1
+           fi
+
+           if [ $CPLUSPLUS = 1 ] ; then
+               LINK="CC"
+           else
+               LINK="ld"
+           fi
+
+           echo "mklib: Making IRIX " ${ABI} " shared library: " ${LIBNAME}
+           ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+           FINAL_LIBS=${LIBNAME}
+       fi
        ;;
 
     'linux-cygwin')
        LIBNAME="lib${LIBNAME}.a"
        echo "mklib: Making linux-cygwin library: " ${LIBNAME}
+       rm -f ${LIBNAME}
        gnuwin32ar ruv ${LIBNAME} ${OBJECTS}
        FINAL_LIBS=${LIBNAME}
        ;;
 
-    'HPUX')
-       RUNLIB="lib${LIBNAME}.${MAJOR}"
-       DEVLIB="lib${LIBNAME}.sl"
-       echo "mklib: Making HPUX library: " ${RUNLIB} ${DEVLIB}
-       ld -b -o ${RUNLIB} +b ${RUNLIB} ${OBJECTS} ${DEPS}
-       ln -s ${RUNLIB} ${DEVLIB}
-       FINAL_LIBS="{RUNLIB} ${DEVLIB}"
+    'HP-UX')
+        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}
+       else
+            # HP uses a .2 for their current GL/GLU libraries
+           if [ ${LIBNAME} = "GL" -o ${LIBNAME} = "GLU" ] ; then
+              MAJOR=2
+           fi
+           RUNLIB="lib${LIBNAME}.${MAJOR}"
+           DEVLIB="lib${LIBNAME}.sl"
+           echo "mklib: Making HP-UX shared library: " ${RUNLIB} ${DEVLIB}
+           ld -b -o ${RUNLIB} +b ${RUNLIB} ${OBJECTS} ${DEPS}
+           ln -s ${RUNLIB} ${DEVLIB}
+           FINAL_LIBS="${RUNLIB} ${DEVLIB}"
+       fi
        ;;
 
+    'AIX' )
+       # examine first object to determine ABI
+       set ${OBJECTS}
+       ABI_64=`file $1 | grep '64-bit'`
+       if [ "${ABI_64}" ] ; then
+           X64="-X64"
+           Q64="-q64"
+           OFILE=shr_64.o
+       else
+           OFILE=shr.o  #Want to be consistent with the IBM libGL.a
+       fi
+
+       if [ $STATIC = 1 ] ; then
+           LIBNAME="lib${LIBNAME}.a"
+           echo "mklib: Making AIX static library: " ${LIBNAME}
+           ar -ruv ${X64} ${LIBNAME} ${OBJECTS}
+           FINAL_LIBS=${LIBNAME}
+       else
+           EXPFILE="lib${LIBNAME}.exp"
+           LIBNAME="lib${LIBNAME}.a"  # shared objects are still stored in the .a libraries
+           OPTS="-bE:${EXPFILE} -bM:SRE -bnoentry ${Q64}"
+           rm -f ${EXPFILE} ${OFILE}
+           NM="/bin/nm -eC ${X64}"
+           echo "#! /usr/lib/${LIBNAME}" > ${EXPFILE}
+           ${NM} ${OBJECTS} | awk '{
+           if ((($2 == "T") || ($2 == "D") || ($2 == "B")) \
+           && ( substr($1,1,1) != ".")) {
+                   if (substr ($1, 1, 7) != "__sinit" &&
+                           substr ($1, 1, 7) != "__sterm") {
+                           if (substr ($1, 1, 5) == "__tf1")
+                               print (substr ($1, 7))
+                           else if (substr ($1, 1, 5) == "__tf9")
+                               print (substr ($1, 15))
+                           else
+                               print $1
+                       }
+               }
+           }' | sort -u >> ${EXPFILE}
+
+            # On AIX a shared library is linked differently when
+            # you want to dlopen the file
+           if [ $DLOPEN = "1" ] ; then
+               cc -G ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+           else
+               cc ${OPTS} -o ${OFILE} ${OBJECTS} ${DEPS}
+               ar ${X64} -r ${LIBNAME} ${OFILE}
+           fi
+
+            FINAL_LIBS="${LIBNAME}"
+        fi
+        ;;
+
     'OpenSTEP')
        LIBNAME="lib${LIBNAME}.a"
        echo "mklib: Making OpenSTEP static library: " ${LIBNAME}
@@ -264,45 +543,99 @@ case $ARCH in
        ;;
 
     'OSF1')
-       VERSION="${MAJOR}.${MINOR}"
-       LIBNAME="lib${LIBNAME}.so"
-       ARNAME="lib${LIBNAME}.a"
-       echo "mklib: Making OSF/1 library: " ${LIBNAME}
-       rm -f ${LIBNAME}.${VERSION}
-       ld -o ${LIBNAME}.${VERSION} -shared -no_archive -set_version ${VERSION} -soname ${LIBNAME}.${VERSION} -expect_unresolved \* -all ${OBJECTS} ${DEPS}
-       ln -sf ${LIBNAME}.${VERSION} ${LIBNAME}
-
-       # also make static lib
-       rm -f ${ARNAME}
-       ar clqz ${ARNAME} ${OBJECTS}
-       FINAL_LIBS="${ARNAME} ${LIBNAME} ${LIBNAME}.${VERSION}"
+        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}
+       else
+           VERSION="${MAJOR}.${MINOR}"
+           LIBNAME="lib${LIBNAME}.so"
+           echo "mklib: Making OSF/1 shared library: " ${LIBNAME}
+           if [ "x$LINK" = "x" ] ; then
+               if [ $CPLUSPLUS = 1 ] ; then
+                   LINK=cxx
+               else
+                   LINK=cc
+               fi
+           fi
+           rm -f ${LIBNAME}.${VERSION}
+           ${LINK} -o ${LIBNAME}.${VERSION} -shared -set_version ${VERSION} -soname ${LIBNAME}.${VERSION} -expect_unresolved \* -all ${OBJECTS} ${DEPS}
+           ln -sf ${LIBNAME}.${VERSION} ${LIBNAME}
+           FINAL_LIBS="${LIBNAME} ${LIBNAME}.${VERSION}"
+       fi
        ;;
 
     'Darwin')
-       VERSION="${MAJOR}.${MINOR}.${TINY}"
-       LIBNAME="lib${LIBNAME}.dylib"
-       ARNAME="lib${LIBNAME}.dylib.a"
-       echo "mklib: Making Darwin libraries: " ${LIBNAME} ${ARNAME}
-       FLAGS="-dynamiclib -multiply_defined suppress"
-       cc ${FLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-       # also make regular .a files,
-       # provided by Danek Duvall (duvall@dhduvall.student.princeton.edu)
-       ar ruv ${ARNAME} ${OBJECTS}
-       ranlib ${ARNAME}
-       FINAL_LIBS="${ARNAME} ${LIBNAME}"
-       ;;
+        if [ $STATIC = 1 ] ; then
+            LIBNAME="lib${LIBNAME}.a"
+            echo "mklib: Making Darwin static library: " ${LIBNAME}
+            LINK="ar"
+            OPTS="-ruvs"
+            ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
+            FINAL_LIBS=${LIBNAME}
+        else
+            # On Darwin a .bundle is used for a library that you want to dlopen
+            if [ $DLOPEN = "1" ] ; then
+                LIBSUFFIX="bundle"
+                OPTS="${ARCHOPT} -bundle -multiply_defined suppress"
+            else
+               LIBSUFFIX="dylib"
+                OPTS="${ARCHOPT} -dynamiclib -multiply_defined suppress -current_version ${MAJOR}.${MINOR}.0 -compatibility_version ${MAJOR}.${MINOR}.0 -install_name lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
+            fi
+            LINKNAME="lib${LIBNAME}.${LIBSUFFIX}"
+            LIBNAME="lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
+
+           # examine first object to determine ABI
+           set ${OBJECTS}
+           ABI_PPC=`file $1 | grep 'object ppc'`
+           ABI_I386=`file $1 | grep 'object i386'`
+           if [ "${ABI_PPC}" ] ; then
+               OPTS="${OPTS} -arch ppc"
+           fi
+           if [ "${ABI_I386}" ] ; then
+               OPTS="${OPTS} -arch i386"
+           fi
+
+           # XXX can we always add -isysroot /Developer/SDKs/MacOSX10.4u.sdk
+           # to OPTS here?
+
+           # determine linker
+           if [ $CPLUSPLUS = 1 ] ; then
+               LINK="g++"
+           else
+               LINK="cc"
+           fi
+
+            echo "mklib: Making Darwin shared library: " ${LIBNAME}
+            ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+            ln -s ${LIBNAME} ${LINKNAME}
+            FINAL_LIBS="${LIBNAME} ${LINKNAME}"
+        fi
+        ;;
 
     'LynxOS')
        LIBNAME="lib${LIBNAME}.a"
-       echo "mklib: Making LynxOS library: " ${LIBNAME}
+       echo "mklib: Making LynxOS static library: " ${LIBNAME}
+       rm -f ${LIBNAME}
        ar ru ${LIBNAME} ${OBJECTS}
        FINAL_LIBS=${LIBNAME}
        ;;
 
     'BeOS')
-       LIBNAME="lib${LIBNAME}.so"
-       echo "mklib: Making BeOS shared library: " ${LIBNAME}
-       gcc -nostart -Xlinker -soname=${LIBNAME} -L/Be/develop/lib/x86 ${OBJECTS} -lbe -o ${LIBNAME}
+        if [ $STATIC = 1 ] ; then
+            LIBNAME="lib${LIBNAME}.a"
+            echo "mklib: Making BeOS static library: " ${LIBNAME}
+            ar -cru "${LIBNAME}" ${OBJECTS}
+        else
+           LIBNAME="lib${LIBNAME}.so"
+           echo "mklib: Making BeOS shared library: " ${LIBNAME}
+           gcc -nostart -Xlinker "-soname=${LIBNAME}" -L/Be/develop/lib/x86 -lbe ${DEPS} ${OBJECTS} -o "${LIBNAME}"
+           mimeset -f "${LIBNAME}"
+           # XXX remove the Mesa3D stuff here since mklib isn't mesa-specific.
+           setversion "${LIBNAME}" -app ${MAJOR} ${MINOR} ${PATCH} -short "Powered by Mesa3D!" -long "Powered by Mesa3D!"
+       fi
        FINAL_LIBS=${LIBNAME}
        ;;
 
@@ -320,23 +653,141 @@ case $ARCH in
        FINAL_LIBS="${LIBNAME}"
        ;;
 
+    'icc' | 'icc-istatic')
+       # Intel C compiler
+       # This should get merged into the Linux code, above, since this isn't
+       # really a different architecture.
+       LIBNAME="lib${LIBNAME}"     # prefix with "lib"
+
+        if [ $STATIC = 1 ] ; then
+            echo "mklib: Making Intel ICC static library: " ${LIBNAME}.a
+            LINK="ar"
+            OPTS="-ruv"
+            # make lib
+            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
+            # finish up
+            FINAL_LIBS="${LIBNAME}.a"
+        else
+            if [ $ARCH = icc-istatic ] ; then
+                 OPTS="-shared -i-static -cxxlib-icc"
+            else
+                 OPTS="-shared"
+            fi
+            VERSION="${MAJOR}.${MINOR}.${PATCH}"
+            echo "mklib: Making Intel ICC shared library: " ${LIBNAME}.so.${VERSION}
+
+            if [ $CPLUSPLUS = 1 ] ; then
+                LINK="icpc"
+            else
+                LINK="icc"
+            fi
+            # rm any old libs
+            rm -f ${LIBNAME}.so.${VERSION}
+            rm -f ${LIBNAME}.so.${MAJOR}
+            rm -f ${LIBNAME}.so
+            # make lib
+            ${LINK} ${OPTS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
+            # make usual symlinks
+            ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
+            ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
+            # finish up
+            FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
+        fi
+       ;;
+
+    'aix-gcc')
+       # AIX with gcc
+        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}
+       else
+           LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
+           echo "mklib: Making AIX GCC shared library: " ${LIBNAME}
+           # remove old lib
+           rm -f ${LIBNAME}
+           # make the lib
+           gcc -shared -Wl,-G ${OBJECTS} ${DEPS} -o ${LIBNAME}
+           # NOTE: the application linking with this library must specify
+           # the -Wl,-brtl flags to gcc
+           FINAL_LIBS=${LIBNAME}
+       fi
+       ;;
+
+    'ultrix')
+       # XXX untested
+        if [ $STATIC = 0 ] ; then
+           echo "mklib: Warning shared libs not supported on Ultrix"
+       fi
+       LIBNAME="lib${LIBNAME}.a"
+       echo "mklib: Making static library for Ultrix: " ${LIBNAME}
+       rm -f ${LIBNAME}
+       ar ru ${LIBNAME} ${OBJECTS}
+       FINAL_LIBS="${LIBNAME}"
+       ;;
+
+     CYGWIN*)
+       # GCC-based environment
+       CYGNAME="cyg${LIBNAME}"     # prefix with "cyg"
+       LIBNAME="lib${LIBNAME}"     # prefix with "lib"
+
+        if [ $STATIC = 1 ] ; then
+            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}.a
+            LINK="ar"
+            OPTS="-ru"
+            # make lib
+            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
+           ranlib ${LIBNAME}.a
+            # finish up
+            FINAL_LIBS=${LIBNAME}.a
+        else
+           OPTS="-shared -Wl,-export-all -Wl,--out-implib=${LIBNAME}-${MAJOR}.dll.a"
+            echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}-${MAJOR}.dll
+
+            if [ $CPLUSPLUS = 1 ] ; then
+                LINK="g++"
+            else
+                LINK="gcc"
+            fi
+
+            # rm any old libs
+            rm -f ${LIBNAME}-${MAJOR}.dll
+            rm -f ${LIBNAME}.dll.a
+            rm -f ${LIBNAME}.a
+
+            # make lib
+            ${LINK} ${OPTS} -o ${CYGNAME}-${MAJOR}.dll ${OBJECTS} ${DEPS}
+            # make usual symlinks
+            ln -s ${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a
+            # finish up
+            FINAL_LIBS="${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a"
+           # special case for installing in bin
+            FINAL_BINS="${CYGNAME}-${MAJOR}.dll"
+        fi
+       ;;
+
     'example')
        # If you're adding support for a new architecture, you can
        # start with this:
-       LIBNAME="lib${LIBNAME}.so"  # prefix with "lib"
-       echo "mklib: Making library for example arch: " ${LIBNAME}
-       ld -o ${LIBNAME} ${OBJECTS} ${DEPS}
-       FINAL_LIBS="${LIBNAME}"
+        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}"
+       else
+           LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
+           echo "mklib: Making shared library for example arch: " ${LIBNAME}
+           ld -o ${LIBNAME} ${OBJECTS} ${DEPS}
+           FINAL_LIBS="${LIBNAME}"
+       fi
        ;;
 
     *)
-       echo "mklib: WARNING: making library for unknown platform!"
-       echo "mklib: WARNING: this may not work!"
-       echo "mklib: WARNING: please update the bin/mklib script!"
-       # XXX this is a total hack for Mesa - remove someday
-       # fall-back to an old mklib.* script
-       ${TOP}/${MAKELIB} "lib${LIBNAME}.a" ${MAJOR} ${MINOR} ${PATCH} ${OBJECTS}
-       FINAL_LIBS="${LIBNAME}"
+       echo "mklib: ERROR: Don't know how to make a static/shared library for" ${ARCH}
+       echo "mklib: Please add necessary commands to mklib script."
        ;;
 esac