#!/bin/bash
##################################################
#             aMule.app bundle creator.          #
##################################################

## This file is part of the aMule Project
##
## Copyright (c) 2011 Angel Vidal ( kry@amule.org )
##
## This program is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License
## as published by the Free Software Foundation; either
## version 2 of the License, or (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA

SCRIPTDIR=`dirname "$0"`
SCRIPTNAME=`basename "$0"`

## Get full path
SCRIPTDIR=`cd $SCRIPTDIR; pwd`

PATH="$SCRIPTDIR:$PATH"

. defs-global.sh $1
. defs-wx.sh
. defs-functions.sh

echo "Start" > $STDOUT_FILE
echo "Start" > $ERROR_FILE

REPEATSCRIPT=${ROOT_FOLDER}/repeat.sh
if [ -f $REPEATSCRIPT ]; then
	chmod 600 $REPEATSCRIPT
fi
echo "Save configuration commandline to ${REPEATSCRIPT} - execute that script to repeat this compilation with the same options."
echo "#!/bin/bash" > $REPEATSCRIPT
echo "echo \"Starting repeat, moving away current repeat.sh\"" >> $REPEATSCRIPT
echo "rm -rf \${0}.old 2>/dev/null; mv \$0 \${0}.old" >> $REPEATSCRIPT
if [ x"$SDKNUMBER" == x"" ]; then
	SDKSTRING="default"
else
	SDKSTRING=$SDKNUMBER
fi

echo "BUILDARCHS=\"${BUILDARCHS}\" SDKNUMBER=\"${SDKSTRING}\" UNIVERSAL=\"${UNIVERSAL}\" WXVERSION=\"${WXVERSION}\" WXPORT=\"${WXPORT}\" SLIMWX=\"${SLIMWX}\" BUILD_FOLDER=\"${BUILD_FOLDER}\" $0" >> $REPEATSCRIPT
echo "echo \"Repeat finished\"" >> $REPEATSCRIPT
chmod 500 $REPEATSCRIPT

echo "Starting build..."

echo -e "\tGetting aMule sources..."

#Get aMule first, because it may contain patches
if [ -d $AMULE_FOLDER/ ]; then
	if [ -d ${AMULE_FOLDER}/.svn/ ]; then
		echo -e "\t\tSources already exist, updating."
	        pushd $AMULE_FOLDER/ >> $STDOUT_FILE
	        svn up >> $STDOUT_FILE
	        popd >> $STDOUT_FILE
	else
		echo -e "\t\taMule sources at \"" $AMULE_FOLDER "\" are not from SVN checkout, so not updating."
	fi
else
	echo -e "\tFirst checkout."
	if [ "$SVN_REPOSITORY" == "public" ]; then
		SVN_REPOSITORY=http://amule.googlecode.com/svn/trunk/
		echo -e "\tUsing public SVN repository at ${SVN_REPOSITORY}."
	else
		echo -e "\tUsing provided SVN repository at ${SVN_REPOSITORY}."
	fi

	svn co $SVN_REPOSITORY $AMULE_FOLDER >> $STDOUT_FILE
	if [ ! -d $AMULE_FOLDER/ ]; then
		echo "ERROR: aMule sources could not be retrieved. Review your settings."
		exit
	fi
fi

pushd $ROOT_FOLDER >> $STDOUT_FILE

echo -e "\tDone"

echo -e "\tGetting wxWidgets sources..."

if [ -d ${WXFOLDER} ]; then
	pushd ${WXFOLDER} >> $STDOUT_FILE
	svn up >> $STDOUT_FILE 2>> $ERROR_FILE
	popd >> $STDOUT_FILE
else
	echo -e "\tFirst checkout."
	svn checkout http://svn.wxwidgets.org/svn/wx/wxWidgets/${WXSVNROOT} ${WXFOLDER} >> $STDOUT_FILE 2>> $ERROR_FILE
	pushd ${WXFOLDER} >> $STDOUT_FILE
	echo -e "\tApplying patches."
	for i in $AMULE_FOLDER/src/utils/patches/wxWidgets/*.patch; do
		echo -e "\t\tAppying \"$i\""
		patch -p0 < $i >> $STDOUT_FILE 2>> $ERROR_FILE
	done
	popd >> $STDOUT_FILE
fi
echo -e "\tDone"

echo -e "\tConfiguring wxWidgets..."

pushd ${WXFOLDER} > $STDOUT_FILE

if [ "$SDKNUMBER" == "" ]; then
	WX_SDK_FLAGS=""
else
	WX_SDK_FLAGS="--with-macosx-sdk=/Developer/SDKs/MacOSX${SDKRELEASE}.sdk \
	--with-macosx-version-min=$SDKNUMBER"
fi

if [ -e amulewxcompilation ]; then
	echo -e "\t\twxWidgets is already configured"
else
	make clean >> $STDOUT_FILE 2>/dev/null
	./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION \
	CFLAGS="$CFLAGS $ARCHCPPFLAGS" CXXFLAGS="$CXXFLAGS $ARCHCPPFLAGS" CPPFLAGS="$CPPFLAGS $ARCHCPPFLAGS" \
	LDFLAGS="$LDFLAGS $ARCHCPPFLAGS" \
	OBJCFLAGS="$OBJCFLAGS $ARCHCPPFLAGS" OBJCXXFLAGS="$OBJCXXFLAGS $ARCHCPPFLAGS" \
	--enable-debug --disable-shared \
	$EXTRA_WXFLAGS \
	$ARCHCONFIGFLAGS \
	$WX_SDK_FLAGS >> $STDOUT_FILE 2>> $ERROR_FILE
	touch amulewxcompilation >> $STDOUT_FILE
	echo -e "\t\tConfigured."
fi

echo -e "\t\tDone"

echo -e "\tCompiling wxWidgets..."

make >> $STDOUT_FILE 2>> $ERROR_FILE

echo -e "\tDone"

popd >> $STDOUT_FILE

CRYPTOPP_FOLDER="cryptopp-source"
CRYPTOPP_FOLDER_INST="cryptopp"
CRYPTOPP_URL=`curl -sS http://www.cryptopp.com/ | grep -oE "http://.*/cryptopp/cryptopp[0-9]+\.zip" | sort -r | head -1`

echo -e "\tGetting cryptopp sources..."

if [ -d $CRYPTOPP_FOLDER_INST ]; then
	echo -e "\t\t$CRYPTOPP_FOLDER_INST already exists, skipping (delete and rerun script to get new sources)"
else
	mkdir $CRYPTOPP_FOLDER
	mkdir $CRYPTOPP_FOLDER_INST
	curl -L -o cryptopp.zip $CRYPTOPP_URL >> $STDOUT_FILE 2>> $ERROR_FILE
	unzip cryptopp.zip -d $CRYPTOPP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	pushd $CRYPTOPP_FOLDER >> $STDOUT_FILE
	#./configure
	for i in $AMULE_FOLDER/src/utils/patches/cryptopp/*.patch; do
		echo -e "\t\tAppying \"$i\""
		patch -p0 < $i >> $STDOUT_FILE 2>> $ERROR_FILE
	done
	#cp ../GNUMakefile .
	echo -e "\t\tCompiling cryptopp..."
	CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION \
		CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" make > $STDOUT_FILE 2> $ERROR_FILE
	PREFIX=${ROOT_FOLDER}/$CRYPTOPP_FOLDER_INST make install >> $STDOUT_FILE 2>> $ERROR_FILE
	popd >> $STDOUT_FILE
	rm cryptopp.zip >> $STDOUT_FILE 2>> $ERROR_FILE
	rm -rf $CRYPTOPP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
fi

echo -e "\tDone"

# Gettext

echo -e "\tGetting gettext sources..."

GETTEXT_FOLDER="gettext-source"
GETTEXT_FOLDER_INST="gettext-inst"
GETTEXT_URL=`curl -sS http://www.gnu.org/software/gettext/ | grep -m 1 -oE "http://[^\"]+/gettext-([0-9]+\.)+tar.gz" | head -1`

if [ -d $GETTEXT_FOLDER_INST ]; then
	echo -e "\t\t$GETTEXT_FOLDER_INST already exists, skipping"
else
	mkdir $GETTEXT_FOLDER
	mkdir $GETTEXT_FOLDER_INST
	curl -L -o gettext.tar.gz $GETTEXT_URL >> $STDOUT_FILE 2>> $ERROR_FILE
	pushd $GETTEXT_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	echo -e "\t\tCompiling gettext..."
	tar --strip-components 1 -zxf ../gettext.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE
	./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \
		CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" \
		--disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$GETTEXT_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE
	make >> $STDOUT_FILE 2>> $ERROR_FILE
	make install >> $STDOUT_FILE 2>> $ERROR_FILE
	popd >> $STDOUT_FILE 2>> $ERROR_FILE
	rm gettext.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE
	rm -rf $GETTEXT_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
fi

echo -e "\tDone."

#libupnp

echo -e "\tGetting libupnp sources..."

LIBUPNP_FOLDER="libupnp-source"
LIBUPNP_FOLDER_INST="libupnp-inst"
LIBUPNP_URL=`curl -sS http://sourceforge.net/projects/pupnp/files/ | grep -m 1 -ioE "http://sourceforge.net/[^\"]+/libupnp-([0-9]+\.)+tar.bz2/download" | head -1`

if [ -d $LIBUPNP_FOLDER_INST ]; then
	echo -e "\t\t$LIBUPNP_FOLDER_INST already exists, skipping"
else
	mkdir $LIBUPNP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	mkdir $LIBUPNP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE
	curl -L -o libupnp.tar.bz2 $LIBUPNP_URL  >> $STDOUT_FILE 2>> $ERROR_FILE
	pushd $LIBUPNP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	echo -e "\t\tCompiling libupnp..."
	tar --strip-components 1 -jxf ../libupnp.tar.bz2 >> $STDOUT_FILE 2>> $ERROR_FILE
	./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \
		CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" --disable-dependency-tracking \
		--disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$LIBUPNP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE
	make >> $STDOUT_FILE 2>> $ERROR_FILE
	make install >> $STDOUT_FILE 2>> $ERROR_FILE
	popd >> $STDOUT_FILE 2>> $ERROR_FILE
	rm libupnp.tar.bz2 >> $STDOUT_FILE 2>> $ERROR_FILE
	rm -rf $LIBUPNP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
fi

echo -e "\tDone."

#geoip

echo -e "\tGetting GeoIP sources..."

LIBGEOIP_FOLDER="libgeoip-source"
LIBGEOIP_FOLDER_INST="libgeoip-inst"
LIBGEOIP_URL="http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz"

if [ -d $LIBGEOIP_FOLDER_INST ]; then
	echo -e "\t\t$LIBGEOIP_FOLDER_INST already exists, skipping"
else
	mkdir $LIBGEOIP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	mkdir $LIBGEOIP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE
	curl -L -o libgeoip.tar.gz $LIBGEOIP_URL >> $STDOUT_FILE 2>> $ERROR_FILE
	pushd $LIBGEOIP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	echo -e "\t\tCompiling GeoIP..."
	tar --strip-components 2 -zxf ../libgeoip.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE
	./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \
		CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" --disable-dependency-tracking \
		--disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$LIBGEOIP_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE
	make >> $STDOUT_FILE 2>> $ERROR_FILE
	make install >> $STDOUT_FILE 2>> $ERROR_FILE
	popd >> $STDOUT_FILE 2>> $ERROR_FILE
	rm libgeoip.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE
	rm -rf $LIBGEOIP_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
fi

echo -e "\tDone."

#pkg-config

echo -e "\tGetting pkg-config sources..."

PKGCFG_FOLDER="pkgcfg-source"
PKGCFG_FOLDER_INST="pkgcfg-inst"
# pkgconfig introduced a dependency on glib to build on 0.26, and I refuse to build the whole glib for this.
# On top of it, glib uses pkgconfig to configure itself...
#PKGCFG_FILE=`curl -sS http://pkgconfig.freedesktop.org/releases/ | grep -ioE "pkg-config-([0-9]+\.)+tar.gz" | uniq | sort -r | head -1`
#PKGCFG_URL="http://pkgconfig.freedesktop.org/releases/${PKGCFG_FILE}"
PKGCFG_URL="http://pkgconfig.freedesktop.org/releases/pkg-config-0.25.tar.gz"

if [ -f $PKGCFG_FOLDER_INST/bin/pkg-config ]; then
	echo -e "\t\t$PKGCFG_FOLDER_INST already exists, skipping"
else
	mkdir $PKGCFG_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	mkdir $PKGCFG_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE
	curl -L -o pkgcfg.tar.gz $PKGCFG_URL >> $STDOUT_FILE 2>> $ERROR_FILE
	pushd $PKGCFG_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	echo -e "\t\tCompiling pkg-config..."
	tar --strip-components 1 -zxf ../pkgcfg.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE
	./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" \
		CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" --disable-dependency-tracking \
		--disable-debug --disable-shared --prefix=${ROOT_FOLDER}/$PKGCFG_FOLDER_INST >> $STDOUT_FILE 2>> $ERROR_FILE
	make >> $STDOUT_FILE 2>> $ERROR_FILE
	make install >> $STDOUT_FILE 2>> $ERROR_FILE
	popd >> $STDOUT_FILE 2>> $ERROR_FILE
	if [ -f $PKGCFG_FOLDER_INST/bin/pkg-config ]; then
		rm -f pkgcfg.tar.gz >> $STDOUT_FILE 2>> $ERROR_FILE
		rm -rf $PKGCFG_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE
	else
		echo -e " ERROR: check output $STDOUT_FILE and $ERROR_FILE for details. "
	fi
fi


echo -e "\tDone."

# aMule

echo -e "\tFINALLY compiling aMule..."

pushd $AMULE_FOLDER >> $STDOUT_FILE 2>> $ERROR_FILE

if [ -f configure ]; then
	echo -e "\t\tConfigure already exists"
else
	PATH="${PATH}:${ROOT_FOLDER}/${GETTEXT_FOLDER_INST}/bin" ./autogen.sh >> $STDOUT_FILE 2>> $ERROR_FILE
fi

if [ -d intl/ ]; then
	echo -e "\t\tGood: intl folder already exists."
else
	mkdir intl >> $STDOUT_FILE 2>> $ERROR_FILE
	touch intl/Makefile.in >> $STDOUT_FILE 2>> $ERROR_FILE
	echo "all:" > intl/Makefile >> $STDOUT_FILE 2>> $ERROR_FILE
	echo "clean:" >> intl/Makefile >> $STDOUT_FILE 2>> $ERROR_FILE
	echo "" >> intl/Makefile >> $STDOUT_FILE 2>> $ERROR_FILE
fi

if [ ! -f src/amule ]; then
	MULECLEAN=YES
fi

rm -rf ${ROOT_FOLDER}/amule-inst/
mkdir -p ${ROOT_FOLDER}/amule-inst/

if [ "$MULECLEAN" == "YES" ]; then
	echo -e "\t\tRunning configure"

	PATH="${PATH}:${ROOT_FOLDER}/${GETTEXT_FOLDER_INST}/bin/:${ROOT_FOLDER}/${PKGCFG_FOLDER_INST}/bin/" \
	 ./configure CC=gcc$CCVERSION CXX=g++$CCVERSION CPP=cpp$CCVERSION LD=g++$CCVERSION \
	CXXFLAGS="-pthread $ARCHCPPFLAGS $SDK" CFLAGS="-pthread $ARCHCPPFLAGS $SDK" LDFLAGS="-pthread $SDK" \
	--enable-nls --disable-dependency-tracking --enable-ccache \
	--with-wxdir=${ROOT_FOLDER}/${WXFOLDER}/ \
	--with-crypto-prefix=${ROOT_FOLDER}/$CRYPTOPP_FOLDER_INST \
	--with-libintl-prefix=${ROOT_FOLDER}/${GETTEXT_FOLDER_INST} \
	--with-libupnp-prefix=${ROOT_FOLDER}/${LIBUPNP_FOLDER_INST} \
	--with-geoip-static --with-geoip-headers=${ROOT_FOLDER}/${LIBGEOIP_FOLDER_INST}/include --with-geoip-lib=${ROOT_FOLDER}/${LIBGEOIP_FOLDER_INST}/lib/ \
	--disable-cas --disable-webserver --disable-amulecmd --disable-amule-gui --disable-wxcas --disable-alc --disable-alcc --disable-amule-daemon \
	--prefix=${ROOT_FOLDER}/amule-inst/ >> $STDOUT_FILE 2>> $ERROR_FILE

	echo -e "\t\tCleaning compilation"

	make clean >> $STDOUT_FILE 2>> $ERROR_FILE
fi

echo -e "\t\tCompiling aMule"

make >> $STDOUT_FILE 2>> $ERROR_FILE

echo -e "\tDone."

echo -e "\t\tFaking install"

make install >> $STDOUT_FILE 2>> $ERROR_FILE

echo -e "\tDone."

popd >> $STDOUT_FILE 2>> $ERROR_FILE

echo -e "Getting application bundle and packaging"

rm -rf aMule.app aMule.zip >> $STDOUT_FILE 2>> $ERROR_FILE

cp -R ${AMULE_FOLDER}/aMule.app . >> $STDOUT_FILE 2>> $ERROR_FILE

find aMule.app \( -name .svn -o -name "Makefile*" -o -name src \) -print0 | xargs -0 rm -rf >> $STDOUT_FILE 2>> $ERROR_FILE

echo -e "Copying i18n files..."
cp -r amule-inst/share/locale aMule.app/Contents/SharedSupport/
echo -e "Done."

. application_packager.sh ${AMULE_FOLDER}/ >> $STDOUT_FILE 2>> $ERROR_FILE

if [ ! -f aMule.zip ]; then
	echo "ERROR: aMule.zip was not created. Please review the output files"
else
	echo "All Done"
fi

# Pop root folder.
popd >> $STDOUT_FILE
