4 ## @brief 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.
13 Geeqie is an image viewer.
14 This script will download, compile, and install Geeqie on Debian-based systems.
15 If run from a folder that already contains the Geeqie sources, the source
16 code will be updated from the repository.
17 Dialogs allow the user to install additional features.
19 Command line options are:
20 -v --version The version of this file
21 -h --help Output this text
22 -c --commit=ID Checkout and compile commit ID
23 -t --tag=TAG Checkout and compile TAG (e.g. v1.4 or v1.3)
24 -b --back=N Checkout commit -N (e.g. "-b 1" for last-but-one commit)
25 -l --list List required dependencies
26 -d --debug=yes Compile with debug output
29 # Essential for compiling
38 # Optional for both GTK2 and GTK3
39 optional_array="LCMS (for color management)
41 exiv2 (for exif handling)
43 lua (for --remote commands)
45 libffmpegthumbnailer (for mpeg thumbnails)
46 libffmpegthumbnailer-dev
47 libtiff (for tiff support)
49 libjpeg (for jpeg support)
51 librsvg2 (for viewing .svg images)
53 libwmf (for viewing .wmf images)
55 exiftran (for image rotation)
57 imagemagick (for image rotation)
59 exiv2 command line (for jpeg export)
61 jpgicc (for jpeg export color correction)
63 pandoc (for generating README help file)
65 gphoto2 (for tethered photography and camera download plugins)
67 libimage-exiftool-perl (for jpeg extraction plugin)
68 libimage-exiftool-perl
69 libheif (for HEIF support)
71 libwebp (for WebP images)
73 libdjvulibre (for DjVu images)
75 libopenjp2 (for JP2 images)
77 libraw (for CR3 images)
79 libomp (required by libraw)
81 libarchive (for compressed files e.g. zip, including timezone)
83 libgspell (for spelling checks)
86 # Optional for GTK3 only
87 optional_gtk3_array="libchamplain gtk (for GPS maps)
88 libchamplain-gtk-0.12-dev
89 libchamplain (for GPS maps)
91 libpoppler (for pdf file preview)
93 libgspell (for spelling checks)
96 ####################################################################
98 # Derived from: https://github.com/coto/server-easy-install (GPL)
99 ####################################################################
102 printf '%b\n' "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
107 OS="$(lowercase "$(uname)")"
111 if [ "${OS}" = "windowsnt" ]
114 elif [ "${OS}" = "darwin" ]
119 if [ "${OS}" = "SunOS" ]
123 OSSTR="${OS} ${REV}(${ARCH} $(uname -v))"
124 elif [ "${OS}" = "AIX" ]
126 # shellcheck disable=SC2034
127 OSSTR="${OS} $(oslevel) ($(oslevel -r))"
128 elif [ "${OS}" = "Linux" ]
130 if [ -f /etc/redhat-release ]
132 DistroBasedOn='RedHat'
133 DIST=$(sed s/\ release.*// /etc/redhat-release)
134 PSUEDONAME=$(sed s/.*\(// /etc/redhat-release | sed s/\)//)
135 REV=$(sed s/.*release\ // /etc/redhat-release | sed s/\ .*//)
136 elif [ -f /etc/SuSE-release ]
139 PSUEDONAME=$(tr "\n" ' ' < /etc/SuSE-release | sed s/VERSION.*//)
140 REV=$(tr "\n" ' ' < /etc/SuSE-release | sed s/.*=\ //)
141 elif [ -f /etc/mandrake-release ]
143 DistroBasedOn='Mandrake'
144 PSUEDONAME=$(sed s/.*\(// /etc/mandrake-release | sed s/\)//)
145 REV=$(cat | sed s/.*release\ // /etc/mandrake-release | sed s/\ .*//)
146 elif [ -f /etc/debian_version ]
148 DistroBasedOn='Debian'
149 if [ -f /etc/lsb-release ]
151 DIST=$(grep '^DISTRIB_ID' /etc/lsb-release | awk -F= '{ print $2 }')
152 PSUEDONAME=$(grep '^DISTRIB_CODENAME' /etc/lsb-release | awk -F= '{ print $2 }')
153 REV=$(grep '^DISTRIB_RELEASE' /etc/lsb-release | awk -F= '{ print $2 }')
156 if [ -f /etc/UnitedLinux-release ]
158 DIST="${DIST}[$(tr "\n" ' ' < /etc/UnitedLinux-release | sed s/VERSION.*//)]"
161 DistroBasedOn=$(lowercase $DistroBasedOn)
164 readonly DistroBasedOn
177 for file in $essential_array
179 if [ $((i % 2)) -ne 0 ]
181 if package_query "$file"
183 package_install "$file"
192 if package_query "libgtk-3-dev"
194 package_install libgtk-3-dev
197 if package_query "libgtk2.0-dev"
199 package_install libgtk2.0-dev
210 # shellcheck disable=SC2086
223 current_dir="$(basename "$PWD")"
224 if [ "$current_dir" = "geeqie" ]
227 sudo --askpass make uninstall
229 if ! 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
232 sudo --askpass rm -rf geeqie
235 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2> /dev/null
243 if [ "$DistroBasedOn" = "debian" ]
246 # shellcheck disable=SC2086
247 res=$(dpkg-query --show --showformat='${Status}' "$1" 2>> $install_log)
248 if [ "${res}" = "install ok installed" ]
260 if [ "$DistroBasedOn" = "debian" ]
262 # shellcheck disable=SC2024
263 sudo --askpass apt-get --assume-yes install "$@" >> "$install_log" 2>&1
269 rm "$install_pass_script" > /dev/null 2>&1
271 if [ -p "$zen_pipe" ]
273 printf '%b\n' "100" > "$zen_pipe"
274 printf '%b\n' "#End" > "$zen_pipe"
277 zenity --title="$title" --width=370 --text="Geeqie is not installed\nLog file: $install_log" --info 2> /dev/null
279 rm "$zen_pipe" > /dev/null 2>&1
289 # If uninstall has been run, maybe the current directory no longer exists
292 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2> /dev/null
299 if [ "$DistroBasedOn" != "debian" ]
301 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
302 Operating System: $OS
304 Psuedoname: $PSUEDONAME
306 DistroBasedOn: $DistroBasedOn
308 Machine: $MACH" 2> /dev/null
313 # Parse the command line
314 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
321 printf '%b\n' "$version"
325 printf '%b\n' "$description"
361 printf '%b\n' "Essential libraries:"
362 for file in $essential_array
364 printf '%b\n' "$file"
368 printf '%b\n' "Optional libraries:"
369 for file in $optional_array
371 printf '%b\n' "$file"
375 printf '%b\n' "Optional for GTK3:"
376 for file in $optional_gtk3_array
378 printf '%b\n' "$file"
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
427 if grep gtk-2.0 config.log > /dev/null
438 # Ask whether to install GTK2 or GTK3 or uninstall
440 if ! 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)
445 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
446 # so create a temporary script containing the command
447 install_pass_script=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
448 printf '%b\n' "#!/bin/sh
449 if zenity --password --title=\"$title\" --width=370 2>/dev/null
452 fi" > "$install_pass_script"
453 chmod +x "$install_pass_script"
454 export SUDO_ASKPASS=$install_pass_script
456 if [ "$gtk_version" = "Uninstall" ]
462 # Put the install log in tmp, to avoid writing to PWD during a new install
463 rm install.log 2> /dev/null
464 install_log=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
466 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2> /dev/null &
469 # Get the standard options that are not yet installed
471 for file in $optional_array
473 if [ $((i % 2)) -eq 0 ]
475 package_title="$file"
477 if package_query "$file"
479 if [ -z "$option_string" ]
481 option_string="${install_option:+${install_option}}\n${package_title}\n${file}"
483 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
490 # If GTK3 required, get the GTK3 options not yet installed
491 if [ -z "${gtk_version%%GTK3*}" ]
494 for file in $optional_gtk3_array
496 if [ $((i % 2)) -eq 0 ]
498 package_title="$file"
500 if package_query "$file"
502 if [ -z "$option_string" ]
504 option_string="${install_option:+${install_option}}\n${file}\n${file}"
506 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
514 kill $zen_pid 2> /dev/null
516 # Ask the user which options to install
517 if [ -n "$option_string" ]
519 if ! options=$(printf '%b\n' "$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)
525 # Start of Zenity progress section
526 zen_pipe=$(mktemp -u "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
528 (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 &
530 printf '%b\n' "2" > "$zen_pipe"
531 printf '%b\n' "#Installing essential libraries..." > "$zen_pipe"
533 install_essential "$gtk_version"
535 printf '%b\n' "4" > "$zen_pipe"
536 printf '%b\n' "#Installing options..." > "$zen_pipe"
540 printf '%b\n' "6" > "$zen_pipe"
541 printf '%b\n' "#Installing extra loaders..." > "$zen_pipe"
543 printf '%b\n' "10" > "$zen_pipe"
544 printf '%b\n' "#Getting new sources from server..." > "$zen_pipe"
546 if [ "$mode" = "install" ]
548 if ! git clone git://geeqie.org/geeqie.git >> "$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
555 if ! git checkout master >> "$install_log" 2>&1
557 git_error="$(tail -n25 "$install_log" 2>&1)"
558 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
561 if ! git pull >> "$install_log" 2>&1
563 git_error=$(tail -n5 "$install_log" 2>&1)
564 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
569 printf '%b\n' "20" > "$zen_pipe"
570 printf '%b\n' "#Cleaning installed version..." > "$zen_pipe"
572 if [ $mode = "install" ]
576 # shellcheck disable=SC2024
577 sudo --askpass make uninstall >> "$install_log" 2>&1
578 # shellcheck disable=SC2024
579 sudo --askpass make maintainer-clean >> "$install_log" 2>&1
582 printf '%b\n' "30" > "$zen_pipe"
583 printf '%b\n' "#Checkout required version..." > "$zen_pipe"
587 if ! git checkout master~"$BACK" >> "$install_log" 2>&1
589 git_error=$(tail -n5 "$install_log" 2>&1)
590 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
596 if ! git checkout "$COMMIT" >> "$install_log" 2>&1
598 git_error=$(tail -n5 "$install_log" 2>&1)
599 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
604 if ! git checkout "$TAG" >> "$install_log" 2>&1
606 git_error=$(tail -n5 "$install_log" 2>&1)
607 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
612 if [ "$DEBUG" = "yes" ]
616 debug_opt="--disable-debug-log"
619 printf '%b\n' "40" > "$zen_pipe"
620 printf '%b\n' "#Creating configuration files..." > "$zen_pipe"
622 if [ -z "${gtk_version%%GTK3*}" ]
624 ./autogen.sh "$debug_opt" >> "$install_log" 2>&1
626 ./autogen.sh "$debug_opt" --disable-gtk3 >> "$install_log" 2>&1
629 printf '%b\n' "60" > "$zen_pipe"
630 printf '%b\n' "#Compiling..." > "$zen_pipe"
632 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
633 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
635 if ! make -j >> "$install_log" 2>&1
637 zenity --title="$title" --width=370 --height=400 --error --text="Compile error" 2> /dev/null
642 printf '%b\n' "90 " > "$zen_pipe"
643 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
645 # shellcheck disable=SC2024
646 sudo --askpass make install >> "$install_log" 2>&1
648 rm "$install_pass_script"
649 mv -f "$install_log" install.log
651 printf '%b\n' "100 " > "$zen_pipe"
654 (for i in $(seq 0 4 100)
658 done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close --percentage=0 2> /dev/null