#!/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
-# ("-o GL" for example, might result in "libGL.so" being made)
-# -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=""
#
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
echo MINOR is $MINOR
echo PATCH is $PATCH
echo DEPS are $DEPS
+ echo "EXPORTS in" $EXPORTS
echo "-----------------"
fi
#
case $ARCH in
- 'Linux' | 'OpenBSD')
- # GCC-based environment
- 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 " $ARCH " 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}
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}
- # XXX OPTS for gcc should be -shared, but that doesn't work.
- # Using -G does work though.
- if [ $CPLUSPLUS = 1 ] ; then
- # determine linker and options for C++ code
- if [ "x${CXX}" = "xg++" ] ; then
- # use g++
- LINK="g++"
- OPTS="-G"
- elif [ "x${CXX}" = "xCC" ] ; then
- # use Sun CC
- LINK="CC"
- OPTS="-G"
- elif [ "x${CXX}" = "xc++" ] ; then
- # use Sun c++
- LINK="c++"
- OPTS="-G"
- elif [ `which c++` ] ; then
- # use Sun c++
- LINK="c++"
- OPTS="-G"
- elif [ `type g++` ] ; then
- # use g++
- 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"
- OPTS="-G"
+ # 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"
- OPTS="-G"
- else
- # use native Sun linker
- LINK="ld"
- OPTS="-G"
+
+ # 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} ${OPTS}
- 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
- '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 [ "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"
+ 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}
;;
'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}
;;
FINAL_LIBS="${LIBNAME}"
;;
- 'icc')
+ '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
# finish up
FINAL_LIBS="${LIBNAME}.a"
else
- OPTS="-shared"
+ 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="icc"
+ 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
'aix-gcc')
# AIX with gcc
- LIBNAME="lib${LIBNAME}.so" # prefix with "lib", suffix with ".so"
- echo "mklib: Making AIX GCC shared library: " ${LIBNAME}
- # remove old lib
+ 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}
- # make the lib
- gcc -shared -Wl,-G ${OBJECTS} ${DEPS} -o ${LIBNAME}
+ ar ru ${LIBNAME} ${OBJECTS}
+ FINAL_LIBS="${LIBNAME}"
+ ;;
- # NOTE: the application linking with this library must specify
- # the -Wl,-brtl flags to gcc
+ CYGWIN*)
+ # GCC-based environment
+ CYGNAME="cyg${LIBNAME}" # prefix with "cyg"
+ LIBNAME="lib${LIBNAME}" # prefix with "lib"
- FINAL_LIBS=${LIBNAME}
+ 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
- LIBNAME="lib${LIBNAME}.a"
- ${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