Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #!/bin/sh
  2.  
  3. # Make a shared library.
  4. # This script should be useful for projects other than Mesa.
  5. # Improvements/fixes are welcome.
  6.  
  7.  
  8. # Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  9. #
  10. # Permission is hereby granted, free of charge, to any person obtaining a
  11. # copy of this software and associated documentation files (the "Software"),
  12. # to deal in the Software without restriction, including without limitation
  13. # the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14. # and/or sell copies of the Software, and to permit persons to whom the
  15. # Software is furnished to do so, subject to the following conditions:
  16. #
  17. # The above copyright notice and this permission notice shall be included
  18. # in all copies or substantial portions of the Software.
  19. #
  20. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21. # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  23. # BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  24. # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  25. # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  26.  
  27.  
  28. # Clear CDPATH as the 'cd' command will echo stuff
  29. # to stdout if it is set
  30. unset CDPATH
  31.  
  32. # Given a list of files, look for .a archives and unpack them.
  33. # Return the original list of files minus the .a files plus the unpacked files.
  34. # first param:  name of a temp directory (to be deleted when finished)
  35. # remaining params:  list of .o and .a files
  36. expand_archives() {
  37.     DIR=$1
  38.     shift
  39.     FILES=$@
  40.     NEWFILES=""
  41.     ORIG_DIR=`pwd`
  42.     mkdir -p "$DIR"
  43.     cd "$DIR"
  44.     for FILE in $FILES ; do
  45.         case $FILE in
  46.             *.a)
  47.                 # extract the .o files from this .a archive
  48.                 case $FILE in
  49.                     /*) ;;
  50.                     *)  FILE="$ORIG_DIR/$FILE" ;;
  51.                 esac
  52.                 MEMBERS=`ar t $FILE`
  53.                 ar x $FILE
  54.                 for MEMBER in $MEMBERS ; do
  55.                     NEWFILES="$NEWFILES $DIR/$MEMBER"
  56.                 done
  57.                 ;;
  58.             *)
  59.                 # other file type, just add to list
  60.                 NEWFILES="$NEWFILES $FILE"
  61.                 ;;
  62.         esac
  63.     done
  64.     cd "$ORIG_DIR"
  65.     echo $NEWFILES
  66. }
  67.  
  68.  
  69. # Make static library with 'ar'
  70. # params:
  71. #    options to ar
  72. #    1 or 0 to indicate if ranlib should be run
  73. #    libname to make
  74. #    list of object files
  75. # Return name of library we made
  76. # Example: "make_ar_static_lib -ru 1 libfoo.a foo.o bar.o"
  77. make_ar_static_lib() {
  78.     OPTS=$1
  79.     shift;
  80.     RANLIB=$1
  81.     shift;
  82.     LIBNAME=$1
  83.     shift;
  84.     OBJECTS=$@
  85.  
  86.     # remove existing lib, if present
  87.     rm -f ${LIBNAME}
  88.  
  89.     # make static lib
  90.     ar ${OPTS} ${LIBNAME} ${OBJECTS}
  91.  
  92.     # run ranlib
  93.     if [ ${RANLIB} = 1 ] ; then
  94.         ranlib ${LIBNAME}
  95.     fi
  96.  
  97.     echo ${LIBNAME}
  98. }
  99.  
  100.  
  101. # Print usage info.
  102. usage() {
  103.     echo 'Usage: mklib [options] objects'
  104.     echo 'Create a shared library from object files.'
  105.     echo '  -o LIBRARY    specifies the name of the resulting library, without'
  106.     echo '                the leading "lib" or any suffix.'
  107.     echo '                (eg: "-o GL" might result in "libGL.so" being made)'
  108.     echo '  -major N      specifies major version number (default is 1)'
  109.     echo '  -minor N      specifies minor version number (default is 0)'
  110.     echo '  -patch N      specifies patch version number (default is 0)'
  111.     echo '  -lLIBRARY     specifies a dependency on LIBRARY'
  112.     echo '  -LDIR         search in DIR for library dependencies at build time'
  113.     echo '  -RDIR         search in DIR for library dependencies at run time'
  114.     echo '  -linker L     explicity specify the linker program to use (eg: gcc, g++)'
  115.     echo '                Not observed on all systems at this time.'
  116.     echo '  -ldflags OPT  specify any additional linker flags in OPT'
  117.     echo '  -cplusplus    link with C++ runtime'
  118.     echo '  -static       make a static library (default is dynamic/shared)'
  119.     echo '  -dlopen       make a shared library suitable for dynamic loading'
  120.     echo '  -install DIR  put resulting library file(s) in DIR'
  121.     echo '  -arch ARCH    override using `uname` to determine host system'
  122.     echo '  -archopt OPT  specify an extra achitecture-specific option OPT'
  123.     echo '  -altopts OPTS alternate options to override all others'
  124.     echo "  -noprefix     don't prefix library name with 'lib' nor add any suffix"
  125.     echo '  -exports FILE only export the symbols listed in FILE'
  126.     echo '  -id NAME      Sets the id of the dylib (Darwin)'
  127.     echo '  -h, --help    display this information and exit'
  128. }
  129.  
  130.  
  131. #
  132. # Option defaults
  133. #
  134. LIBNAME=""
  135. MAJOR=1
  136. MINOR=0
  137. PATCH=""
  138. DEPS=""
  139. LINK=""
  140. LDFLAGS=""
  141. CPLUSPLUS=0
  142. STATIC=0
  143. DLOPEN=0
  144. INSTALLDIR="."
  145. ARCH="auto"
  146. ARCHOPT=""
  147. NOPREFIX=0
  148. EXPORTS=""
  149. ID=""
  150.  
  151. #
  152. # Parse arguments
  153. #
  154. while true
  155. do
  156.     case $1 in
  157.         '-h' | '--help')
  158.             usage
  159.             exit 1
  160.             ;;
  161.         '-o')
  162.             shift 1;
  163.             LIBNAME=$1
  164.             ;;
  165.         '-major')
  166.             shift 1;
  167.             MAJOR=$1
  168.             ;;
  169.         '-minor')
  170.             shift 1;
  171.             MINOR=$1
  172.             ;;
  173.         '-patch')
  174.             shift 1;
  175.             PATCH=$1
  176.             ;;
  177.         '-linker')
  178.             shift 1;
  179.             LINK=$1
  180.             ;;
  181.         '-ldflags')
  182.             shift 1;
  183.             LDFLAGS=$1
  184.             ;;
  185.         -l*)
  186.             DEPS="$DEPS $1"
  187.             ;;
  188.         -L*)
  189.             DEPS="$DEPS $1"
  190.             ;;
  191.         -R*)
  192.             DEPS="$DEPS $1"
  193.             ;;
  194.         -Wl*)
  195.             DEPS="$DEPS $1"
  196.             ;;
  197.         -pthread)
  198.             # this is a special case (see bugzilla 10876)
  199.             DEPS="$DEPS $1"
  200.             ;;
  201.         '-pthread')
  202.             DEPS="$DEPS -pthread"
  203.             ;;
  204.         '-cplusplus')
  205.             CPLUSPLUS=1
  206.             ;;
  207.         '-static')
  208.             STATIC=1
  209.             ;;
  210.         '-dlopen')
  211.             DLOPEN=1
  212.             ;;
  213.         '-install')
  214.             shift 1;
  215.             INSTALLDIR=$1
  216.             ;;
  217.         '-arch')
  218.             shift 1;
  219.             ARCH=$1
  220.             ;;
  221.         '-archopt')
  222.             shift 1;
  223.             ARCHOPT=$1
  224.             ;;
  225.         '-altopts')
  226.             shift 1;
  227.             ALTOPTS=$1
  228.             ;;
  229.         '-noprefix')
  230.             NOPREFIX=1
  231.             ;;
  232.         '-exports')
  233.             shift 1;
  234.             EXPORTS=$1
  235.             ;;
  236.         '-id')
  237.             shift 1;
  238.             ID=$1
  239.             ;;
  240.         -*)
  241.             echo "mklib: Unknown option: " $1 ;
  242.             exit 1
  243.             ;;
  244.         *)
  245.             # This should be the first object file, stop parsing
  246.             break
  247.     esac
  248.     shift 1
  249. done
  250. OBJECTS=$@
  251.  
  252.  
  253. if [ ${ARCH} = "auto" ] ; then
  254.     ARCH=`uname`
  255. fi
  256.  
  257.  
  258. if [ $STATIC = 1 ]; then
  259.     # filter out linker options inside object list
  260.     NEWOBJECTS=""
  261.     for OBJ in $OBJECTS ; do
  262.         case $OBJ in
  263.             -Wl,*)
  264.                 echo "mklib: warning: ignoring $OBJ for static library"
  265.                 ;;
  266.             *)
  267.                 NEWOBJECTS="$NEWOBJECTS $OBJ"
  268.                 ;;
  269.         esac
  270.     done
  271.     OBJECTS=$NEWOBJECTS
  272. fi
  273.  
  274.  
  275. #
  276. # Error checking
  277. #
  278. if [ "x${LIBNAME}" = "x" ] ; then
  279.     echo "mklib: Error: no library name specified (-h for help)"
  280.     exit 1
  281. fi
  282. if [ "x${OBJECTS}" = "x" ] ; then
  283.     echo "mklib: Error: no object files specified (-h for help)"
  284.     exit 1
  285. fi
  286.  
  287.  
  288. #
  289. # Debugging info
  290. #
  291. if [  ]  ; then
  292.     echo "-----------------"
  293.     echo ARCH is $ARCH
  294.     echo LIBNAME is $LIBNAME
  295.     echo MAJOR is $MAJOR
  296.     echo MINOR is $MINOR
  297.     echo PATCH is $PATCH
  298.     echo DEPS are $DEPS
  299.     echo "EXPORTS in" $EXPORTS
  300.     echo ID is $ID
  301.     echo "-----------------"
  302. fi
  303.  
  304.  
  305. #
  306. # OK, make the library now
  307. #
  308. case $ARCH in
  309.  
  310.     'Linux' | 'OpenBSD' | 'DragonFly' | 'GNU' | GNU/*)
  311.         # we assume gcc
  312.  
  313.         if [ "x$LINK" = "x" ] ; then
  314.             # -linker was not specified so set default link command now
  315.             if [ $CPLUSPLUS = 1 ] ; then
  316.                 LINK=g++
  317.             else
  318.                 LINK=gcc
  319.             fi
  320.         fi
  321.  
  322.         if [ $NOPREFIX = 1 ] ; then
  323.             # No "lib" or ".so" part
  324.             echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}
  325.             case $ARCH in 'Linux' | 'GNU' | GNU/*)
  326.                 OPTS="-Xlinker -Bsymbolic -shared"
  327.             ;;
  328.             *)
  329.                 OPTS="-shared"
  330.             ;;
  331.             esac
  332.  
  333.             # Check if objects are 32-bit and we're running in 64-bit
  334.             # environment.  If so, pass -m32 flag to linker.
  335.             set ${OBJECTS}
  336.             ABI32=`file $1 | grep 32-bit`
  337.             if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
  338.                 OPTS="-m32 ${OPTS}"
  339.             fi
  340.  
  341.             if [ "${ALTOPTS}" ] ; then
  342.                 OPTS=${ALTOPTS}
  343.             fi
  344.  
  345.             rm -f ${LIBNAME}
  346.             # make lib
  347.             ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
  348.             # finish up
  349.             FINAL_LIBS="${LIBNAME}"
  350.         elif [ $STATIC = 1 ] ; then
  351.             # make a static .a library
  352.             LIBNAME="lib${LIBNAME}.a"     # prefix with "lib", suffix with ".a"
  353.             echo "mklib: Making" $ARCH "static library: " ${LIBNAME}
  354.             OPTS="-ru"
  355.             if [ "${ALTOPTS}" ] ; then
  356.                 OPTS=${ALTOPTS}
  357.             fi
  358.  
  359.             # expand .a into .o files
  360.             NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
  361.  
  362.             # make static lib
  363.             FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
  364.  
  365.             # remove temporary extracted .o files
  366.             rm -rf ${LIBNAME}.obj
  367.         else
  368.             # make dynamic library
  369.             LIBNAME="lib${LIBNAME}"     # prefix with "lib"
  370.             case $ARCH in 'Linux' | 'GNU' | GNU/*)
  371.                 OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
  372.             ;;
  373.             *)
  374.                 OPTS="-shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
  375.             ;;
  376.             esac
  377.             if [ $EXPORTS ] ; then
  378.                 #OPTS="${OPTS} -Xlinker --retain-symbols-file ${EXPORTS}"
  379.                 # Make the 'exptmp' file for --version-script option
  380.                 echo "{" > exptmp
  381.                 echo "global:" >> exptmp
  382.                 sed 's/$/;/' ${EXPORTS} >> exptmp
  383.                 echo "local:" >> exptmp
  384.                 echo "*;" >> exptmp
  385.                 echo "};" >> exptmp
  386.                 OPTS="${OPTS} -Xlinker --version-script=exptmp"
  387.                 # exptmp is removed below
  388.             fi
  389.  
  390.             # Check if objects are 32-bit and we're running in 64-bit
  391.             # environment.  If so, pass -m32 flag to linker.
  392.             set ${OBJECTS}
  393.             ABI32=`file $1 | grep 32-bit`
  394.             if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
  395.                 OPTS="-m32 ${OPTS}"
  396.             fi
  397.             if [ "${ALTOPTS}" ] ; then
  398.                 OPTS=${ALTOPTS}
  399.             fi
  400.  
  401.             if [ x${PATCH} = "x" ] ; then
  402.                 VERSION="${MAJOR}.${MINOR}"
  403.             else
  404.                 VERSION="${MAJOR}.${MINOR}.${PATCH}"
  405.             fi
  406.  
  407.             echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}.so.${VERSION}
  408.  
  409.             # rm any old libs
  410.             rm -f ${LIBNAME}.so.${VERSION}
  411.             rm -f ${LIBNAME}.so.${MAJOR}
  412.             rm -f ${LIBNAME}.so
  413.  
  414.             # make lib
  415.             ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
  416.             # make usual symlinks
  417.             ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
  418.             ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
  419.             # finish up
  420.             FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
  421. #           rm -f exptmp
  422.         fi
  423.         ;;
  424.  
  425.     'SunOS')
  426.         if [ $STATIC = 1 ] ; then
  427.             LIBNAME="lib${LIBNAME}.a"
  428.             echo "mklib: Making SunOS static library: " ${LIBNAME}
  429.             FINAL_LIBS=`make_ar_static_lib -ruc 0 ${LIBNAME} ${OBJECTS}`
  430.         else
  431.             if [ $NOPREFIX = 0 ] ; then
  432.                 LIBNAME="lib${LIBNAME}.so"
  433.             fi
  434.             echo "mklib: Making SunOS shared library: " ${LIBNAME}
  435.  
  436.             if [ "x$LINK" = "x" ] ; then
  437.                 # -linker was not specified, choose default linker now
  438.                 if [ $CPLUSPLUS = 1 ] ; then
  439.                     # determine linker and options for C++ code
  440.                     if [ `which c++` ] ; then
  441.                         # use Sun c++
  442.                         LINK="c++"
  443.                     elif [ `type g++` ] ; then
  444.                         # use g++
  445.                         LINK="g++"
  446.                     else
  447.                         echo "mklib: warning: can't find C++ compiler, trying CC."
  448.                         LINK="CC"
  449.                     fi
  450.                 else
  451.                     # use native Sun linker for C code
  452.                     LINK="ld"
  453.                 fi
  454.             fi
  455.  
  456.             # linker options
  457.             if [ ${LINK} = "ld" -o ${LINK} = "cc" -o ${LINK} = "CC" ] ; then
  458.                 # SunOS tools, -G to make shared libs
  459.                 OPTS="-G"
  460.             else
  461.                 # gcc linker
  462.                 # Check if objects are 32-bit and we're running in 64-bit
  463.                 # environment.  If so, pass -m32 flag to linker.
  464.                 set ${OBJECTS}
  465.                 ABI32=`file $1 | grep 32-bit`
  466.                 if [ "${ABI32}" ] ; then
  467.                     OPTS="-m32 -shared -Wl,-Bdynamic"
  468.                 else
  469.                     OPTS="-m64 -shared -Wl,-Bdynamic"
  470.                 fi
  471.             fi
  472.  
  473.             # If using Sun C++ compiler, need to tell it not to add runpaths
  474.             # that are specific to the build machine
  475.             if [ ${LINK} = "CC" ] ; then
  476.                 OPTS="${OPTS} -norunpath"
  477.             fi
  478.  
  479.             # Solaris linker requires explicitly listing the Standard C & C++
  480.             # libraries in the link path when building shared objects
  481.             if [ ${LINK} = "CC" ] ; then
  482.                 DEPS="${DEPS} -lCrun"
  483.             fi
  484.             DEPS="${DEPS} -lc"
  485.  
  486.             if [ $EXPORTS ] ; then
  487.                 # Make the 'mapfile.scope' linker mapfile
  488.                 echo "{" > mapfile.scope
  489.                 echo "global:" >> mapfile.scope
  490.                 sed 's/$/;/' ${EXPORTS} >> mapfile.scope
  491.                 echo "local:" >> mapfile.scope
  492.                 echo "    *;" >> mapfile.scope
  493.                 echo "};" >> mapfile.scope
  494.                 OPTS="${OPTS} -Wl,-Mmapfile.scope"
  495.             fi
  496.  
  497.             # Check if objects are 64-bit
  498.             # file says: ELF 64-bit MSB relocatable SPARCV9 Version 1
  499.             set ${OBJECTS}
  500.             if [ ${LINK} = "cc" -o ${LINK} = "CC" ] ; then
  501.                 ABI64=`file $1 | grep "ELF 64-bit"`
  502.                 if [ "${ABI64}" ] ; then
  503.                     case `uname -p` in
  504.                         sparc)      OPTS="${OPTS} -xarch=v9" ;;
  505.                         i386)       OPTS="${OPTS} -xarch=amd64" ;;
  506.                     esac
  507.                 fi
  508.             fi
  509.             if [ "${ALTOPTS}" ] ; then
  510.                 OPTS=${ALTOPTS}
  511.             fi
  512.  
  513.             # for debug:
  514.             #echo "mklib: linker is" ${LINK} ${OPTS}
  515.             if [ $NOPREFIX = 1 ] ; then
  516.                 rm -f ${LIBNAME}
  517.                 ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
  518.                 FINAL_LIBS="${LIBNAME}"
  519.             else
  520.                 rm -f ${LIBNAME}.${MAJOR} ${LIBNAME}
  521.                 ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.${MAJOR} -h ${LIBNAME}.${MAJOR} ${OBJECTS} ${DEPS}
  522.                 ln -s ${LIBNAME}.${MAJOR} ${LIBNAME}
  523.                 FINAL_LIBS="${LIBNAME}.${MAJOR} ${LIBNAME}"
  524.             fi
  525.         fi
  526.         ;;
  527.  
  528.     'FreeBSD')
  529.         # we assume gcc
  530.  
  531.         if [ "x$LINK" = "x" ] ; then
  532.             # -linker was not specified so set default link command now
  533.             if [ $CPLUSPLUS = 1 ] ; then
  534.                 LINK=g++
  535.             else
  536.                 LINK=gcc
  537.             fi
  538.         fi
  539.  
  540.         if [ $NOPREFIX = 1 ] ; then
  541.             # No "lib" or ".so" part
  542.             echo "mklib: Making FreeBSD shared library: " ${LIBNAME}
  543.             OPTS="-shared"
  544.             if [ "${ALTOPTS}" ] ; then
  545.                 OPTS=${ALTOPTS}
  546.             fi
  547.             rm -f ${LIBNAME}
  548.             ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
  549.             FINAL_LIBS=${LIBNAME}
  550.         elif [ $STATIC = 1 ] ; then
  551.             # make a static .a library
  552.             STLIB="lib${LIBNAME}.a"
  553.             echo "mklib: Making FreeBSD static library: " ${STLIB}
  554.  
  555.             # expand .a into .o files
  556.             NEW_OBJECTS=`expand_archives ${STLIB}.obj $OBJECTS`
  557.  
  558.             FINAL_LIBS=`make_ar_static_lib cq 1 ${STLIB} ${NEW_OBJECTS}`
  559.  
  560.             # remove temporary extracted .o files
  561.             rm -rf ${STLIB}.obj
  562.         else
  563.             # make dynamic library
  564.             SHLIB="lib${LIBNAME}.so.${MAJOR}"
  565.             OPTS="-shared -Wl,-soname,${SHLIB}"
  566.             if [ "${ALTOPTS}" ] ; then
  567.                 OPTS=${ALTOPTS}
  568.             fi
  569.             echo "mklib: Making FreeBSD shared library: " ${SHLIB}
  570.             rm -f ${SHLIB}
  571.             ${LINK} ${OPTS} ${LDFLAGS} -o ${SHLIB} ${OBJECTS} ${DEPS}
  572.             ln -sf ${SHLIB} "lib${LIBNAME}.so"
  573.             FINAL_LIBS="${SHLIB} lib${LIBNAME}.so"
  574.         fi
  575.         ;;
  576.  
  577.     'NetBSD')
  578.         if [ $STATIC = 1 ] ; then
  579.             LIBNAME="lib${LIBNAME}_pic.a"
  580.             echo "mklib: Making NetBSD PIC static library: " ${LIBNAME}
  581.             FINAL_LIBS=`make_ar_static_lib cq 1 ${LIBNAME} ${OBJECTS}`
  582.         else
  583.             LIBNAME="lib${LIBNAME}.so.${MAJOR}.${MINOR}"
  584.             echo "mklib: Making NetBSD PIC shared library: " ${LIBNAME}
  585.             rm -f ${LIBNAME}
  586.             ld -x -Bshareable -Bforcearchive -o ${LIBNAME} ${OBJECTS}
  587.             FINAL_LIBS=${LIBNAME}
  588.         fi
  589.         ;;
  590.  
  591.     'IRIX' | 'IRIX64')
  592.         if [ $STATIC = 1 ] ; then
  593.             LIBNAME="lib${LIBNAME}.a"
  594.             FINAL_LIBS=`make_ar_static_lib rc 0 ${LIBNAME} ${OBJECTS}`
  595.         else
  596.             LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
  597.  
  598.             # examine first object to determine ABI
  599.             set ${OBJECTS}
  600.             ABI_O32=`file $1 | grep 'ELF 32-bit'`
  601.             ABI_N32=`file $1 | grep 'ELF N32'`
  602.             ABI_N64=`file $1 | grep 'ELF 64-bit'`
  603.             if [ "${ABI_O32}" ] ; then
  604.                 OPTS="-32 -shared -all"
  605.                 ABI="o32-bit"
  606.             elif [ "${ABI_N32}" ] ; then
  607.                 OPTS="-n32 -shared -all"
  608.                 ABI="n32-bit"
  609.             elif [ "${ABI_N64}" ] ; then
  610.                 OPTS="-64 -shared -all"
  611.                 ABI="64-bit"
  612.             else
  613.                 echo "Error: Unexpected IRIX ABI!"
  614.                 exit 1
  615.             fi
  616.  
  617.             if [ "${ALTOPTS}" ] ; then
  618.                 OPTS=${ALTOPTS}
  619.             fi
  620.  
  621.             if [ $CPLUSPLUS = 1 ] ; then
  622.                 LINK="CC"
  623.             else
  624.                 LINK="ld"
  625.             fi
  626.  
  627.             echo "mklib: Making IRIX " ${ABI} " shared library: " ${LIBNAME}
  628.             ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
  629.             FINAL_LIBS=${LIBNAME}
  630.         fi
  631.         ;;
  632.  
  633.     'linux-cygwin')
  634.         LIBNAME="lib${LIBNAME}.a"
  635.         echo "mklib: Making linux-cygwin library: " ${LIBNAME}
  636.         rm -f ${LIBNAME}
  637.         gnuwin32ar ruv ${LIBNAME} ${OBJECTS}
  638.         FINAL_LIBS=${LIBNAME}
  639.         ;;
  640.  
  641.     'HP-UX')
  642.         if [ $STATIC = 1 ] ; then
  643.             LIBNAME="lib${LIBNAME}.a"
  644.             echo "mklib: Making HP-UX static library: " ${LIBNAME}
  645.             FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
  646.         else
  647.             # HP uses a .2 for their current GL/GLU libraries
  648.             if [ ${LIBNAME} = "GL" -o ${LIBNAME} = "GLU" ] ; then
  649.                MAJOR=2
  650.             fi
  651.             RUNLIB="lib${LIBNAME}.${MAJOR}"
  652.             DEVLIB="lib${LIBNAME}.sl"
  653.             echo "mklib: Making HP-UX shared library: " ${RUNLIB} ${DEVLIB}
  654.             ld -b -o ${RUNLIB} +b ${RUNLIB} ${OBJECTS} ${DEPS}
  655.             ln -s ${RUNLIB} ${DEVLIB}
  656.             FINAL_LIBS="${RUNLIB} ${DEVLIB}"
  657.         fi
  658.         ;;
  659.  
  660.     'AIX' )
  661.         # examine first object to determine ABI
  662.         set ${OBJECTS}
  663.         ABI_64=`file $1 | grep '64-bit'`
  664.         if [ "${ABI_64}" ] ; then
  665.             X64="-X64"
  666.             Q64="-q64"
  667.             OFILE=shr_64.o
  668.         else
  669.             OFILE=shr.o  #Want to be consistent with the IBM libGL.a
  670.         fi
  671.  
  672.         if [ $STATIC = 1 ] ; then
  673.             LIBNAME="lib${LIBNAME}.a"
  674.             echo "mklib: Making AIX static library: " ${LIBNAME}
  675.             FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
  676.         else
  677.             EXPFILE="lib${LIBNAME}.exp"
  678.             LIBNAME="lib${LIBNAME}.a"  # shared objects are still stored in the .a libraries
  679.             OPTS="-bE:${EXPFILE} -bM:SRE -bnoentry ${Q64}"
  680.             rm -f ${EXPFILE} ${OFILE}
  681.             NM="/bin/nm -eC ${X64}"
  682.             echo "#! /usr/lib/${LIBNAME}" > ${EXPFILE}
  683.             ${NM} ${OBJECTS} | awk '{
  684.             if ((($2 == "T") || ($2 == "D") || ($2 == "B")) \
  685.             && ( substr($1,1,1) != ".")) {
  686.                     if (substr ($1, 1, 7) != "__sinit" &&
  687.                             substr ($1, 1, 7) != "__sterm") {
  688.                             if (substr ($1, 1, 5) == "__tf1")
  689.                                 print (substr ($1, 7))
  690.                             else if (substr ($1, 1, 5) == "__tf9")
  691.                                 print (substr ($1, 15))
  692.                             else
  693.                                 print $1
  694.                         }
  695.                 }
  696.             }' | sort -u >> ${EXPFILE}
  697.  
  698.             if [ "${ALTOPTS}" ] ; then
  699.                 OPTS=${ALTOPTS}
  700.             fi
  701.  
  702.             # On AIX a shared library is linked differently when
  703.             # you want to dlopen the file
  704.             if [ $DLOPEN = "1" ] ; then
  705.                 cc -G ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
  706.             else
  707.                 cc ${OPTS} ${LDFLAGS} -o ${OFILE} ${OBJECTS} ${DEPS}
  708.                 ar ${X64} -r ${LIBNAME} ${OFILE}
  709.             fi
  710.  
  711.             FINAL_LIBS="${LIBNAME}"
  712.         fi
  713.         ;;
  714.  
  715.     'OpenSTEP')
  716.         LIBNAME="lib${LIBNAME}.a"
  717.         echo "mklib: Making OpenSTEP static library: " ${LIBNAME}
  718.         libtool -static -o ${LIBNAME} - ${OBJECTS}
  719.         FINAL_LIBS=${LIBNAME}
  720.         ;;
  721.  
  722.     'OSF1')
  723.         if [ $STATIC = 1 ] ; then
  724.             LIBNAME="lib${LIBNAME}.a"
  725.             echo "mklib: Making OSF/1 static library: " ${LIBNAME}
  726.             FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
  727.         else
  728.             VERSION="${MAJOR}.${MINOR}"
  729.             LIBNAME="lib${LIBNAME}.so"
  730.             echo "mklib: Making OSF/1 shared library: " ${LIBNAME}
  731.             if [ "x$LINK" = "x" ] ; then
  732.                 if [ $CPLUSPLUS = 1 ] ; then
  733.                     LINK=cxx
  734.                 else
  735.                     LINK=cc
  736.                 fi
  737.             fi
  738.             rm -f ${LIBNAME}.${VERSION}
  739.             ${LINK} -o ${LIBNAME}.${VERSION} -shared -set_version ${VERSION} -soname ${LIBNAME}.${VERSION} -expect_unresolved \* -all ${OBJECTS} ${DEPS}
  740.             ln -sf ${LIBNAME}.${VERSION} ${LIBNAME}
  741.             FINAL_LIBS="${LIBNAME} ${LIBNAME}.${VERSION}"
  742.         fi
  743.         ;;
  744.  
  745.     'Darwin')
  746.         if [ $STATIC = 1 ] ; then
  747.             LIBNAME="lib${LIBNAME}.a"
  748.             echo "mklib: Making Darwin static library: " ${LIBNAME}
  749.             OPTS="-ruvs"
  750.             if [ "${ALTOPTS}" ] ; then
  751.                 OPTS=${ALTOPTS}
  752.             fi
  753.  
  754.             # expand .a into .o files
  755.             NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
  756.  
  757.             # make static lib
  758.             FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
  759.  
  760.             # remove temporary extracted .o files
  761.             rm -rf ${LIBNAME}.obj
  762.  
  763.             FINAL_LIBS=${LIBNAME}
  764.         else
  765.             # On Darwin a .bundle is used for a library that you want to dlopen
  766.             if [ $DLOPEN = "1" ] ; then
  767.                 LIBSUFFIX="bundle"
  768.                 OPTS="${ARCHOPT} -bundle -multiply_defined suppress"
  769.             else
  770.                 LIBSUFFIX="dylib"
  771.                 if [ -z "$ID" ] ; then
  772.                     ID="lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
  773.                 fi
  774.                 OPTS="${ARCHOPT} -dynamiclib -multiply_defined suppress -current_version ${MAJOR}.${MINOR}.0 -compatibility_version ${MAJOR}.${MINOR}.0 -install_name ${ID}"
  775.             fi
  776.  
  777.             if [ ${EXPORTS} ] ; then
  778.                 if [ -f ${EXPORTS}".darwin" ] ; then
  779.                     EXPORTS=$EXPORTS".darwin"
  780.                 fi
  781.                 OPTS="${OPTS} -exported_symbols_list ${EXPORTS}"
  782.             fi
  783.  
  784.             LINKNAME="lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
  785.             LINKNAME2="lib${LIBNAME}.${LIBSUFFIX}"
  786.             LIBNAME="lib${LIBNAME}.${MAJOR}.${MINOR}.${LIBSUFFIX}"
  787.  
  788.             # examine first object to determine ABI
  789.             set ${OBJECTS}
  790.             ABIS=`lipo -info $1 | sed s/.*://`
  791.             for ABI in $ABIS; do
  792.                 OPTS="${OPTS} -arch ${ABI}"
  793.             done
  794.  
  795.             if [ "${ALTOPTS}" ] ; then
  796.                 OPTS=${ALTOPTS}
  797.             fi
  798.  
  799.             # XXX can we always add -isysroot /Developer/SDKs/MacOSX10.4u.sdk
  800.             # to OPTS here?
  801.  
  802.             # determine linker
  803.             if [ $CPLUSPLUS = 1 ] ; then
  804.                 LINK="g++"
  805.             else
  806.                 LINK="cc"
  807.             fi
  808.  
  809.             echo "mklib: Making Darwin shared library: " ${LIBNAME}
  810.  
  811.             ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
  812.             ln -s ${LIBNAME} ${LINKNAME}
  813.             ln -s ${LIBNAME} ${LINKNAME2}
  814.             FINAL_LIBS="${LIBNAME} ${LINKNAME} ${LINKNAME2}"
  815.         fi
  816.         ;;
  817.  
  818.     'LynxOS')
  819.         LIBNAME="lib${LIBNAME}.a"
  820.         echo "mklib: Making LynxOS static library: " ${LIBNAME}
  821.         FINAL_LIBS=`make_ar_static_lib -ru 0 ${LIBNAME} ${OBJECTS}`
  822.         ;;
  823.  
  824.     'BeOS')
  825.         if [ $STATIC = 1 ] ; then
  826.             LIBNAME="lib${LIBNAME}.a"
  827.             echo "mklib: Making BeOS static library: " ${LIBNAME}
  828.             FINAL_LIBS=`make_ar_static_lib -cru 0 ${LIBNAME} ${OBJECTS}`
  829.         else
  830.             LIBNAME="lib${LIBNAME}.so"
  831.             echo "mklib: Making BeOS shared library: " ${LIBNAME}
  832.             gcc -nostart -Xlinker "-soname=${LIBNAME}" -L/Be/develop/lib/x86 -lbe ${DEPS} ${OBJECTS} -o "${LIBNAME}"
  833.             mimeset -f "${LIBNAME}"
  834.             # XXX remove the Mesa3D stuff here since mklib isn't mesa-specific.
  835.             setversion "${LIBNAME}" -app ${MAJOR} ${MINOR} ${PATCH} -short "Powered by Mesa3D!" -long "Powered by Mesa3D!"
  836.         fi
  837.         FINAL_LIBS=${LIBNAME}
  838.         ;;
  839.  
  840.     'QNX')
  841.         LIBNAME="lib${LIBNAME}.a"
  842.         echo "mklib: Making QNX library: " ${LIBNAME}
  843.         wlib ${LIBNAME} ${OBJECTS}
  844.         FINAL_LIBS=${LIBNAME}
  845.         ;;
  846.  
  847.     'MorphOS')
  848.         LIBNAME="lib${LIBNAME}.a"
  849.         echo "mklib: Making MorphOS library: " ${LIBNAME}
  850.         ppc-morphos-ar rc ${LIBNAME} ${OBJECTS}
  851.         FINAL_LIBS="${LIBNAME}"
  852.         ;;
  853.  
  854.     'icc' | 'icc-istatic')
  855.         # Intel C compiler
  856.         # This should get merged into the Linux code, above, since this isn't
  857.         # really a different architecture.
  858.         LIBNAME="lib${LIBNAME}"     # prefix with "lib"
  859.  
  860.         if [ $STATIC = 1 ] ; then
  861.             echo "mklib: Making Intel ICC static library: " ${LIBNAME}.a
  862.             LINK="ar"
  863.             OPTS="-ruv"
  864.             if [ "${ALTOPTS}" ] ; then
  865.                 OPTS=${ALTOPTS}
  866.             fi
  867.             # make lib
  868.             ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
  869.             # finish up
  870.             FINAL_LIBS="${LIBNAME}.a"
  871.         else
  872.             if [ $ARCH = icc-istatic ] ; then
  873.                  OPTS="-shared -i-static -cxxlib-icc"
  874.             else
  875.                  OPTS="-shared"
  876.             fi
  877.             if [ "${ALTOPTS}" ] ; then
  878.                 OPTS=${ALTOPTS}
  879.             fi
  880.             VERSION="${MAJOR}.${MINOR}.${PATCH}"
  881.             echo "mklib: Making Intel ICC shared library: " ${LIBNAME}.so.${VERSION}
  882.  
  883.             if [ $CPLUSPLUS = 1 ] ; then
  884.                 LINK="icpc"
  885.             else
  886.                 LINK="icc"
  887.             fi
  888.             # rm any old libs
  889.             rm -f ${LIBNAME}.so.${VERSION}
  890.             rm -f ${LIBNAME}.so.${MAJOR}
  891.             rm -f ${LIBNAME}.so
  892.             # make lib
  893.             ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
  894.             # make usual symlinks
  895.             ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
  896.             ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
  897.             # finish up
  898.             FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
  899.         fi
  900.         ;;
  901.  
  902.     'aix-gcc')
  903.         # AIX with gcc
  904.         if [ $STATIC = 1 ] ; then
  905.             LIBNAME="lib${LIBNAME}.a"
  906.             echo "mklib: Making AIX GCC static library: " ${LIBNAME}
  907.             FINAL_LIBS=`make_ar_static_lib ru 0 ${LIBNAME} ${OBJECTS}`
  908.         else
  909.             LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
  910.             echo "mklib: Making AIX GCC shared library: " ${LIBNAME}
  911.             # remove old lib
  912.             rm -f ${LIBNAME}
  913.             # make the lib
  914.             gcc -shared -Wl,-G ${OBJECTS} ${DEPS} -o ${LIBNAME}
  915.             # NOTE: the application linking with this library must specify
  916.             # the -Wl,-brtl flags to gcc
  917.             FINAL_LIBS=${LIBNAME}
  918.         fi
  919.         ;;
  920.  
  921.     'ultrix')
  922.         # XXX untested
  923.         if [ $STATIC = 0 ] ; then
  924.             echo "mklib: Warning shared libs not supported on Ultrix"
  925.         fi
  926.         LIBNAME="lib${LIBNAME}.a"
  927.         echo "mklib: Making static library for Ultrix: " ${LIBNAME}
  928.         FINAL_LIBS=`make_ar_static_lib ru 0 ${LIBNAME} ${OBJECTS}`
  929.         ;;
  930.  
  931.      CYGWIN*)
  932.         # GCC-based environment
  933.  
  934.         if [ "x$LINK" = "x" ] ; then
  935.             # -linker was not specified so set default link command now
  936.             if [ $CPLUSPLUS = 1 ] ; then
  937.                 LINK=g++
  938.             else
  939.                 LINK=gcc
  940.             fi
  941.         fi
  942.  
  943.         if [ $NOPREFIX = 1 ] ; then
  944.             # No "lib" or ".so" part
  945.             echo "mklib: Making CYGWIN shared library: " ${LIBNAME}
  946.             OPTS="-shared -Wl,--enable-auto-image-base"
  947.             if [ "${ALTOPTS}" ] ; then
  948.                 OPTS=${ALTOPTS}
  949.             fi
  950.             rm -f ${LIBNAME}
  951.             ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS} || exit $?
  952.             FINAL_LIBS=${LIBNAME}
  953.         else
  954.         CYGNAME="cyg${LIBNAME}"     # prefix with "cyg"
  955.         LIBNAME="lib${LIBNAME}"     # prefix with "lib"
  956.  
  957.         if [ $STATIC = 1 ] ; then
  958.             LIBNAME=${LIBNAME}.a
  959.             echo "mklib: Making CYGWIN static library: " ${LIBNAME}
  960.             OPTS="-ru"
  961.             if [ "${ALTOPTS}" ] ; then
  962.                 OPTS=${ALTOPTS}
  963.             fi
  964.  
  965.             # expand .a into .o files
  966.             NEW_OBJECTS=`expand_archives ${LIBNAME}.obj $OBJECTS`
  967.  
  968.             FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
  969.  
  970.             # remove temporary extracted .o files
  971.             rm -rf ${LIBNAME}.obj
  972.         else
  973.             OPTS="-shared -Wl,--enable-auto-image-base -Wl,-export-all -Wl,--out-implib=${LIBNAME}-${MAJOR}.dll.a"
  974.             if [ "${ALTOPTS}" ] ; then
  975.                 OPTS=${ALTOPTS}
  976.             fi
  977.             echo "mklib: Making CYGWIN shared library: " ${CYGNAME}-${MAJOR}.dll
  978.  
  979.             # rm any old libs
  980.             rm -f ${CYGNAME}-${MAJOR}.dll
  981.             rm -f ${LIBNAME}-${MAJOR}.dll.a
  982.             rm -f ${LIBNAME}.dll.a
  983.             rm -f ${LIBNAME}.a
  984.  
  985.             # make lib
  986.             ${LINK} ${OPTS} ${LDFLAGS} -o ${CYGNAME}-${MAJOR}.dll ${OBJECTS} ${DEPS} || exit $?
  987.             # make usual symlinks
  988.             ln -s ${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a
  989.             # finish up
  990.             FINAL_LIBS="${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a"
  991.             # special case for installing in bin
  992.             FINAL_BINS="${CYGNAME}-${MAJOR}.dll"
  993.         fi
  994.         fi
  995.         ;;
  996.  
  997.     'MINGW32_NT-5.1')
  998.         # If you're adding support for a new architecture, you can
  999.         # start with this:
  1000.         if [ $STATIC = 1 ] ; then
  1001.             LIBNAME="lib${LIBNAME}.a"
  1002.             echo "mklib: Making Mingw static library: " ${LIBNAME}
  1003.             FINAL_LIBS=`make_ar_static_lib rv 0 ${LIBNAME} ${OBJECTS}`
  1004.         else
  1005.             LIBNAME="lib${LIBNAME}.dll"  # prefix with "lib", suffix with ".dll"
  1006.             echo "mklib: Making Kolibri shared library: " ${LIBNAME}
  1007.             ld -o ${LIBNAME} ${OBJECTS} ${DEPS}
  1008.             FINAL_LIBS="${LIBNAME}"
  1009.         fi
  1010.         ;;
  1011.  
  1012.     'example')
  1013.         # If you're adding support for a new architecture, you can
  1014.         # start with this:
  1015.         if [ $STATIC = 1 ] ; then
  1016.             LIBNAME="lib${LIBNAME}.a"
  1017.             echo "mklib: Making static library for example arch: " ${LIBNAME}
  1018.             FINAL_LIBS=`make_ar_static_lib rv 0 ${LIBNAME} ${OBJECTS}`
  1019.         else
  1020.             LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
  1021.             echo "mklib: Making shared library for example arch: " ${LIBNAME}
  1022.             ld -o ${LIBNAME} ${OBJECTS} ${DEPS}
  1023.             FINAL_LIBS="${LIBNAME}"
  1024.         fi
  1025.         ;;
  1026.  
  1027.     *)
  1028.         echo "mklib: ERROR: Don't know how to make a static/shared library for" ${ARCH}
  1029.         echo "mklib: Please add necessary commands to mklib script."
  1030.         ;;
  1031. esac
  1032.  
  1033.  
  1034. #
  1035. # Put library files into installation directory if specified.
  1036. #
  1037. if [ ${INSTALLDIR} != "." ] ; then
  1038.     echo "mklib: Installing" ${FINAL_LIBS} "in" ${INSTALLDIR}
  1039.     test -d ${INSTALLDIR} || mkdir -p ${INSTALLDIR}
  1040.     mv ${FINAL_LIBS} ${INSTALLDIR}/
  1041.  
  1042.     if [ "x${FINAL_BINS}" != "x" ] ; then
  1043.         echo "mklib: Installing" ${FINAL_BINS} "in" ${INSTALLDIR}
  1044.         mv ${FINAL_BINS} ${INSTALLDIR}/
  1045.     fi
  1046. fi
  1047.