Blob Blame Raw
#!/bin/bash
#
# SynfigStudio build script
# Copyright (c) 2008-2010 Konstantin Dmitriev
#
# This package 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 package 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.

# = Usage: =
#    ./synfigstudio-linux-build.sh [mode] [revision]
#
# where:
#   - [mode] is full|quick|package
#   - [revision] - commit id, branch or tag (package mode only)
#
# To build packages it's required to run this script as root.
#
# = Examples: =
#
# == Standart mode ==
# Configure and (re)build synfigstudio into your homedir:
#    ./synfigstudio-linux-build.sh
# Configure and make clean build synfigstudio into your homedir:
#    ./synfigstudio-linux-build.sh full
# Quick rebuild of synfig (without configure) into your homedir:
#    ./synfigstudio-linux-build.sh quick
#
# == Package mode ==
# Build package from "master" branch:
#    ./synfigstudio-linux-build.sh package
# Build package from "genete_setup_dialog" branch
#    ./synfigstudio-linux-build.sh package origin/genete_setup_dialog
# Build package from commit with "synfigstudio-0.62.00" tag
#    ./synfigstudio-linux-build.sh package synfigstudio-0.62.00
#
# Note: Make sure to run "git clean -f -x -d" after you switch branches.
#
# = TODO =
# - debuginfo packages

RELEASE=8

if [ -z "$PREFIX" ]; then
PREFIX=$HOME/synfig/
fi

PACKAGES_PATH=$HOME/synfig-packages     	# path where to write packages files

if [ -z $BUILDROOT ]; then
PACKAGES_BUILDROOT=$HOME/synfig-buildroot	# path of for build infrastructure
else
PACKAGES_BUILDROOT=$BUILDROOT/synfig-buildroot
fi
if [ -d "$PACKAGES_BUILDROOT" ]; then
PACKAGES_BUILDROOT=`cd $PACKAGES_BUILDROOT; pwd`	# canonify buildroot path
fi

BUILDROOT_VERSION=9
BUILDROOT_LIBRARY_SET_ID=4
MAKE_THREADS=2					#count of threads for make

# full = clean, configure, make
# standart = configure, make
# quick = make
# package = chroot, clean, configure, make
MODE='standart'
OPENGL=0
BREED=
if [ -z $DEBUG ]; then
	export DEBUG=0
fi

export EMAIL='root@synfig.org'

# Bundled libraries
LIBSIGCPP=2.2.10
GLEW=1.5.1
CAIROMM=1.8.0
IMAGEMAGICK=6.8.6
PANGOMM=2.26.3		# required by GTKMM 2.20.3
GTKMM=3.0.0 		# !!! we need Notebook.set_action_widget()
FTGL=2.1.2
FREEGLUT=2.4.0
GTKGLEXT=1.2.0
GTKGLEXTMM=1.2.0
LIBXMLPP=2.22.0
GLIBMM=2.24.2		# required by GTKMM 2.20.3
CAIRO=1.12.0		# required by the cairo render engine 2013-04-01
BOOST=1_53_0

# System libraries
ATK=1.29.4			# required by GTK 2.20.1
GLIB=2.24.2			# required by GLIBMM 2.24.2
GTK=3.0.0			# !!! we need Notebook.set_action_widget()
PIXMAN=0.22.0		# required by CAIRO 1.12.0
PANGO=1.24.5
FONTCONFIG=2.5.0
JACK=0.124.1


GITVERSION=1.7.0   # git version for chroot environment

SYNFIG_REPO_DIR=''
WORKDIR_IS_REPO=0

# Allow overriding PREFIX and/or BREED
if [ -f "./synfigstudio-build.conf" ] ; then
	. "./synfigstudio-build.conf"
fi

# enable ccache for speedup
if which ccache > /dev/null; then
    echo "ccache found! Enabling ccache..."
	
	# set CC/CXX variables if it is not already
	if [ -z $CC ]; then
		export CC=gcc
	fi
	if [ -z $CXX ]; then
		export CXX=g++
	fi

    export CC="ccache $CC"
    export CXX="ccache $CXX"
    echo "CC=$CC"
    echo "CXX=$CXX"
else
    echo "ccache not found..."
fi

MAKE_OPTIONS="-j$MAKE_THREADS --silent LIBTOOLFLAGS=--silent"
CFLAGS="-fdiagnostics-color=always $CFLAGS"
CXXFLAGS="-fdiagnostics-color=always $CXXFLAGS"



set -e

travis_fold_start() {
	if [ -n "$TRAVIS" ]; then
		echo -e "travis_fold:start:$1\033[33;1m$2\033[0m"
	fi
}

travis_fold_end() {

	if [ -n "$TRAVIS" ]; then
		echo -e "\ntravis_fold:end:$1\r"
	fi
}

if (test "$2"); then
	SELECTEDREVISION=$2
else
	SELECTEDREVISION=origin/master
fi

mklibsigcpp()
{
if ! pkg-config sigc\+\+-2.0 --exact-version=${LIBSIGCPP}  --print-errors; then
	pushd /source
	wget -c --no-check-certificate http://ftp.gnome.org/pub/GNOME/sources/libsigc++/${LIBSIGCPP%.*}/libsigc++-${LIBSIGCPP}.tar.bz2
	[ ! -d libsigc++-${LIBSIGCPP} ] && tar -xjf libsigc++-${LIBSIGCPP}.tar.bz2 #&& cd libsigc++-${LIBSIGCPP} && patch -p1 < ../libsigc++-2.0_2.0.18-2.diff && cd ..
	cd libsigc++-${LIBSIGCPP}
	#make clean || true
	./configure --prefix=${PREFIX}/ --includedir=${PREFIX}/include --disable-static --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkglib()
{
if ! pkg-config glib-2.0 --exact-version=${GLIB}  --print-errors; then
	pushd /source
	[ ! -d glib-${GLIB} ] && tar -xjf glib-${GLIB}.tar.bz2
	cd glib-${GLIB}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --disable-static --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkjack()
{
if ! pkg-config jack --exact-version=${JACK}  --print-errors; then
	pushd /source
	apt-get install -y libdb-dev uuid-dev
	[ ! -d jack-audio-connection-kit-${JACK} ] && tar -xzf jack-audio-connection-kit-${JACK}.tar.gz
	cd jack-audio-connection-kit-${JACK}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --disable-static --enable-shared \
		--libdir=/usr/local/lib
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}


mkatk()
{
if ! pkg-config atk --exact-version=${ATK}  --print-errors; then
	pushd /source
	[ ! -d atk-${ATK} ] && tar -xjf atk-${ATK}.tar.bz2
	cd atk-${ATK}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --disable-static --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkglibmm()
{
if ! pkg-config glibmm-2.4 --exact-version=${GLIBMM}  --print-errors; then
	pushd /source
	[ ! -d glibmm-${GLIBMM} ] && tar -xjf glibmm-${GLIBMM}.tar.bz2
	cd glibmm-${GLIBMM}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared --disable-fulldocs
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mklibxmlpp()
{
if ! pkg-config libxml\+\+-2.6 --exact-version=${LIBXMLPP}  --print-errors; then
	pushd /source
	[ ! -d libxml++-${LIBXMLPP} ] && tar -xjf libxml++-${LIBXMLPP}.tar.bz2
	cd libxml++-${LIBXMLPP}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkimagemagick()
{
PKG_NAME=ImageMagick
PKG_VERSION="${IMAGEMAGICK}-10"
TAREXT=bz2
if ! pkg-config ImageMagick --exact-version=${IMAGEMAGICK}  --print-errors; then
	pushd /source
	[ -e ${PKG_NAME}-${PKG_VERSION}.tar.${TAREXT} ] || wget http://www.imagemagick.org/download/legacy/${PKG_NAME}-${PKG_VERSION}.tar.${TAREXT}
	[ ! -d ${PKG_NAME}-${PKG_VERSION} ] && tar -xjf ${PKG_NAME}-${PKG_VERSION}.tar.bz2 # && cd ${PKG_NAME}-${PKG_VERSION} && patch -p1 < ../ImageMagick-6.4.0-multilib.patch && cd ..
	cd ${PKG_NAME}-${PKG_VERSION}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared \
		--with-modules \
		--without-perl \
		--without-x \
		--with-threads \
		--with-magick_plus_plus
	sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
	sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkglew()
{
[ ! -d glew-${GLEW} ] && tar -xzf glew-${GLEW}.tar.gz && cd glew && patch -p1 < glew-${GLEW}-makefile.patch && cd ..
	pushd /source
	cd glew
	#[[ $DOCLEAN == 1 ]] && make clean || true
	sed -i -e 's/\r//g' config/config.guess
	make -j$MAKE_THREADS
	make install GLEW_DEST=${PREFIX} libdir=/lib bindir=/bin  includedir=/include
	cd ..
	popd
}

mkfontconfig()
{
if ! pkg-config fontconfig --exact-version=${FONTCONFIG}  --print-errors; then
	pushd /source
	[ ! -d fontconfig-${FONTCONFIG} ] && tar -xzf fontconfig-${FONTCONFIG}.tar.gz
	cd fontconfig-${FONTCONFIG}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --disable-static --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
fi
}

mkpixman()
{
if ! pkg-config pixman-1 --exact-version=${PIXMAN}  --print-errors; then
	pushd /source
	[ ! -d pixman-${PIXMAN} ] && tar -xzf pixman-${PIXMAN}.tar.gz
	cd pixman-${PIXMAN}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --disable-static --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
fi
}

mkcairo()
{
if ! pkg-config cairo --exact-version=${CAIRO}  --print-errors; then
	pushd /source
	[ ! -d cairo-${CAIRO} ] && tar -xzf cairo-${CAIRO}.tar.gz
	cd cairo-${CAIRO}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} \
		--disable-static 	\
		--enable-warnings 	\
		--enable-xlib 		\
		--enable-freetype 	\
	    --enable-gobject    \
		--disable-gtk-doc
	make -j$MAKE_THREADS
	make install
	cd ..
fi
}

mkcairomm()
{
if ! pkg-config cairomm-1.0 --exact-version=${CAIROMM}  --print-errors; then
	pushd /source
	[ ! -d cairomm-${CAIROMM} ] && tar -xzf cairomm-${CAIROMM}.tar.gz
	cd cairomm-${CAIROMM}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared --enable-docs=no
	make -j$MAKE_THREADS
	make install
	cd ..
fi
}

mkpango()
{
if ! pkg-config pango --exact-version=${PANGO}  --print-errors; then
	pushd /source
	[ ! -d pango-${PANGO} ] && tar -xjf pango-${PANGO}.tar.bz2
	cd pango-${PANGO}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure  --disable-static --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkpangomm()
{
if ! pkg-config pangomm-1.4 --exact-version=${PANGOMM}  --print-errors; then
	pushd /source
	[ ! -d pangomm-${PANGOMM} ] && tar -xjf pangomm-${PANGOMM}.tar.bz2
	cd pangomm-${PANGOMM}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared --disable-docs
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkgtk()
{
if ! pkg-config gtk\+-3.0 --exact-version=${GTK}  --print-errors; then
	pushd /source
	[ ! -d gtk\+-${GTK} ] && tar -xjf gtk\+-${GTK}.tar.bz2
	cd gtk\+-${GTK}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --disable-static --enable-shared --disable-examples --disable-demos --disable-docs
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkgtkmm()
{
if ! pkg-config gtkmm-3.0 --exact-version=${GTKMM}  --print-errors; then
	pushd /source
	[ ! -d gtkmm-${GTKMM} ] && tar -xjf gtkmm-${GTKMM}.tar.bz2
	cd gtkmm-${GTKMM}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared --disable-examples --disable-demos --disable-docs
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
fi
}

mkfreeglut()
{
	pushd /source
	[ ! -d freeglut-${FREEGLUT} ] && tar -xzf freeglut-${FREEGLUT}.tar.gz
	cd freeglut-${FREEGLUT}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static  --disable-warnings --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
}

mkftgl()
{
	pushd /source
	if [ ! -d ftgl-${FTGL} ]; then
		tar -xjf ftgl-${FTGL}.tar.bz2
		cd FTGL
		patch -p1 -b < ftgl-2.1.2-destdir.patch
		patch -p1 -b < ftgl-2.1.2-Glyph-g++_41.patch
		patch -p1 -b < ftgl-2.1.2-pc_req.patch
		patch -p1 -b < ftgl-2.1.2-rpath_FTGLDemo.patch
		patch -p1 -b < ftgl-2.1.2-ttf_font.patch
		sed -i.fixed_version -e 's|2.0.5|%{version}|g' unix/configure.ac unix/configure
		cd ..
	fi
	cd FTGL
	cd unix
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared --with-gl-inc=${PREFIX}/include  --with-gl-lib=${PREFIX}/lib  --with-glut-inc=${PREFIX}/include  --with-glut-lib=${PREFIX}/lib  --with-x
	make all -j$MAKE_THREADS
	make install
	cd ..
	popd
}

mkgtkglext()
{
	pushd /source
	[ ! -d gtkglext-${GTKGLEXT} ] && tar -xjf gtkglext-${GTKGLEXT}.tar.bz2
	cd gtkglext-${GTKGLEXT}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include  --disable-gtk-doc --disable-static  --enable-shared
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
}

mkgtkglextmm()
{
	pushd /source
	[ ! -d gtkglextmm-${GTKGLEXTMM} ] && tar -xjf gtkglextmm-${GTKGLEXTMM}.tar.bz2 && cd gtkglextmm-${GTKGLEXTMM} && patch -p1 < gtkglextmm-1.2.0-aclocal.diff && cd ..
	cd gtkglextmm-${GTKGLEXTMM}
	#[[ $DOCLEAN == 1 ]] && make clean || true
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include  --disable-dependency-tracking --disable-static  --enable-shared
	make -j$MAKE_THREADS
	make install
	popd
cd ..
}

mkgit()
{
	pushd /source
	[ ! -d git-${GITVERSION} ] && tar -xjf git-${GITVERSION}.tar.bz2
	cd git-${GITVERSION}
	./configure
	make -j$MAKE_THREADS
	make install
	cd ..
	popd
}

mkboost()
{
if ! cat /usr/local/include/boost/version.hpp |egrep "BOOST_LIB_VERSION \"${BOOST%_*}\""; then
	pushd /source
	[ ! -d boost-${BOOST} ] && tar -xjf boost_${BOOST}.tar.bz2
	cd boost_${BOOST}
	./bootstrap.sh
	./b2 || true
	./b2 install || true
	cd ..
	popd
fi
cp /usr/local/lib/libboost_program_options.so.1.53.0 $PREFIX/lib/
}

mkETL()
{
travis_fold_start ETL "Building ETL"

if [ -f ${SYNFIG_REPO_DIR}/ETL/trunk/configure.ac ]; then
	pushd ${SYNFIG_REPO_DIR}/ETL/trunk
else
	pushd ${SYNFIG_REPO_DIR}/ETL
fi


if ( [[ $MODE == 'package' ]] || [[ $MODE == 'full' ]] ); then
	echo "Cleaning source tree..."
	make clean || true
fi


if [[ $MODE != 'quick' ]]; then
	echo "Going to configure..."
	rm -f aclocal.m4
	autoreconf --install --force
	./configure --prefix=${PREFIX} --includedir=${PREFIX}/include $DEBUG CFLAGS=$CFLAGS CXXFLAGS=$CXXFLAGS
fi
make $MAKE_OPTIONS
sed -i "s|^Cflags: -I\\\${includedir}|Cflags: -I$REPO_DIR\/ETL -I\\\${includedir}|" ETL.pc
make install

popd
travis_fold_end ETL
}

mksynfig()
{
travis_fold_start SynfigCore "Building Synfig Core"
if [ -d ${SYNFIG_REPO_DIR}/synfig-core/trunk/configure.ac ]; then
	pushd ${SYNFIG_REPO_DIR}/synfig-core/trunk
else
	pushd ${SYNFIG_REPO_DIR}/synfig-core
fi

if [[ $MODE == 'package' ]] || [[ $MODE == 'full' ]]; then
    make clean || true
fi

if [[ $MODE != 'quick' ]]; then
    /bin/sh ./bootstrap.sh
	if [ -e /etc/debian_version ] && [ -z $BOOST_CONFIGURE_OPTIONS ]; then
		# Debian/Ubuntu multiarch
		MULTIARCH_LIBDIR="/usr/lib/`uname -m`-linux-gnu/"
		if [ -e "${MULTIARCH_LIBDIR}/libboost_program_options.so" ]; then
			export BOOST_CONFIGURE_OPTIONS="--with-boost-libdir=$MULTIARCH_LIBDIR"
		fi
	fi
	export CONFIG_SHELL=/bin/bash
	/bin/bash ./configure --prefix=${PREFIX} \
		--includedir=${PREFIX}/include \
		--disable-static --enable-shared \
		--with-magickpp \
		--without-libavcodec \
		--without-included-ltdl \
		$BOOST_CONFIGURE_OPTIONS \
		$DEBUG \
		CFLAGS=$CFLAGS \
		CXXFLAGS=$CXXFLAGS
fi

#It looks like mod_libavcodec causes segfault on synfig-core when rendering to png.
#Tested on: ffmpeg-0.4.9-0.52.20080908.fc10.x86_64.

#if [[ $GIT == 1 ]]; then
#	export CFLAGS=-I/opt/synfig/include/GL/
#	export LDFLAGS=-L/opt/synfig/lib/
#else
#	export CFLAGS=''
#	export LDFLAGS=''
#fi
make $MAKE_OPTIONS
sed -i "s|^includedir=.*$|includedir=$SYNFIG_REPO_DIR\/synfig-core\/src|" synfig.pc
make install

popd
travis_fold_end SynfigCore
}

mksynfigstudio()
{
travis_fold_start SynfigStudio "Building Synfig Studio"
if [ -d ${SYNFIG_REPO_DIR}/synfig-studio/trunk/configure.ac ]; then
	pushd ${SYNFIG_REPO_DIR}/synfig-studio/trunk
else
	pushd ${SYNFIG_REPO_DIR}/synfig-studio
fi

if [[ $MODE == 'package' ]] || [[ $MODE == 'full' ]]; then
    make clean || true
fi

if [[ $MODE == 'package' ]]; then
	CONFIGURE_PACKAGE_OPTIONS='--disable-update-mimedb'
fi

if [[ $MODE != 'quick' ]]; then
	/bin/sh ./bootstrap.sh
	/bin/sh ./configure --prefix=${PREFIX} --includedir=${PREFIX}/include --disable-static --enable-shared --enable-jack --enable-warnings=max $DEBUG $CONFIGURE_PACKAGE_OPTIONS CFLAGS=$CFLAGS CXXFLAGS=$CXXFLAGS
fi

make $MAKE_OPTIONS
make install

for n in AUTHORS COPYING NEWS README
do
  	cp -f $n ${PREFIX}
done

#if [ -e synfigstudio-cph-monitor ]; then
#	cp -f synfigstudio-cph-monitor ${PREFIX}/bin/
#	chmod a+x ${PREFIX}/bin/synfigstudio-cph-monitor
#fi

popd
travis_fold_end SynfigStudio
}

mkpack()
{
	[ -d /packages ] || mkdir /packages

	# bundle libpng
	rm -f ${PREFIX}/lib/libpng* || true
	cp -av /usr/lib/libpng*.so* ${PREFIX}/lib
	# bundle libjasper
	rm -f ${PREFIX}/lib/libjasper* || true
	cp -av /usr/lib/libjasper*.so* ${PREFIX}/lib
	# bundle libltdl
	rm -f ${PREFIX}/lib/libltdl* || true
	cp -av /usr/lib/libltdl*.so* ${PREFIX}/lib

	# A place for optional libs
	[ -e ${PREFIX}/lib.extra ] || mkdir -p ${PREFIX}/lib.extra
	# bundle optional libjack
	rm -f ${PREFIX}/lib.extra/libjack* || true
	cp -av /usr/local/lib/libjack.so* ${PREFIX}/lib.extra
	rm -f ${PREFIX}/lib.extra/libdb-4* || true
	cp -av /usr/lib/libdb-4*.so ${PREFIX}/lib.extra
	
	cat > $PREFIX/synfig <<EOF
#!/bin/sh

PREFIX="/opt/synfig"

export LD_LIBRARY_PATH=\${PREFIX}/lib:\$LD_LIBRARY_PATH
export SYNFIG_ROOT=\${PREFIX}/
export SYNFIG_MODULE_LIST=\${PREFIX}/etc/synfig_modules.cfg

\$PREFIX/bin/synfig "\$@"
EOF
	chmod a+x $PREFIX/synfig
	
	cat > $PREFIX/synfigstudio <<EOF
#!/bin/sh

PREFIX="/opt/synfig"

# Check if this system have JACK installed
if ( ! ldconfig -p | grep libjack.so >/dev/null ) || ( ! which jackd >/dev/null ) ; then
	# No JACK, so disable this functionality.
	# (The bundled libjack won't work correctly anyway).
	export SYNFIG_DISABLE_JACK=1
	export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\${PREFIX}/lib.extra
fi

export LD_LIBRARY_PATH=\${PREFIX}/lib:\$LD_LIBRARY_PATH
export SYNFIG_ROOT=\${PREFIX}/
export SYNFIG_MODULE_LIST=\${PREFIX}/etc/synfig_modules.cfg

\$PREFIX/bin/synfigstudio "\$@"
EOF
	chmod a+x $PREFIX/synfigstudio
	
	#== tar.bz2 ==
	TBZPREFIX=/tmp/synfigstudio-${VERSION}-${REVISION}.$BREED.$RELEASE.${ARCH}
	rm -rf $TBZPREFIX
	mkdir -p $TBZPREFIX
	cp -r  ${PREFIX}/* $TBZPREFIX

	if [[ $DEBUG != '' ]]; then
		GDB="which gdb && xterm -e  gdb -ex run -ex quit \$PREFIX/bin/synfig \"\$@\" || "
	else
		GDB=''
	fi

	#binaries
	cat > $TBZPREFIX/synfig <<EOF
#!/bin/sh

PREFIX=\`dirname \$0\`
PREFIX=\`cd \$PREFIX; pwd\`
export LD_LIBRARY_PATH=\${PREFIX}/lib:\$LD_LIBRARY_PATH
export SYNFIG_ROOT=\${PREFIX}/
export SYNFIG_MODULE_LIST=\${PREFIX}/etc/synfig_modules.cfg

$GDB\$PREFIX/bin/synfig "\$@"
EOF
	if [[ $DEBUG != '' ]]; then
		GDB="which gdb && xterm -e  gdb -ex run -ex quit \$PREFIX/bin/synfigstudio \$@ || "
	else
		GDB=''
	fi
	cat > $TBZPREFIX/synfigstudio <<EOF
#!/bin/sh

PREFIX=\`dirname \$0\`
PREFIX=\`cd \$PREFIX; pwd\`

# Check if this system have JACK installed
if ( ! ldconfig -p | grep libjack.so >/dev/null ) || ( ! which jackd >/dev/null ) ; then
	# No JACK, so disable this functionality.
	# (The bundled libjack won't work correctly anyway).
	export SYNFIG_DISABLE_JACK=1
	export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\${PREFIX}/lib.extra
fi

export LD_LIBRARY_PATH=\${PREFIX}/lib:\$LD_LIBRARY_PATH
export SYNFIG_ROOT=\${PREFIX}/
export SYNFIG_MODULE_LIST=\${PREFIX}/etc/synfig_modules.cfg

$GDB\$PREFIX/bin/synfigstudio "\$@"
EOF
	chmod a+x $TBZPREFIX/synfig
	chmod a+x $TBZPREFIX/synfigstudio

	#cleaning devel stuff
	mkdir $TBZPREFIX/bin.tmp
	mv $TBZPREFIX/bin/synfig $TBZPREFIX/bin.tmp/synfig
	mv $TBZPREFIX/bin/synfigstudio $TBZPREFIX/bin.tmp/synfigstudio
	rm -rf $TBZPREFIX/bin
	mv $TBZPREFIX/bin.tmp $TBZPREFIX/bin

	rm -f $TBZPREFIX/lib/*.la
	rm -f $TBZPREFIX/lib/*.a
	rm -f $TBZPREFIX/lib/cairo/*.la
	rm -rf $TBZPREFIX/include
	rm -rf $TBZPREFIX/lib/gdkmm-3.0
	rm -rf $TBZPREFIX/lib/libxml++-2.6
	rm -rf $TBZPREFIX/lib/glibmm-2.4
	rm -rf $TBZPREFIX/lib/pangomm-1.4
	rm -rf $TBZPREFIX/lib/gtkmm-3.0
	rm -rf $TBZPREFIX/lib/pkgconfig
	rm -rf $TBZPREFIX/lib/sigc++-2.0
	rm -rf $TBZPREFIX/share/doc
	rm -rf $TBZPREFIX/share/devhelp
	rm -rf $TBZPREFIX/share/gtk-doc
	rm -rf $TBZPREFIX/share/aclocal
	rm -rf $TBZPREFIX/share/ImageMagick-6.4.0
	rm -rf $TBZPREFIX/share/man

	rm -f /packages/synfigstudio-${VERSION}-${REVISION}.$BREED.$RELEASE.${ARCH}.tar.bz2
	pushd $TBZPREFIX/../
	tar cjf /packages/synfigstudio-${VERSION}-${REVISION}.$BREED.$RELEASE.${ARCH}.tar.bz2 synfigstudio-${VERSION}-${REVISION}.$BREED.$RELEASE.${ARCH}
	popd
	rm -rf $TBZPREFIX

	#== rpm ==
    cat > synfigstudio.spec << EOF
%define __spec_install_post /bin/true

Name:           synfigstudio
Version:        ${VERSION}
Release:        ${REVISION}.${BREED}.${RELEASE}
Summary:        Film-Quality 2D Vector Animation package
Group:          Applications/Graphics
License:        GPL
URL:            http://www.synfig.org/
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Obsoletes:       synfig ETL
AutoReqProv: no


%description
Synfig Animation Studio is a powerful, industrial-strength vector-based
2D animation software, designed from the ground-up for producing
feature-film quality animation with fewer people and resources.
It eliminates the need for tweening, preventing the need to hand-draw
each frame. Synfig features spatial and temporal resolution independence
(sharp and smooth at any resolution or framerate), high dynamic range
images, and a flexible plugin system.


%prep


%build

%install
rm -rf \$RPM_BUILD_ROOT
mkdir -p \$RPM_BUILD_ROOT/${PREFIX}
cp -r  ${PREFIX}/* \$RPM_BUILD_ROOT/${PREFIX}
mkdir -p \$RPM_BUILD_ROOT/usr/share
mv \$RPM_BUILD_ROOT/${PREFIX}/share/applications \$RPM_BUILD_ROOT/usr/share
mv \$RPM_BUILD_ROOT/${PREFIX}/share/icons \$RPM_BUILD_ROOT/usr/share
mv \$RPM_BUILD_ROOT/${PREFIX}/share/mime \$RPM_BUILD_ROOT/usr/share
mkdir -p \$RPM_BUILD_ROOT/usr/share/mime-info
ln -sf ${PREFIX}/share/mime-info/synfigstudio.keys \$RPM_BUILD_ROOT/usr/share/mime-info/synfigstudio.keys
ln -sf ${PREFIX}/share/mime-info/synfigstudio.mime \$RPM_BUILD_ROOT/usr/share/mime-info/synfigstudio.mime
mkdir -p \$RPM_BUILD_ROOT/usr/share/pixmaps
ln -sf ${PREFIX}/share/pixmaps/sif_icon.png \$RPM_BUILD_ROOT/usr/share/pixmaps/sif_icon.png
ln -sf ${PREFIX}/share/pixmaps/synfig_icon.png \$RPM_BUILD_ROOT/usr/share/pixmaps/synfig_icon.png
mkdir -p \$RPM_BUILD_ROOT/usr/bin
cp \$RPM_BUILD_ROOT/${PREFIX}/synfig \$RPM_BUILD_ROOT/usr/bin/
cp \$RPM_BUILD_ROOT/${PREFIX}/synfigstudio \$RPM_BUILD_ROOT/usr/bin/

#if [ -e \$RPM_BUILD_ROOT/${PREFIX}/bin/synfigstudio-cph-monitor ]; then
#mv \$RPM_BUILD_ROOT/${PREFIX}/bin/synfigstudio-cph-monitor \$RPM_BUILD_ROOT/usr/bin/
#cat > \$RPM_BUILD_ROOT/usr/share/applications/synfigstudio-cph-monitor.desktop << EOD
#[Desktop Entry]
#Encoding=UTF-8
#Name=Synfig Studio CPH monitor
#Comment=This application collecting statistics about synfig crashes
#Exec=synfigstudio-cph-monitor
#Icon=terminal.png
#Terminal=true
#Type=Application
#Categories=Graphics;Application;
#X-Desktop-File-Install-Version=0.15
#EOD
#fi

#cleaning devel stuff
rm -f \$RPM_BUILD_ROOT/${PREFIX}/lib/*.la
rm -f \$RPM_BUILD_ROOT/${PREFIX}/lib/*.a
rm -f \$RPM_BUILD_ROOT/${PREFIX}/lib/cairo/*.la
#rm -rf \$RPM_BUILD_ROOT/${PREFIX}/bin
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/include
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/lib/gdkmm-3.0
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/lib/libxml++-2.6
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/lib/glibmm-2.4
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/lib/gtkmm-3.0
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/lib/pangomm-1.4
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/lib/pkgconfig
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/lib/sigc++-2.0
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/share/doc
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/share/devhelp
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/share/gtk-doc
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/share/aclocal
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/share/ImageMagick-6.4.0
rm -rf \$RPM_BUILD_ROOT/${PREFIX}/share/man


%clean
rm -rf \$RPM_BUILD_ROOT

%post
if [ -x /usr/bin/update-mime-database ]; then
  update-mime-database /usr/share/mime
fi
if [ -x /usr/bin/update-desktop-database ]; then
  update-desktop-database
fi

%postun
if [ -x /usr/bin/update-mime-database ]; then
  update-mime-database /usr/share/mime
fi
if [ -x /usr/bin/update-desktop-database ]; then
  update-desktop-database
fi

%files
%defattr(-,root,root,-)
$PREFIX
/usr/share/*
/usr/bin/*

%changelog
* Sat Mar 21 2009 Konstantin Dmitriev <ksee.zelgadis@gmail.com> - 0.61.09-2354.morevnapackage.1
- Update to SVN2354
- Include ImageMagick-c++

* Wed Jan 14 2009 Konstantin Dmitriev <ksee.zelgadis@gmail.com> - 0.61.09-2316.morevnapackage.1
- First release

EOF
    rpmbuild -bb synfigstudio.spec

    #cp /usr/src/redhat/RPMS/$ARCH/synfigstudio-${VERSION}-${REVISION}.${BREED}.$RELEASE.${ARCH}.rpm ../
    cp /usr/src/rpm/RPMS/$ARCH/synfigstudio-${VERSION}-${REVISION}.${BREED}.$RELEASE.${ARCH}.rpm /packages/
    pushd /packages/
    alien -k --scripts synfigstudio-${VERSION}-${REVISION}.${BREED}.$RELEASE.${ARCH}.rpm
    rm -rf synfigstudio-${VERSION}
    popd
}

initialize()
{
	if [[ $DEBUG == 1 ]]; then
		DEBUG='--enable-debug --enable-optimization=0'
	else
		DEBUG=''
	fi

	if [[ $MODE == 'package' ]]; then
		PREFIX="/opt/synfig"
	fi

	if [[ $MODE == 'package' ]] && [[ `cat /etc/chroot.id` == "Synfig Packages Buildroot v${BUILDROOT_VERSION}" ]]; then
		SYNFIG_REPO_DIR="/source/synfig.git"

		which git || mkgit

		pushd $SYNFIG_REPO_DIR
		git fetch
		git reset --hard HEAD
		#we can't switch directly to specified commit wit old git, so let's create temporary branch:
		#git checkout master || ( git branch -f master && git checkout master )
		#git branch -f __build $SELECTEDREVISION
		#git checkout __build
		git checkout $SELECTEDREVISION
		VERSION=`cat synfig-core/configure.ac |egrep "AC_INIT\(\[Synfig Core\],"| sed "s|.*Core\],\[||" | sed "s|\],\[.*||"`
		if [ -z $BREED ]; then
			BREED="`git branch -a --no-color --contains HEAD | sed -e s/\*\ // | sed -e s/\(no\ branch\)// | tr '\n' ' ' | tr -s ' ' | sed s/^' '//`"
			if ( echo $BREED | egrep origin/master > /dev/null ); then
				#give a priority to master branch
				BREED='master'
			else
				BREED=`echo $BREED | cut -d ' ' -f 1`
				BREED=${BREED##*/}
			fi
			BREED=${BREED%_master}
		fi
		if [[ ${VERSION##*-RC} != ${VERSION} ]]; then
			#if [[ $BREED == 'master' ]]; then
				BREED=rc${VERSION##*-RC}
			#else
			#	BREED=rc${VERSION##*-RC}.$BREED
			#fi
			VERSION=${VERSION%%-*}
		fi
		[[ $DEBUG == 1 ]] && BREED=${BREED}.dbg
		BREED=`echo $BREED | tr _ . | tr - .`	# No "-" or "_" characters, becuse RPM and DEB complain
		REVISION=`git show --pretty=format:%ci HEAD |  head -c 10 | tr -d '-'`
		echo
		echo
		echo "BUILDING synfigstudio-$VERSION-$REVISION.$BREED.$RELEASE"
		echo
		echo
		sleep 5
		popd

		#Trick to detect arch under chroot
		#ARCH=`rpm -q --queryformat='%{arch}\n' e2fsprogs`
		MACHINE_TYPE=`uname -m`
		case ${MACHINE_TYPE} in
			i586)
			ARCH=i386;;
			i686)
			ARCH=i386;;
			*)
			ARCH=${MACHINE_TYPE};;
		esac
	else
		#detecting repo
		SCRIPTPATH=`dirname "$0"`
		pushd "$SCRIPTPATH"
		if git rev-parse --git-dir >/dev/null; then
			SYNFIG_REPO_DIR=$(dirname `git rev-parse --git-dir`)
			pushd "$SYNFIG_REPO_DIR" > /dev/null
			SYNFIG_REPO_DIR=`pwd`
			popd  > /dev/null
			WORKDIR_IS_REPO=1
		fi
		popd > /dev/null
	fi

	#export PREFIX=/opt/synfig
	export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig:${PREFIX}/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib/`uname -i`-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH
	export PATH=${PREFIX}/bin:$PATH
	export LD_LIBRARY_PATH=${PREFIX}/lib:${PREFIX}/lib64:/usr/local/lib:$LD_LIBRARY_PATH
	export LDFLAGS="-Wl,-rpath -Wl,\\\$\$ORIGIN/lib"
}

mk()
{
	#get_dependencies
	initialize 
	
	if [[ $WORKDIR_IS_REPO == 0 ]]; then
		SYNFIG_REPO_DIR=`pwd`/synfig.git/
		git clone git://github.com/synfig/synfig.git ${SYNFIG_REPO_DIR}
	fi

	mkETL
	mksynfig
	mksynfigstudio
}

mkpackage()
{
	#check if we already in chroot
	if [[ `cat /etc/chroot.id` == "Synfig Packages Buildroot v${BUILDROOT_VERSION}" ]]; then
		echo "We are in chroot now."

		echo "[user]"  > /root/.gitconfig
		echo "email = packages@synfig.org"  >> /root/.gitconfig
		echo "name = Synfig Packager" >> /root/.gitconfig
		
		# we need newer intltool
		dpkg -i /source/intltool_0.41.1-1_all.deb

		#system libs
		mkglib
		mkfontconfig
		mkatk
		mkpixman
		mkcairo
		mkpango
		mkgtk
		mkjack


		#synfig-core deps
		mklibsigcpp
		mkglibmm
		mklibxmlpp
		if [[ $OPENGL == 1 ]]; then
			mkglew
		fi
		mkimagemagick
		mkboost

		#synfig-studio deps
		mkcairomm
		mkpangomm
		mkgtkmm
		if [[ $OPENGL == 1 ]]; then
			mkfreeglut
			mkftgl
			mkgtkglext
			mkgtkglextmm
		fi

		mkETL
		mksynfig
		mksynfigstudio

		mkpack
	else
		[ -d $HOME/synfig-packages ] || mkdir -p $HOME/synfig-packages
		#DEB_LIST="build-essential,autoconf,automake,libltdl3-dev,libtool,gettext,libpng12-dev,libjpeg62-dev,libfreetype6-dev,libfontconfig1-dev,libgtk3.0-dev,libxml2-dev,bzip2,rpm,alien,xsltproc"
		for ARCH in i386 amd64; do
		if [[ $ARCH == 'i386' ]];then
			SETARCH='linux32'
		else
			SETARCH='linux64'
		fi
		
		# If chroot version changed -> reset existing buildroot
		if [[ `cat $PACKAGES_BUILDROOT.$ARCH/etc/chroot.id` != "Synfig Packages Buildroot v${BUILDROOT_VERSION}" ]]; then
			echo "======================= !!! ======================"
			echo "   Buildroot version changed. Force update..."
			echo "======================= !!! ======================"
			if [ -e $PACKAGES_BUILDROOT.$ARCH/ ]; then
				rm -rf $PACKAGES_BUILDROOT.$ARCH/
			fi
			debootstrap --arch=$ARCH --variant=buildd  --include=sudo lenny $PACKAGES_BUILDROOT.$ARCH http://archive.debian.org/debian
			#debootstrap --arch=$ARCH --variant=buildd  --include=sudo squeeze $PACKAGES_BUILDROOT.$ARCH http://ftp.de.debian.org/debian
		fi
		#set chroot ID
		echo "Synfig Packages Buildroot v${BUILDROOT_VERSION}" > $PACKAGES_BUILDROOT.$ARCH/etc/chroot.id
		
		# If library set changed -> remove all existing libraries to force rebuild
		if [[ `cat $PACKAGES_BUILDROOT.$ARCH/etc/chroot_libset.id` != "${BUILDROOT_LIBRARY_SET_ID}" ]]; then
			echo "======================= !!! ======================"
			echo "   Library set is changed. Force cleanup..."
			echo "======================= !!! ======================"
			sleep 5
			echo "Cleaning $PACKAGES_BUILDROOT.$ARCH/usr/local ..."
			rm -rf $PACKAGES_BUILDROOT.$ARCH/usr/local || true
			echo "Cleaning $PACKAGES_BUILDROOT.$ARCH/$PREFIX ..."
			rm -rf $PACKAGES_BUILDROOT.$ARCH/$PREFIX || true
			echo
		fi
		#set library set ID
		echo "${BUILDROOT_LIBRARY_SET_ID}" > $PACKAGES_BUILDROOT.$ARCH/etc/chroot_libset.id
		
		cp -f $0 $PACKAGES_BUILDROOT.$ARCH/build.sh
		
		#resolv.conf
		cp -f /etc/resolv.conf $PACKAGES_BUILDROOT.$ARCH/etc/resolv.conf
		#keep proxy settings
		if ! [ -z $http_proxy ]; then
			#echo "export http_proxy=\"$http_proxy\";" >> $PACKAGES_BUILDROOT.$ARCH/root/.bashrc
			#echo "echo 'proxy export done';" >> $PACKAGES_BUILDROOT.$ARCH/root/.bashrc
			echo "Acquire::http::Proxy \"$http_proxy\";" > $PACKAGES_BUILDROOT.$ARCH/etc/apt/apt.conf
		fi
		#fetch sources to cache
		if [ -d $PACKAGES_BUILDROOT.$ARCH/source/synfig.git ]; then
		    rm -rf $PACKAGES_BUILDROOT.$ARCH/source/synfig.git || true
		fi
		if [ -d $PACKAGES_BUILDROOT/synfig.git ]; then
			if [[ $WORKDIR_IS_REPO == 1 ]]; then
				rm -rf "$PACKAGES_BUILDROOT/synfig.git"
			fi
		fi
		if ! [ -d $PACKAGES_BUILDROOT/synfig.git ]; then
			if [[ $WORKDIR_IS_REPO == 1 ]]; then
				git clone $SYNFIG_REPO_DIR $PACKAGES_BUILDROOT/synfig.git
				sed -i 's|url = .*|url = git://github.com/synfig/synfig.git|' $PACKAGES_BUILDROOT/synfig.git/.git/config
			else
				git clone git://github.com/synfig/synfig.git $PACKAGES_BUILDROOT/synfig.git
			fi
		fi
		pushd $PACKAGES_BUILDROOT
		cd synfig.git && git fetch && cd ..
		#[ ! -e git-$GITVERSION.tar.bz2 ] && wget -c http://kernel.org/pub/software/scm/git/git-$GITVERSION.tar.bz2
		rsync -av rsync://download.tuxfamily.org/pub/synfig/packages/sources/base/ ./
		if [[ $OPENGL == 1 ]]; then
			rsync -av rsync://download.tuxfamily.org/pub/synfig/packages/sources/opengl/ ./
		fi
		popd
		#copy sources
		[ -d $PACKAGES_BUILDROOT.$ARCH/source ] || mkdir -p $PACKAGES_BUILDROOT.$ARCH/source
		cp -rf $PACKAGES_BUILDROOT/* $PACKAGES_BUILDROOT.$ARCH/source/

		#set up the /proc link
		echo "Mounting proc..."
		if ! ( mount | egrep "proc on $PACKAGES_BUILDROOT.${ARCH}/proc" ); then
			mount -o bind /proc $PACKAGES_BUILDROOT.$ARCH/proc
			echo "   Done."
		else
			echo "   Already mounted. Skipping."
		fi

		#go to chroot
		$SETARCH chroot $PACKAGES_BUILDROOT.$ARCH env http_proxy=$http_proxy bash /build.sh package $SELECTEDREVISION

		umount $PACKAGES_BUILDROOT.$ARCH/proc || true

		mv -f $PACKAGES_BUILDROOT.$ARCH/packages/* $PACKAGES_PATH
		done
		echo
		echo
		find $PACKAGES_PATH/synfigstudio* -maxdepth 1
		echo "     DONE BUILDING PACKAGES INTO $HOME/synfig-packages"
		echo
	fi
}

###=================================== MAIN ======================================

if [ -z $1 ]; then
	ARG='standart'
else
	ARG=$1
fi

case $ARG in
	full)
		MODE='full'
		mk
		exit;;
	standart)
		MODE='standart'
		mk
		exit;;
	quick)
		MODE='quick'
		mk
		exit;;
	package)
		export MODE='package'
		#get_dependencies
		./install-requirements-linux.sh
		initialize
		mk$ARG
		exit;;
	*)
		if [ -e /etc/chroot.id ]; then
			MODE='package'
		else
			MODE='standart'
		fi
		initialize
		mk$ARG
		exit;;
esac