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 and camera download plugins)"
62 "libimage-exiftool-perl (for jpeg extraction plugin)"
63 "libimage-exiftool-perl"
64 "libheif (for HEIF support)"
66 "libwebp (for WebP images)"
70 # Optional for GTK3 only
72 "libchamplain gtk (for GPS maps)"
73 "libchamplain-gtk-0.12-dev"
74 "libchamplain (for GPS maps)"
75 "libchamplain-0.12-dev"
76 "libpoppler (for pdf file preview)"
80 # Optional pixbuf loaders
81 optional_loaders_array=(
82 ".psd Photoshop images"
88 ####################################################################
90 # Derived from: https://github.com/coto/server-easy-install (GPL)
91 ####################################################################
94 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
99 OS=`lowercase \`uname\``
103 if [ "${OS}" == "windowsnt" ]
106 elif [ "${OS}" == "darwin" ]
111 if [ "${OS}" = "SunOS" ]
115 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
116 elif [ "${OS}" = "AIX" ]
118 OSSTR="${OS} `oslevel` (`oslevel -r`)"
119 elif [ "${OS}" = "Linux" ]
121 if [ -f /etc/redhat-release ]
123 DistroBasedOn='RedHat'
124 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
125 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
126 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
127 elif [ -f /etc/SuSE-release ]
130 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
131 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
132 elif [ -f /etc/mandrake-release ]
134 DistroBasedOn='Mandrake'
135 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
136 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
137 elif [ -f /etc/debian_version ]
139 DistroBasedOn='Debian'
140 if [ -f /etc/lsb-release ]
142 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
143 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
144 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
147 if [ -f /etc/UnitedLinux-release ]
149 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
152 DistroBasedOn=`lowercase $DistroBasedOn`
155 readonly DistroBasedOn
166 arraylength=${#essential_array[@]}
167 for (( i=0; i<${arraylength}; i=i+1 ));
169 package_query ${essential_array[$i]}
172 package_install ${essential_array[$i]}
176 if [[ $1 == "GTK3" ]]
178 package_query "libgtk-3-dev"
181 package_install libgtk-3-dev
184 package_query "libgtk2.0-dev"
187 package_install libgtk2.0-dev
210 rm -rf gdk-pixbuf-psd
211 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
215 sudo --askpass make install
216 sudo --askpass gdk-pixbuf-query-loaders --update-cache
218 rm -rf gdk-pixbuf-psd
223 rm -rf xcf-pixbuf-loader
224 package_install libbz2-dev
225 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
230 # There must be a better way...
231 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
240 sudo --askpass cp .libs/libioxcf.so $2
241 sudo --askpass gdk-pixbuf-query-loaders --update-cache
244 rm -rf xcf-pixbuf-loader
247 install_extra_loaders()
249 if [ -n "$extra_loaders" ]
274 current_dir=$(basename $PWD)
275 if [[ $current_dir == "geeqie" ]]
277 sudo --askpass make uninstall
278 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
283 sudo --askpass rm -rf geeqie
286 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
294 if [[ $DistroBasedOn == "debian" ]]
296 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
297 if [[ "$res" == "install ok installed"* ]]
309 if [[ $DistroBasedOn == "debian" ]]
311 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
317 rm $install_pass_script >/dev/null 2>&1
318 #~ rm $install_log >/dev/null 2>&1
320 if [[ -p $zen_pipe ]]
322 echo "100" > $zen_pipe
323 echo "#End" > $zen_pipe
326 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
328 rm $zen_pipe >/dev/null 2>&1
335 # If uninstall has been run, maybe the current directory no longer exists
339 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
346 if [[ $DistroBasedOn != "debian" ]]
348 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
349 Operating System: $OS
351 Psuedoname: $PSUEDONAME
353 DistroBasedOn: $DistroBasedOn
355 Machine: $MACH" 2>/dev/null
360 # Parse the comand line
361 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
400 # If a Geeqie folder already exists here, warn the user
403 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
408 # If it looks like a Geeqie download folder, assume an update
409 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
413 # If it looks like something else is already installed here, warn the user
414 if [ -d ".git" ] || [ -d "src" ]
416 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
424 # Use GTK3 as default
428 if [[ $mode == "install" ]]
430 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."
432 title="Install Geeqie and dependencies"
435 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."
437 title="Update Geeqie and re-install"
440 # When updating, use previous installation as default
441 if [[ -f config.log ]]
443 grep gtk-2.0 config.log >/dev/null
455 # Ask whether to install GTK2 or GTK3 or uninstall
457 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)
464 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
465 # so create a temporary script containing the command
466 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
468 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
473 \n' > $install_pass_script
474 chmod +x $install_pass_script
475 export SUDO_ASKPASS=$install_pass_script
477 if [[ $gtk_version == "Uninstall" ]]
483 # Put the install log in tmp, to avoid writing to PWD during a new install
484 rm install.log 2>/dev/null
485 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
487 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
490 # Get the standard options that are not yet installed
491 arraylength=${#optional_array[@]}
492 for (( i=0; i<${arraylength}; i=i+2 ));
494 package_query ${optional_array[$i+1]}
497 if [ -z "$option_string" ]
499 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
501 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
506 # If GTK3 required, get the GTK3 options not yet installed
507 if [[ "$gtk_version" == "GTK3"* ]]
509 arraylength=${#optional_gtk3_array[@]}
510 for (( i=0; i<${arraylength}; i=i+2 ));
512 package_query ${optional_gtk3_array[$i+1]}
515 if [ -z "$option_string" ]
517 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
519 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
525 # Get the optional loaders not yet installed
527 gdk-pixbuf-query-loaders | grep WebP >/dev/null
530 if [ -z "$loaders_string" ]
532 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
534 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
540 gdk-pixbuf-query-loaders | grep psd >/dev/null
543 if [ -z "$loaders_string" ]
545 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
547 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
552 gdk-pixbuf-query-loaders | grep xcf >/dev/null
555 if [ -z "$loaders_string" ]
557 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
559 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
563 kill $zen_pid 2>/dev/null
565 # Ask the user which options to install
566 if [ -n "$option_string" ]
568 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)
576 # Ask the user which extra loaders to install
577 if [ -n "$loaders_string" ]
579 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)
587 # Start of Zenity progress section
588 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
590 (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 &
593 echo "#Installing essential libraries..." > $zen_pipe
595 install_essential $gtk_version
598 echo "#Installing options..." > $zen_pipe
603 echo "#Installing extra loaders..." > $zen_pipe
605 install_extra_loaders
607 echo "10" > $zen_pipe
608 echo "#Getting new sources from server..." > $zen_pipe
610 if [[ $mode == "install" ]]
612 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
614 git checkout master >>$install_log 2>&1
617 git_error=$(tail -n5 $install_log 2>&1)
618 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
621 ret=$(git pull >>$install_log 2>&1)
626 git_error=$(tail -n5 $install_log 2>&1)
627 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
631 echo "20" > $zen_pipe
632 echo "#Cleaning installed version..." > $zen_pipe
634 if [[ $mode == "install" ]]
638 sudo --askpass make uninstall >>$install_log 2>&1
639 sudo --askpass make maintainer-clean >>$install_log 2>&1
642 echo "30" > $zen_pipe
643 echo "#Checkout required version..." > $zen_pipe
647 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
650 git_error=$(tail -n5 $install_log 2>&1)
651 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
656 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
659 git_error=$(tail -n5 $install_log 2>&1)
660 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
665 ret=$(git checkout "$TAG" >>$install_log 2>&1)
669 git_error=$(tail -n5 $install_log 2>&1)
670 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
675 if [[ "$DEBUG" == "yes" ]]
679 debug_opt="--disable-debug-log"
682 echo "40" > $zen_pipe
683 echo "#Creating configuration files..." > $zen_pipe
685 if [[ $gtk_version == "GTK3"* ]]
687 ./autogen.sh "$debug_opt" >>$install_log 2>&1
689 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
692 echo "60" > $zen_pipe
693 echo "#Compiling..." > $zen_pipe
695 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
696 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
697 make -j >>$install_log 2>&1
701 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
706 echo "90 " > $zen_pipe
707 echo "#Installing Geeqie..." > $zen_pipe
709 sudo --askpass make install >>$install_log 2>&1
711 # This is a temporary fix until the ZoneDetect project releases its source code
712 zonedetect_message="ZoneDetect database not loaded"
713 if [[ -d "/usr/local/lib/geeqie" ]]
715 if [[ ! -f "/usr/local/lib/geeqie/timezone21.bin" ]]
717 sudo --askpass wget --directory-prefix=/usr/local/lib/geeqie/ https://github.com/BertoldVdb/ZoneDetect/raw/master/database/timezone21.bin >>$install_log 2>&1
720 zonedetect_message=""
723 zonedetect_message=""
727 rm $install_pass_script
728 mv -f $install_log install.log;
730 echo "100 " > $zen_pipe
733 (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