blob: 96077168ac33be525152222516f754bedaee4199 [file] [log] [blame]
#!/bin/sh
CORE_TOP=`pwd`
export CORE_TOP
CURLBIN=`which curl`
if ! test -n "CURLBIN"; then
display_error "Error: curl is required. Add it to 'PATH'"
exit 1
fi
GUNZIP=`which gunzip`
UNZIP=`which unzip`
TAR=`which tar`
GNUMAKE=`which gmake 2>/dev/null || which make`
PATCHES=$CORE_TOP/patches
STATICLIBS=$CORE_TOP/.libs
DISTDIR=$CORE_TOP/.dists
# nspr sources
NSPR_VER=4.8.8
NSPR_DISTNAME=nspr-$NSPR_VER.tar.gz
NSPR_SITE=http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/v4.8.8/src/
# spidermonkey js sources
JS_VER=185-1.0.0
JS_REALVER=1.8.5
JS_DISTNAME=js$JS_VER.tar.gz
JS_SITE=http://ftp.mozilla.org/pub/mozilla.org/js
JSDIR=$STATICLIBS/js-$JS_REALVER
JS_LIBDIR=$STATICLIBS/js/lib
JS_INCDIR=$STATICLIBS/js/include
[ "$MACHINE" ] || MACHINE=`(uname -m) 2>/dev/null` || MACHINE="unknown"
[ "$RELEASE" ] || RELEASE=`(uname -r) 2>/dev/null` || RELEASE="unknown"
[ "$SYSTEM" ] || SYSTEM=`(uname -s) 2>/dev/null` || SYSTEM="unknown"
[ "$BUILD" ] || VERSION=`(uname -v) 2>/dev/null` || VERSION="unknown"
CFLAGS="-g -O2 -Wall"
LDFLAGS="-lstdc++"
ARCH=
ISA64=
GNUMAKE=make
CC=gcc
CXX=g++
PATCH=patch
case "$SYSTEM" in
Linux)
ARCH=`(uname -p) 2>/dev/null`
;;
FreeBSD|OpenBSD|NetBSD)
ARCH=`(uname -p) 2>/dev/null`
GNUMAKE=gmake
;;
Darwin)
ARCH=`(uname -p) 2>/dev/null`
ISA64=`(sysctl -n hw.optional.x86_64) 2>/dev/null`
;;
Solaris)
ARCH=`(uname -p) 2>/dev/null`
GNUMAKE=gmake
PATCH=gpatch
;;
*)
ARCH="unknown"
;;
esac
# TODO: add mirror & signature validation support
fetch()
{
TARGET=$DISTDIR/$1
if ! test -f $TARGET; then
echo "==> Fetch $1 to $TARGET"
$CURLBIN --progress-bar -L $2/$1 -o $TARGET
fi
}
build_nspr()
{
NSPR_CONFIGURE_ENV=""
case "$SYSTEM" in
Linux)
ARCH=`(uname -p) 2>/dev/null`
if [ "$ARCH" = "x86_64" ]; then
NSPR_CONFIGURE_ENV="--enable-64bit"
fi
CFLAGS="$CFLAGS -lpthread"
;;
FreeBSD|OpenBSD|NetBSD)
ARCH=`(uname -p) 2>/dev/null`
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "amd64" ]; then
NSPR_CONFIGURE_ENV+=--enable-64bit
fi
;;
Darwin)
if [ "$ISA64" = "1" ]; then
NSPR_CONFIGURE_ENV+=--enable-64bit
fi
;;
esac
fetch $NSPR_DISTNAME $NSPR_SITE
# clean the build
rm -rf $STATICLIBS/nspr*
echo "==> build nspr"
cd $STATICLIBS
$GUNZIP -c $DISTDIR/$NSPR_DISTNAME | $TAR xf -
cd $STATICLIBS/nspr-$NSPR_VER/mozilla/nsprpub
./configure --disable-debug --enable-optimize \
--prefix=$STATICLIBS/nsprpub $NSPR_CONFIGURE_ENV
$GNUMAKE all
$GNUMAKE install
}
build_js()
{
fetch $JS_DISTNAME $JS_SITE
# clean the build
rm -rf $STATICLIBS/js*
mkdir -p $JS_LIBDIR
mkdir -p $JS_INCDIR
cd $STATICLIBS
$GUNZIP -c $DISTDIR/$JS_DISTNAME | $TAR -xf -
echo "==> build js"
cd $JSDIR/js/src
$PATCH -p0 -i $PATCHES/js/patch-jsprf_cpp || echo "skipping patch"
$PATCH -p0 -i $PATCHES/js/patch-configure || echo "skipping patch"
env CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" \
CPPFLAGS="-DXP_UNIX -DJS_C_STRINGS_ARE_UTF8" \
./configure --prefix=$STATICLIBS/js \
--disable-debug \
--enable-optimize \
--enable-static \
--disable-shared-js \
--disable-tests \
--with-system-nspr \
--with-nspr-prefix=$STATICLIBS/nsprpub && \
$GNUMAKE all || exit 1
mkdir -p $JS_INCDIR/js
cp $JSDIR/js/src/*.h $JS_INCDIR
cp $JSDIR/js/src/*.tbl $JS_INCDIR
cp $JSDIR/js/src/libjs_static.a $JS_LIBDIR
}
do_setup()
{
echo "==> spidermonkey (compile)"
mkdir -p $DISTDIR
mkdir -p $STATICLIBS
}
do_builddeps()
{
if [ ! -f $STATICLIBS/nsprpub/lib/libnspr4.a ]; then
build_nspr
fi
if [ ! -f $STATICLIBS/js/lib/libjs_static.a ]; then
build_js
fi
}
clean()
{
rm -rf $STATICLIBS
rm -rf $DISTDIR
}
usage()
{
cat << EOF
Usage: $basename [command] [OPTIONS]
The $basename command compile Mozilla Spidermonkey and ICU statically
for couch_core.
Commands:
all: build couch_core static libs
clean: clean static libs
-?: display usage
Report bugs at <https://github.com/refuge/couch_core>.
EOF
}
if [ ! "x$COUCHDB_STATIC" = "x1" ]; then
exit 0
fi
if [ "x$1" = "x" ]; then
do_setup
do_builddeps
exit 0
fi
case "$1" in
all)
shift 1
do_setup
do_builddeps
;;
clean)
shift 1
clean
;;
js)
shift 1
do_setup
build_js
;;
nspr)
shift 1
do_setup
build_nspr
;;
help|--help|-h|-?)
usage
exit 0
;;
*)
echo $basename: ERROR Unknown command $arg 1>&2
echo 1>&2
usage 1>&2
echo "### $basename: Exitting." 1>&2
exit 1;
;;
esac
exit 0