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"
66 # Optional for GTK3 only
68 "libchamplain gtk (for GPS maps)"
69 "libchamplain-gtk-0.12-dev"
70 "libchamplain (for GPS maps)"
71 "libchamplain-0.12-dev"
72 "libpoppler (for pdf file preview)"
76 # Optional pixbuf loaders
77 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 webp-pixbuf-loader-master
209 package_install libglib2.0-dev libgdk-pixbuf2.0-dev libwebp-dev python-minimal
210 wget https://github.com/aruiz/webp-pixbuf-loader/archive/master.zip
212 cd webp-pixbuf-loader-master
215 sudo --askpass ./waf install
216 sudo --askpass gdk-pixbuf-query-loaders --update-cache
218 rm -rf webp-pixbuf-loader-master
224 rm -rf gdk-pixbuf-psd
225 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
229 sudo --askpass make install
230 sudo --askpass gdk-pixbuf-query-loaders --update-cache
232 rm -rf gdk-pixbuf-psd
237 rm -rf xcf-pixbuf-loader
238 package_install libbz2-dev
239 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
244 # There must be a better way...
245 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
254 sudo --askpass cp .libs/libioxcf.so $2
255 sudo --askpass gdk-pixbuf-query-loaders --update-cache
258 rm -rf xcf-pixbuf-loader
261 install_extra_loaders()
263 if [ -n "$extra_loaders" ]
291 current_dir=$(basename $PWD)
292 if [[ $current_dir == "geeqie" ]]
294 sudo --askpass make uninstall
295 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
300 sudo --askpass rm -rf geeqie
303 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
311 if [[ $DistroBasedOn == "debian" ]]
313 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
314 if [[ "$res" == "install ok installed"* ]]
326 if [[ $DistroBasedOn == "debian" ]]
328 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
334 rm $install_pass_script >/dev/null 2>&1
335 #~ rm $install_log >/dev/null 2>&1
337 if [[ -p $zen_pipe ]]
339 echo "100" > $zen_pipe
340 echo "#End" > $zen_pipe
343 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
345 rm $zen_pipe >/dev/null 2>&1
352 # If uninstall has been run, maybe the current directory no longer exists
356 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
363 if [[ $DistroBasedOn != "debian" ]]
365 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
366 Operating System: $OS
368 Psuedoname: $PSUEDONAME
370 DistroBasedOn: $DistroBasedOn
372 Machine: $MACH" 2>/dev/null
377 # Parse the comand line
378 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
417 # If a Geeqie folder already exists here, warn the user
420 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
425 # If it looks like a Geeqie download folder, assume an update
426 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
430 # If it looks like something else is already installed here, warn the user
431 if [ -d ".git" ] || [ -d "src" ]
433 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
441 # Use GTK3 as default
445 if [[ $mode == "install" ]]
447 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."
449 title="Install Geeqie and dependencies"
452 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."
454 title="Update Geeqie and re-install"
457 # When updating, use previous installation as default
458 if [[ -f config.log ]]
460 grep gtk-2.0 config.log >/dev/null
472 # Ask whether to install GTK2 or GTK3 or uninstall
474 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)
481 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
482 # so create a temporary script containing the command
483 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
485 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
490 \n' > $install_pass_script
491 chmod +x $install_pass_script
492 export SUDO_ASKPASS=$install_pass_script
494 if [[ $gtk_version == "Uninstall" ]]
500 # Put the install log in tmp, to avoid writing to PWD during a new install
501 rm install.log 2>/dev/null
502 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
504 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
507 # Get the standard options that are not yet installed
508 arraylength=${#optional_array[@]}
509 for (( i=0; i<${arraylength}; i=i+2 ));
511 package_query ${optional_array[$i+1]}
514 if [ -z "$option_string" ]
516 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
518 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
523 # If GTK3 required, get the GTK3 options not yet installed
524 if [[ "$gtk_version" == "GTK3"* ]]
526 arraylength=${#optional_gtk3_array[@]}
527 for (( i=0; i<${arraylength}; i=i+2 ));
529 package_query ${optional_gtk3_array[$i+1]}
532 if [ -z "$option_string" ]
534 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
536 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
542 # Get the optional loaders not yet installed
544 gdk-pixbuf-query-loaders | grep WebP >/dev/null
547 if [ -z "$loaders_string" ]
549 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
551 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
557 gdk-pixbuf-query-loaders | grep psd >/dev/null
560 if [ -z "$loaders_string" ]
562 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
564 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
569 gdk-pixbuf-query-loaders | grep xcf >/dev/null
572 if [ -z "$loaders_string" ]
574 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
576 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
580 kill $zen_pid 2>/dev/null
582 # Ask the user which options to install
583 if [ -n "$option_string" ]
585 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)
593 # Ask the user which extra loaders to install
594 if [ -n "$loaders_string" ]
596 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)
604 # Start of Zenity progress section
605 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
607 (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 &
610 echo "#Installing essential libraries..." > $zen_pipe
612 install_essential $gtk_version
615 echo "#Installing options..." > $zen_pipe
620 echo "#Installing extra loaders..." > $zen_pipe
622 install_extra_loaders
624 echo "10" > $zen_pipe
625 echo "#Getting new sources from server..." > $zen_pipe
627 if [[ $mode == "install" ]]
629 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
631 git checkout master >>$install_log 2>&1
634 git_error=$(tail -n5 $install_log 2>&1)
635 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
638 ret=$(git pull >>$install_log 2>&1)
643 git_error=$(tail -n5 $install_log 2>&1)
644 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
648 echo "20" > $zen_pipe
649 echo "#Cleaning installed version..." > $zen_pipe
651 if [[ $mode == "install" ]]
655 sudo --askpass make uninstall >>$install_log 2>&1
656 sudo --askpass make maintainer-clean >>$install_log 2>&1
659 echo "30" > $zen_pipe
660 echo "#Checkout required version..." > $zen_pipe
664 ret=$(git checkout master~"$BACK" >>$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 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
676 git_error=$(tail -n5 $install_log 2>&1)
677 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
682 ret=$(git checkout "$TAG" >>$install_log 2>&1)
686 git_error=$(tail -n5 $install_log 2>&1)
687 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
692 if [[ "$DEBUG" == "yes" ]]
696 debug_opt="--disable-debug-log"
699 echo "40" > $zen_pipe
700 echo "#Creating configuration files..." > $zen_pipe
702 if [[ $gtk_version == "GTK3"* ]]
704 ./autogen.sh "$debug_opt" >>$install_log 2>&1
706 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
709 echo "60" > $zen_pipe
710 echo "#Compiling..." > $zen_pipe
712 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
713 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
714 make -j >>$install_log 2>&1
718 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
723 echo "90 " > $zen_pipe
724 echo "#Installing Geeqie..." > $zen_pipe
726 sudo --askpass make install >>$install_log 2>&1
728 # This is a temporary fix until the ZoneDetect project releases its source code
729 zonedetect_message="ZoneDetect database not loaded"
730 if [[ -d "/usr/local/lib/geeqie" ]]
732 if [[ ! -f "/usr/local/lib/geeqie/timezone21.bin" ]]
734 sudo --askpass wget --directory-prefix=/usr/local/lib/geeqie/ https://github.com/BertoldVdb/ZoneDetect/raw/master/database/timezone21.bin >>$install_log 2>&1
737 zonedetect_message=""
740 zonedetect_message=""
744 rm $install_pass_script
745 mv -f $install_log install.log;
747 echo "100 " > $zen_pipe
750 (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