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)"
72 "libraw (for CR3 images)"
76 # Optional for GTK3 only
78 "libchamplain gtk (for GPS maps)"
79 "libchamplain-gtk-0.12-dev"
80 "libchamplain (for GPS maps)"
81 "libchamplain-0.12-dev"
82 "libpoppler (for pdf file preview)"
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 current_dir=$(basename $PWD)
209 if [[ $current_dir == "geeqie" ]]
211 sudo --askpass make uninstall
212 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
217 sudo --askpass rm -rf geeqie
220 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
228 if [[ $DistroBasedOn == "debian" ]]
230 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
231 if [[ "$res" == "install ok installed"* ]]
243 if [[ $DistroBasedOn == "debian" ]]
245 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
251 rm $install_pass_script >/dev/null 2>&1
252 #~ rm $install_log >/dev/null 2>&1
254 if [[ -p $zen_pipe ]]
256 echo "100" > $zen_pipe
257 echo "#End" > $zen_pipe
260 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
262 rm $zen_pipe >/dev/null 2>&1
269 # If uninstall has been run, maybe the current directory no longer exists
273 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
280 if [[ $DistroBasedOn != "debian" ]]
282 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
283 Operating System: $OS
285 Psuedoname: $PSUEDONAME
287 DistroBasedOn: $DistroBasedOn
289 Machine: $MACH" 2>/dev/null
294 # Parse the command line
295 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
334 # If a Geeqie folder already exists here, warn the user
337 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
342 # If it looks like a Geeqie download folder, assume an update
343 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
347 # If it looks like something else is already installed here, warn the user
348 if [ -d ".git" ] || [ -d "src" ]
350 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
358 # Use GTK3 as default
362 if [[ $mode == "install" ]]
364 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."
366 title="Install Geeqie and dependencies"
369 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."
371 title="Update Geeqie and re-install"
374 # When updating, use previous installation as default
375 if [[ -f config.log ]]
377 grep gtk-2.0 config.log >/dev/null
389 # Ask whether to install GTK2 or GTK3 or uninstall
391 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)
398 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
399 # so create a temporary script containing the command
400 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
402 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
407 \n' > $install_pass_script
408 chmod +x $install_pass_script
409 export SUDO_ASKPASS=$install_pass_script
411 if [[ $gtk_version == "Uninstall" ]]
417 # Put the install log in tmp, to avoid writing to PWD during a new install
418 rm install.log 2>/dev/null
419 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
421 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
424 # Get the standard options that are not yet installed
425 arraylength=${#optional_array[@]}
426 for (( i=0; i<${arraylength}; i=i+2 ));
428 package_query ${optional_array[$i+1]}
431 if [ -z "$option_string" ]
433 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
435 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
440 # If GTK3 required, get the GTK3 options not yet installed
441 if [[ "$gtk_version" == "GTK3"* ]]
443 arraylength=${#optional_gtk3_array[@]}
444 for (( i=0; i<${arraylength}; i=i+2 ));
446 package_query ${optional_gtk3_array[$i+1]}
449 if [ -z "$option_string" ]
451 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
453 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
459 kill $zen_pid 2>/dev/null
461 # Ask the user which options to install
462 if [ -n "$option_string" ]
464 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)
472 # Start of Zenity progress section
473 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
475 (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 &
478 echo "#Installing essential libraries..." > $zen_pipe
480 install_essential $gtk_version
483 echo "#Installing options..." > $zen_pipe
488 echo "#Installing extra loaders..." > $zen_pipe
490 echo "10" > $zen_pipe
491 echo "#Getting new sources from server..." > $zen_pipe
493 if [[ $mode == "install" ]]
495 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
497 git checkout master >>$install_log 2>&1
500 git_error=$(tail -n5 $install_log 2>&1)
501 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
504 ret=$(git pull >>$install_log 2>&1)
509 git_error=$(tail -n5 $install_log 2>&1)
510 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
514 echo "20" > $zen_pipe
515 echo "#Cleaning installed version..." > $zen_pipe
517 if [[ $mode == "install" ]]
521 sudo --askpass make uninstall >>$install_log 2>&1
522 sudo --askpass make maintainer-clean >>$install_log 2>&1
525 echo "30" > $zen_pipe
526 echo "#Checkout required version..." > $zen_pipe
530 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
533 git_error=$(tail -n5 $install_log 2>&1)
534 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
539 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
542 git_error=$(tail -n5 $install_log 2>&1)
543 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
548 ret=$(git checkout "$TAG" >>$install_log 2>&1)
552 git_error=$(tail -n5 $install_log 2>&1)
553 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
558 if [[ "$DEBUG" == "yes" ]]
562 debug_opt="--disable-debug-log"
565 echo "40" > $zen_pipe
566 echo "#Creating configuration files..." > $zen_pipe
568 if [[ $gtk_version == "GTK3"* ]]
570 ./autogen.sh "$debug_opt" >>$install_log 2>&1
572 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
575 echo "60" > $zen_pipe
576 echo "#Compiling..." > $zen_pipe
578 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
579 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
580 make -j >>$install_log 2>&1
584 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
589 echo "90 " > $zen_pipe
590 echo "#Installing Geeqie..." > $zen_pipe
592 sudo --askpass make install >>$install_log 2>&1
594 rm $install_pass_script
595 mv -f $install_log install.log;
597 echo "100 " > $zen_pipe
600 (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