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)"
68 # Optional for GTK3 only
70 "libchamplain gtk (for GPS maps)"
71 "libchamplain-gtk-0.12-dev"
72 "libchamplain (for GPS maps)"
73 "libchamplain-0.12-dev"
74 "libpoppler (for pdf file preview)"
78 # Optional pixbuf loaders
79 optional_loaders_array=(
80 ".psd Photoshop images"
86 ####################################################################
88 # Derived from: https://github.com/coto/server-easy-install (GPL)
89 ####################################################################
92 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
97 OS=`lowercase \`uname\``
101 if [ "${OS}" == "windowsnt" ]
104 elif [ "${OS}" == "darwin" ]
109 if [ "${OS}" = "SunOS" ]
113 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
114 elif [ "${OS}" = "AIX" ]
116 OSSTR="${OS} `oslevel` (`oslevel -r`)"
117 elif [ "${OS}" = "Linux" ]
119 if [ -f /etc/redhat-release ]
121 DistroBasedOn='RedHat'
122 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
123 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
124 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
125 elif [ -f /etc/SuSE-release ]
128 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
129 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
130 elif [ -f /etc/mandrake-release ]
132 DistroBasedOn='Mandrake'
133 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
134 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
135 elif [ -f /etc/debian_version ]
137 DistroBasedOn='Debian'
138 if [ -f /etc/lsb-release ]
140 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
141 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
142 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
145 if [ -f /etc/UnitedLinux-release ]
147 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
150 DistroBasedOn=`lowercase $DistroBasedOn`
153 readonly DistroBasedOn
164 arraylength=${#essential_array[@]}
165 for (( i=0; i<${arraylength}; i=i+1 ));
167 package_query ${essential_array[$i]}
170 package_install ${essential_array[$i]}
174 if [[ $1 == "GTK3" ]]
176 package_query "libgtk-3-dev"
179 package_install libgtk-3-dev
182 package_query "libgtk2.0-dev"
185 package_install libgtk2.0-dev
208 rm -rf gdk-pixbuf-psd
209 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
213 sudo --askpass make install
214 sudo --askpass gdk-pixbuf-query-loaders --update-cache
216 rm -rf gdk-pixbuf-psd
221 rm -rf xcf-pixbuf-loader
222 package_install libbz2-dev
223 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
228 # There must be a better way...
229 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
238 sudo --askpass cp .libs/libioxcf.so $2
239 sudo --askpass gdk-pixbuf-query-loaders --update-cache
242 rm -rf xcf-pixbuf-loader
245 install_extra_loaders()
247 if [ -n "$extra_loaders" ]
272 current_dir=$(basename $PWD)
273 if [[ $current_dir == "geeqie" ]]
275 sudo --askpass make uninstall
276 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
281 sudo --askpass rm -rf geeqie
284 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
292 if [[ $DistroBasedOn == "debian" ]]
294 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
295 if [[ "$res" == "install ok installed"* ]]
307 if [[ $DistroBasedOn == "debian" ]]
309 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
315 rm $install_pass_script >/dev/null 2>&1
316 #~ rm $install_log >/dev/null 2>&1
318 if [[ -p $zen_pipe ]]
320 echo "100" > $zen_pipe
321 echo "#End" > $zen_pipe
324 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
326 rm $zen_pipe >/dev/null 2>&1
333 # If uninstall has been run, maybe the current directory no longer exists
337 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
344 if [[ $DistroBasedOn != "debian" ]]
346 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
347 Operating System: $OS
349 Psuedoname: $PSUEDONAME
351 DistroBasedOn: $DistroBasedOn
353 Machine: $MACH" 2>/dev/null
358 # Parse the comand line
359 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
398 # If a Geeqie folder already exists here, warn the user
401 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
406 # If it looks like a Geeqie download folder, assume an update
407 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
411 # If it looks like something else is already installed here, warn the user
412 if [ -d ".git" ] || [ -d "src" ]
414 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
422 # Use GTK3 as default
426 if [[ $mode == "install" ]]
428 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."
430 title="Install Geeqie and dependencies"
433 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."
435 title="Update Geeqie and re-install"
438 # When updating, use previous installation as default
439 if [[ -f config.log ]]
441 grep gtk-2.0 config.log >/dev/null
453 # Ask whether to install GTK2 or GTK3 or uninstall
455 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)
462 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
463 # so create a temporary script containing the command
464 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
466 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
471 \n' > $install_pass_script
472 chmod +x $install_pass_script
473 export SUDO_ASKPASS=$install_pass_script
475 if [[ $gtk_version == "Uninstall" ]]
481 # Put the install log in tmp, to avoid writing to PWD during a new install
482 rm install.log 2>/dev/null
483 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
485 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
488 # Get the standard options that are not yet installed
489 arraylength=${#optional_array[@]}
490 for (( i=0; i<${arraylength}; i=i+2 ));
492 package_query ${optional_array[$i+1]}
495 if [ -z "$option_string" ]
497 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
499 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
504 # If GTK3 required, get the GTK3 options not yet installed
505 if [[ "$gtk_version" == "GTK3"* ]]
507 arraylength=${#optional_gtk3_array[@]}
508 for (( i=0; i<${arraylength}; i=i+2 ));
510 package_query ${optional_gtk3_array[$i+1]}
513 if [ -z "$option_string" ]
515 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
517 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
523 # Get the optional loaders not yet installed
525 gdk-pixbuf-query-loaders | grep WebP >/dev/null
528 if [ -z "$loaders_string" ]
530 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
532 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
538 gdk-pixbuf-query-loaders | grep psd >/dev/null
541 if [ -z "$loaders_string" ]
543 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
545 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
550 gdk-pixbuf-query-loaders | grep xcf >/dev/null
553 if [ -z "$loaders_string" ]
555 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
557 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
561 kill $zen_pid 2>/dev/null
563 # Ask the user which options to install
564 if [ -n "$option_string" ]
566 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)
574 # Ask the user which extra loaders to install
575 if [ -n "$loaders_string" ]
577 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)
585 # Start of Zenity progress section
586 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
588 (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 &
591 echo "#Installing essential libraries..." > $zen_pipe
593 install_essential $gtk_version
596 echo "#Installing options..." > $zen_pipe
601 echo "#Installing extra loaders..." > $zen_pipe
603 install_extra_loaders
605 echo "10" > $zen_pipe
606 echo "#Getting new sources from server..." > $zen_pipe
608 if [[ $mode == "install" ]]
610 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
612 git checkout master >>$install_log 2>&1
615 git_error=$(tail -n5 $install_log 2>&1)
616 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
619 ret=$(git pull >>$install_log 2>&1)
624 git_error=$(tail -n5 $install_log 2>&1)
625 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
629 echo "20" > $zen_pipe
630 echo "#Cleaning installed version..." > $zen_pipe
632 if [[ $mode == "install" ]]
636 sudo --askpass make uninstall >>$install_log 2>&1
637 sudo --askpass make maintainer-clean >>$install_log 2>&1
640 echo "30" > $zen_pipe
641 echo "#Checkout required version..." > $zen_pipe
645 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
648 git_error=$(tail -n5 $install_log 2>&1)
649 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
654 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
657 git_error=$(tail -n5 $install_log 2>&1)
658 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
663 ret=$(git checkout "$TAG" >>$install_log 2>&1)
667 git_error=$(tail -n5 $install_log 2>&1)
668 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
673 if [[ "$DEBUG" == "yes" ]]
677 debug_opt="--disable-debug-log"
680 echo "40" > $zen_pipe
681 echo "#Creating configuration files..." > $zen_pipe
683 if [[ $gtk_version == "GTK3"* ]]
685 ./autogen.sh "$debug_opt" >>$install_log 2>&1
687 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
690 echo "60" > $zen_pipe
691 echo "#Compiling..." > $zen_pipe
693 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
694 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
695 make -j >>$install_log 2>&1
699 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
704 echo "90 " > $zen_pipe
705 echo "#Installing Geeqie..." > $zen_pipe
707 sudo --askpass make install >>$install_log 2>&1
709 # This is a temporary fix until the ZoneDetect project releases its source code
710 zonedetect_message="ZoneDetect database not loaded"
711 if [[ -d "/usr/local/lib/geeqie" ]]
713 if [[ ! -f "/usr/local/lib/geeqie/timezone21.bin" ]]
715 sudo --askpass wget --directory-prefix=/usr/local/lib/geeqie/ https://github.com/BertoldVdb/ZoneDetect/raw/master/database/timezone21.bin >>$install_log 2>&1
718 zonedetect_message=""
721 zonedetect_message=""
725 rm $install_pass_script
726 mv -f $install_log install.log;
728 echo "100 " > $zen_pipe
731 (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