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)
17 -d --debug=yes Compile with debug output
20 # Essential for compiling
30 # Optional for both GTK2 and GTK3
32 "LCMS (for color management)"
34 "exiv2 (for exif handling)"
36 "lua (for --remote commands)"
38 "libffmpegthumbnailer (for mpeg thumbnails)"
39 "libffmpegthumbnailer-dev"
40 "libtiff (for tiff support)"
42 "libjpeg (for jpeg support"
44 "librsvg2 (for viewing .svg images"
46 "libwmf (for viewing .wmf images)"
48 "exiftran (for image rotation)"
50 "imagemagick (for image rotation)"
52 "ufraw (for RAW file handling)"
54 "exiv2 command line (for jpeg export)"
56 "jpgicc (for jpeg export color correction)"
58 "markdown (for generating README help file)"
60 "gphoto2 (for tethered photography)"
64 # Optional for GTK3 only
66 "libchamplain gtk (for GPS maps)"
67 "libchamplain-gtk-0.12-dev"
68 "libchamplain (for GPS maps)"
69 "libchamplain-0.12-dev"
70 "libpoppler (for pdf file preview)"
74 # Optional pixbuf loaders
75 optional_loaders_array=(
78 ".psd Photoshop images"
84 ####################################################################
86 # Derived from: https://github.com/coto/server-easy-install (GPL)
87 ####################################################################
90 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
95 OS=`lowercase \`uname\``
99 if [ "${OS}" == "windowsnt" ]
102 elif [ "${OS}" == "darwin" ]
107 if [ "${OS}" = "SunOS" ]
111 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
112 elif [ "${OS}" = "AIX" ]
114 OSSTR="${OS} `oslevel` (`oslevel -r`)"
115 elif [ "${OS}" = "Linux" ]
117 if [ -f /etc/redhat-release ]
119 DistroBasedOn='RedHat'
120 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
121 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
122 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
123 elif [ -f /etc/SuSE-release ]
126 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
127 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
128 elif [ -f /etc/mandrake-release ]
130 DistroBasedOn='Mandrake'
131 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
132 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
133 elif [ -f /etc/debian_version ]
135 DistroBasedOn='Debian'
136 if [ -f /etc/lsb-release ]
138 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
139 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
140 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
143 if [ -f /etc/UnitedLinux-release ]
145 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
148 DistroBasedOn=`lowercase $DistroBasedOn`
151 readonly DistroBasedOn
162 arraylength=${#essential_array[@]}
163 for (( i=0; i<${arraylength}; i=i+1 ));
165 package_query ${essential_array[$i]}
168 package_install ${essential_array[$i]}
172 if [[ $1 == "GTK3" ]]
174 package_query "libgtk-3-dev"
177 package_install libgtk-3-dev
180 package_query "libgtk2.0-dev"
183 package_install libgtk2.0-dev
206 rm -rf webp-pixbuf-loader-master
207 package_install libglib2.0-dev libgdk-pixbuf2.0-dev libwebp-dev python-minimal
208 wget https://github.com/aruiz/webp-pixbuf-loader/archive/master.zip
210 cd webp-pixbuf-loader-master
213 sudo --askpass ./waf install
214 sudo --askpass gdk-pixbuf-query-loaders --update-cache
216 rm -rf webp-pixbuf-loader-master
222 rm -rf gdk-pixbuf-psd
223 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
227 sudo --askpass make install
228 sudo --askpass gdk-pixbuf-query-loaders --update-cache
230 rm -rf gdk-pixbuf-psd
235 rm -rf xcf-pixbuf-loader
236 package_install libbz2-dev
237 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
242 # There must be a better way...
243 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
252 sudo --askpass cp .libs/libioxcf.so $2
253 sudo --askpass gdk-pixbuf-query-loaders --update-cache
256 rm -rf xcf-pixbuf-loader
259 install_extra_loaders()
261 if [ -n "$extra_loaders" ]
289 current_dir=$(basename $PWD)
290 if [[ $current_dir == "geeqie" ]]
292 sudo --askpass make uninstall
293 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
298 sudo --askpass rm -rf geeqie
301 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
309 if [[ $DistroBasedOn == "debian" ]]
311 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
312 if [[ "$res" == "install ok installed"* ]]
324 if [[ $DistroBasedOn == "debian" ]]
326 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
332 rm $install_pass_script >/dev/null 2>&1
333 #~ rm $install_log >/dev/null 2>&1
335 if [[ -p $zen_pipe ]]
337 echo "100" > $zen_pipe
338 echo "#End" > $zen_pipe
341 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
343 rm $zen_pipe >/dev/null 2>&1
350 # If uninstall has been run, maybe the current directory no longer exists
354 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
361 if [[ $DistroBasedOn != "debian" ]]
363 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
364 Operating System: $OS
366 Psuedoname: $PSUEDONAME
368 DistroBasedOn: $DistroBasedOn
370 Machine: $MACH" 2>/dev/null
375 # Parse the comand line
376 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
415 # If a Geeqie folder already exists here, warn the user
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\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
423 # If it looks like a Geeqie download folder, assume an update
424 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
428 # If it looks like something else is already installed here, warn the user
429 if [ -d ".git" ] || [ -d "src" ]
431 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
439 # Use GTK3 as default
443 if [[ $mode == "install" ]]
445 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."
447 title="Install Geeqie and dependencies"
450 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."
452 title="Update Geeqie and re-install"
455 # When updating, use previous installation as default
456 if [[ -f config.log ]]
458 grep gtk-2.0 config.log >/dev/null
470 # Ask whether to install GTK2 or GTK3 or uninstall
472 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)
479 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
480 # so create a temporary script containing the command
481 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
483 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
488 \n' > $install_pass_script
489 chmod +x $install_pass_script
490 export SUDO_ASKPASS=$install_pass_script
492 if [[ $gtk_version == "Uninstall" ]]
498 # Put the install log in tmp, to avoid writing to PWD during a new install
499 rm install.log 2>/dev/null
500 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
502 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
505 # Get the standard options that are not yet installed
506 arraylength=${#optional_array[@]}
507 for (( i=0; i<${arraylength}; i=i+2 ));
509 package_query ${optional_array[$i+1]}
512 if [ -z "$option_string" ]
514 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
516 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
521 # If GTK3 required, get the GTK3 options not yet installed
522 if [[ "$gtk_version" == "GTK3"* ]]
524 arraylength=${#optional_gtk3_array[@]}
525 for (( i=0; i<${arraylength}; i=i+2 ));
527 package_query ${optional_gtk3_array[$i+1]}
530 if [ -z "$option_string" ]
532 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
534 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
540 # Get the optional loaders not yet installed
542 gdk-pixbuf-query-loaders | grep WebP >/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]}"
555 gdk-pixbuf-query-loaders | grep psd >/dev/null
558 if [ -z "$loaders_string" ]
560 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
562 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
567 gdk-pixbuf-query-loaders | grep xcf >/dev/null
570 if [ -z "$loaders_string" ]
572 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
574 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
578 kill $zen_pid 2>/dev/null
580 # Ask the user which options to install
581 if [ -n "$option_string" ]
583 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)
591 # Ask the user which extra loaders to install
592 if [ -n "$loaders_string" ]
594 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)
602 # Start of Zenity progress section
603 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
605 (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 &
608 echo "#Installing essential libraries..." > $zen_pipe
610 install_essential $gtk_version
613 echo "#Installing options..." > $zen_pipe
618 echo "#Installing extra loaders..." > $zen_pipe
620 install_extra_loaders
622 echo "10" > $zen_pipe
623 echo "#Getting new sources from server..." > $zen_pipe
625 if [[ $mode == "install" ]]
627 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
629 git checkout master >>$install_log 2>&1
632 git_error=$(tail -n5 $install_log 2>&1)
633 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
636 ret=$(git pull >>$install_log 2>&1)
641 git_error=$(tail -n5 $install_log 2>&1)
642 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
646 echo "20" > $zen_pipe
647 echo "#Cleaning installed version..." > $zen_pipe
649 if [[ $mode == "install" ]]
653 sudo --askpass make uninstall >>$install_log 2>&1
654 sudo --askpass make maintainer-clean >>$install_log 2>&1
657 echo "30" > $zen_pipe
658 echo "#Checkout required version..." > $zen_pipe
662 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
665 git_error=$(tail -n5 $install_log 2>&1)
666 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
671 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
674 git_error=$(tail -n5 $install_log 2>&1)
675 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
680 ret=$(git checkout "$TAG" >>$install_log 2>&1)
684 git_error=$(tail -n5 $install_log 2>&1)
685 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
690 if [[ "$DEBUG" == "yes" ]]
694 debug_opt="--disable-debug-log"
697 echo "40" > $zen_pipe
698 echo "#Creating configuration files..." > $zen_pipe
700 if [[ $gtk_version == "GTK3"* ]]
702 ./autogen.sh "$debug_opt" >>$install_log 2>&1
704 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
707 echo "60" > $zen_pipe
708 echo "#Compiling..." > $zen_pipe
710 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
711 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
712 make -j >>$install_log 2>&1
716 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
721 echo "90 " > $zen_pipe
722 echo "#Installing Geeqie..." > $zen_pipe
724 sudo --askpass make install >>$install_log 2>&1
726 # This is a temporary fix until the ZoneDetect project releases its source code
727 zonedetect_message="ZoneDetect database not loaded"
728 if [[ -d "/usr/local/lib/geeqie" ]]
730 if [[ ! -f "/usr/local/lib/geeqie/timezone21.bin" ]]
732 sudo --askpass wget --directory-prefix=/usr/local/lib/geeqie/ https://github.com/BertoldVdb/ZoneDetect/raw/master/database/timezone21.bin >>$install_log 2>&1
735 zonedetect_message=""
738 zonedetect_message=""
742 rm $install_pass_script
743 mv -f $install_log install.log;
745 echo "100 " > $zen_pipe
748 (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$zonedetect_message" --auto-close --percentage=0 2>/dev/null