#!/bin/sh -e
#----------------------------------------------------------------------
# Build wxMac and wxPythonOSX from the tarball and then make an
# Installer package out of it.

spectemplate=distrib/wxPythonFull.spec.in

if [ ! -d wxPython -o ! -e ${spectemplate} ]; then
    echo "Please run this script from the root wxPython directory."
    exit 1
fi

if [ "$UID" != "0" ]; then
    echo "-------------------------------------------------------"
    echo " WARNING:  will be unable to change ownership of files"
    echo " unless this script is run as root or via sudo"
    echo "-------------------------------------------------------"
fi

#----------------------------------------------------------------------
# Check Parameters

function usage {
    echo ""
    echo "Usage: $0  [panther|jaguar]  [command flags...]"
    echo ""
    echo "   panther        Build for Apple's python in /usr/bin, such as on Panther"
    echo "   jaguar         Build for a python in /usr/local/bin, such as on Jaguar"
    echo ""
    echo "optional command flags:"
    echo "   skiptar        Don't unpack the tarball"
    echo "   inplace        Don't use the tarball, build from the CVS tree instead"
    echo "                  (The Docs and Demo tarballs are still required for a full build.)"
    echo "   unicode        Make a unicode build"
    echo "   skipconfig     Don't run configure"
    echo "   skipbuild      Don't build wxWidgets or wxPython"
    echo "   skipinstall    Don't do the installation step"
    echo "   skipdmg        Don't make the package or diskimage"
    echo "   skipclean      Don't do the cleanup at the end"
    echo ""
}


if [ $# -lt 1 ]; then
    usage
    exit 1
fi

KIND=$1
case $KIND in
    panther)    PYTHON=/usr/bin/python ;;
    jaguar)     PYTHON=/usr/local/bin/python ;;
    *)          usage; exit 1 ;;
esac
PYTHONW=${PYTHON}w
shift

skiptar=no
skipconfig=no
skipbuild=no
skipinstall=no
skipdmg=no
skipclean=no
inplace=no
unicode=no

for flag in $*; do
    case ${flag} in
	skiptar)     skiptar=yes                                ;;
	skipconfig)  skipconfig=yes; skiptar=yes                ;;
	skipbuild)   skipbuild=yes; skipconfig=yes; skiptar=yes ;;
	skipinstall) skipinstall=yes                            ;;
        skipdmg)     skipdmg=yes                                ;;
	skipclean)   skipclean=yes                              ;;
	inplace)     inplace=yes; skiptar=yes                   ;;
	unicode)     unicode=yes                                ;;

	*)  echo "Unknown flag \"${flag}\""
	    usage
	    exit 1
    esac
done


VERSION=`$PYTHON -c "import setup;print setup.VERSION"`
PYVER=`$PYTHON -c "import sys; print sys.version[:3]"`
PYPREFIX=`$PYTHON -c "import sys; print sys.exec_prefix"`
PYLIB=$PYPREFIX/lib/python$PYVER
SITEPACKAGES=$PYLIB/site-packages
SHORTVER=`echo $VERSION | cut -c 1,2,3`

if [ $unicode == yes ]; then
    CHARTYPE=unicode
    UNICODEOPT=--enable-unicode
    PYUNICODEOPT=1
else
    CHARTYPE=ansi
    UNICODEOPT=--disable-unicode
    PYUNICODEOPT=0
fi

#if [ "$HOSTNAME" = "bigmac.alldunn.com" ]; then
#    MAKEJOBS="--jobs=2"
#fi


if [ -z "$TARBALLDIR" ]; then
    # this is a spot on my fileserver where the tarballs go, adjust
    # as needed for where you put the wxPython tarball, or set
    # TARBALLDIR before invoking this script...
    TARBALLDIR=/stuff/Development/wxPython/dist/$VERSION
fi
TARBALL=$TARBALLDIR/wxPython-src-$VERSION.tar.gz

if [ ! -e $TARBALLDIR/wxPython-demo-$VERSION.tar.gz ]; then 
    echo "-------------------------------------------------------"
    echo " WARNING:  Demo tarball not found, will skip building "
    echo "           the Demo app bundle and etc."
    echo " $TARBALLDIR/wxPython-demo-$VERSION.tar.gz"
    echo "-------------------------------------------------------"
fi

if [ ! -e $TARBALLDIR/wxPython-docs-$VERSION.tar.gz ]; then
    echo "-------------------------------------------------------"
    echo " WARNING:  Docs tarball not found, will skip building "
    echo "           the the wxDocsViewer app bundle and etc."
    echo " $TARBALLDIR/wxPython-docs-$VERSION.tar.gz"
    echo "-------------------------------------------------------"
fi




PREFIX=/usr/local/lib/wxPython-$CHARTYPE-$VERSION
BINPREFIX=/usr/local/bin

WXROOT=`dirname $PWD`
PROGDIR="`dirname \"$0\"`"
TMPDIR=$PWD/_build_dmg

BUILDROOT=$TMPDIR/build

INSTALLROOT=$TMPDIR/install-root
INSTALLAPPS=$TMPDIR/install-apps

DMGDIR=$TMPDIR/dmg
DMGROOT=$DMGDIR/root
DMGAPPS=$DMGDIR/apps

RESOURCEDIR=$PROGDIR/resources
DESTDIR=$PWD/dist
SRCROOT=$BUILDROOT/wxPython-src-$VERSION


#----------------------------------------------------------------------
# Setup builddirs

mkdir -p $BUILDROOT
mkdir -p $INSTALLROOT
mkdir -p $INSTALLAPPS

rm -rf $DMGDIR
mkdir -p $DMGROOT
mkdir -p $DMGAPPS/Docs
mkdir -p $DMGAPPS/Samples


pushd $BUILDROOT


#----------------------------------------------------------------------
# Unpack the tarball

if [ $skiptar != yes ]; then
    echo Unarchiving tarball...
    tar xzf $TARBALL
fi

if [ $inplace = no ]; then
    # make a build dir and cd to it.
    cd wxPython-src-$VERSION
    WXDIR=`pwd`
    mkdir -p $WXDIR/bld
    cd $WXDIR/bld
    WXBLD=$WXDIR/bld
else

    # If building "inplace" then our build dir will be off of the
    # WXROOT like normal, adjust the variables to find things that
    # way.
    WXBLD=$WXROOT/build-$CHARTYPE
    mkdir -p $WXBLD
    cd $WXBLD
    WXDIR=..
    SRCROOT=$WXROOT
fi

echo "Using wx root dir: $WXROOT"
echo "Using build dir:   $WXBLD" 
echo "Using source tree: $WXDIR"

#----------------------------------------------------------------------


# Configure wxWidgets
if [ $skipconfig != yes ]; then
    $WXDIR/configure \
	--prefix=$PREFIX \
	--with-mac \
	--enable-monolithic \
	--with-opengl \
	--enable-sound \
	--enable-display \
	--enable-geometry \
	--enable-debug_flag \
	--enable-precomp=no \
	--enable-optimise \
	$UNICODEOPT


fi

# Build wxWidgets and wxPython
if [ $skipbuild != yes ]; then

    # Make wxWidgets and some contribs

    # For some reason Rez and DeRez have started locking up if run as
    # root, figure out why, but in the meantime...
    if [ "$UID" = "0" ]; then
	chmod a+w lib
	if [ "$CHARTYPE" = "ansi" ]; then
	    su robind -c "make lib/libwx_macd-2.5.3.r"
	else
	    su robind -c "make lib/libwx_macud-2.5.3.r"
	fi
    fi

    make $MAKEJOBS
    make $MAKEJOBS -C contrib/src/gizmos
    make $MAKEJOBS -C contrib/src/ogl CXXFLAGS="-DwxUSE_DEPRECATED=0"
    make $MAKEJOBS -C contrib/src/stc

    # Build wxPython
    cd $WXROOT/wxPython
    $PYTHON setup.py \
	UNICODE=$PYUNICODEOPT \
	NO_SCRIPTS=1 \
	EP_ADD_OPTS=1 \
	WX_CONFIG="$WXBLD/wx-config --inplace" \
	BUILD_BASE=$WXBLD/wxPython \
	build
fi

#----------------------------------------------------------------------

if [ $skipinstall != yes ]; then
    # Install wxWidgets
    cd $WXBLD
    make prefix=$INSTALLROOT$PREFIX install
    make -C contrib/src/gizmos prefix=$INSTALLROOT$PREFIX install
    make -C contrib/src/ogl CXXFLAGS="-DwxUSE_DEPRECATED=0" prefix=$INSTALLROOT/$PREFIX install
    make -C contrib/src/stc prefix=$INSTALLROOT$PREFIX install


    # relink wx-config with a relative link
    cd $INSTALLROOT$PREFIX/bin
    rm wx-config
    ln -s ../lib/wx/config/* wx-config

    # and wxPython
    cd $WXROOT/wxPython
    $PYTHON setup.py \
	UNICODE=$PYUNICODEOPT \
	NO_SCRIPTS=1 \
	EP_ADD_OPTS=1 \
	WX_CONFIG="$INSTALLROOT/$PREFIX/bin/wx-config --prefix=$INSTALLROOT/$PREFIX" \
	BUILD_BASE=$WXBLD/wxPython \
	install \
	--root=$INSTALLROOT


    # Apple's Python (on Panther) sym-links the site-packages dir to
    # /Library/Python/$PYVER so we need to move the files so they are
    # installed in the physical location, not the virtual one.
    if [ "$KIND" = "panther" ]; then
	if [ -e $INSTALLROOT/Library/Python/$PYVER ]; then
	    rm -r $INSTALLROOT/Library/Python/$PYVER
	fi	    
	mkdir -p $INSTALLROOT/Library/Python/$PYVER
	mv $INSTALLROOT/$SITEPACKAGES/* $INSTALLROOT/Library/Python/$PYVER
	rm -r $INSTALLROOT/System
	SITEPACKAGES=/Library/Python/$PYVER
    fi

    # install wxPython's tool scripts
    mkdir -p $INSTALLROOT$BINPREFIX
    cd $WXROOT/wxPython/scripts
    python$PYVER CreateMacScripts.py $INSTALLROOT $BINPREFIX


    # Remove the .pyc/.pyo files they just take up space and can be recreated
    # during the install.
    pushd $WXROOT/wxPython
    $PYTHON $PROGDIR/../zappycfiles.py $INSTALLROOT > /dev/null
    popd

    # Set premissions for files in $INSTALLROOT
    if [ "$UID" = "0" ]; then
	chown -R root:admin $INSTALLROOT
	chmod -R g+w        $INSTALLROOT
    fi
fi

if [ "$KIND" = "panther" ]; then
    SITEPACKAGES=/Library/Python/$PYVER
fi
PKGDIR=`cat $INSTALLROOT$SITEPACKAGES/wx.pth`

popd

#----------------------------------------------------------------------

# Make the Installer packages and disk image
if [ $skipdmg != yes ]; then

    #-----------------------------------------------
    # The main runtime installer package

    # Make the welcome message
    case $KIND in
	panther)  W_MSG="the Panther (OS X 10.3.x) version of" ;;
	jaguar)   W_MSG="the Jaguar (OS X 10.2.x) version of" ;;
    esac
    

    cat > $RESOURCEDIR/Welcome.txt <<EOF
Welcome!

This Installer package will install the wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER.  This includes:

    * The wxPython packages and modules
    * The wxWidgets shared libraries and headers
    * Some command line tool scripts, installed to /usr/local/bin.

You must install onto your current boot disk, eventhough the installer does not enforce this, otherwise things will not work.

You can install more than one version of the wxPython runtime if you desire.  The most recently installed version will be the default wxPython, but you can choose another by setting the PYTHONPATH or by using the wxversion module.  See http://wiki.wxpython.org/index.cgi/MultiVersionInstalls for more details.

Build date:   `date`
EOF

    # make the preflight script
    cat > $RESOURCEDIR/preflight <<EOF
#!/bin/sh
# Cleanup any old install of the wxPython package
rm -rf \$2$SITEPACKAGES/wxPython
rm -rf \$2$SITEPACKAGES/wx
rm -rf \$2$SITEPACKAGES/$PKGDIR
exit 0
EOF
    chmod +x $RESOURCEDIR/preflight

    # make the postflight script
    cat > $RESOURCEDIR/postflight <<EOF
#!/bin/sh -e
# Compile the .py files in the wxPython pacakge
$PYTHON \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
$PYTHON -O \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR

# and all of the wxPython pacakge should be group writable
chgrp -R admin \$2$SITEPACKAGES/$PKGDIR
chmod -R g+w \$2$SITEPACKAGES/$PKGDIR

exit 0
EOF
    chmod +x $RESOURCEDIR/postflight

    

    # Build the main Installer Package...
    rm -rf wxPython${SHORTVER}-osx-$CHARTYPE-$KIND.pkg
    python $PROGDIR/../buildpkg.py \
	--Title=wxPython${SHORTVER}-osx-$CHARTYPE-$KIND \
	--Version=$VERSION \
	--Description="wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER" \
	--NeedsAuthorization="YES" \
	--Relocatable="NO" \
	--InstallOnly="YES" \
	$INSTALLROOT \
	$RESOURCEDIR

    mv wxPython${SHORTVER}-osx-$CHARTYPE-$KIND.pkg $DMGROOT

    rm $RESOURCEDIR/postflight
    rm $RESOURCEDIR/preflight
    rm $RESOURCEDIR/Welcome.txt


    #-----------------------------------------------
    # Make a README to go on the disk image
    cat > "$DMGROOT/README 1st.txt" <<EOF
Welcome to wxPython!

This disk image contains the following items:

    wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND

        This Installer contains the wxPython runtime, compiled on a
        $KIND OS X system, using the $CHARTYPE build of the wxWidgets
        library.  It includes the Python modules and extension
        modules, as well as the wxWidgets libraries.

        It is possible to have more than one version of the runtime
        installed at once if you wish.  The most recently installed
        version will be the default wxPython, but you can choose
        another by setting the PYTHONPATH or by using the wxversion
        module.  For more details see:
        http://wiki.wxpython.org/index.cgi/MultiVersionInstalls 


    uninstall_wxPython.py

        A simple tool to help you manage your installed versions of
        wxPython.  It will allow you to choose from the currently
        installed wxPython packages and to select one for
        uninstallation.  It is a text-mode tool so you can either run
        it from a Terminal command line, or you can open it with
        PythonLauncher and let it create a Terminal to run it in.

        NOTE: If you have versions prior to 2.5.3.1 installed, please
        do run this uninstall tool to remove the older version.

EOF



    cp $PROGDIR/../uninstall_wxPython.py $DMGROOT


    #-----------------------------------------------
    # Make a disk image to hold these files
    dmgname=wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND-py$PYVER
    $PROGDIR/../makedmg $DMGROOT $DMGDIR $dmgname

    echo Moving $DMGDIR/$dmgname.dmg to $DESTDIR
    mv $DMGDIR/$dmgname.dmg  $DESTDIR


#---------------------------------------------------------------------------
# Now create app bundles for the demo, docs, and tools and make another
# disk image to hold it all.
#---------------------------------------------------------------------------

    cat > "$DMGAPPS/README 1st.txt" <<EOF
Welcome to wxPython!

On this disk image you will find Demo, Tools, Docs, and etc. for
wxPython $VERSION.  Everything here is optional and you can drag them
out of the disk image and drop them wherever you want.  You will need
to have an installed wxPython runtime to be able to use any of them.


   wxPython Demo        An application bundle version of the demo.
                        (This has it's own copy of the demo sources 
                        within the bundle.)

   XRCed                An application for editing wxPython resource
                        files  (XRC files.)

   PyCrust              An application that provides an interactive
                        Python shell and also namespace inspectors.



   Docs/wxDocsViewer    An application that allows you to view the
                        wxWidgets documentation.

   Docs/licence         License files.

   Docs/other           A few readmes, change log, etc.


   Samples/samples      Several small sample applications that
                        demonstrate how to use wxPython.

   Samples/demo         A copy of the wxPython demo source code,
                        just open the folder and run demo.pyw.

Happy Hacking!
EOF

#   PyAlaMode            An extension of PyCrust that includes source
#                        file editing capabilities.


    # wxDocs
    if [ ! -e $TARBALLDIR/wxPython-docs-$VERSION.tar.gz ]; then
	cat > "$DMGAPPS/Docs/Build ERROR.txt" <<EOF

The wxPython-docs tarball was not found when building this disk image!

EOF

    else
	pushd $BUILDROOT
	tar xzvf $TARBALLDIR/wxPython-docs-$VERSION.tar.gz
	popd

        # Make an app to launch viewdocs.py
	$PYTHONW $PROGDIR/../buildapp.py \
	    --builddir=$DMGAPPS/Docs \
	    --name=wxDocsViewer \
	    --mainprogram=$BUILDROOT/wxPython-$VERSION/docs/viewdocs.py \
	    --iconfile=$PROGDIR/Info.icns \
	    build

	cp $BUILDROOT/wxPython-$VERSION/docs/*.zip $DMGAPPS/Docs/wxDocsViewer.app/Contents/Resources

	cat > "$DMGAPPS/Docs/README 1st.txt" <<EOF

The wxDocsViewer application needs to be copied to your Desktop (or
someplace else you have write access to) before you can run it, so it
can cache some indexes within its bundle.

EOF

    fi

    # license files, docs, etc.
    pushd $DMGAPPS/Docs
    cp -pR $SRCROOT/wxPython/licence   .
    cp -pR $SRCROOT/wxPython/docs      .
    rm -rf docs/bin
    rm -rf docs/xml-raw
    mv docs other
    popd


    if [ ! -e $TARBALLDIR/wxPython-demo-$VERSION.tar.gz ]; then
	cat > "$DMGAPPS/Samples/Build ERROR.txt" <<EOF

The wxPython-demo tarball was not found when building this disk image!

EOF
	cp "$DMGAPPS/Samples/Build ERROR.txt" $DMGAPPS

    else

        # Copy the demo and samples to the disk image from the tarball
	pushd $DMGAPPS/Samples
	tar xzvf $TARBALLDIR/wxPython-demo-$VERSION.tar.gz
	mv wxPython-$VERSION/* .
	rm -rf wxPython-$VERSION
	rm demo/b demo/.setup.sh
	mv demo/demo.py demo/demo.pyw
	popd

        # Make an app bundle to run the demo
	$PYTHONW $PROGDIR/../buildapp.py \
	    --builddir=$DMGAPPS \
	    --name="wxPython Demo" \
	    --mainprogram=$DMGAPPS/Samples/demo/demo.pyw \
	    --iconfile=$PROGDIR/RunDemo.icns \
	    build
	cp -pR $DMGAPPS/Samples/demo/* "$DMGAPPS/wxPython Demo.app/Contents/Resources"
    fi


    # Make an app bundle to launch PyCrust
    $PYTHONW $PROGDIR/../buildapp.py \
	--builddir=$DMGAPPS \
	--name=PyCrust \
	--mainprogram=$INSTALLROOT$BINPREFIX/pycrust.py \
	--iconfile=$PROGDIR/PieShell.icns \
	build

## TODO: PyAlaMode needs tweaked to be able to run from a bundle.  It
## needs to know to ignore command line parameters and etc...
#      # and PyAlaMode
#      $PYTHONW $PROGDIR/../buildapp.py \
#  	--builddir=$DMGAPPS \
#  	--name=PyAlaMode \
#  	--mainprogram=$INSTALLROOT$BINPREFIX/pyalamode.py \
#  	--iconfile=$PROGDIR/PieShell.icns \
#  	build

    # Make an app to launch XRCed
    $PYTHONW $PROGDIR/../buildapp.py \
 	--builddir=$DMGAPPS \
 	--name=XRCed \
 	--mainprogram=$INSTALLROOT$BINPREFIX/xrced.py \
 	--iconfile=$PROGDIR/XRCed.icns \
 	build



    # and then finally make a disk image containing everything
    dmgname=wxPython${SHORTVER}-osx-docs-demos-$VERSION-$KIND
    $PROGDIR/../makedmg $DMGAPPS $DMGDIR $dmgname

    echo Moving $DMGDIR/$dmgname.dmg to $DESTDIR
    mv $DMGDIR/$dmgname.dmg  $DESTDIR
fi


# Cleanup build/install dirs
if [ $skipclean != yes ]; then
    echo "Cleaning up..."
    rm -rf $TMPDIR
else
    echo "Cleanup is disabled.  You should remove $TMPDIR when finished"
fi