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
28 # Essential for compiling
39 # Optional for both GTK2 and GTK3
40 optional_array="LCMS (for color management)
42 exiv2 (for exif handling)
44 lua (for --remote commands)
46 libffmpegthumbnailer (for mpeg thumbnails)
47 libffmpegthumbnailer-dev
48 libtiff (for tiff support)
50 libjpeg (for jpeg support)
52 librsvg2 (for viewing .svg images)
54 libwmf (for viewing .wmf images)
56 exiftran (for image rotation)
58 imagemagick (for image rotation)
60 exiv2 command line (for jpeg export)
62 jpgicc (for jpeg export color correction)
64 pandoc (for generating README help file)
66 gphoto2 (for tethered photography and camera download plugins)
68 libimage-exiftool-perl (for jpeg extraction plugin)
69 libimage-exiftool-perl
70 libheif (for HEIF support)
72 libwebp (for WebP images)
74 libdjvulibre (for DjVu images)
76 libopenjp2 (for JP2 images)
78 libraw (for CR3 images)
80 libomp (required by libraw)
82 libarchive (for compressed files e.g. zip, including timezone)
84 libgspell (for spelling checks)
87 # Optional for GTK3 only
88 optional_gtk3_array="libchamplain gtk (for GPS maps)
89 libchamplain-gtk-0.12-dev
90 libchamplain (for GPS maps)
92 libpoppler (for pdf file preview)
94 libgspell (for spelling checks)
97 ####################################################################
99 # Derived from: https://github.com/coto/server-easy-install (GPL)
100 ####################################################################
103 printf '%b\n' "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
108 OS="$(lowercase "$(uname)")"
112 if [ "${OS}" = "windowsnt" ]
115 elif [ "${OS}" = "darwin" ]
120 if [ "${OS}" = "SunOS" ]
124 OSSTR="${OS} ${REV}(${ARCH} $(uname -v))"
125 elif [ "${OS}" = "AIX" ]
127 # shellcheck disable=SC2034
128 OSSTR="${OS} $(oslevel) ($(oslevel -r))"
129 elif [ "${OS}" = "Linux" ]
131 if [ -f /etc/redhat-release ]
133 DistroBasedOn='RedHat'
134 DIST=$(sed s/\ release.*// /etc/redhat-release)
135 PSUEDONAME=$(sed s/.*\(// /etc/redhat-release | sed s/\)//)
136 REV=$(sed s/.*release\ // /etc/redhat-release | sed s/\ .*//)
137 elif [ -f /etc/SuSE-release ]
140 PSUEDONAME=$(tr "\n" ' ' < /etc/SuSE-release | sed s/VERSION.*//)
141 REV=$(tr "\n" ' ' < /etc/SuSE-release | sed s/.*=\ //)
142 elif [ -f /etc/mandrake-release ]
144 DistroBasedOn='Mandrake'
145 PSUEDONAME=$(sed s/.*\(// /etc/mandrake-release | sed s/\)//)
146 REV=$(cat | sed s/.*release\ // /etc/mandrake-release | sed s/\ .*//)
147 elif [ -f /etc/debian_version ]
149 DistroBasedOn='Debian'
150 if [ -f /etc/lsb-release ]
152 DIST=$(grep '^DISTRIB_ID' /etc/lsb-release | awk -F= '{ print $2 }')
153 PSUEDONAME=$(grep '^DISTRIB_CODENAME' /etc/lsb-release | awk -F= '{ print $2 }')
154 REV=$(grep '^DISTRIB_RELEASE' /etc/lsb-release | awk -F= '{ print $2 }')
157 if [ -f /etc/UnitedLinux-release ]
159 DIST="${DIST}[$(tr "\n" ' ' < /etc/UnitedLinux-release | sed s/VERSION.*//)]"
162 DistroBasedOn=$(lowercase $DistroBasedOn)
165 readonly DistroBasedOn
178 for file in $essential_array
180 if [ $((i % 2)) -ne 0 ]
182 if package_query "$file"
184 package_install "$file"
193 if package_query "libgtk-3-dev"
195 package_install libgtk-3-dev
198 if package_query "libgtk2.0-dev"
200 package_install libgtk2.0-dev
211 # shellcheck disable=SC2086
224 current_dir="$(basename "$PWD")"
225 if [ "$current_dir" = "geeqie" ]
228 sudo --askpass ninja -C build uninstall
230 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
233 sudo --askpass rm -rf geeqie
236 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2> /dev/null
244 if [ "$DistroBasedOn" = "debian" ]
247 # shellcheck disable=SC2086
248 res=$(dpkg-query --show --showformat='${Status}' "$1" 2>> $install_log)
249 if [ "${res}" = "install ok installed" ]
261 if [ "$DistroBasedOn" = "debian" ]
263 # shellcheck disable=SC2024
264 sudo --askpass apt-get --assume-yes install "$@" >> "$install_log" 2>&1
270 rm "$install_pass_script" > /dev/null 2>&1
272 if [ -p "$zen_pipe" ]
274 printf '%b\n' "100" > "$zen_pipe"
275 printf '%b\n' "#End" > "$zen_pipe"
278 zenity --title="$title" --width=370 --text="Geeqie is not installed\nLog file: $install_log" --info 2> /dev/null
280 rm "$zen_pipe" > /dev/null 2>&1
290 # If uninstall has been run, maybe the current directory no longer exists
293 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2> /dev/null
300 if [ "$DistroBasedOn" != "debian" ]
302 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
303 Operating System: $OS
305 Psuedoname: $PSUEDONAME
307 DistroBasedOn: $DistroBasedOn
309 Machine: $MACH" 2> /dev/null
314 # Parse the command line
315 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
322 printf '%b\n' "$version"
326 printf '%b\n' "$description"
357 printf '%b\n' "Essential libraries:"
358 for file in $essential_array
360 printf '%b\n' "$file"
364 printf '%b\n' "Optional libraries:"
365 for file in $optional_array
367 printf '%b\n' "$file"
371 printf '%b\n' "Optional for GTK3:"
372 for file in $optional_gtk3_array
374 printf '%b\n' "$file"
380 # If a Geeqie folder already exists here, warn the user
383 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
388 # If it looks like a Geeqie download folder, assume an update
389 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
393 # If it looks like something else is already installed here, warn the user
394 if [ -d ".git" ] || [ -d "src" ]
396 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
404 # Use GTK3 as default
408 if [ "$mode" = "install" ]
410 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."
412 title="Install Geeqie and dependencies"
415 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."
417 title="Update Geeqie and re-install"
420 # When updating, use previous installation as default
423 if grep gtk-2.0 config.log > /dev/null
434 # Ask whether to install GTK2 or GTK3 or uninstall
436 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)
441 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
442 # so create a temporary script containing the command
443 install_pass_script=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
444 printf '%b\n' "#!/bin/sh
445 if zenity --password --title=\"$title\" --width=370 2>/dev/null
448 fi" > "$install_pass_script"
449 chmod +x "$install_pass_script"
450 export SUDO_ASKPASS=$install_pass_script
452 if [ "$gtk_version" = "Uninstall" ]
458 # Put the install log in tmp, to avoid writing to PWD during a new install
459 rm install.log 2> /dev/null
460 install_log=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
462 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2> /dev/null &
465 # Get the standard options that are not yet installed
467 for file in $optional_array
469 if [ $((i % 2)) -eq 0 ]
471 package_title="$file"
473 if package_query "$file"
475 if [ -z "$option_string" ]
477 option_string="${install_option:+${install_option}}\n${package_title}\n${file}"
479 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
486 # If GTK3 required, get the GTK3 options not yet installed
487 if [ -z "${gtk_version%%GTK3*}" ]
490 for file in $optional_gtk3_array
492 if [ $((i % 2)) -eq 0 ]
494 package_title="$file"
496 if package_query "$file"
498 if [ -z "$option_string" ]
500 option_string="${install_option:+${install_option}}\n${file}\n${file}"
502 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
510 kill $zen_pid 2> /dev/null
512 # Ask the user which options to install
513 if [ -n "$option_string" ]
515 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)
521 # Start of Zenity progress section
522 zen_pipe=$(mktemp -u "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
524 (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 &
526 printf '%b\n' "2" > "$zen_pipe"
527 printf '%b\n' "#Installing essential libraries..." > "$zen_pipe"
529 install_essential "$gtk_version"
531 printf '%b\n' "4" > "$zen_pipe"
532 printf '%b\n' "#Installing options..." > "$zen_pipe"
536 printf '%b\n' "6" > "$zen_pipe"
537 printf '%b\n' "#Installing extra loaders..." > "$zen_pipe"
539 printf '%b\n' "10" > "$zen_pipe"
540 printf '%b\n' "#Getting new sources from server..." > "$zen_pipe"
542 if [ "$mode" = "install" ]
544 if ! git clone git://geeqie.org/geeqie.git >> "$install_log" 2>&1
546 git_error=$(tail -n5 "$install_log" 2>&1)
547 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
551 if ! git checkout master >> "$install_log" 2>&1
553 git_error="$(tail -n25 "$install_log" 2>&1)"
554 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
557 if ! git pull >> "$install_log" 2>&1
559 git_error=$(tail -n5 "$install_log" 2>&1)
560 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
565 printf '%b\n' "20" > "$zen_pipe"
566 printf '%b\n' "#Cleaning installed version..." > "$zen_pipe"
568 if [ $mode = "install" ]
572 sudo --askpass ninja -C build uninstall
575 printf '%b\n' "30" > "$zen_pipe"
576 printf '%b\n' "#Checkout required version..." > "$zen_pipe"
580 if ! git checkout master~"$BACK" >> "$install_log" 2>&1
582 git_error=$(tail -n5 "$install_log" 2>&1)
583 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
589 if ! git checkout "$COMMIT" >> "$install_log" 2>&1
591 git_error=$(tail -n5 "$install_log" 2>&1)
592 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
597 if ! git checkout "$TAG" >> "$install_log" 2>&1
599 git_error=$(tail -n5 "$install_log" 2>&1)
600 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
606 printf '%b\n' "40" > "$zen_pipe"
607 printf '%b\n' "#Creating configuration files..." > "$zen_pipe"
609 if [ -z "${gtk_version%%GTK3*}" ]
612 printf '%b\n' "90 " > "$zen_pipe"
613 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
614 ninja -C build install
617 meson configure build -Dgtk3=false
618 printf '%b\n' "90 " > "$zen_pipe"
619 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
620 ninja -C build install
623 rm "$install_pass_script"
624 mv -f "$install_log" "./build/install.log"
626 printf '%b\n' "100 " > "$zen_pipe"
629 (for i in $(seq 0 4 100)
633 done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close --percentage=0 2> /dev/null