#!/bin/sh

# Make a shared library.
# This script should be useful for projects other than Mesa.
# Improvements/fixes are welcome.


# Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
#
# 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:
#
# 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.


#
# Option defaults
#
LIBNAME=""
MAJOR=1
MINOR=0
PATCH=""
DEPS=""
LINK=""
LDFLAGS=""
CPLUSPLUS=0
STATIC=0
DLOPEN=0
INSTALLDIR="."
ARCH="auto"
ARCHOPT=""
NOPREFIX=0
EXPORTS=""
ID=""
if [ "x${AR}" = "x" ] ; then
    AR="ar"
fi

#
# Parse arguments
#
while true
do
    case $1 in
	'-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 at build time'
	    echo '  -RDIR         search in DIR for library dependencies at run time'
	    echo '  -linker L     explicity specify the linker program to use (eg: gcc, g++)'
	    echo '                Not observed on all systems at this time.'
	    echo '  -ldflags OPT  specify any additional linker flags in OPT'
	    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 '  -altopts OPTS alternate options to override all others'
	    echo "  -noprefix     don't prefix library name with 'lib' nor add any suffix"
	    echo '  -exports FILE only export the symbols listed in FILE'
	    echo '  -id NAME      Sets the id of the dylib (Darwin)'
	    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
	    ;;
	'-ldflags')
	    shift 1;
	    LDFLAGS=$1
	    ;;
	-l*)
	    DEPS="$DEPS $1"
	    ;;
	-L*)
	    DEPS="$DEPS $1"
	    ;;
	-R*)
	    DEPS="$DEPS $1"
	    ;;
	-Wl*)
            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
	    ;;
	'-altopts')
            shift 1;
            ALTOPTS=$1
            ;;
	'-noprefix')
	    NOPREFIX=1
	    ;;
	'-exports')
	    shift 1;
	    EXPORTS=$1
	    ;;
	'-id')
	    shift 1;
	    ID=$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


#
# Error checking
#
if [ "x${LIBNAME}" = "x" ] ; then
    echo "mklib: Error: no library name specified"
    exit 1
fi
if [ "x${OBJECTS}" = "x" ] ; then
    echo "mklib: Error: no object files specified"
    exit 1
fi


#
# Debugging info
#
if [  ]  ; then
    echo "-----------------"
    echo ARCH is $ARCH
    echo LIBNAME is $LIBNAME
    echo MAJOR is $MAJOR
    echo MINOR is $MINOR
    echo PATCH is $PATCH
    echo DEPS are $DEPS
    echo "EXPORTS in" $EXPORTS
    echo ID is $ID
    echo "-----------------"
fi


#
# OK, make the library now
#
case $ARCH in

    'Linux' | 'OpenBSD' | 'DragonFly' | 'GNU' | GNU/*)
	# we assume gcc

	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

            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi

            rm -f ${LIBNAME}
            # make lib
            ${LINK} ${OPTS} ${LDFLAGS} -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"
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi
            rm -f ${LIBNAME}
            temp_ar=`mktemp -d`
            cur_dir=`pwd`
            extracted_ar=""
            cd ${temp_ar}
            for file in ${OBJECTS}; do
                basefilename=`basename $file`
                if [ `basename $file .a` != "$basefilename" ] ; then
                    ${AR} -xv ${cur_dir}/$file || exit 1
                    extracted_ar="${temp_ar}/*"
                else
                    OBJECTS_2="${OBJECTS_2} $file"
                fi
            done
            cd ${cur_dir}
            # make lib
            ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS_2} ${extracted_ar} || exit 1
            rm -r ${temp_ar}
            ranlib ${LIBNAME}
            # finish up
            FINAL_LIBS=${LIBNAME}
        else
	    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

	    # 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 [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            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}
            rm -f ${LIBNAME}.so.${MAJOR}
            rm -f ${LIBNAME}.so

            # make lib
            ${LINK} ${OPTS} ${LDFLAGS} -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"
#	    rm -f exptmp
        fi
	;;

    'SunOS')
        if [ $STATIC = 1 ] ; then
	    LIBNAME="lib${LIBNAME}.a"
	    echo "mklib: Making SunOS static library: " ${LIBNAME}
	    rm -f ${LIBNAME}
	    temp_ar=`mktemp -d`
	    cur_dir=`pwd`
	    cd ${temp_ar}
	    extracted_ar=""
	    for file in ${OBJECTS}; do
		basefilename=`basename $file`
		if [ `basename $file .a` != "$basefilename" ] ; then
		    ${AR} -xv ${cur_dir}/$file || exit 1
		    extracted_ar="${temp_ar}/*"
		else
		    OBJECTS_2="${OBJECTS_2} $file"
		fi
	    done
	    cd ${cur_dir}
	    ${AR} -ruv ${LIBNAME} ${OBJECTS_2} ${extracted_ar} || exit 1
	    rm -r ${temp_ar}
	    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++ compiler, 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
		# 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

	    # Check if objects are SPARC v9
	    # 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"
		fi
	    fi
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi
	    # for debug:
	    #echo "mklib: linker is" ${LINK} ${OPTS}
	    if [ $NOPREFIX = 1 ] ; then
		rm -f ${LIBNAME}
		${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
	    else
		rm -f ${LIBNAME}.${MAJOR} ${LIBNAME}
		${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.${MAJOR} -h ${LIBNAME}.${MAJOR} ${OBJECTS} ${DEPS}
		ln -s ${LIBNAME}.${MAJOR} ${LIBNAME}
	    fi
	    FINAL_LIBS="${LIBNAME}.${MAJOR} ${LIBNAME}"
	fi
	;;

    'FreeBSD')
	# we assume gcc

	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 FreeBSD shared library: " ${LIBNAME}
	    OPTS="-shared"
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi
	    rm -f ${LIBNAME}
	    ${LINK} ${OPTS} ${LDFLAGS} -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}"
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi
	    echo "mklib: Making FreeBSD shared library: " ${SHLIB}
	    rm -f ${SHLIB}
	    ${LINK} ${OPTS} ${LDFLAGS} -o ${SHLIB} ${OBJECTS} ${DEPS}
	    ln -sf ${SHLIB} "lib${LIBNAME}.so"
	    FINAL_LIBS="${SHLIB} lib${LIBNAME}.so"
	fi
	;;

    '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
	    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
	;;

    '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 [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi

	    if [ $CPLUSPLUS = 1 ] ; then
		LINK="CC"
	    else
		LINK="ld"
	    fi

	    echo "mklib: Making IRIX " ${ABI} " shared library: " ${LIBNAME}
	    ${LINK} ${OPTS} ${LDFLAGS} -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}
	;;

    '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}

            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi

            # On AIX a shared library is linked differently when
            # you want to dlopen the file
	    if [ $DLOPEN = "1" ] ; then
		cc -G ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
	    else
		cc ${OPTS} ${LDFLAGS} -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}
	libtool -static -o ${LIBNAME} - ${OBJECTS}
	FINAL_LIBS=${LIBNAME}
	;;

    'OSF1')
        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')
        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}
            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"
                if [ -z "$ID" ] ; then
                    ID="lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
                fi
                OPTS="${ARCHOPT} -dynamiclib -multiply_defined suppress -current_version ${MAJOR}.${MINOR}.0 -compatibility_version ${MAJOR}.${MINOR}.0 -install_name ${ID}"
            fi

            if [ ${EXPORTS} ] ; then
                if [ -f ${EXPORTS}".darwin" ] ; then
                    EXPORTS=$EXPORTS".darwin"
                fi
                OPTS="${OPTS} -exported_symbols_list ${EXPORTS}"
            fi

            LINKNAME="lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
            LINKNAME2="lib${LIBNAME}.${LIBSUFFIX}"
            LIBNAME="lib${LIBNAME}.${MAJOR}.${MINOR}.${LIBSUFFIX}"

	    # examine first object to determine ABI
    	    set ${OBJECTS}
            ABI_PPC=`file $1 | grep ' ppc'`
            ABI_I386=`file $1 | grep ' i386'`
            ABI_PPC64=`file $1 | grep ' ppc64'`
            ABI_X86_64=`file $1 | grep ' x86_64'`
            if [ "${ABI_PPC}" ] ; then
                OPTS="${OPTS} -arch ppc"
            fi
            if [ "${ABI_I386}" ] ; then
                OPTS="${OPTS} -arch i386"
            fi
            if [ "${ABI_PPC64}" ] ; then
                OPTS="${OPTS} -arch ppc64"
            fi
            if [ "${ABI_X86_64}" ] ; then
                OPTS="${OPTS} -arch x86_64"
            fi

            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            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} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
            ln -s ${LIBNAME} ${LINKNAME}
            ln -s ${LIBNAME} ${LINKNAME2}
            FINAL_LIBS="${LIBNAME} ${LINKNAME} ${LINKNAME2}"
        fi
        ;;

    'LynxOS')
	LIBNAME="lib${LIBNAME}.a"
	echo "mklib: Making LynxOS static library: " ${LIBNAME}
	rm -f ${LIBNAME}
	ar ru ${LIBNAME} ${OBJECTS}
	FINAL_LIBS=${LIBNAME}
	;;

    'BeOS')
        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}
	;;

    'QNX')
	LIBNAME="lib${LIBNAME}.a"
	echo "mklib: Making QNX library: " ${LIBNAME}
	wlib ${LIBNAME} ${OBJECTS}
	FINAL_LIBS=${LIBNAME}
	;;

    'MorphOS')
	LIBNAME="lib${LIBNAME}.a"
	echo "mklib: Making MorphOS library: " ${LIBNAME}
	ppc-morphos-ar rc ${LIBNAME} ${OBJECTS}
	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"
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi
            # 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
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            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} ${LDFLAGS} -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"
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi
            # 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"
            if [ "${ALTOPTS}" ] ; then
                OPTS=${ALTOPTS}
            fi
            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} ${LDFLAGS} -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:
        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: ERROR: Don't know how to make a static/shared library for" ${ARCH}
	echo "mklib: Please add necessary commands to mklib script."
	;;
esac


#
# Put library files into installation directory if specified.
#
if [ ${INSTALLDIR} != "." ] ; then
    echo "mklib: Installing" ${FINAL_LIBS} "in" ${INSTALLDIR}
    mv ${FINAL_LIBS} ${INSTALLDIR}/
fi
