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)"
68 "libdjvulibre (for DjVu images)"
72 # Optional for GTK3 only
74 "libchamplain gtk (for GPS maps)"
75 "libchamplain-gtk-0.12-dev"
76 "libchamplain (for GPS maps)"
77 "libchamplain-0.12-dev"
78 "libpoppler (for pdf file preview)"
82 # Optional pixbuf loaders
83 optional_loaders_array=(
84 ".psd Photoshop images"
90 ####################################################################
92 # Derived from: https://github.com/coto/server-easy-install (GPL)
93 ####################################################################
96 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
101 OS=`lowercase \`uname\``
105 if [ "${OS}" == "windowsnt" ]
108 elif [ "${OS}" == "darwin" ]
113 if [ "${OS}" = "SunOS" ]
117 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
118 elif [ "${OS}" = "AIX" ]
120 OSSTR="${OS} `oslevel` (`oslevel -r`)"
121 elif [ "${OS}" = "Linux" ]
123 if [ -f /etc/redhat-release ]
125 DistroBasedOn='RedHat'
126 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
127 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
128 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
129 elif [ -f /etc/SuSE-release ]
132 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
133 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
134 elif [ -f /etc/mandrake-release ]
136 DistroBasedOn='Mandrake'
137 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
138 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
139 elif [ -f /etc/debian_version ]
141 DistroBasedOn='Debian'
142 if [ -f /etc/lsb-release ]
144 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
145 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
146 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
149 if [ -f /etc/UnitedLinux-release ]
151 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
154 DistroBasedOn=`lowercase $DistroBasedOn`
157 readonly DistroBasedOn
168 arraylength=${#essential_array[@]}
169 for (( i=0; i<${arraylength}; i=i+1 ));
171 package_query ${essential_array[$i]}
174 package_install ${essential_array[$i]}
178 if [[ $1 == "GTK3" ]]
180 package_query "libgtk-3-dev"
183 package_install libgtk-3-dev
186 package_query "libgtk2.0-dev"
189 package_install libgtk2.0-dev
212 rm -rf gdk-pixbuf-psd
213 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
217 sudo --askpass make install
218 sudo --askpass gdk-pixbuf-query-loaders --update-cache
220 rm -rf gdk-pixbuf-psd
225 rm -rf xcf-pixbuf-loader
226 package_install libbz2-dev
227 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
232 # There must be a better way...
233 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
242 sudo --askpass cp .libs/libioxcf.so $2
243 sudo --askpass gdk-pixbuf-query-loaders --update-cache
246 rm -rf xcf-pixbuf-loader
249 install_extra_loaders()
251 if [ -n "$extra_loaders" ]
276 current_dir=$(basename $PWD)
277 if [[ $current_dir == "geeqie" ]]
279 sudo --askpass make uninstall
280 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
285 sudo --askpass rm -rf geeqie
288 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
296 if [[ $DistroBasedOn == "debian" ]]
298 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
299 if [[ "$res" == "install ok installed"* ]]
311 if [[ $DistroBasedOn == "debian" ]]
313 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
319 rm $install_pass_script >/dev/null 2>&1
320 #~ rm $install_log >/dev/null 2>&1
322 if [[ -p $zen_pipe ]]
324 echo "100" > $zen_pipe
325 echo "#End" > $zen_pipe
328 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
330 rm $zen_pipe >/dev/null 2>&1
337 # If uninstall has been run, maybe the current directory no longer exists
341 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
348 if [[ $DistroBasedOn != "debian" ]]
350 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
351 Operating System: $OS
353 Psuedoname: $PSUEDONAME
355 DistroBasedOn: $DistroBasedOn
357 Machine: $MACH" 2>/dev/null
362 # Parse the comand line
363 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
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
677 if [[ "$DEBUG" == "yes" ]]
681 debug_opt="--disable-debug-log"
684 echo "40" > $zen_pipe
685 echo "#Creating configuration files..." > $zen_pipe
687 if [[ $gtk_version == "GTK3"* ]]
689 ./autogen.sh "$debug_opt" >>$install_log 2>&1
691 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
694 echo "60" > $zen_pipe
695 echo "#Compiling..." > $zen_pipe
697 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
698 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
699 make -j >>$install_log 2>&1
703 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
708 echo "90 " > $zen_pipe
709 echo "#Installing Geeqie..." > $zen_pipe
711 sudo --askpass make install >>$install_log 2>&1
713 # This is a temporary fix until the ZoneDetect project releases its source code
714 zonedetect_message="ZoneDetect database not loaded"
715 if [[ -d "/usr/local/lib/geeqie" ]]
717 if [[ ! -f "/usr/local/lib/geeqie/timezone21.bin" ]]
719 sudo --askpass wget --directory-prefix=/usr/local/lib/geeqie/ https://github.com/BertoldVdb/ZoneDetect/raw/master/database/timezone21.bin >>$install_log 2>&1
722 zonedetect_message=""
725 zonedetect_message=""
729 rm $install_pass_script
730 mv -f $install_log install.log;
732 echo "100 " > $zen_pipe
735 (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