4 Geeqie is an image viewer.
5 This script will download, compile, and install Geeqie on Debian-based systems.
6 If run from a folder that already contains the Geeqie sources, the source
7 code will be updated from the repository.
8 Dialogs allow the user to install additional features, including
9 additional pixbuf loaders.
11 Command line options are:
12 -v --version The version of this file
13 -h --help Output this text
14 -c --commit=ID Checkout and compile commit ID
15 -t --tag=TAG Checkout and compile TAG (e.g. v1.4 or v1.3)
16 -b --back=N Checkout commit -N (e.g. "-b 1" for last-but-one commit)
19 # Essential for compiling
28 # Optional for both GTK2 and GTK3
30 "LCMS (for color management)"
32 "exiv2 (for exif handling)"
34 "lua (for --remote commands)"
36 "libffmpegthumbnailer (for mpeg thumbnails)"
37 "libffmpegthumbnailer-dev"
38 "libtiff (for tiff support)"
40 "libjpeg (for jpeg support"
42 "librsvg2 (for viewing .svg images"
44 "libwmf (for viewing .wmf images)"
46 "exiftran (for image rotation)"
48 "imagemagick (for image rotation)"
50 "ufraw (for RAW file handling)"
52 "markdown (for generating README help file)"
56 # Optional for GTK3 only
58 "libchamplain gtk (for GPS maps)"
59 "libchamplain-gtk-0.12-dev"
60 "libchamplain (for GPS maps)"
61 "libchamplain-0.12-dev"
62 "libpoppler (for pdf file preview)"
66 # Optional pixbuf loaders
67 optional_loaders_array=(
70 ".psd Photoshop images"
76 ####################################################################
78 # Derived from: https://github.com/coto/server-easy-install (GPL)
79 ####################################################################
82 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
87 OS=`lowercase \`uname\``
91 if [ "${OS}" == "windowsnt" ]
94 elif [ "${OS}" == "darwin" ]
99 if [ "${OS}" = "SunOS" ]
103 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
104 elif [ "${OS}" = "AIX" ]
106 OSSTR="${OS} `oslevel` (`oslevel -r`)"
107 elif [ "${OS}" = "Linux" ]
109 if [ -f /etc/redhat-release ]
111 DistroBasedOn='RedHat'
112 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
113 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
114 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
115 elif [ -f /etc/SuSE-release ]
118 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
119 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
120 elif [ -f /etc/mandrake-release ]
122 DistroBasedOn='Mandrake'
123 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
124 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
125 elif [ -f /etc/debian_version ]
127 DistroBasedOn='Debian'
128 if [ -f /etc/lsb-release ]
130 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
131 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
132 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
135 if [ -f /etc/UnitedLinux-release ]
137 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
140 DistroBasedOn=`lowercase $DistroBasedOn`
143 readonly DistroBasedOn
154 arraylength=${#essential_array[@]}
155 for (( i=0; i<${arraylength}; i=i+1 ));
157 package_query ${essential_array[$i]}
160 package_install ${essential_array[$i]}
164 if [[ $1 == "GTK3" ]]
166 package_query "libgtk-3-dev"
169 package_install libgtk-3-dev
172 package_query "libgtk2.0-dev"
175 package_install libgtk2.0-dev
198 rm -rf webp-pixbuf-loader-master
199 package_install libglib2.0-dev libgdk-pixbuf2.0-dev libwebp-dev python-minimal
200 wget https://github.com/aruiz/webp-pixbuf-loader/archive/master.zip
202 cd webp-pixbuf-loader-master
205 sudo --askpass ./waf install
206 sudo --askpass gdk-pixbuf-query-loaders --update-cache
208 rm -rf webp-pixbuf-loader-master
214 rm -rf gdk-pixbuf-psd
215 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
219 sudo --askpass make install
220 sudo --askpass gdk-pixbuf-query-loaders --update-cache
222 rm -rf gdk-pixbuf-psd
227 rm -rf xcf-pixbuf-loader
228 package_install libbz2-dev
229 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
234 # There must be a better way...
235 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
244 sudo --askpass cp .libs/libioxcf.so $2
245 sudo --askpass gdk-pixbuf-query-loaders --update-cache
248 rm -rf xcf-pixbuf-loader
251 install_extra_loaders()
253 if [ -n "$extra_loaders" ]
281 current_dir=$(basename $PWD)
282 if [[ $current_dir == "geeqie" ]]
284 sudo --askpass make uninstall
285 zenity --title="Uninstall Geeqie" --width=370 --text="WARNING.\nThis will delete folder:\n\n$PWD\n\nand all sub-folders!" --question --ok-label="Cancel" --cancel-label="OK" 2>/dev/null
290 sudo --askpass rm -rf geeqie
293 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
301 if [[ $DistroBasedOn == "debian" ]]
303 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
304 if [[ "$res" == "install ok installed"* ]]
316 if [[ $DistroBasedOn == "debian" ]]
318 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
324 rm $install_pass_script >/dev/null 2>&1
325 #~ rm $install_log >/dev/null 2>&1
327 if [[ -p $zen_pipe ]]
329 echo "100" > $zen_pipe
330 echo "#End" > $zen_pipe
333 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
335 rm $zen_pipe >/dev/null 2>&1
342 # If uninstall has been run, maybe the current directory no longer exists
346 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
353 if [[ $DistroBasedOn != "debian" ]]
355 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
356 Operating System: $OS
358 Psuedoname: $PSUEDONAME
360 DistroBasedOn: $DistroBasedOn
362 Machine: $MACH" 2>/dev/null
367 # Parse the comand line
368 OPTS=$(getopt -o vhc:t:b: --long version,help,commit:,tag:,back: -- "$@")
402 # If a Geeqie folder already exists here, warn the user
405 zenity --info --title="Install Geeqie and dependencies" --width=370 --text="This script is for use on Ubuntu and other\nDebian-based installations.\nIt will download, compile, and install Geeqie source\ncode and its dependencies.\n\nA sub-folder named \"geeqie\" will be created in the\nfolder this script is run from, and the source code\nwill be downloaded to that sub-folder.\n\nA sub-folder of that name already exists.\nPlease try another folder." 2>/dev/null
410 # If it looks like a Geeqie download folder, assume an update
411 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
415 # If it looks like something else is already installed here, warn the user
416 if [ -d ".git" ] || [ -d "src" ]
418 zenity --info --title="Install Geeqie and dependencies" --width=370 --text="This script is for use on Ubuntu and other\nDebian-based installations.\nIt will download, compile, and install Geeqie source\ncode and its dependencies.\n\nIt looks like you are running this script from a folder which already has software installed.\n\nPlease try another folder." 2>/dev/null
426 # Use GTK3 as default
430 if [[ $mode == "install" ]]
432 message="This script is for use on Ubuntu and other\nDebian-based installations.\nIt will download, compile, and install Geeqie source\ncode and its dependencies.\n\nA sub-folder named \"geeqie\" will be created in the\nfolder this script is run from, and the source code\nwill be downloaded to that sub-folder.\n\nIn this dialog you must select whether to compile\nfor GTK2 or GTK3.\nIf you want to use GPS maps or pdf preview,\nyou must choose GTK3.\nThe GTK2 version has a slightly different\nlook-and-feel compared to the GTK3 version,\nbut otherwise has the same features.\nYou may easily switch between the two after\ninstallation.\n\nIn subsequent dialogs you may choose which\noptional features to install."
434 title="Install Geeqie and dependencies"
437 message="This script is for use on Ubuntu and other\nDebian-based installations.\nIt will update the Geeqie source code and its\ndependencies, and will compile and install Geeqie.\n\nYou may also switch the installed version from\nGTK2 to GTK3 and vice versa.\n\nIn this dialog you must select whether to compile\nfor GTK2 or GTK3.\nIf you want to use GPS maps or pdf preview,\nyou must choose GTK3.\nThe GTK2 version has a slightly different\nlook-and-feel compared to the GTK3 version,\nbut otherwise has the same features.\n\nIn subsequent dialogs you may choose which\noptional features to install."
439 title="Update Geeqie and re-install"
442 # When updating, use previous installation as default
443 if [[ -f config.log ]]
445 grep gtk-2.0 config.log >/dev/null
457 # Ask whether to install GTK2 or GTK3 or uninstall
459 gtk_version=$(zenity --title="$title" --width=370 --text="$message" --list --radiolist --column "" --column "" "$gtk3_installed" "GTK3 (required for GPS maps and pdf preview)" "$gtk2_installed" "GTK2" FALSE "Uninstall" --cancel-label="Cancel" --ok-label="OK" --hide-header 2>/dev/null)
466 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
467 # so create a temporary script containing the command
468 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
470 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
475 \n' > $install_pass_script
476 chmod +x $install_pass_script
477 export SUDO_ASKPASS=$install_pass_script
479 if [[ $gtk_version == "Uninstall" ]]
485 # Put the install log in tmp, to avoid writing to PWD during a new install
486 rm install.log 2>/dev/null
487 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
489 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
492 # Get the standard options that are not yet installed
493 arraylength=${#optional_array[@]}
494 for (( i=0; i<${arraylength}; i=i+2 ));
496 package_query ${optional_array[$i+1]}
499 if [ -z "$option_string" ]
501 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
503 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
508 # If GTK3 required, get the GTK3 options not yet installed
509 if [[ "$gtk_version" == "GTK3"* ]]
511 arraylength=${#optional_gtk3_array[@]}
512 for (( i=0; i<${arraylength}; i=i+2 ));
514 package_query ${optional_gtk3_array[$i+1]}
517 if [ -z "$option_string" ]
519 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
521 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
527 # Get the optional loaders not yet installed
529 gdk-pixbuf-query-loaders | grep WebP >/dev/null
532 if [ -z "$loaders_string" ]
534 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
536 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
542 gdk-pixbuf-query-loaders | grep psd >/dev/null
545 if [ -z "$loaders_string" ]
547 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
549 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
554 gdk-pixbuf-query-loaders | grep xcf >/dev/null
557 if [ -z "$loaders_string" ]
559 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
561 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
565 kill $zen_pid 2>/dev/null
567 # Ask the user which options to install
568 if [ -n "$option_string" ]
570 options=$(echo "$option_string" | zenity --title="$title" --width=400 --height=500 --list --checklist --text 'Select which library files to install:' --column='Select' --column='Library files' --column='Library' --hide-column=3 --print-column=3 2>/dev/null)
578 # Ask the user which extra loaders to install
579 if [ -n "$loaders_string" ]
581 extra_loaders=$(echo "$loaders_string" | zenity --title="$title" --width=370 --height=400 --list --checklist --text 'These loaders are not part of the main repository,\nbut are known to work to some extent.' --column='Select' --column='Library files' --column='Library' --hide-column=3 --print-column=3 2>/dev/null)
589 # Start of Zenity progress section
590 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
592 (tail -f $zen_pipe 2>/dev/null) | zenity --progress --title="$title" --width=370 --text="Installing options..." --auto-close --auto-kill --percentage=0 2>/dev/null &
595 echo "#Installing essential libraries..." > $zen_pipe
597 install_essential $gtk_version
600 echo "#Installing options..." > $zen_pipe
605 echo "#Installing extra loaders..." > $zen_pipe
607 install_extra_loaders
609 echo "10" > $zen_pipe
610 echo "#Getting new sources from server..." > $zen_pipe
612 if [[ $mode == "install" ]]
614 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
616 git checkout master >>$install_log 2>&1
619 git_error=$(tail -n5 $install_log 2>&1)
620 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
623 ret=$(git pull >>$install_log 2>&1)
628 git_error=$(tail -n5 $install_log 2>&1)
629 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
633 echo "20" > $zen_pipe
634 echo "#Cleaning installed version..." > $zen_pipe
636 if [[ $mode == "install" ]]
640 sudo --askpass make uninstall >>$install_log 2>&1
641 sudo --askpass make maintainer-clean >>$install_log 2>&1
644 echo "30" > $zen_pipe
645 echo "#Checkout required version..." > $zen_pipe
649 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
652 git_error=$(tail -n5 $install_log 2>&1)
653 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
658 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
661 git_error=$(tail -n5 $install_log 2>&1)
662 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
667 ret=$(git checkout "$TAG" >>$install_log 2>&1)
671 git_error=$(tail -n5 $install_log 2>&1)
672 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
678 echo "40" > $zen_pipe
679 echo "#Creating configuration files..." > $zen_pipe
681 if [[ $gtk_version == "GTK3"* ]]
683 ./autogen.sh >>$install_log 2>&1
685 ./autogen.sh --disable-gtk3 >>$install_log 2>&1
688 echo "60" > $zen_pipe
689 echo "#Compiling..." > $zen_pipe
691 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
692 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
693 make -j >>$install_log 2>&1
695 echo "90 " > $zen_pipe
696 echo "#Installing Geeqie..." > $zen_pipe
698 sudo --askpass make install >>$install_log 2>&1
700 rm $install_pass_script
701 mv -f $install_log install.log;
703 echo "100 " > $zen_pipe
706 (for i in $(seq 0 4 100); do echo "$i"; sleep 0.1; done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close 2>/dev/null