#!/usr/bin/env bash
#
# Script for creating a self-contained Wings package for Unix systems.
#

# Configurable stuff.
INSTALL=`which install`
MAKESELF=`which makeself makeself.sh 2> /dev/null | head -1`
ESDL_PATH=`erl -noshell -eval "io:put_chars(code:lib_dir(esdl))" -run erlang halt`
ESDL_NAME=`basename $ESDL_PATH`

if [ X$ESDL_NAME == Xesdl ]; then
    echo $ESDL_NAME without version
    source $ESDL_PATH/vsn.mk
    ESDL_NAME=$ESDL_VSN
    echo Install esdl to $ESDL_NAME
fi

ERLANG_PATH=`erl -noshell -eval "io:format([126,115,126,110],[code:root_dir()])" -s erlang halt`
# End of configurable stuff.

# Copy the Wings application.

WINGS_DIR="`pwd`"
WINGS_APP=`basename "$WINGS_DIR"`
WINGS_VSN=`echo "$WINGS_APP" | sed -e 's/.*wings-//'`
if [ X$WINGS_VSN == Xwings ]; then 
    WINGS_VSN=`sed -n "/WINGS_VSN/s/^WINGS_VSN[^0-9]*//p" vsn.mk`
fi
OS_NAME=`uname -s | perl -pe 'tr/[A-Z]/[a-z]/'`
DEST_ROOT="wings-$WINGS_VSN-$OS_NAME"

dest="$DEST_ROOT"

$INSTALL -d "$dest"
$INSTALL -c -m 644 README AUTHORS license.terms vsn.mk "$dest"

dest="$DEST_ROOT/lib/$WINGS_APP"

$INSTALL -d "$dest" "$dest/ebin" "$dest/patches"
$INSTALL -c -m 644 ebin/* "$dest/ebin"
$INSTALL -d  "$dest/fonts"

$INSTALL -d "$dest/textures"
$INSTALL -d "$dest/shaders"
$INSTALL -c -m 644 textures/* "$dest/textures"
$INSTALL -c -m 644 shaders/* "$dest/shaders"

$INSTALL -d "$dest/plugins/default" \
 "$dest/plugins/accel" \
 "$dest/plugins/import_export" "$dest/plugins/commands" \
 "$dest/plugins/primitives" "$dest/plugins/autouv" "$dest/plugins/jpeg"

$INSTALL -c -m 644 fonts/* "$dest/fonts"

$INSTALL -c -m 644 plugins/default/wp9_dialogs* "$dest/plugins/default"
$INSTALL -c -m 644 plugins/accel/* "$dest/plugins/accel"
$INSTALL -c -m 644 plugins/import_export/* "$dest/plugins/import_export"
$INSTALL -c -m 644 plugins/commands/* "$dest/plugins/commands"
$INSTALL -c -m 644 plugins/primitives/* "$dest/plugins/primitives"
$INSTALL -c -m 644 plugins/autouv/* "$dest/plugins/autouv"
$INSTALL -c -m 644 plugins/jpeg/* "$dest/plugins/jpeg"

# Copy the relevant parts of Erlang/OTP.

src="$ERLANG_PATH"
dest="$DEST_ROOT"
erts_src=`echo "$src"/erts-*`
stdlib=`basename "$src"/lib/stdlib-*`
kernel=`basename "$src"/lib/kernel-*`
xmerl=`basename "$src"/lib/xmerl-*`

$INSTALL -d "$dest/bin" \
    "$dest/lib/$stdlib/ebin" \
    "$dest/lib/$kernel/ebin" \
    "$dest/lib/$xmerl/ebin"

$INSTALL -c -m 644 "$src"/lib/kernel-*/ebin/* "$dest/lib/$kernel/ebin"
$INSTALL -c -m 644 "$src"/lib/stdlib-*/ebin/* "$dest/lib/$stdlib/ebin"
$INSTALL -c -m 644 "$src"/lib/xmerl-*/ebin/* "$dest/lib/$xmerl/ebin"

$INSTALL -c "$erts_src/bin/erlexec" "$dest/bin/erlexec"
$INSTALL -c "$erts_src/bin/beam.smp" "$dest/bin/beam.smp"
$INSTALL -c "$erts_src/bin/child_setup" "$dest/bin/child_setup"
$INSTALL -c "$erts_src/bin/inet_gethost" "$dest/bin/inet_gethost"
strip --strip-debug "$dest/bin/erlexec"
strip --strip-debug "$dest/bin/beam.smp"
strip --strip-debug "$dest/bin/child_setup"
strip --strip-debug "$dest/bin/inet_gethost"
$INSTALL -c -m 644 "$src/bin/start.boot" "$dest/bin"

# Copy the relevant parts of ESDL.
dest="$DEST_ROOT/lib/$ESDL_NAME"
$INSTALL -d "$dest/ebin" "$dest/priv"
$INSTALL -c -m 644  "$ESDL_PATH"/ebin/* "$dest/ebin"
$INSTALL -c "$ESDL_PATH"/priv/sdl_driver.so "$dest/priv"
rm -rf "$dest/ebin/sdl_audio.beam" "$dest/ebin/sdl_joystick.beam"
strip --strip-debug --strip-unneeded "$dest/priv/sdl_driver.so"

# Copy the SDL so.
sdl_lib=`ldd "$dest/priv/sdl_driver.so" | awk '$1 ~ /^libSDL/ { print $3}'`
sdl_lib_name=`basename $sdl_lib`
if [ ! -L $sdl_lib ]; then
    echo `basename $0`: "$sdl_lib expected to be a symlink"
    $INSTALL -c $sdl_lib "$dest/priv"
else
    lib_dir=`dirname $sdl_lib`
    linkname=`readlink $sdl_lib`
    $INSTALL -c $lib_dir/$linkname "$dest/priv"
    rm -f $dest/priv/$sdl_lib_name
    (cd $dest/priv; ln -s $linkname $sdl_lib_name)
fi

# Copy the relevant parts of wx (we use opengl from it)
WX_PATH=`erl -noshell -eval "io:format([126,115,126,110],[code:lib_dir(wx)])" -s erlang halt`
WX_NAME=`basename $WX_PATH`
dest="$DEST_ROOT/lib/$WX_NAME"
$INSTALL -d "$dest/ebin" "$dest/priv"
$INSTALL -c -m 644  "$WX_PATH"/ebin/gl.beam "$dest/ebin"
$INSTALL -c -m 644  "$WX_PATH"/ebin/glu.beam "$dest/ebin"
$INSTALL -c -m 644  "$WX_PATH"/priv/erl_gl.so "$dest/priv"
strip --strip-debug --strip-unneeded "$dest/priv/erl_gl.so"

# OpenCL 
CL_PATH=`erl -noshell -eval "io:format([126,115,126,110],[code:lib_dir(cl)])" -s erlang halt`
CL_NAME=`basename $CL_PATH`
if [ X$CL_NAME == Xcl ]; then
    echo $CL_NAME without version
    CL_VSN=`sed -n "/CL_VSN/s/^CL_VSN[^0-9]*//p" $CL_PATH/vsn.mk`
    CL_NAME="cl-$CL_VSN"
    echo Install cl to $CL_NAME
fi
dest="$DEST_ROOT/lib/$CL_NAME"
$INSTALL -d "$dest/ebin" "$dest/priv"
$INSTALL -c -m 644  "$CL_PATH"/ebin/cl.beam "$dest/ebin"
$INSTALL -c -m 644  "$CL_PATH"/ebin/cl1?.beam "$dest/ebin"
$INSTALL -c -m 644  "$CL_PATH"/ebin/clu.beam "$dest/ebin"
$INSTALL -c -m 644  "$CL_PATH"/priv/cl_nif.so "$dest/priv"
strip --strip-debug --strip-unneeded "$dest/priv/cl_nif.so"

#
# Remove files from OTP not needed.
#
$WINGS_DIR/tools/wings_reduce_otp "$DEST_ROOT"

# Strip debug information from all beam files.
cd "$latest_wings"
erlc -o/tmp tools/strip.erl
cd "$DEST_ROOT"
erl -noshell -pa /tmp -run strip strip

# Package the installer.
cd $WINGS_DIR
INSTALLER="$DEST_ROOT/install_wings"
sed -e "s;%WINGS_VSN%;$WINGS_VSN;" -e "s;%ESDL_NAME%;$ESDL_NAME;" -e "s;%LIB_SDL_NAME%;$sdl_lib_name;" $WINGS_DIR/unix/install_wings.src > $INSTALLER
chmod +x $INSTALLER

dest=$DEST_ROOT
$MAKESELF --bzip2 $dest $dest.bzip2.run Wings3D ./install_wings "$WINGS_VSN"
if [ -f $dest.run ]; then
    cp $dest.run ..
fi
