gallium: fix alignment parameter passed to u_mmAllocMem()
[mesa.git] / bin / mklib
index 06436ff388f544f10c8ac4316771b43f0788a738..031e049c615584ea026de641d30aa3e96e30518e 100755 (executable)
--- a/bin/mklib
+++ b/bin/mklib
@@ -1,36 +1,28 @@
 #!/bin/sh
 
 # Make a shared library.
-# Basically do a switch/case depending on the OS and make a shared (or static)
-# library 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
-#   -linker L     explicity specify the linker program to use (ex: gcc, g++)
-#                 Not observed on all systems at this time.
-#   -cplusplus    link with C++ runtime
-#   -static       make a static library (default is dynamic/shared)
-#   -install DIR  pu resulting library file(s) in DIR
-#   -arch ARCH    override using `uname` to determine architecture
-#   -archopt OPT  specify an extra achitecture-specific option OPT
-#   -noprefix     don't prefix library name with "lib" nor add any suffix
-#   -exports FILE only export the symbols listed in FILE
+# This script should be useful for projects other than Mesa.
+# Improvements/fixes are welcome.
+
+
+# Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
 #
-# 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 (unless the -noprefix option is used).
+# 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:
 #
-# objects should be:  foo.o bar.o etc.o
+# 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.
 
 
 #
@@ -44,6 +36,7 @@ DEPS=""
 LINK=""
 CPLUSPLUS=0
 STATIC=0
+DLOPEN=0
 INSTALLDIR="."
 ARCH="auto"
 ARCHOPT=""
@@ -57,27 +50,104 @@ 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;;
-       '-linker')    shift 1; LINK=$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;;
-       '-noprefix')  NOPREFIX=1;;
-       '-exports')   shift 1; EXPORTS=$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
@@ -117,7 +187,7 @@ fi
 #
 case $ARCH in
 
-    'Linux' | 'OpenBSD')
+    'Linux' | 'OpenBSD' | 'GNU' | GNU/*)
        # we assume gcc
 
        if [ "x$LINK" = "x" ] ; then
@@ -132,34 +202,51 @@ case $ARCH in
        if [ $NOPREFIX = 1 ] ; then
            # No "lib" or ".so" part
            echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}
-           #OPTS="-shared -Wl,-soname,${LIBNAME}"  # soname???
-           OPTS="-shared"
+           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}"     # prefix with "lib"
-            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}.a
+            LIBNAME="lib${LIBNAME}.a"     # prefix with "lib", suffix with ".a"
+            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}
             LINK="ar"
             OPTS="-ru"
+            rm -f ${LIBNAME}
             # make lib
-            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
-           ranlib ${LIBNAME}.a
+            ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
+            ranlib ${LIBNAME}
             # finish up
-            FINAL_LIBS=${LIBNAME}.a
+            FINAL_LIBS=${LIBNAME}
         else
            LIBNAME="lib${LIBNAME}"     # prefix with "lib"
-           if [ $ARCH = 'Linux' ] ; then
+           case $ARCH in 'Linux' | 'GNU' | GNU/*)
                OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
-           else
+           ;;
+           *)
                OPTS="-shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
-           fi
+           ;;
+           esac
            if [ $EXPORTS ] ; then
                #OPTS="${OPTS} -Xlinker --retain-symbols-file ${EXPORTS}"
                # Make the 'exptmp' file for --version-script option
-               echo "VERSION_${MAJOR}.${MINOR} {" > exptmp
+               echo "{" > exptmp
                echo "global:" >> exptmp
                sed 's/$/;/' ${EXPORTS} >> exptmp
                echo "local:" >> exptmp
@@ -209,11 +296,11 @@ case $ARCH in
            ar -ruv ${LIBNAME} ${OBJECTS}
            FINAL_LIBS=${LIBNAME}
        else
-           LIBNAME="lib${LIBNAME}.so"
+           if [ $NOPREFIX = 0 ] ; then
+               LIBNAME="lib${LIBNAME}.so"
+           fi
            echo "mklib: Making SunOS shared library: " ${LIBNAME}
-           # XXX OPTS for gcc should be -shared, but that doesn't work.
-           # Using -G does work though.
-           OPTS="-G"
+
            if [ "x$LINK" = "x" ] ; then
                # -linker was not specified, choose default linker now
                if [ $CPLUSPLUS = 1 ] ; then
@@ -233,20 +320,64 @@ case $ARCH in
                    LINK="ld"
                fi
            fi
-           echo "mklib: linker is" ${LINK} ${OPTS}
-           rm -f ${LIBNAME}.${MAJOR} ${LIBNAME}
-           ${LINK} ${OPTS} -o ${LIBNAME}.${MAJOR} ${OBJECTS} ${DEPS}
-           ln -s ${LIBNAME}.${MAJOR} ${LIBNAME}
+
+           # 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}
+           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
        ;;
 
     '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"
            rm -f ${LIBNAME}
-           ld -Bshareable -o ${LIBNAME} ${OBJECTS}
+           ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
            FINAL_LIBS=${LIBNAME}
         elif [ $STATIC = 1 ] ; then
            STLIB="lib${LIBNAME}.a"
@@ -256,12 +387,13 @@ case $ARCH in
            ranlib ${STLIB}
            FINAL_LIBS=${STLIB}
        else
-           SHLIB="lib${LIBNAME}.so.${MAJOR}.${MINOR}"
+           SHLIB="lib${LIBNAME}.so.${MAJOR}"
+           OPTS="-shared -Wl,-soname,${SHLIB}"
            echo "mklib: Making FreeBSD shared library: " ${SHLIB}
            rm -f ${SHLIB}
-           ld -Bshareable -o ${SHLIB} ${OBJECTS}
-           # XXX make lib${LIBNAME}.so.${MAJOR} symlink?
-           FINAL_LIBS=${SHLIB}
+           ${LINK} ${OPTS} -o ${SHLIB} ${OBJECTS} ${DEPS}
+           ln -sf ${SHLIB} "lib${LIBNAME}.so"
+           FINAL_LIBS="${SHLIB} lib${LIBNAME}.so"
        fi
        ;;
 
@@ -290,26 +422,33 @@ case $ARCH in
            FINAL_LIBS=${LIBNAME}
        else
            LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
-           # XXX we should run 'file' on the first object file to determine
-           # if it's o32, n32 or 64 format, as we do for Linux above.
-           if [ $ARCHOPT = "64" ] ; then
-               # 64-bit ABI
-               OPTS="-64 -shared -all"
-               echo "mklib: Making IRIX 64-bit shared library: " ${LIBNAME}
-           elif [ $ARCHOPT = "o32" ] ; then
-               # old 32-bit ABI
+
+           # 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"
-               echo "mklib: Making IRIX o32-bit shared library: " ${LIBNAME}
-           else
-               # new 32-bit ABI
+               ABI="o32-bit"
+           elif [ "${ABI_N32}" ] ; then
                OPTS="-n32 -shared -all"
-               echo "mklib: Making IRIX n32-bit shared library: " ${LIBNAME}
+               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
@@ -331,6 +470,10 @@ case $ARCH in
            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}
@@ -340,25 +483,27 @@ case $ARCH in
        fi
        ;;
 
-    'AIX' | 'AIX64')
-       if [ $ARCH = "AIX64" ] ; then
+    '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
+       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"
-           OFILE=shr.o  #Want to be consistent with the IBM libGL.a
            LIBNAME="lib${LIBNAME}.a"  # shared objects are still stored in the .a libraries
-           if [ $ARCH = "AIX64" ] ; then
-               OPTS="-bE:${EXPFILE} -bM:SRE -bnoentry -q64"
-           else
-               OPTS="-bE:${EXPFILE} -bM:SRE -bnoentry"
-           fi
+           OPTS="-bE:${EXPFILE} -bM:SRE -bnoentry ${Q64}"
            rm -f ${EXPFILE} ${OFILE}
            NM="/bin/nm -eC ${X64}"
            echo "#! /usr/lib/${LIBNAME}" > ${EXPFILE}
@@ -376,8 +521,16 @@ case $ARCH in
                        }
                }
            }' | sort -u >> ${EXPFILE}
-           cc ${OPTS} -o ${OFILE} ${OBJECTS} ${DEPS}
-           ar ${X64} -r ${LIBNAME} ${OFILE}
+
+            # 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
         ;;
@@ -419,20 +572,46 @@ case $ARCH in
             LIBNAME="lib${LIBNAME}.a"
             echo "mklib: Making Darwin static library: " ${LIBNAME}
             LINK="ar"
-            OPTS="-ruv"
+            OPTS="-ruvs"
             ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
             FINAL_LIBS=${LIBNAME}
         else
-            LIBNAME="lib${LIBNAME}.dylib"
-            echo "mklib: Making Darwin shared library: " ${LIBNAME}
-            FLAGS="-dynamiclib -multiply_defined suppress"
+            # 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
-            ${LINK} ${FLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-            FINAL_LIBS=${LIBNAME}
+
+            echo "mklib: Making Darwin shared library: " ${LIBNAME}
+            ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
+            ln -s ${LIBNAME} ${LINKNAME}
+            FINAL_LIBS="${LIBNAME} ${LINKNAME}"
         fi
         ;;
 
@@ -474,8 +653,10 @@ case $ARCH in
        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
@@ -487,12 +668,16 @@ case $ARCH in
             # 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
@@ -593,7 +778,7 @@ case $ARCH in
            ar rv ${LIBNAME} ${OBJECTS}
            FINAL_LIBS="${LIBNAME}"
        else
-           LIBNAME="lib${LIBNAME}.so"  # prefix with "lib"
+           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}"