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=(
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 xcf-pixbuf-loader
211 package_install libbz2-dev
212 git clone https://github.com/StephaneDelcroix/xcf-pixbuf-loader.git
217 # There must be a better way...
218 loader_locn=$(gdk-pixbuf-query-loaders | grep "LoaderDir" | tr -d '#[:space:]')
227 sudo --askpass cp .libs/libioxcf.so $2
228 sudo --askpass gdk-pixbuf-query-loaders --update-cache
231 rm -rf xcf-pixbuf-loader
234 install_extra_loaders()
236 if [ -n "$extra_loaders" ]
258 current_dir=$(basename $PWD)
259 if [[ $current_dir == "geeqie" ]]
261 sudo --askpass make uninstall
262 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
267 sudo --askpass rm -rf geeqie
270 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
278 if [[ $DistroBasedOn == "debian" ]]
280 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
281 if [[ "$res" == "install ok installed"* ]]
293 if [[ $DistroBasedOn == "debian" ]]
295 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
301 rm $install_pass_script >/dev/null 2>&1
302 #~ rm $install_log >/dev/null 2>&1
304 if [[ -p $zen_pipe ]]
306 echo "100" > $zen_pipe
307 echo "#End" > $zen_pipe
310 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
312 rm $zen_pipe >/dev/null 2>&1
319 # If uninstall has been run, maybe the current directory no longer exists
323 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
330 if [[ $DistroBasedOn != "debian" ]]
332 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
333 Operating System: $OS
335 Psuedoname: $PSUEDONAME
337 DistroBasedOn: $DistroBasedOn
339 Machine: $MACH" 2>/dev/null
344 # Parse the comand line
345 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
384 # If a Geeqie folder already exists here, warn the user
387 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
392 # If it looks like a Geeqie download folder, assume an update
393 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
397 # If it looks like something else is already installed here, warn the user
398 if [ -d ".git" ] || [ -d "src" ]
400 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
408 # Use GTK3 as default
412 if [[ $mode == "install" ]]
414 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."
416 title="Install Geeqie and dependencies"
419 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."
421 title="Update Geeqie and re-install"
424 # When updating, use previous installation as default
425 if [[ -f config.log ]]
427 grep gtk-2.0 config.log >/dev/null
439 # Ask whether to install GTK2 or GTK3 or uninstall
441 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)
448 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
449 # so create a temporary script containing the command
450 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
452 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
457 \n' > $install_pass_script
458 chmod +x $install_pass_script
459 export SUDO_ASKPASS=$install_pass_script
461 if [[ $gtk_version == "Uninstall" ]]
467 # Put the install log in tmp, to avoid writing to PWD during a new install
468 rm install.log 2>/dev/null
469 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
471 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
474 # Get the standard options that are not yet installed
475 arraylength=${#optional_array[@]}
476 for (( i=0; i<${arraylength}; i=i+2 ));
478 package_query ${optional_array[$i+1]}
481 if [ -z "$option_string" ]
483 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
485 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
490 # If GTK3 required, get the GTK3 options not yet installed
491 if [[ "$gtk_version" == "GTK3"* ]]
493 arraylength=${#optional_gtk3_array[@]}
494 for (( i=0; i<${arraylength}; i=i+2 ));
496 package_query ${optional_gtk3_array[$i+1]}
499 if [ -z "$option_string" ]
501 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
503 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
509 # Get the optional loaders not yet installed
511 gdk-pixbuf-query-loaders | grep xcf >/dev/null
514 if [ -z "$loaders_string" ]
516 loaders_string=$'FALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
518 loaders_string="$loaders_string"$'\nFALSE\n'"${optional_loaders_array[$i]}"$'\n'"${optional_loaders_array[$i+1]}"
522 kill $zen_pid 2>/dev/null
524 # Ask the user which options to install
525 if [ -n "$option_string" ]
527 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)
535 # Ask the user which extra loaders to install
536 if [ -n "$loaders_string" ]
538 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)
546 # Start of Zenity progress section
547 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
549 (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 &
552 echo "#Installing essential libraries..." > $zen_pipe
554 install_essential $gtk_version
557 echo "#Installing options..." > $zen_pipe
562 echo "#Installing extra loaders..." > $zen_pipe
564 install_extra_loaders
566 echo "10" > $zen_pipe
567 echo "#Getting new sources from server..." > $zen_pipe
569 if [[ $mode == "install" ]]
571 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
573 git checkout master >>$install_log 2>&1
576 git_error=$(tail -n5 $install_log 2>&1)
577 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
580 ret=$(git pull >>$install_log 2>&1)
585 git_error=$(tail -n5 $install_log 2>&1)
586 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
590 echo "20" > $zen_pipe
591 echo "#Cleaning installed version..." > $zen_pipe
593 if [[ $mode == "install" ]]
597 sudo --askpass make uninstall >>$install_log 2>&1
598 sudo --askpass make maintainer-clean >>$install_log 2>&1
601 echo "30" > $zen_pipe
602 echo "#Checkout required version..." > $zen_pipe
606 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
609 git_error=$(tail -n5 $install_log 2>&1)
610 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
615 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
618 git_error=$(tail -n5 $install_log 2>&1)
619 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
624 ret=$(git checkout "$TAG" >>$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
634 if [[ "$DEBUG" == "yes" ]]
638 debug_opt="--disable-debug-log"
641 echo "40" > $zen_pipe
642 echo "#Creating configuration files..." > $zen_pipe
644 if [[ $gtk_version == "GTK3"* ]]
646 ./autogen.sh "$debug_opt" >>$install_log 2>&1
648 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
651 echo "60" > $zen_pipe
652 echo "#Compiling..." > $zen_pipe
654 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
655 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
656 make -j >>$install_log 2>&1
660 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
665 echo "90 " > $zen_pipe
666 echo "#Installing Geeqie..." > $zen_pipe
668 sudo --askpass make install >>$install_log 2>&1
670 rm $install_pass_script
671 mv -f $install_log install.log;
673 echo "100 " > $zen_pipe
676 (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