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
29 # Optional for both GTK2 and GTK3
31 "LCMS (for color management)"
33 "exiv2 (for exif handling)"
35 "lua (for --remote commands)"
37 "libffmpegthumbnailer (for mpeg thumbnails)"
38 "libffmpegthumbnailer-dev"
39 "libtiff (for tiff support)"
41 "libjpeg (for jpeg support)"
43 "librsvg2 (for viewing .svg images)"
45 "libwmf (for viewing .wmf images)"
47 "exiftran (for image rotation)"
49 "imagemagick (for image rotation)"
51 "ufraw (for RAW file handling)"
53 "exiv2 command line (for jpeg export)"
55 "jpgicc (for jpeg export color correction)"
57 "markdown (for generating README help file)"
59 "gphoto2 (for tethered photography and camera download plugins)"
61 "libimage-exiftool-perl (for jpeg extraction plugin)"
62 "libimage-exiftool-perl"
63 "libheif (for HEIF support)"
65 "libwebp (for WebP images)"
67 "libdjvulibre (for DjVu images)"
69 "libopenjp2 (for JP2 images)"
73 # Optional for GTK3 only
75 "libchamplain gtk (for GPS maps)"
76 "libchamplain-gtk-0.12-dev"
77 "libchamplain (for GPS maps)"
78 "libchamplain-0.12-dev"
79 "libpoppler (for pdf file preview)"
83 ####################################################################
85 # Derived from: https://github.com/coto/server-easy-install (GPL)
86 ####################################################################
89 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
94 OS=`lowercase \`uname\``
98 if [ "${OS}" == "windowsnt" ]
101 elif [ "${OS}" == "darwin" ]
106 if [ "${OS}" = "SunOS" ]
110 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
111 elif [ "${OS}" = "AIX" ]
113 OSSTR="${OS} `oslevel` (`oslevel -r`)"
114 elif [ "${OS}" = "Linux" ]
116 if [ -f /etc/redhat-release ]
118 DistroBasedOn='RedHat'
119 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
120 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
121 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
122 elif [ -f /etc/SuSE-release ]
125 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
126 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
127 elif [ -f /etc/mandrake-release ]
129 DistroBasedOn='Mandrake'
130 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
131 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
132 elif [ -f /etc/debian_version ]
134 DistroBasedOn='Debian'
135 if [ -f /etc/lsb-release ]
137 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
138 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
139 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
142 if [ -f /etc/UnitedLinux-release ]
144 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
147 DistroBasedOn=`lowercase $DistroBasedOn`
150 readonly DistroBasedOn
161 arraylength=${#essential_array[@]}
162 for (( i=0; i<${arraylength}; i=i+1 ));
164 package_query ${essential_array[$i]}
167 package_install ${essential_array[$i]}
171 if [[ $1 == "GTK3" ]]
173 package_query "libgtk-3-dev"
176 package_install libgtk-3-dev
179 package_query "libgtk2.0-dev"
182 package_install libgtk2.0-dev
205 current_dir=$(basename $PWD)
206 if [[ $current_dir == "geeqie" ]]
208 sudo --askpass make uninstall
209 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
214 sudo --askpass rm -rf geeqie
217 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
225 if [[ $DistroBasedOn == "debian" ]]
227 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
228 if [[ "$res" == "install ok installed"* ]]
240 if [[ $DistroBasedOn == "debian" ]]
242 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
248 rm $install_pass_script >/dev/null 2>&1
249 #~ rm $install_log >/dev/null 2>&1
251 if [[ -p $zen_pipe ]]
253 echo "100" > $zen_pipe
254 echo "#End" > $zen_pipe
257 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
259 rm $zen_pipe >/dev/null 2>&1
266 # If uninstall has been run, maybe the current directory no longer exists
270 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
277 if [[ $DistroBasedOn != "debian" ]]
279 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
280 Operating System: $OS
282 Psuedoname: $PSUEDONAME
284 DistroBasedOn: $DistroBasedOn
286 Machine: $MACH" 2>/dev/null
291 # Parse the comand line
292 OPTS=$(getopt -o vhc:t:b:d: --long version,help,commit:,tag:,back:,debug: -- "$@")
331 # If a Geeqie folder already exists here, warn the user
334 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
339 # If it looks like a Geeqie download folder, assume an update
340 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
344 # If it looks like something else is already installed here, warn the user
345 if [ -d ".git" ] || [ -d "src" ]
347 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
355 # Use GTK3 as default
359 if [[ $mode == "install" ]]
361 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."
363 title="Install Geeqie and dependencies"
366 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."
368 title="Update Geeqie and re-install"
371 # When updating, use previous installation as default
372 if [[ -f config.log ]]
374 grep gtk-2.0 config.log >/dev/null
386 # Ask whether to install GTK2 or GTK3 or uninstall
388 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)
395 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
396 # so create a temporary script containing the command
397 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
399 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
404 \n' > $install_pass_script
405 chmod +x $install_pass_script
406 export SUDO_ASKPASS=$install_pass_script
408 if [[ $gtk_version == "Uninstall" ]]
414 # Put the install log in tmp, to avoid writing to PWD during a new install
415 rm install.log 2>/dev/null
416 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
418 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
421 # Get the standard options that are not yet installed
422 arraylength=${#optional_array[@]}
423 for (( i=0; i<${arraylength}; i=i+2 ));
425 package_query ${optional_array[$i+1]}
428 if [ -z "$option_string" ]
430 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
432 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
437 # If GTK3 required, get the GTK3 options not yet installed
438 if [[ "$gtk_version" == "GTK3"* ]]
440 arraylength=${#optional_gtk3_array[@]}
441 for (( i=0; i<${arraylength}; i=i+2 ));
443 package_query ${optional_gtk3_array[$i+1]}
446 if [ -z "$option_string" ]
448 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
450 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
456 kill $zen_pid 2>/dev/null
458 # Ask the user which options to install
459 if [ -n "$option_string" ]
461 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)
469 # Start of Zenity progress section
470 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
472 (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 &
475 echo "#Installing essential libraries..." > $zen_pipe
477 install_essential $gtk_version
480 echo "#Installing options..." > $zen_pipe
485 echo "#Installing extra loaders..." > $zen_pipe
487 echo "10" > $zen_pipe
488 echo "#Getting new sources from server..." > $zen_pipe
490 if [[ $mode == "install" ]]
492 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
494 git checkout master >>$install_log 2>&1
497 git_error=$(tail -n5 $install_log 2>&1)
498 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
501 ret=$(git pull >>$install_log 2>&1)
506 git_error=$(tail -n5 $install_log 2>&1)
507 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
511 echo "20" > $zen_pipe
512 echo "#Cleaning installed version..." > $zen_pipe
514 if [[ $mode == "install" ]]
518 sudo --askpass make uninstall >>$install_log 2>&1
519 sudo --askpass make maintainer-clean >>$install_log 2>&1
522 echo "30" > $zen_pipe
523 echo "#Checkout required version..." > $zen_pipe
527 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
530 git_error=$(tail -n5 $install_log 2>&1)
531 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
536 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
539 git_error=$(tail -n5 $install_log 2>&1)
540 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
545 ret=$(git checkout "$TAG" >>$install_log 2>&1)
549 git_error=$(tail -n5 $install_log 2>&1)
550 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
555 if [[ "$DEBUG" == "yes" ]]
559 debug_opt="--disable-debug-log"
562 echo "40" > $zen_pipe
563 echo "#Creating configuration files..." > $zen_pipe
565 if [[ $gtk_version == "GTK3"* ]]
567 ./autogen.sh "$debug_opt" >>$install_log 2>&1
569 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
572 echo "60" > $zen_pipe
573 echo "#Compiling..." > $zen_pipe
575 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
576 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
577 make -j >>$install_log 2>&1
581 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
586 echo "90 " > $zen_pipe
587 echo "#Installing Geeqie..." > $zen_pipe
589 sudo --askpass make install >>$install_log 2>&1
591 rm $install_pass_script
592 mv -f $install_log install.log;
594 echo "100 " > $zen_pipe
597 (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