All pastes #418171 Raw Edit

Unnamed

public text v1 · immutable
#418171 ·published 2007-03-31 13:18 UTC
rendered paste body
#!/bin/bash

#############################################################################
# This script is based on the very good prework from trickster.             #
# It is a result of the work from the people from #e.de (irc.freenode.net). #
# It will checkout the cvs and compile e17.                                 #
#                                                                           #
# License: BSD licence                                                      #
# Get the latest version at http://omicron.homeip.net/projects/#easy_e17.sh #
# Rewrite by morlenxus (morlenxus@gmx.net)                                  #
#                                                                           #
last_changes="2007-01-15"                                                   #
version="1.1.2"                                                             #
#############################################################################


# Edit these variables if you like:
install_path="/opt/e17"
cvs_path="$HOME/e17_cvs"
tmp_path="/tmp/easy_e17"
logs_path="$tmp_path/install_logs"
cvs_srv=":pserver:anonymous@anoncvs.enlightenment.org:/var/cvs/e";

efl="imlib2 edb eet evas ecore efreet epeg embryo edje epsilon esmart emotion engrave etk ewl exml enhance"
apps="e entrance eclair evfs edje_viewer edje_editor emphasis empower entrance_edit_gui entropy ephoto estickies exhibit extrackt"
apps_misc="engage scrot rage"
e17_modules="alarm bling cpu deskshow emu flame forecasts language mail mem mixer moon net photo rain screenshot slideshow snow taskbar tclock uptime weather winselector wlan"

os=$(uname)       
autogen_args=""		# evas:--disable-gl-x11,ecore:--disable-ecore-evas-gl
max_backoff=360		# Actual maximum backoff time is roughly this number in seconds.
threads=2			# make -j <threads>
nice_level=0		# nice level (19 == low, -20 == high)


#############################################################################
function logo ()
{
	clear
	echo -e "\033[1m-------------------------------\033[7m Easy_e17.sh $version \033[0m\033[1m------------------------------\033[0m"
	echo -e "\033[1m  Developers:\033[0m      Brian 'morlenxus' Miculcy"
	echo -e "                   David 'onefang' Seikel"
	echo -e "\033[1m  Contributors:\033[0m    Tim 'wtfoo' Zebulla"
	echo -e "                   Daniel G. '_ke' Siegel"
	echo -e "                   Stefan 'slax' Langner"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo -e "\033[1m  Updates:\033[0m         http://omicron.homeip.net/projects/#easy_e17.sh"
	echo -e "\033[1m  Support:\033[0m         #e.de, #get-e (irc.freenode.net)"
	echo -e "                   morlenxus@gmx.net"
	echo -e "\033[1m  Patches:\033[0m         Generally accepted, please contact me!"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo 
	echo
	echo -e "\033[1m-----------------------------\033[7m Current Configuration \033[0m\033[1m----------------------------\033[0m"
	echo "  Install path:    $install_path"
	echo "  CVS path:        $cvs_path"
	echo "  CVS server:      $cvs_srv"
	echo "  Logs path:       $logs_path"
	echo "  OS:              $os"
	echo
	echo "  Libaries:        $efl"
	echo "  Applications:    $apps"
	echo "  Miscellaneous:   $apps_misc"
	echo "  Modules:         $e17_modules"
	if [ "$skip" ]; then
		echo "  Skipping:        $skip"
	fi
	if [ "$only" ]; then
		echo "  Only:            $only"
	fi
	echo
	if [ "$skip_cvsupdate" ]; then
		echo "  Skip cvs update: yes"
	fi
	if [[ clean -eq 1 ]] ; then
		echo "  Run clean:       yes"
	fi
	if [[ clean -eq 2 ]] ; then
		echo "  Run distclean:   yes"
	fi
	if [[ clean -ge 3 ]] ; then
		echo "  Run uninstall:   yes"
	fi
	if [ "$skip_errors" ]; then
		echo "  Skip errors:     yes"
	fi
	if [ "$gen_docs" ]; then
		echo "  Generate docs:   yes"
	fi
	if [ "$easy_e17_post_script" ]; then
		echo "  Post install:    $easy_e17_post_script"
	fi
	if [ "$wait" ]; then
		echo "  Wait on exit:    yes"
	fi		
	if [ "$keep" ]; then
		echo "  Keep tempdir:    yes"
	fi
	if [ "$accache" ]; then
		echo "  Use caches:      yes"
	fi
	if [ "$threads" -ne 2 ]; then
		echo "  Threads:         $threads"
	fi
	if [ "$nice_level" -ne 0 ]; then
		echo "  Nice level:      $nice_level"
	fi	
	if [ -z "$action" ]; then
		action="MISSING!"
	fi
	echo "  Script action:   $action"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo

	if [ ! $1 = 0 ]; then
		echo -e "\033[1m--------------------------------\033[7m Build phase $1/3 \033[0m\033[1m-------------------------------\033[0m"
	fi

	case $1 in
		0)
			if [ "$os" == "not supported" ]; then
				echo -e "\033[1m-------------------------------\033[7m Not supported OS \033[0m\033[1m------------------------------\033[0m"
			  	echo "  Your operating system '$(uname)' is not supported by this script."
				echo "  If possible please provide a patch."
			else if [ -z "$fullhelp" ]; then
				echo -e "\033[1m-----------------\033[7m Short help 'easy_e17.sh <ACTION> <OPTIONS...>' \033[0m\033[1m---------------\033[0m"
				echo "  -i, --install    = action: compile and install ALL of e17"
				echo "  -u, --update     = action: update your installed e17"
				echo "      --help       = full help"
			else
				echo -e "\033[1m-----------------\033[7m Full help 'easy_e17.sh <ACTION> <OPTIONS...>' \033[0m\033[1m----------------\033[0m"
				echo -e "  \033[1mACTION (ONLY ONE SELECTION POSSIBLE):\033[0m"
				echo "  -i, --install                       = action: compile and install ALL of e17"
				echo "  -u, --update                        = action: update your installed e17"
				echo "  -c, --clean                         = action: clean the sources"
				echo "                                        (more --cleans means more cleaning, up"
				echo "                                        to a maximum of three, which will"
				echo "                                        uninstall e17."
				echo "                                        If used with one of the other actions,"
				echo "                                        this will clean first.)"
				echo "      --only=<name1>,<name2>,...      = action: checkout and compile ONLY the"
				echo "                                        named libs/apps"
				echo "      --cvsupdate                     = update only the cvs tree"
				echo "      --help                          = this help"
				echo
				echo -e "  \033[1mOPTIONS:\033[0m"
				echo "      --instpath=<path>               = change the default install path"
				echo "      --cvspath=<path>                = change the default cvs path"
				echo "      --cvssrv=<server>               = change the default cvs server"
				echo "  -s, --skip-cvsupdate                = no update for your local cvs copy"
				echo "      --skip=<name1>,<name2>,...      = this will skip installing the named"
				echo "                                        libs/apps"
				echo "  -d, --docs                          = generate programmers documentation"
				echo "      --postscript=<name>             = full path to a script to run as root"
				echo "                                        after installation"
				echo "  -e, --skip-errors                   = continue compiling even if there is"
				echo "                                        an error"
				echo "  -w, --wait                          = don't exit the script after finishing,"
				echo "                                        this allows 'xterm -e ./easy_e17.sh -i'"
				echo "                                        without closing the xterm"
				echo "  -k, --keep                          = don't delete the temporary dir"
				echo
				echo "  -l, --low                           = use lowest nice level (19, slowest,"
				echo "                                        takes more time to compile, select"
				echo "                                        this if you need to work on the pc"
				echo "                                        while compiling)"
				echo "      --normal                        = default nice level ($nice_level),"
				echo "                                        will be automatically used"
				echo "  -h, --high                          = use highest nice level (-20, fastest,"
				echo "                                        slows down the pc)"
				echo "      --cache                         = Use a common configure cache and"
				echo "                                        ccache if available"
				echo "      --threads=<int>                 = make can use threads, recommended on smp"
				echo "                                        systems (default: 2 threads)"
				echo
				echo "      --efl=<name1>,<name2>,...       = compile libraries in this order"
				echo "      --apps=<name1>,...              = compile e17 applications in this order"
				echo "      --apps_misc=<name1>,...         = compile e17 misc in this order"
				echo "      --e17_modules=<name1>,...       = compile e17 modules in this order"
				echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
				echo
				echo -e "\033[1m----------------------\033[7m Configurationfile '~/.easy_e17.conf' \033[0m\033[1m--------------------\033[0m"
				echo "  Just create this file and save your favourite arguments."
				echo "  Example: If you use a diffent cvs path, add this line:"
				echo "           --cvspath=/home/brian.miculcy/enlightenment/e17_cvs"
			fi fi
			;;
		1)
			echo "- running some basic system checks"
			echo "- pre cleaning"
			echo "- cvs checkout/update"
			;;
		2)
			echo "- lib-compilation and installation"
			echo "- apps-compilation and installation"
			;;
		3)
			echo "- cleaning"
			echo "- install notes"
			;;
	esac
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo
	echo
}

function define_os_vars ()
{
	case $os in
		SunOS)
			ldconfig="$(which crle) -u"	# there is no command like ldconfig on solaris! "crle" does nearly the same.
	       	;;
		Linux)
			ldconfig="/sbin/ldconfig"
	       	;;
		*)
			os="not supported"
			logo 0
			exit
			;;
	esac
}

function find_path ()
{
	basedir="$cvs_path/$1"
	name=$2
	path=""
	for dir in `find "$basedir" -type d -name "$name" | awk -F "$cvs_path/" '{print $2}' | egrep -v -i "/bin/|/cvs/|/data/|/docs/|/oe/|/src/|/test/"`; do
		if [ "${#dir}" -lt "${#path}" ] || [ -z "$path" ]; then
			path=$dir
		fi
	done
	echo "$cvs_path/$path"
}

function backoff_loop
{
	cvscommand=$1

	backoff=$(( 4 + (RANDOM % 5) ))
	attempt=1;

	while [ 1 ]; do
		if [ "$action" == "update" ] || [ "$action" == "cvsupdate" ]; then
			$cvscommand | tee --append "$tmp_path/cvs_update.log"
		else	
			$cvscommand
		fi
		if [ "${PIPESTATUS[0]}" -gt 0 ]; then
			attempt=$(($attempt + 1))
			for (( i = $backoff / 2; i > 0; i-- )) do
    	        set_title "Checkout FAILED! Next attempt $attempt in $i seconds"
				echo -n -e "\rFAILED! Next attempt $attempt in \033[1m$i\033[0m seconds"
				sleep 1
			done
			echo -n -e "\r                                                            \r"
			if [[ backoff -le max_backoff ]] ; then
				backoff=$(( ($backoff * 2) + (RANDOM % 5) ))
			fi
		else
			break
		fi
	done
}

function get_cvs ()
{
	repo=$1

	cd $cvs_path
	if [ -d "$repo" ]; then
        if [ -n "$only" ]; then
            set_title "Updating source of '$repo' ($pkg_pos/$pkg_total)"
			echo "- updating source of '`basename "$repo"`' (please wait, this won't output much) ..."
        else
            set_title "Updating source of repo '$repo'"
			echo "- updating source of repo '$repo' (please wait, this won't output much) ..."
        fi
		cd "$repo"
		backoff_loop "cvs -z3 -q update -dP" 
	else
        if [ -n "$only" ]; then
            set_title "Checkout source of '$repo' ($pkg_pos/$pkg_total)"
			echo "- checkout source of '`basename "$repo"`' ..."
        else
            set_title "Checkout source of repo '$repo'"
			echo "- checkout source of repo '$repo' ..."
        fi
		backoff_loop "cvs -z3 -q -d $cvs_srv co $repo"
	fi
	echo
}

function build_each ()
{
	repo="$1"
	array=$2
	
	for name in $array
	do
		path=`find_path $repo $name`
		compile "$name" "$path"
	done
}

function compile ()
{
	name=$1
	path=$2
	cnt=${#name}
	max=27
	
	echo -n "- $name "
	while [ ! $cnt = $max ]
	do
		echo -n "."
		cnt=`expr $cnt + 1`
	done
	echo -n " "

	for one in $skip
	do
		if [ "$name" == "$one" ]; then
			echo "SKIPPED"
			return
		fi
	done
	if [ "$only" ] || [ "$action" == "update" ]; then
		found=""
		for one in $only
		do
			if [ "$name" == "$one" ]; then
				found=1
			fi
		done
		if [ -z "$found" ]; then
			echo "SKIPPED"
			return
		fi
	fi

	if [ ! -d "$path" ]; then
		echo "NOT FOUND"
		return
	fi
	cd "$path"

	touch "$logs_path/$name.log"
	pkg_pos=`expr $pkg_pos + 1`

	if [[ clean -ge 1 ]] ; then
		if [ ! -e "Makefile" ]; then
		    echo "CAN'T CLEAN"
		    return
		fi
		if [[ clean -eq 1 ]] ; then
		    make clean >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
		fi
		if [[ clean -eq 2 ]] ; then
		    echo -n "distclean:  "
		    make clean distclean >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
		fi
		if [[ clean -ge 3 ]] ; then
		    echo -n "uninstall:  "
		    case "$mode" in
			"root")
			    nice -n $nice_level make uninstall clean distclean >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
			    ;;
			"sudo")
			    echo "$sudopwd" | sudo -S nice -n $nice_level make uninstall clean distclean >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
			    ;;
		    esac
		fi
		pid="$!"
		rotate "$pid" "$name"
		del_lines 12
		rm $tmp_path/$name.noerrors 2>/dev/null
		echo "ok"
		return
	fi	

	if [ -e "$tmp_path/$name.noerrors" ]; then
		echo "previously installed"
		return
	fi

	# get autogen arguments
	args=""
	for app_arg in `echo $autogen_args | cut -d',' -f- | tr -s '\,' '\ '`
	do
		app=`echo $app_arg | cut -d':' -f1`
		if [ "$app" == "$name" ]; then
			args="$args `echo $app_arg | cut -d':' -f2-`"
		fi
	done
            
	if [ ! -e "autogen.sh" ]; then
	    echo "CAN'T AUTOGEN"
	    return
	fi
	set_title "$name: autogen ($pkg_pos/$pkg_total)"
	echo -n "autogen:    "	
	if [ $nice_level -ge 0 ]; then
		nice -n $nice_level ./autogen.sh --prefix=$install_path $accache $args >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
	else
		case "$mode" in
			"root")
				nice -n $nice_level ./autogen.sh --prefix=$install_path $accache $args >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
				;;
			"sudo")
				echo "$sudopwd" | sudo -S nice -n $nice_level ./autogen.sh --prefix=$install_path $accache $args >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
				;;
			esac	
	fi
	pid="$!"
	rotate "$pid" "$name"
	for package in $failed_packages
	do
		if [ "$package" == "$name" ]; then
			return
		fi	
	done
	del_lines 12
	rm $tmp_path/$name.noerrors

	set_title "$name: make ($pkg_pos/$pkg_total)"
	echo -n "make   :    "	
	if [ $nice_level -ge 0 ]; then
		nice -n $nice_level make -j $threads >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
	else
		case "$mode" in
			"root")
				nice -n $nice_level make -j $threads >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
				;;
			"sudo")
				echo "$sudopwd" | sudo -S nice -n $nice_level make -j $threads >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
				;;
			esac	
	fi
	pid="$!"
	rotate "$pid" "$name"
	for package in $failed_packages
	do
		if [ "$package" == "$name" ]; then
			return
		fi	
	done
	del_lines 12
	rm $tmp_path/$name.noerrors

	if [ "$gen_docs" ]; then
		if [ -e "gendoc" ]; then
			set_title "$name: docs ($pkg_pos/$pkg_total)"
			echo -n "docs   :    "
			if [ $nice_level -ge 0 ]; then
				nice -n $nice_level sh gendoc >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
			else
				case "$mode" in
					"root")
						nice -n $nice_level sh gendoc >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
						;;
					"sudo")
						echo "$sudopwd" | sudo -S nice -n $nice_level sh gendoc >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
						;;
				esac	
			fi
			pid="$!"
			rotate "$pid" "$name"
			for package in $failed_packages
			do
				if [ "$package" == "$name" ]; then
					return
				fi	
			done
			del_lines 12
			rm $tmp_path/$name.noerrors
		fi
	fi
   	        
	set_title "$name: install ($pkg_pos/$pkg_total)"
	echo -n "install:    "	
	case "$mode" in
		"root")
			nice -n $nice_level make install >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
			pid="$!"
			rotate "$pid" "$name"
			for package in $failed_packages
			do
				if [ "$package" == "$name" ]; then
					return
				fi	
			done
			nice -n $nice_level $ldconfig
			del_lines 12
			echo "ok"
			;;
		"sudo")
			echo "$sudopwd" | sudo -S nice -n $nice_level make install >> "$logs_path/$name.log" 2>&1 && touch $tmp_path/$name.noerrors &
			pid="$!"
			rotate "$pid" "$name"
			for package in $failed_packages
			do
				if [ "$package" == "$name" ]; then
					return
				fi	
			done
			echo "$sudopwd" | sudo -S nice -n $nice_level $ldconfig &>/dev/null
			del_lines 12
			echo "ok"
			;;
	esac

}

function rotate ()
{
	pid=$1
	name=$2
	star=1
	log_line=""
	
	while [ "`ps -p $pid -o comm=`" ]
	do
		last_line=`tail -1 "$logs_path/$name.log"`
		if [ ! "$log_line" = "$last_line" ]; then
			echo -e -n "\b\b\b"
			case $star in
				1)
					echo -n "["
					echo -n -e "\033[1m|\033[0m"
					echo -n "]"
					star=2
				;;
				2)
					echo -n "["
					echo -n -e "\033[1m/\033[0m"
					echo -n "]"
					star=3
				;;
				3)
					echo -n "["
					echo -n -e "\033[1m-\033[0m"
					echo -n "]"
					star=4
				;;
				4)
					echo -n "["
					echo -n -e "\033[1m"
					echo -n "\\"
					echo -n -e "\033[0m"
					echo -n "]"
					star=1
				;;
			esac
			log_line=$last_line
		fi
		sleep 1
	done

	if [ ! -e "$tmp_path/$name.noerrors" ]; then
		del_lines 12
		echo -e "\033[1mERROR!\033[0m"

		if [ ! "$skip_errors" ]; then
        	set_title "$name: ERROR"
			echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
			echo
			echo -e "\033[1m-----------------------------------\033[7m Last loglines \033[0m\033[1m------------------------------\033[0m"
			echo -n -e "\033[1m"
			tail -25 "$logs_path/$name.log"
			echo -n -e "\033[0m"
			echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
			echo
			echo "-> Get more informations by checking the log file '$logs_path/$name.log'!"
			echo
			exit
		else
			failed_packages="$failed_packages $name"
		fi	
	fi
}

function del_lines ()
{
	cnt=0
	max=$1
	while [ ! "$cnt" == "$max" ]
	do
		echo -n -e "\b \b"
		cnt=`expr $cnt + 1`
	done
}

function error ()
{
    set_title "ERROR: $1"
	echo -e "\n\n\033[1mERROR: $1\033[0m\n\n"
	exit 2
}

function set_title ()
{
	if [ "$1" ]; then
		message="- $1"
	fi	

	if [ "$DISPLAY" ]; then
	    case "$TERM" in
			xterm*|rxvt*|Eterm|eterm|Aterm|aterm)
	        	echo -ne "\033]0;Easy_e17.sh $message\007"
				;;
	    esac
	fi	
}

function get_repo ()
{
    if [ -n "$only" ]; then
		# single install
        for pkg in $only
        do
            for each in $efl
            do
                if [ "$each" == "$pkg" ]; then
					path=`find_path "e17/" "$pkg"`
                    get_cvs "$path"
                fi
            done

            for each in $apps
            do
                if [ "$each" == "$pkg" ]; then
					path=`find_path "e17/" "$pkg"`
                    get_cvs "$path"
                fi
            done

            for each in $apps_misc
            do
                if [ "$each" == "$pkg" ]; then
					path=`find_path "misc/" "$pkg"`
                    get_cvs "$path"
                fi
            done

            for each in $e17_modules
            do
                if [ "$each" == "$pkg" ]; then
					path=`find_path "e_modules/" "$pkg"`
                    get_cvs "$path"
                fi
            done
        done
    else
    	# full install    
        get_cvs e17
        get_cvs misc
        get_cvs e_modules
        get_cvs devs
    fi
}

function cnt_pkgs () {
    pkg_total=0
    pkg_pos=0
    
    if [ -n "$only" ]; then
        for each in $only
        do
            pkg_total=`expr $pkg_total + 1`
        done  
    else
        # Maybe some regexp which counts the spaces is faster?
        total_pkgs="$efl $apps $apps_misc $e17_modules"
        for each in $total_pkgs
        do
            pkg_total=`expr $pkg_total + 1`
        done
    fi
} 

# SCRIPT: 
set_title 
define_os_vars
accache=""
easy_options=""
clean=0

if [ -e "$HOME/.easy_e17.conf" ]; then
	# load configfile 
	for option in `cat "$HOME/.easy_e17.conf"`
	do
		easy_options="$easy_options $option"
	done
fi

# append arguments
easy_options="$easy_options $@" 

# check options
for arg in $easy_options
do
	option=`echo "'$arg'" | cut -d"=" -f1 | tr -d "'"`
	value=`echo "'$arg'" | cut -d"=" -f2 | tr -d "'"`
	if [ "$value" == "$option" ]; then
		value=""
	fi

	# $action can't be set twice
	if [ "$action" ]; then 
		if [ "$option" == "-i" ] ||
		   [ "$option" == "--install" ] ||
		   [ "$option" == "-u" ] ||
		   [ "$option" == "--update" ] ||
		   [ "$option" == "--only" ] ||
		   [ "$option" == "--cvsupdate" ]; then
			logo 0
			exit
		fi
	fi
	
	case "$option" in
		"-i")			action="install" ;;
		"--install")	action="install" ;;
		"-u")			action="update" ;;
		"--update")		action="update" ;;
		"-c")			clean=$(( $clean + 1 ))	;;
		"--clean")		clean=$(( $clean + 1 ))	;;
		"--only")
			if [ -z "$value" ]; then
				logo 0
				exit
			fi
			action="only"
			only="`echo "$value" | cut -d"," -f- | tr -s '\,' '\ '` $only"
			;;

		"--cvsupdate")
			action="cvsupdate"
			skip="$efl $apps $apps_misc $e17_modules"
			;;
		"--instpath")	install_path="$value" ;;
		"--cvspath")	cvs_path="$value" ;;
		"--cvssrv")
			cvs_srv="$value"
			export CVS_RSH="ssh"
			;;
		"-d")				gen_docs=1 ;;
		"--docs")			gen_docs=1 ;;
		"--postscript")		easy_e17_post_script="$value" ;;
		"-s")				skip_cvsupdate=1 ;;
		"--skip-cvsupdate")	skip_cvsupdate=1 ;;
		"--skip")
			if [ -z "$value" ]; then
				logo 0
				exit
			fi
			skip="`echo "$value" | cut -d"," -f- | tr -s '\,' '\ '` $skip"
			;;
		"-e")				skip_errors=1 ;;
		"--skip-errors")	skip_errors=1 ;;		
		"-w")				wait=1 ;;
		"--wait")			wait=1 ;;
		"-k")				keep=1 ;;
		"--keep")			keep=1 ;;

		"-l")	 			nice_level=19 ;;
		"--low") 			nice_level=19 ;;
		"--normal") ;;
		"-h")	 			nice_level=-20 ;;
		"--high") 			nice_level=-20 ;;
		"--cache")
			accache=" --cache-file=$tmp_path/easy_e17.cache"
			ccache=`whereis ccache`
			if [ ! "$ccache" = "ccache:" ]; then
			    export CC="ccache gcc"
			fi
			;;
		"--threads")
			if [ -z "$value" ] || ! expr "$value" : "[0-9]*$" >/dev/null || [ "$value" -lt 1 ]; then
				logo 0
				exit
			fi
			threads=$value
			;;

		"--efl")
			if [ -z "$value" ]; then
				logo 0
				exit
			fi
			efl="`echo "$value" | cut -d"," -f- | tr -s '\,' '\ '`"
			;;
		"--apps")
			if [ -z "$value" ]; then
				logo 0
				exit
			fi
			apps="`echo "$value" | cut -d"," -f- | tr -s '\,' '\ '`"
			;;
		"--apps_misc")
			if [ -z "$value" ]; then
				logo 0
				exit
			fi
			apps_misc="`echo "$value" | cut -d"," -f- | tr -s '\,' '\ '`"
			;;
		"--e17_modules")
			if [ -z "$value" ]; then
				logo 0
				exit
			fi
			e17_modules="`echo "$value" | cut -d"," -f- | tr -s '\,' '\ '`"
			;;
		"--help")
			fullhelp=1
			logo 0
			exit
			;;
		*)
			logo 0
			exit
			;;
	esac
done

if [ -z "$action" ]; then
    if [[ clean -ge 1 ]] ; then
	action="clean"
    fi
fi

if [ -z "$action" ] || [ -z "$install_path" ] || [ -z "$cvs_path" ]; then
	logo 0
	exit
fi

logo 1
set_title "Basic system checks"
echo -e "\033[1m-------------------------------\033[7m Basic system checks \033[0m\033[1m----------------------------\033[0m"
echo -n "- cvs-dir .................... " 
mkdir -p "$cvs_path" 2>/dev/null
if [ ! -w "$cvs_path" ]; then
	error "The cvs-dir '$cvs_path' isn't writeable!"
else
	echo "ok"
fi
touch "$HOME/.cvspass" 2>/dev/null

echo -n "- creating script dirs ....... "
mkdir -p "$tmp_path" 2>/dev/null
chmod 700 "$tmp_path"
mkdir -p "$logs_path" 2>/dev/null
echo "ok"

if [ ! "$action"  == "cvsupdate" ]; then
	echo -n "- build-user ................. "
	if [ ! "$LOGNAME" == "root" ]; then
		echo "$LOGNAME (non-root)"
		echo -n "- sudo available ............. "
		sudotest=`type sudo &>/dev/null ; echo $?`
		if [ "$sudotest" == 0 ]; then
			sudo -K
			if [ -e "$tmp_path/sudo.test" ]; then
				rm -f "$tmp_path/sudo.test"
			fi
			while [ -z "$sudopwd" ]
			do
				echo -n "enter sudo-password: "
				stty -echo
				read sudopwd
				stty echo
		
				# password check
				echo "$sudopwd" | sudo -S touch "$tmp_path/sudo.test" &>/dev/null
				if [ ! -e "$tmp_path/sudo.test" ]; then
					sudopwd=""
				fi
			done
			echo 
			mode="sudo"
			rm -f "$tmp_path/sudo.test"
		else
			error "You're not root and sudo isn't available. Please run this script as root!"
		fi
	else
		echo "root"
		mode="root"
	fi

	echo -n "- adding path to env ......... " 
	export PATH="$PATH:$install_path/bin"
	export PKG_CONFIG_PATH="$install_path/lib/pkgconfig:$PKG_CONFIG_PATH"
	echo "ok"
	
	echo -n "- checking lib-path in ldc ... "
	case $os in
		SunOS) 	e17ldcfg="";; # need more testing of adding libaries on different solaris versions. atm this is not working
		Linux)
			e17ldcfg="`grep -r -l -i -m 1 $install_path/lib /etc/ld.so.conf*`"
			if [ -z "$e17ldcfg" ]; then
				if [ "`grep -l 'include /etc/ld.so.conf.d/' /etc/ld.so.conf`" ]; then
					e17ldcfg="/etc/ld.so.conf.d/e17.conf"
					rm $e17ldcfg 2>/dev/null
				else
					e17ldcfg="/etc/ld.so.conf";
					cp $e17ldcfg $tmp_path;
				fi
				case "$mode" in
					"root")	echo "$install_path/lib" >>$e17ldcfg ;;
					"sudo")
						echo "$install_path/lib" >> $tmp_path/`basename $e17ldcfg`
						echo "$sudopwd" | sudo -S mv -f $tmp_path/`basename $e17ldcfg` $e17ldcfg
						;;
				esac
				echo "ok (path has been added to $e17ldcfg)";
			else
				echo "ok ($e17ldcfg)";
			fi
			;;
	esac

	echo -n "- setting compile options .... "
	export CPPFLAGS="$CPPFLAGS -I$install_path/include"
	export LDFLAGS="$LDFLAGS -L$install_path/lib"
	echo "ok"
fi

echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
echo


# do the clean first if not just cleaning.
if [[ clean -ge 1 ]] ; then
    if [ "$action" != "clean" ]; then
	set_title "Pre cleaning"
	sleep 5

	echo -e "\033[1m----------------------------\033[7m Precleaning libaries (EFL) \033[0m\033[1m------------------------\033[0m"
	pkg_pos=0
	build_each "e17/" "$efl"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo

	echo -e "\033[1m-----------------------------\033[7m Precleaning applications \033[0m\033[1m-------------------------\033[0m"
	build_each "e17/" "$apps"
	build_each "misc/" "$apps_misc"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo

	echo -e "\033[1m-----------------------------\033[7m Precleaning e17 modules \033[0m\033[1m--------------------------\033[0m"
	build_each "e_modules/" "$e17_modules"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo

	clean=0
    fi
fi


# cvs
echo -e "\033[1m-------------------------------\033[7m CVS checkout/update \033[0m\033[1m----------------------------\033[0m"
if [ -z "$skip_cvsupdate" ]; then
	rm "$tmp_path/cvs_update.log" 2>/dev/null
    get_repo
else
	echo -e "\n                                - - - SKIPPED - - -\n"
fi
echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
echo

if [ "$action" == "update" ] && [ -e "$tmp_path/cvs_update.log" ]; then
	for update in `egrep "^[P|U] " "$tmp_path/cvs_update.log" | egrep "apps/|libs/|proto/" | cut -d'/' -f2 | sort -u`; do
		for package in $efl $apps; do
			if [ "$update" == "$package" ]; then
				only="$update $only"
			fi
		done
	done
	for update in `egrep "^[P|U] " "$tmp_path/cvs_update.log" | egrep -v "apps/|libs/|proto/" | cut -d'/' -f1 | sort -u`; do
		for package in $apps_misc $e17_modules; do
			if [ "$update" == "$package" ]; then
				only="$update $only"
			fi
		done
	done
fi

# Count packages 
cnt_pkgs

echo -n "-> PREPARING FOR PHASE 2..."
set_title "Preparing for phase 2... compilation & installation"
sleep 5

logo 2
echo -e "\033[1m---------------------------\033[7m Installing libaries (EFL) \033[0m\033[1m--------------------------\033[0m"
pkg_pos=0
build_each "e17/" "$efl"
echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
echo

echo -e "\033[1m----------------------------\033[7m Installing applications \033[0m\033[1m---------------------------\033[0m"
build_each "e17/" "$apps"
build_each "misc/" "$apps_misc"
echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
echo

echo -e "\033[1m-----------------------------\033[7m Installing e17 modules \033[0m\033[1m---------------------------\033[0m"
build_each "e_modules/" "$e17_modules"
echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
echo 

echo -n "-> PREPARING FOR PHASE 3..."
set_title "Preparing for phase 3..."
sleep 5

logo 3
set_title "Finished"

if [ -z "$keep" ]; then
	echo -e "\033[1m--------------------------------\033[7m Cleaning temp dir \033[0m\033[1m-----------------------------\033[0m"
	if [ "$failed_packages" ]; then
		echo -n "- saving logs ................ "	
		for noerrorfile in $tmp_path/*.noerrors ; do
			package=`basename "$noerrorfile" | cut -d'.' -f1`
			rm "$noerrorfile" 2>/dev/null
			rm "$logs_path/$package.log" 2>/dev/null
		done
	else		
		echo -n "- del temp dir ............... "
		rm -rf $tmp_path 2>/dev/null
	fi	
	echo "ok"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo 
fi	

if [ "$easy_e17_post_script" ]; then
	echo -e "\033[1m-------------------------------\033[7m Post install script \033[0m\033[1m----------------------------\033[0m"
	case "$mode" in
		"root") nice -n $nice_level $easy_e17_post_script ;;
		"sudo") echo "$sudopwd" | sudo -S nice -n $nice_level $easy_e17_post_script ;;
	esac	
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo
fi

if [ "$failed_packages" ]; then
	echo -e "\033[1m---------------------------------\033[7m Failed packages \033[0m\033[1m------------------------------\033[0m"
	for package in $failed_packages
	do
		echo "- $package (error log: $logs_path/$package.log)"
	done
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo 
fi		

if [ "$action" == "install" ]; then
	echo "INSTALL NOTES:"
	echo "-----------------------------------------------------------------------------"
	echo "The most incredible and really unbelivable dream has become true:"
	echo "You compiled e17 sucessfully!"
	echo 
	echo "Starting e17:"
	echo "Create a file ~/.xsession with the line 'exec $install_path/bin/enlightenment_start'."
	echo "Add a link to this file using 'ln -s ~/.xsession ~/.xinitrc'."
	echo
	echo "If you're using a login manager (GDM/KDM), select the session type 'default' in them."
	echo "If you're using the startx command, simply execute it now."
	echo
	echo "Note: e17 is still not released and it won't be in the near future. So don't"
	echo "ask for a stable release. e17 is still very buggy and only for experienced users"
	echo "who know what they do..."
	echo 
	echo "Rasterman didn't write this script so don't ask him for help with it."
	echo
	echo "We hope you will enjoy your trip into e17... Have fun!"
	echo -e "\033[1m--------------------------------------------------------------------------------\033[0m"
	echo
fi

# Clear this out if we ever set it.
export CC=""

# exit script or wait?
if [ "$wait" ]; then
	echo
	echo -e -n "\033[1mThe script is waiting here - simply press [enter] to exit.\033[0m"
	read
fi