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.
10 Command line options are:
11 -v --version The version of this file
12 -h --help Output this text
13 -c --commit=ID Checkout and compile commit ID
14 -t --tag=TAG Checkout and compile TAG (e.g. v1.4 or v1.3)
15 -b --back=N Checkout commit -N (e.g. "-b 1" for last-but-one commit)
16 -d --debug=yes Compile with debug output
19 # 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)"
70 "libopenjp2 (for JP2 images)"
74 # Optional for GTK3 only
76 "libchamplain gtk (for GPS maps)"
77 "libchamplain-gtk-0.12-dev"
78 "libchamplain (for GPS maps)"
79 "libchamplain-0.12-dev"
80 "libpoppler (for pdf file preview)"
84 ####################################################################
86 # Derived from: https://github.com/coto/server-easy-install (GPL)
87 ####################################################################
90 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
95 OS=`lowercase \`uname\``
99 if [ "${OS}" == "windowsnt" ]
102 elif [ "${OS}" == "darwin" ]
107 if [ "${OS}" = "SunOS" ]
111 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
112 elif [ "${OS}" = "AIX" ]
114 OSSTR="${OS} `oslevel` (`oslevel -r`)"
115 elif [ "${OS}" = "Linux" ]
117 if [ -f /etc/redhat-release ]
119 DistroBasedOn='RedHat'
120 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
121 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
122 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
123 elif [ -f /etc/SuSE-release ]
126 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
127 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
128 elif [ -f /etc/mandrake-release ]
130 DistroBasedOn='Mandrake'
131 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
132 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
133 elif [ -f /etc/debian_version ]
135 DistroBasedOn='Debian'
136 if [ -f /etc/lsb-release ]
138 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
139 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
140 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
143 if [ -f /etc/UnitedLinux-release ]
145 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
148 DistroBasedOn=`lowercase $DistroBasedOn`
151 readonly DistroBasedOn
162 arraylength=${#essential_array[@]}
163 for (( i=0; i<${arraylength}; i=i+1 ));
165 package_query ${essential_array[$i]}
168 package_install ${essential_array[$i]}
172 if [[ $1 == "GTK3" ]]
174 package_query "libgtk-3-dev"
177 package_install libgtk-3-dev
180 package_query "libgtk2.0-dev"
183 package_install libgtk2.0-dev
206 current_dir=$(basename $PWD)
207 if [[ $current_dir == "geeqie" ]]
209 sudo --askpass make uninstall
210 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
215 sudo --askpass rm -rf geeqie
218 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
226 if [[ $DistroBasedOn == "debian" ]]
228 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
229 if [[ "$res" == "install ok installed"* ]]
241 if [[ $DistroBasedOn == "debian" ]]
243 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
249 rm $install_pass_script >/dev/null 2>&1
250 #~ rm $install_log >/dev/null 2>&1
252 if [[ -p $zen_pipe ]]
254 echo "100" > $zen_pipe
255 echo "#End" > $zen_pipe
258 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
260 rm $zen_pipe >/dev/null 2>&1
267 # If uninstall has been run, maybe the current directory no longer exists
271 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
278 if [[ $DistroBasedOn != "debian" ]]
280 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
281 Operating System: $OS
283 Psuedoname: $PSUEDONAME
285 DistroBasedOn: $DistroBasedOn
287 Machine: $MACH" 2>/dev/null
292 # Parse the comand line
293 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
332 # If a Geeqie folder already exists here, warn the user
335 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
340 # If it looks like a Geeqie download folder, assume an update
341 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
345 # If it looks like something else is already installed here, warn the user
346 if [ -d ".git" ] || [ -d "src" ]
348 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
356 # Use GTK3 as default
360 if [[ $mode == "install" ]]
362 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."
364 title="Install Geeqie and dependencies"
367 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."
369 title="Update Geeqie and re-install"
372 # When updating, use previous installation as default
373 if [[ -f config.log ]]
375 grep gtk-2.0 config.log >/dev/null
387 # Ask whether to install GTK2 or GTK3 or uninstall
389 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)
396 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
397 # so create a temporary script containing the command
398 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
400 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
405 \n' > $install_pass_script
406 chmod +x $install_pass_script
407 export SUDO_ASKPASS=$install_pass_script
409 if [[ $gtk_version == "Uninstall" ]]
415 # Put the install log in tmp, to avoid writing to PWD during a new install
416 rm install.log 2>/dev/null
417 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
419 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
422 # Get the standard options that are not yet installed
423 arraylength=${#optional_array[@]}
424 for (( i=0; i<${arraylength}; i=i+2 ));
426 package_query ${optional_array[$i+1]}
429 if [ -z "$option_string" ]
431 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
433 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
438 # If GTK3 required, get the GTK3 options not yet installed
439 if [[ "$gtk_version" == "GTK3"* ]]
441 arraylength=${#optional_gtk3_array[@]}
442 for (( i=0; i<${arraylength}; i=i+2 ));
444 package_query ${optional_gtk3_array[$i+1]}
447 if [ -z "$option_string" ]
449 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
451 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
457 kill $zen_pid 2>/dev/null
459 # Ask the user which options to install
460 if [ -n "$option_string" ]
462 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)
470 # Start of Zenity progress section
471 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
473 (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 &
476 echo "#Installing essential libraries..." > $zen_pipe
478 install_essential $gtk_version
481 echo "#Installing options..." > $zen_pipe
486 echo "#Installing extra loaders..." > $zen_pipe
488 echo "10" > $zen_pipe
489 echo "#Getting new sources from server..." > $zen_pipe
491 if [[ $mode == "install" ]]
493 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
495 git checkout master >>$install_log 2>&1
498 git_error=$(tail -n5 $install_log 2>&1)
499 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
502 ret=$(git pull >>$install_log 2>&1)
507 git_error=$(tail -n5 $install_log 2>&1)
508 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
512 echo "20" > $zen_pipe
513 echo "#Cleaning installed version..." > $zen_pipe
515 if [[ $mode == "install" ]]
519 sudo --askpass make uninstall >>$install_log 2>&1
520 sudo --askpass make maintainer-clean >>$install_log 2>&1
523 echo "30" > $zen_pipe
524 echo "#Checkout required version..." > $zen_pipe
528 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
531 git_error=$(tail -n5 $install_log 2>&1)
532 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
537 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
540 git_error=$(tail -n5 $install_log 2>&1)
541 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
546 ret=$(git checkout "$TAG" >>$install_log 2>&1)
550 git_error=$(tail -n5 $install_log 2>&1)
551 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
556 if [[ "$DEBUG" == "yes" ]]
560 debug_opt="--disable-debug-log"
563 echo "40" > $zen_pipe
564 echo "#Creating configuration files..." > $zen_pipe
566 if [[ $gtk_version == "GTK3"* ]]
568 ./autogen.sh "$debug_opt" >>$install_log 2>&1
570 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
573 echo "60" > $zen_pipe
574 echo "#Compiling..." > $zen_pipe
576 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
577 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
578 make -j >>$install_log 2>&1
582 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
587 echo "90 " > $zen_pipe
588 echo "#Installing Geeqie..." > $zen_pipe
590 sudo --askpass make install >>$install_log 2>&1
592 rm $install_pass_script
593 mv -f $install_log install.log;
595 echo "100 " > $zen_pipe
598 (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