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)"
62 # Optional for GTK3 only
64 "libchamplain gtk (for GPS maps)"
65 "libchamplain-gtk-0.12-dev"
66 "libchamplain (for GPS maps)"
67 "libchamplain-0.12-dev"
68 "libpoppler (for pdf file preview)"
72 # Optional pixbuf loaders
73 optional_loaders_array=(
76 ".psd Photoshop images"
82 ####################################################################
84 # Derived from: https://github.com/coto/server-easy-install (GPL)
85 ####################################################################
88 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
93 OS=`lowercase \`uname\``
97 if [ "${OS}" == "windowsnt" ]
100 elif [ "${OS}" == "darwin" ]
105 if [ "${OS}" = "SunOS" ]
109 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
110 elif [ "${OS}" = "AIX" ]
112 OSSTR="${OS} `oslevel` (`oslevel -r`)"
113 elif [ "${OS}" = "Linux" ]
115 if [ -f /etc/redhat-release ]
117 DistroBasedOn='RedHat'
118 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
119 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
120 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
121 elif [ -f /etc/SuSE-release ]
124 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
125 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
126 elif [ -f /etc/mandrake-release ]
128 DistroBasedOn='Mandrake'
129 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
130 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
131 elif [ -f /etc/debian_version ]
133 DistroBasedOn='Debian'
134 if [ -f /etc/lsb-release ]
136 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
137 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
138 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
141 if [ -f /etc/UnitedLinux-release ]
143 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
146 DistroBasedOn=`lowercase $DistroBasedOn`
149 readonly DistroBasedOn
160 arraylength=${#essential_array[@]}
161 for (( i=0; i<${arraylength}; i=i+1 ));
163 package_query ${essential_array[$i]}
166 package_install ${essential_array[$i]}
170 if [[ $1 == "GTK3" ]]
172 package_query "libgtk-3-dev"
175 package_install libgtk-3-dev
178 package_query "libgtk2.0-dev"
181 package_install libgtk2.0-dev
204 rm -rf webp-pixbuf-loader-master
205 package_install libglib2.0-dev libgdk-pixbuf2.0-dev libwebp-dev python-minimal
206 wget https://github.com/aruiz/webp-pixbuf-loader/archive/master.zip
208 cd webp-pixbuf-loader-master
211 sudo --askpass ./waf install
212 sudo --askpass gdk-pixbuf-query-loaders --update-cache
214 rm -rf webp-pixbuf-loader-master
220 rm -rf gdk-pixbuf-psd
221 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
225 sudo --askpass make install
226 sudo --askpass gdk-pixbuf-query-loaders --update-cache
228 rm -rf gdk-pixbuf-psd
233 rm -rf xcf-pixbuf-loader
234 package_install libbz2-dev
235 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
240 # There must be a better way...
241 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
250 sudo --askpass cp .libs/libioxcf.so $2
251 sudo --askpass gdk-pixbuf-query-loaders --update-cache
254 rm -rf xcf-pixbuf-loader
257 install_extra_loaders()
259 if [ -n "$extra_loaders" ]
287 current_dir=$(basename $PWD)
288 if [[ $current_dir == "geeqie" ]]
290 sudo --askpass make uninstall
291 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
296 sudo --askpass rm -rf geeqie
299 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
307 if [[ $DistroBasedOn == "debian" ]]
309 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
310 if [[ "$res" == "install ok installed"* ]]
322 if [[ $DistroBasedOn == "debian" ]]
324 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
330 rm $install_pass_script >/dev/null 2>&1
331 #~ rm $install_log >/dev/null 2>&1
333 if [[ -p $zen_pipe ]]
335 echo "100" > $zen_pipe
336 echo "#End" > $zen_pipe
339 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
341 rm $zen_pipe >/dev/null 2>&1
348 # If uninstall has been run, maybe the current directory no longer exists
352 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
359 if [[ $DistroBasedOn != "debian" ]]
361 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
362 Operating System: $OS
364 Psuedoname: $PSUEDONAME
366 DistroBasedOn: $DistroBasedOn
368 Machine: $MACH" 2>/dev/null
373 # Parse the comand line
374 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
413 # If a Geeqie folder already exists here, warn the user
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\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
421 # If it looks like a Geeqie download folder, assume an update
422 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
426 # If it looks like something else is already installed here, warn the user
427 if [ -d ".git" ] || [ -d "src" ]
429 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
437 # Use GTK3 as default
441 if [[ $mode == "install" ]]
443 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."
445 title="Install Geeqie and dependencies"
448 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."
450 title="Update Geeqie and re-install"
453 # When updating, use previous installation as default
454 if [[ -f config.log ]]
456 grep gtk-2.0 config.log >/dev/null
468 # Ask whether to install GTK2 or GTK3 or uninstall
470 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)
477 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
478 # so create a temporary script containing the command
479 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
481 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
486 \n' > $install_pass_script
487 chmod +x $install_pass_script
488 export SUDO_ASKPASS=$install_pass_script
490 if [[ $gtk_version == "Uninstall" ]]
496 # Put the install log in tmp, to avoid writing to PWD during a new install
497 rm install.log 2>/dev/null
498 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
500 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
503 # Get the standard options that are not yet installed
504 arraylength=${#optional_array[@]}
505 for (( i=0; i<${arraylength}; i=i+2 ));
507 package_query ${optional_array[$i+1]}
510 if [ -z "$option_string" ]
512 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
514 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
519 # If GTK3 required, get the GTK3 options not yet installed
520 if [[ "$gtk_version" == "GTK3"* ]]
522 arraylength=${#optional_gtk3_array[@]}
523 for (( i=0; i<${arraylength}; i=i+2 ));
525 package_query ${optional_gtk3_array[$i+1]}
528 if [ -z "$option_string" ]
530 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
532 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
538 # Get the optional loaders not yet installed
540 gdk-pixbuf-query-loaders | grep WebP >/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]}"
553 gdk-pixbuf-query-loaders | grep psd >/dev/null
556 if [ -z "$loaders_string" ]
558 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
560 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
565 gdk-pixbuf-query-loaders | grep xcf >/dev/null
568 if [ -z "$loaders_string" ]
570 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
572 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
576 kill $zen_pid 2>/dev/null
578 # Ask the user which options to install
579 if [ -n "$option_string" ]
581 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)
589 # Ask the user which extra loaders to install
590 if [ -n "$loaders_string" ]
592 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)
600 # Start of Zenity progress section
601 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
603 (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 &
606 echo "#Installing essential libraries..." > $zen_pipe
608 install_essential $gtk_version
611 echo "#Installing options..." > $zen_pipe
616 echo "#Installing extra loaders..." > $zen_pipe
618 install_extra_loaders
620 echo "10" > $zen_pipe
621 echo "#Getting new sources from server..." > $zen_pipe
623 if [[ $mode == "install" ]]
625 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
627 git checkout master >>$install_log 2>&1
630 git_error=$(tail -n5 $install_log 2>&1)
631 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
634 ret=$(git pull >>$install_log 2>&1)
639 git_error=$(tail -n5 $install_log 2>&1)
640 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
644 echo "20" > $zen_pipe
645 echo "#Cleaning installed version..." > $zen_pipe
647 if [[ $mode == "install" ]]
651 sudo --askpass make uninstall >>$install_log 2>&1
652 sudo --askpass make maintainer-clean >>$install_log 2>&1
655 echo "30" > $zen_pipe
656 echo "#Checkout required version..." > $zen_pipe
660 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
663 git_error=$(tail -n5 $install_log 2>&1)
664 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
669 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
672 git_error=$(tail -n5 $install_log 2>&1)
673 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
678 ret=$(git checkout "$TAG" >>$install_log 2>&1)
682 git_error=$(tail -n5 $install_log 2>&1)
683 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
688 if [[ "$DEBUG" == "yes" ]]
692 debug_opt="--disable-debug-log"
695 echo "40" > $zen_pipe
696 echo "#Creating configuration files..." > $zen_pipe
698 if [[ $gtk_version == "GTK3"* ]]
700 ./autogen.sh "$debug_opt" >>$install_log 2>&1
702 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
705 echo "60" > $zen_pipe
706 echo "#Compiling..." > $zen_pipe
708 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
709 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
710 make -j >>$install_log 2>&1
714 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
719 echo "90 " > $zen_pipe
720 echo "#Installing Geeqie..." > $zen_pipe
722 sudo --askpass make install >>$install_log 2>&1
724 # This is a temporary fix until the ZoneDetect project releases its source code
725 zonedetect_message="ZoneDetect database not loaded"
726 if [[ -d "/usr/local/lib/geeqie" ]]
728 if [[ ! -f "/usr/local/lib/geeqie/timezone21.bin" ]]
730 sudo --askpass wget --directory-prefix=/usr/local/lib/geeqie/ https://github.com/BertoldVdb/ZoneDetect/raw/master/database/timezone21.bin >>$install_log 2>&1
733 zonedetect_message=""
736 zonedetect_message=""
740 rm $install_pass_script
741 mv -f $install_log install.log;
743 echo "100 " > $zen_pipe
746 (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