mklib 12.5 KB
Newer Older
1 2 3
#!/bin/sh

# Make a shared library.
Brian Paul's avatar
Brian Paul committed
4 5
# Basically do a switch/case depending on the OS and make a shared (or static)
# library conforming to that OS.
6 7 8 9 10


# Usage:
#   mklib [options] objects ...
# Options:
Brian Paul's avatar
Brian Paul committed
11 12
#   -o LIBRARY    specifies the name of resulting library
#                 ("-o GL" for example, might result in "libGL.so" being made)
13 14 15 16 17 18 19
#   -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)
Brian Paul's avatar
Brian Paul committed
20
#   -install DIR  move resulting library file(s) to DIR
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
#   -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.
#
# objects should be:  foo.o bar.o etc.o
#
# Environment variables recognized:
#   CC   C compiler command
#   CXX  C++ compiler command
#


#
# Option defaults
#
LIBNAME=""
MAJOR=1
MINOR=0
PATCH=0
DEPS=""
CPLUSPLUS=0
STATIC=0
INSTALLDIR="."
ARCH="auto"
ARCHOPT=""


#
# Parse arguments
#
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
    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 "-----------------"
fi


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

112 113
    'Linux' | 'OpenBSD')
	# GCC-based environment
114 115
	LIBNAME="lib${LIBNAME}"     # prefix with "lib"

116
        if [ $STATIC = 1 ] ; then
Brian Paul's avatar
Brian Paul committed
117
            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}.a
118 119 120 121 122
            LINK="ar"
            OPTS="-ruv"
            # make lib
            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
            # finish up
Brian Paul's avatar
Brian Paul committed
123
            FINAL_LIBS=${LIBNAME}
124
        else
Brian Paul's avatar
Brian Paul committed
125 126 127 128 129
	    if [ $ARCH = 'Linux' ] ; then
		OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
	    else
		OPTS="-shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
	    fi
130 131
            VERSION="${MAJOR}.${MINOR}.${PATCH}"

Brian Paul's avatar
Brian Paul committed
132
            echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}.so.${VERSION}
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

            if [ $CPLUSPLUS = 1 ] ; then
                LINK="g++"
            else
                LINK="gcc"
            fi

            # rm any old libs
            rm -f ${LIBNAME}.so.${VERSION}
            rm -f ${LIBNAME}.so.${MAJOR}
            rm -f ${LIBNAME}.so

            # make lib
            ${LINK} ${OPTS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
            # make usual symlinks
            ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
            ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
            # finish up
            FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
        fi
153 154 155
	;;

    'SunOS')
Brian Paul's avatar
Brian Paul committed
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
        if [ $STATIC = 1 ] ; then
	    LIBNAME="lib${LIBNAME}.a"
	    echo "mklib: Making SunOS static library: " ${LIBNAME}
	    rm -f ${LIBNAME}
	    ar ru ${LIBNAME} ${OBJECTS}
	    FINAL_LIBS=${LIBNAME}
	else
	    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++"
		    OPTS="-G"
		else
		    echo "mklib: warning: can't find C++ comiler, trying CC."
		    LINK="CC"
		    OPTS="-G"
		fi
	    elif [ "x${CC}" = "xgcc" ] ; then
		# use gcc for linking
		LINK="gcc"
197
		OPTS="-G"
198
	    else
Brian Paul's avatar
Brian Paul committed
199 200
		# use native Sun linker
		LINK="ld"
Brian Paul's avatar
Brian Paul committed
201
		OPTS="-G"
202
	    fi
Brian Paul's avatar
Brian Paul committed
203 204 205 206 207
	    echo "mklib: linker is" ${LINK} ${OPTS}
	    rm -f ${LIBNAME}.${MAJOR} ${LIBNAME}
	    ${LINK} ${OPTS} -o ${LIBNAME}.${MAJOR} ${OBJECTS} ${DEPS}
	    ln -s ${LIBNAME}.${MAJOR} ${LIBNAME}
	    FINAL_LIBS="${LIBNAME}.${MAJOR} ${LIBNAME}"
208 209 210 211
	fi
	;;

    'FreeBSD')
Brian Paul's avatar
Brian Paul committed
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
        if [ $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}.${MINOR}"
	    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}
	fi
227 228 229
	;;

    'NetBSD')
Brian Paul's avatar
Brian Paul committed
230 231 232 233 234 235 236 237 238 239 240 241 242 243
        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
244 245
	;;

Brian Paul's avatar
Brian Paul committed
246
    'IRIX' | 'IRIX64')
Brian Paul's avatar
Brian Paul committed
247 248 249 250 251
        if [ $STATIC = 1 ] ; then
	    LIBNAME="lib${LIBNAME}.a"
	    rm -f ${LIBNAME}
	    ar rc ${LIBNAME} ${OBJECTS}
	    FINAL_LIBS=${LIBNAME}
Brian Paul's avatar
Brian Paul committed
252
	else
Brian Paul's avatar
Brian Paul committed
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
	    LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
	    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
		OPTS="-32 -shared -all"
		echo "mklib: Making IRIX o32-bit shared library: " ${LIBNAME}
	    else
		# new 32-bit ABI
		OPTS="-n32 -shared -all"
		echo "mklib: Making IRIX n32-bit shared library: " ${LIBNAME}
	    fi
	    if [ $CPLUSPLUS = 1 ] ; then
		LINK="CC"
	    else
		LINK="ld"
	    fi
	    ${LINK} ${OPTS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
	    FINAL_LIBS=${LIBNAME}
Brian Paul's avatar
Brian Paul committed
274
	fi
275 276 277 278 279
	;;

    'linux-cygwin')
	LIBNAME="lib${LIBNAME}.a"
	echo "mklib: Making linux-cygwin library: " ${LIBNAME}
Brian Paul's avatar
Brian Paul committed
280
	rm -f ${LIBNAME}
281 282 283 284 285
	gnuwin32ar ruv ${LIBNAME} ${OBJECTS}
	FINAL_LIBS=${LIBNAME}
	;;

    'HPUX')
Brian Paul's avatar
Brian Paul committed
286 287 288 289 290 291 292 293 294 295 296 297 298 299
        if [ $STATIC = 1 ] ; then
	    LIBNAME="lib${LIBNAME}.a"
	    echo "mklib: Making HPUX static library: " ${LIBNAME}
	    rm -f ${LIBNAME}
	    ar ru ${LIBNAME} ${OBJECTS}
	    FINAL_LIBS=${LIBNAME}
	else
	    RUNLIB="lib${LIBNAME}.${MAJOR}"
	    DEVLIB="lib${LIBNAME}.sl"
	    echo "mklib: Making HPUX stared library: " ${RUNLIB} ${DEVLIB}
	    ld -b -o ${RUNLIB} +b ${RUNLIB} ${OBJECTS} ${DEPS}
	    ln -s ${RUNLIB} ${DEVLIB}
	    FINAL_LIBS="{RUNLIB} ${DEVLIB}"
	fi
300 301 302 303 304 305 306 307 308 309
	;;

    'OpenSTEP')
	LIBNAME="lib${LIBNAME}.a"
	echo "mklib: Making OpenSTEP static library: " ${LIBNAME}
	libtool -static -o ${LIBNAME} - ${OBJECTS}
	FINAL_LIBS=${LIBNAME}
	;;

    'OSF1')
Brian Paul's avatar
Brian Paul committed
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
        if [ $STATIC = 1 ] ; then
	    LIBNAME="lib${LIBNAME}.a"
	    echo "mklib: Making OSF/1 static library: " ${LIBNAME}
	    rm -f ${LIBNAME}
	    ar clqz ${LIBNAME} ${OBJECTS}
	    FINAL_LIBS=${LIBNAME}
	else
	    VERSION="${MAJOR}.${MINOR}"
	    LIBNAME="lib${LIBNAME}.so"
	    echo "mklib: Making OSF/1 shared 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}
	    FINAL_LIBS="${LIBNAME} ${LIBNAME}.${VERSION}"
	fi
325 326 327 328 329 330 331 332 333 334 335
	;;

    '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)
Brian Paul's avatar
Brian Paul committed
336
	rm -f ${ARNAME}
337 338 339 340 341 342 343
	ar ruv ${ARNAME} ${OBJECTS}
	ranlib ${ARNAME}
	FINAL_LIBS="${ARNAME} ${LIBNAME}"
	;;

    'LynxOS')
	LIBNAME="lib${LIBNAME}.a"
Brian Paul's avatar
Brian Paul committed
344 345
	echo "mklib: Making LynxOS static library: " ${LIBNAME}
	rm -f ${LIBNAME}
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
	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}
	FINAL_LIBS=${LIBNAME}
	;;

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

364 365 366 367 368 369 370
    'MorphOS')
	LIBNAME="lib${LIBNAME}.a"
	echo "mklib: Making MorphOS library: " ${LIBNAME}
	ppc-morphos-ar rc ${LIBNAME} ${OBJECTS}
	FINAL_LIBS="${LIBNAME}"
	;;

Brian Paul's avatar
Brian Paul committed
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
    'icc')
	# Intel C compiler
	LIBNAME="lib${LIBNAME}"     # prefix with "lib"

        if [ $STATIC = 1 ] ; then
            echo "mklib: Making Intel ICC static library: " ${LIBNAME}.a
            LINK="ar"
            OPTS="-ruv"
            # make lib
            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
            # finish up
            FINAL_LIBS="${LIBNAME}.a"
        else
            OPTS="-shared"
            VERSION="${MAJOR}.${MINOR}.${PATCH}"

            echo "mklib: Making Intel ICC shared library: " ${LIBNAME}.so.${VERSION}

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

            # rm any old libs
            rm -f ${LIBNAME}.so.${VERSION}
            rm -f ${LIBNAME}.so.${MAJOR}
            rm -f ${LIBNAME}.so

            # make lib
            ${LINK} ${OPTS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
            # make usual symlinks
            ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
            ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
            # finish up
            FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
        fi
	;;

410 411
    'aix-gcc')
	# AIX with gcc
Brian Paul's avatar
Brian Paul committed
412 413 414 415 416 417 418 419 420 421 422 423 424
        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}
425

Brian Paul's avatar
Brian Paul committed
426 427
	    # NOTE: the application linking with this library must specify
	    # the -Wl,-brtl flags to gcc
428

Brian Paul's avatar
Brian Paul committed
429 430 431 432 433 434 435 436 437 438 439 440 441 442
	    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}"
443
	;;
Brian Paul's avatar
Brian Paul committed
444

445 446 447
    'example')
	# If you're adding support for a new architecture, you can
	# start with this:
Brian Paul's avatar
Brian Paul committed
448 449 450 451 452 453 454 455 456 457 458 459
        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"
	    echo "mklib: Making shared library for example arch: " ${LIBNAME}
	    ld -o ${LIBNAME} ${OBJECTS} ${DEPS}
	    FINAL_LIBS="${LIBNAME}"
	fi
460 461 462
	;;

    *)
Brian Paul's avatar
Brian Paul committed
463 464
	echo "mklib: ERROR: Don't know how to make a static/shared library for" ${ARCH}
	echo "mklib: Please add necessary commands to mklib script."
465 466 467 468 469 470 471 472 473 474 475
	;;
esac


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