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=(
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 webp-pixbuf-loader-master
211 package_install libglib2.0-dev libgdk-pixbuf2.0-dev libwebp-dev python-minimal
212 wget https://github.com/aruiz/webp-pixbuf-loader/archive/master.zip
214 cd webp-pixbuf-loader-master
217 sudo --askpass ./waf install
218 sudo --askpass gdk-pixbuf-query-loaders --update-cache
220 rm -rf webp-pixbuf-loader-master
226 rm -rf gdk-pixbuf-psd
227 git clone https://github.com/and-rom/gdk-pixbuf-psd.git
231 sudo --askpass make install
232 sudo --askpass gdk-pixbuf-query-loaders --update-cache
234 rm -rf gdk-pixbuf-psd
239 rm -rf xcf-pixbuf-loader
240 package_install libbz2-dev
241 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
246 # There must be a better way...
247 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
256 sudo --askpass cp .libs/libioxcf.so $2
257 sudo --askpass gdk-pixbuf-query-loaders --update-cache
260 rm -rf xcf-pixbuf-loader
263 install_extra_loaders()
265 if [ -n "$extra_loaders" ]
293 current_dir=$(basename $PWD)
294 if [[ $current_dir == "geeqie" ]]
296 sudo --askpass make uninstall
297 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
302 sudo --askpass rm -rf geeqie
305 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
313 if [[ $DistroBasedOn == "debian" ]]
315 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
316 if [[ "$res" == "install ok installed"* ]]
328 if [[ $DistroBasedOn == "debian" ]]
330 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
336 rm $install_pass_script >/dev/null 2>&1
337 #~ rm $install_log >/dev/null 2>&1
339 if [[ -p $zen_pipe ]]
341 echo "100" > $zen_pipe
342 echo "#End" > $zen_pipe
345 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
347 rm $zen_pipe >/dev/null 2>&1
354 # If uninstall has been run, maybe the current directory no longer exists
358 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
365 if [[ $DistroBasedOn != "debian" ]]
367 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
368 Operating System: $OS
370 Psuedoname: $PSUEDONAME
372 DistroBasedOn: $DistroBasedOn
374 Machine: $MACH" 2>/dev/null
379 # Parse the comand line
380 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
419 # If a Geeqie folder already exists here, warn the user
422 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
427 # If it looks like a Geeqie download folder, assume an update
428 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
432 # If it looks like something else is already installed here, warn the user
433 if [ -d ".git" ] || [ -d "src" ]
435 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
443 # Use GTK3 as default
447 if [[ $mode == "install" ]]
449 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."
451 title="Install Geeqie and dependencies"
454 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."
456 title="Update Geeqie and re-install"
459 # When updating, use previous installation as default
460 if [[ -f config.log ]]
462 grep gtk-2.0 config.log >/dev/null
474 # Ask whether to install GTK2 or GTK3 or uninstall
476 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)
483 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
484 # so create a temporary script containing the command
485 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
487 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
492 \n' > $install_pass_script
493 chmod +x $install_pass_script
494 export SUDO_ASKPASS=$install_pass_script
496 if [[ $gtk_version == "Uninstall" ]]
502 # Put the install log in tmp, to avoid writing to PWD during a new install
503 rm install.log 2>/dev/null
504 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
506 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
509 # Get the standard options that are not yet installed
510 arraylength=${#optional_array[@]}
511 for (( i=0; i<${arraylength}; i=i+2 ));
513 package_query ${optional_array[$i+1]}
516 if [ -z "$option_string" ]
518 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
520 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
525 # If GTK3 required, get the GTK3 options not yet installed
526 if [[ "$gtk_version" == "GTK3"* ]]
528 arraylength=${#optional_gtk3_array[@]}
529 for (( i=0; i<${arraylength}; i=i+2 ));
531 package_query ${optional_gtk3_array[$i+1]}
534 if [ -z "$option_string" ]
536 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
538 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
544 # Get the optional loaders not yet installed
546 gdk-pixbuf-query-loaders | grep WebP >/dev/null
549 if [ -z "$loaders_string" ]
551 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
553 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
559 gdk-pixbuf-query-loaders | grep psd >/dev/null
562 if [ -z "$loaders_string" ]
564 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
566 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
571 gdk-pixbuf-query-loaders | grep xcf >/dev/null
574 if [ -z "$loaders_string" ]
576 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
578 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
582 kill $zen_pid 2>/dev/null
584 # Ask the user which options to install
585 if [ -n "$option_string" ]
587 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)
595 # Ask the user which extra loaders to install
596 if [ -n "$loaders_string" ]
598 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)
606 # Start of Zenity progress section
607 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
609 (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 &
612 echo "#Installing essential libraries..." > $zen_pipe
614 install_essential $gtk_version
617 echo "#Installing options..." > $zen_pipe
622 echo "#Installing extra loaders..." > $zen_pipe
624 install_extra_loaders
626 echo "10" > $zen_pipe
627 echo "#Getting new sources from server..." > $zen_pipe
629 if [[ $mode == "install" ]]
631 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
633 git checkout master >>$install_log 2>&1
636 git_error=$(tail -n5 $install_log 2>&1)
637 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
640 ret=$(git pull >>$install_log 2>&1)
645 git_error=$(tail -n5 $install_log 2>&1)
646 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
650 echo "20" > $zen_pipe
651 echo "#Cleaning installed version..." > $zen_pipe
653 if [[ $mode == "install" ]]
657 sudo --askpass make uninstall >>$install_log 2>&1
658 sudo --askpass make maintainer-clean >>$install_log 2>&1
661 echo "30" > $zen_pipe
662 echo "#Checkout required version..." > $zen_pipe
666 ret=$(git checkout master~"$BACK" >>$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 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
678 git_error=$(tail -n5 $install_log 2>&1)
679 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
684 ret=$(git checkout "$TAG" >>$install_log 2>&1)
688 git_error=$(tail -n5 $install_log 2>&1)
689 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
694 if [[ "$DEBUG" == "yes" ]]
698 debug_opt="--disable-debug-log"
701 echo "40" > $zen_pipe
702 echo "#Creating configuration files..." > $zen_pipe
704 if [[ $gtk_version == "GTK3"* ]]
706 ./autogen.sh "$debug_opt" >>$install_log 2>&1
708 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
711 echo "60" > $zen_pipe
712 echo "#Compiling..." > $zen_pipe
714 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
715 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
716 make -j >>$install_log 2>&1
720 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
725 echo "90 " > $zen_pipe
726 echo "#Installing Geeqie..." > $zen_pipe
728 sudo --askpass make install >>$install_log 2>&1
730 # This is a temporary fix until the ZoneDetect project releases its source code
731 zonedetect_message="ZoneDetect database not loaded"
732 if [[ -d "/usr/local/lib/geeqie" ]]
734 if [[ ! -f "/usr/local/lib/geeqie/timezone21.bin" ]]
736 sudo --askpass wget --directory-prefix=/usr/local/lib/geeqie/ https://github.com/BertoldVdb/ZoneDetect/raw/master/database/timezone21.bin >>$install_log 2>&1
739 zonedetect_message=""
742 zonedetect_message=""
746 rm $install_pass_script
747 mv -f $install_log install.log;
749 echo "100 " > $zen_pipe
752 (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