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
40 optional_array="LCMS (for color management)
42 exiv2 (for exif handling)
44 evince (for print preview)
46 lua (for --remote commands)
48 libffmpegthumbnailer (for mpeg thumbnails)
49 libffmpegthumbnailer-dev
50 libtiff (for tiff support)
52 libjpeg (for jpeg support)
54 librsvg2 (for viewing .svg images)
56 libwmf (for viewing .wmf images)
58 exiftran (for image rotation)
60 imagemagick (for image rotation)
62 exiv2 command line (for jpeg export)
64 jpgicc (for jpeg export color correction)
66 pandoc (for generating README help file)
68 gphoto2 (for tethered photography and camera download plugins)
70 libimage-exiftool-perl (for jpeg extraction plugin)
71 libimage-exiftool-perl
72 libheif (for HEIF support)
74 webp-pixbuf-loader (for WebP images)
76 libdjvulibre (for DjVu images)
78 libopenjp2 (for JP2 images)
80 libraw (for CR3 images)
82 libomp (required by libraw)
84 libarchive (for compressed files e.g. zip, including timezone)
86 libgspell (for spelling checks)
88 libchamplain gtk (for GPS maps)
89 libchamplain-gtk-0.12-dev
90 libchamplain (for GPS maps)
92 libpoppler (for pdf file preview)
95 ####################################################################
97 # Derived from: https://github.com/coto/server-easy-install (GPL)
98 ####################################################################
101 printf '%b\n' "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
106 OS="$(lowercase "$(uname)")"
110 if [ "${OS}" = "windowsnt" ]
113 elif [ "${OS}" = "darwin" ]
118 if [ "${OS}" = "SunOS" ]
122 OSSTR="${OS} ${REV}(${ARCH} $(uname -v))"
123 elif [ "${OS}" = "AIX" ]
125 # shellcheck disable=SC2034
126 OSSTR="${OS} $(oslevel) ($(oslevel -r))"
127 elif [ "${OS}" = "Linux" ]
129 if [ -f /etc/redhat-release ]
131 DistroBasedOn='RedHat'
132 DIST=$(sed s/\ release.*// /etc/redhat-release)
133 PSUEDONAME=$(sed s/.*\(// /etc/redhat-release | sed s/\)//)
134 REV=$(sed s/.*release\ // /etc/redhat-release | sed s/\ .*//)
135 elif [ -f /etc/SuSE-release ]
138 PSUEDONAME=$(tr "\n" ' ' < /etc/SuSE-release | sed s/VERSION.*//)
139 REV=$(tr "\n" ' ' < /etc/SuSE-release | sed s/.*=\ //)
140 elif [ -f /etc/mandrake-release ]
142 DistroBasedOn='Mandrake'
143 PSUEDONAME=$(sed s/.*\(// /etc/mandrake-release | sed s/\)//)
144 REV=$(cat | sed s/.*release\ // /etc/mandrake-release | sed s/\ .*//)
145 elif [ -f /etc/debian_version ]
147 DistroBasedOn='Debian'
148 if [ -f /etc/lsb-release ]
150 DIST=$(grep '^DISTRIB_ID' /etc/lsb-release | awk -F= '{ print $2 }')
151 PSUEDONAME=$(grep '^DISTRIB_CODENAME' /etc/lsb-release | awk -F= '{ print $2 }')
152 REV=$(grep '^DISTRIB_RELEASE' /etc/lsb-release | awk -F= '{ print $2 }')
155 if [ -f /etc/UnitedLinux-release ]
157 DIST="${DIST}[$(tr "\n" ' ' < /etc/UnitedLinux-release | sed s/VERSION.*//)]"
160 DistroBasedOn=$(lowercase $DistroBasedOn)
163 readonly DistroBasedOn
174 for file in $essential_array
176 if package_query "$file"
178 package_install "$file"
184 if package_query "libgtk-3-dev"
186 package_install libgtk-3-dev
189 if package_query "libgtk2.0-dev"
191 package_install libgtk2.0-dev
202 # shellcheck disable=SC2086
215 current_dir="$(basename "$PWD")"
216 if [ "$current_dir" = "geeqie" ]
219 sudo --askpass ninja -C build uninstall
221 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
224 sudo --askpass rm -rf geeqie
227 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2> /dev/null
235 if [ "$DistroBasedOn" = "debian" ]
238 # shellcheck disable=SC2086
239 res=$(dpkg-query --show --showformat='${Status}' "$1" 2>> $install_log)
240 if [ "${res}" = "install ok installed" ]
252 if [ "$DistroBasedOn" = "debian" ]
254 # shellcheck disable=SC2024
255 sudo --askpass apt-get --assume-yes install "$@" >> "$install_log" 2>&1
261 rm "$install_pass_script" > /dev/null 2>&1
263 if [ -p "$zen_pipe" ]
265 printf '%b\n' "100" > "$zen_pipe"
266 printf '%b\n' "#End" > "$zen_pipe"
269 zenity --title="$title" --width=370 --text="Geeqie is not installed\nLog file: $install_log" --info 2> /dev/null
271 rm "$zen_pipe" > /dev/null 2>&1
281 # If uninstall has been run, maybe the current directory no longer exists
284 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2> /dev/null
291 if [ "$DistroBasedOn" != "debian" ]
293 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
294 Operating System: $OS
296 Psuedoname: $PSUEDONAME
298 DistroBasedOn: $DistroBasedOn
300 Machine: $MACH" 2> /dev/null
305 # Parse the command line
306 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
313 printf '%b\n' "$version"
317 printf '%b\n' "$description"
348 printf '%b\n' "Essential libraries:"
349 for file in $essential_array
351 printf '%b\n' "$file"
355 printf '%b\n' "Optional libraries:"
356 for file in $optional_array
358 printf '%b\n' "$file"
364 # If a Geeqie folder already exists here, warn the user
367 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
372 # If it looks like a Geeqie download folder, assume an update
373 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
377 # If it looks like something else is already installed here, warn the user
378 if [ -d ".git" ] || [ -d "src" ]
380 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
388 # Use GTK3 as default
391 if [ "$mode" = "install" ]
393 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 subsequent dialogs you may choose which\noptional features to install."
395 title="Install Geeqie and dependencies"
398 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\nIn subsequent dialogs you may choose which\noptional features to install."
400 title="Update Geeqie and re-install"
404 # Ask whether to install GTK3 or uninstall
406 if ! gtk_version=$(zenity --title="$title" --width=370 --text="$message" --list --radiolist --column "" --column "" "$gtk3_installed" "Install" FALSE "Uninstall" --cancel-label="Cancel" --ok-label="OK" --hide-header 2> /dev/null)
411 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
412 # so create a temporary script containing the command
413 install_pass_script=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
414 printf '%b\n' "#!/bin/sh
415 if zenity --password --title=\"$title\" --width=370 2>/dev/null
418 fi" > "$install_pass_script"
419 chmod +x "$install_pass_script"
420 export SUDO_ASKPASS=$install_pass_script
422 if [ "$gtk_version" = "Uninstall" ]
428 # Put the install log in tmp, to avoid writing to PWD during a new install
429 rm install.log 2> /dev/null
430 install_log=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
432 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2> /dev/null &
435 # Get the standard options that are not yet installed
437 for file in $optional_array
439 if [ $((i % 2)) -eq 0 ]
441 package_title="$file"
443 if package_query "$file"
445 if [ -z "$option_string" ]
447 option_string="${install_option:+${install_option}}\n${package_title}\n${file}"
449 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
456 kill $zen_pid 2> /dev/null
458 # Ask the user which options to install
459 if [ -n "$option_string" ]
461 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)
467 # Start of Zenity progress section
468 zen_pipe=$(mktemp -u "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
470 (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 &
472 printf '%b\n' "2" > "$zen_pipe"
473 printf '%b\n' "#Installing essential libraries..." > "$zen_pipe"
475 install_essential "$gtk_version"
477 printf '%b\n' "4" > "$zen_pipe"
478 printf '%b\n' "#Installing options..." > "$zen_pipe"
482 printf '%b\n' "6" > "$zen_pipe"
483 printf '%b\n' "#Installing extra loaders..." > "$zen_pipe"
485 printf '%b\n' "10" > "$zen_pipe"
486 printf '%b\n' "#Getting new sources from server..." > "$zen_pipe"
488 if [ "$mode" = "install" ]
490 if ! git clone git://geeqie.org/geeqie.git >> "$install_log" 2>&1
492 git_error=$(tail -n5 "$install_log" 2>&1)
493 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
497 if ! git checkout master >> "$install_log" 2>&1
499 git_error="$(tail -n25 "$install_log" 2>&1)"
500 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
503 if ! git pull >> "$install_log" 2>&1
505 git_error=$(tail -n5 "$install_log" 2>&1)
506 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
511 printf '%b\n' "20" > "$zen_pipe"
512 printf '%b\n' "#Cleaning installed version..." > "$zen_pipe"
514 if [ $mode = "install" ]
518 sudo --askpass ninja -C build uninstall
521 printf '%b\n' "30" > "$zen_pipe"
522 printf '%b\n' "#Checkout required version..." > "$zen_pipe"
526 if ! git checkout master~"$BACK" >> "$install_log" 2>&1
528 git_error=$(tail -n5 "$install_log" 2>&1)
529 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
535 if ! git checkout "$COMMIT" >> "$install_log" 2>&1
537 git_error=$(tail -n5 "$install_log" 2>&1)
538 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
543 if ! git checkout "$TAG" >> "$install_log" 2>&1
545 git_error=$(tail -n5 "$install_log" 2>&1)
546 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
552 printf '%b\n' "40" > "$zen_pipe"
553 printf '%b\n' "#Creating configuration files..." > "$zen_pipe"
555 if [ -z "${gtk_version%%GTK3*}" ]
558 printf '%b\n' "90 " > "$zen_pipe"
559 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
560 ninja -C build install
563 meson configure build
564 printf '%b\n' "90 " > "$zen_pipe"
565 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
566 ninja -C build install
569 rm "$install_pass_script"
570 mv -f "$install_log" "./build/install.log"
572 printf '%b\n' "100 " > "$zen_pipe"
575 (for i in $(seq 0 4 100)
579 done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close --percentage=0 2> /dev/null