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
176 for file in $essential_array
178 if [ $((i % 2)) -ne 0 ]
180 if package_query "$file"
182 package_install "$file"
191 if package_query "libgtk-3-dev"
193 package_install libgtk-3-dev
196 if package_query "libgtk2.0-dev"
198 package_install libgtk2.0-dev
209 # shellcheck disable=SC2086
222 current_dir="$(basename "$PWD")"
223 if [ "$current_dir" = "geeqie" ]
226 sudo --askpass ninja -C build uninstall
228 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
231 sudo --askpass rm -rf geeqie
234 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2> /dev/null
242 if [ "$DistroBasedOn" = "debian" ]
245 # shellcheck disable=SC2086
246 res=$(dpkg-query --show --showformat='${Status}' "$1" 2>> $install_log)
247 if [ "${res}" = "install ok installed" ]
259 if [ "$DistroBasedOn" = "debian" ]
261 # shellcheck disable=SC2024
262 sudo --askpass apt-get --assume-yes install "$@" >> "$install_log" 2>&1
268 rm "$install_pass_script" > /dev/null 2>&1
270 if [ -p "$zen_pipe" ]
272 printf '%b\n' "100" > "$zen_pipe"
273 printf '%b\n' "#End" > "$zen_pipe"
276 zenity --title="$title" --width=370 --text="Geeqie is not installed\nLog file: $install_log" --info 2> /dev/null
278 rm "$zen_pipe" > /dev/null 2>&1
288 # If uninstall has been run, maybe the current directory no longer exists
291 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2> /dev/null
298 if [ "$DistroBasedOn" != "debian" ]
300 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
301 Operating System: $OS
303 Psuedoname: $PSUEDONAME
305 DistroBasedOn: $DistroBasedOn
307 Machine: $MACH" 2> /dev/null
312 # Parse the command line
313 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
320 printf '%b\n' "$version"
324 printf '%b\n' "$description"
355 printf '%b\n' "Essential libraries:"
356 for file in $essential_array
358 printf '%b\n' "$file"
362 printf '%b\n' "Optional libraries:"
363 for file in $optional_array
365 printf '%b\n' "$file"
371 # If a Geeqie folder already exists here, warn the user
374 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
379 # If it looks like a Geeqie download folder, assume an update
380 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
384 # If it looks like something else is already installed here, warn the user
385 if [ -d ".git" ] || [ -d "src" ]
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\nIt looks like you are running this script from a folder which already has software installed.\n\nPlease try another folder." 2> /dev/null
395 # Use GTK3 as default
398 if [ "$mode" = "install" ]
400 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."
402 title="Install Geeqie and dependencies"
405 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."
407 title="Update Geeqie and re-install"
411 # Ask whether to install GTK3 or uninstall
413 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)
418 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
419 # so create a temporary script containing the command
420 install_pass_script=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
421 printf '%b\n' "#!/bin/sh
422 if zenity --password --title=\"$title\" --width=370 2>/dev/null
425 fi" > "$install_pass_script"
426 chmod +x "$install_pass_script"
427 export SUDO_ASKPASS=$install_pass_script
429 if [ "$gtk_version" = "Uninstall" ]
435 # Put the install log in tmp, to avoid writing to PWD during a new install
436 rm install.log 2> /dev/null
437 install_log=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
439 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2> /dev/null &
442 # Get the standard options that are not yet installed
444 for file in $optional_array
446 if [ $((i % 2)) -eq 0 ]
448 package_title="$file"
450 if package_query "$file"
452 if [ -z "$option_string" ]
454 option_string="${install_option:+${install_option}}\n${package_title}\n${file}"
456 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
463 kill $zen_pid 2> /dev/null
465 # Ask the user which options to install
466 if [ -n "$option_string" ]
468 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)
474 # Start of Zenity progress section
475 zen_pipe=$(mktemp -u "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
477 (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 &
479 printf '%b\n' "2" > "$zen_pipe"
480 printf '%b\n' "#Installing essential libraries..." > "$zen_pipe"
482 install_essential "$gtk_version"
484 printf '%b\n' "4" > "$zen_pipe"
485 printf '%b\n' "#Installing options..." > "$zen_pipe"
489 printf '%b\n' "6" > "$zen_pipe"
490 printf '%b\n' "#Installing extra loaders..." > "$zen_pipe"
492 printf '%b\n' "10" > "$zen_pipe"
493 printf '%b\n' "#Getting new sources from server..." > "$zen_pipe"
495 if [ "$mode" = "install" ]
497 if ! git clone git://geeqie.org/geeqie.git >> "$install_log" 2>&1
499 git_error=$(tail -n5 "$install_log" 2>&1)
500 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
504 if ! git checkout master >> "$install_log" 2>&1
506 git_error="$(tail -n25 "$install_log" 2>&1)"
507 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
510 if ! git pull >> "$install_log" 2>&1
512 git_error=$(tail -n5 "$install_log" 2>&1)
513 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
518 printf '%b\n' "20" > "$zen_pipe"
519 printf '%b\n' "#Cleaning installed version..." > "$zen_pipe"
521 if [ $mode = "install" ]
525 sudo --askpass ninja -C build uninstall
528 printf '%b\n' "30" > "$zen_pipe"
529 printf '%b\n' "#Checkout required version..." > "$zen_pipe"
533 if ! git checkout master~"$BACK" >> "$install_log" 2>&1
535 git_error=$(tail -n5 "$install_log" 2>&1)
536 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
542 if ! git checkout "$COMMIT" >> "$install_log" 2>&1
544 git_error=$(tail -n5 "$install_log" 2>&1)
545 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
550 if ! 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
559 printf '%b\n' "40" > "$zen_pipe"
560 printf '%b\n' "#Creating configuration files..." > "$zen_pipe"
562 if [ -z "${gtk_version%%GTK3*}" ]
565 printf '%b\n' "90 " > "$zen_pipe"
566 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
567 ninja -C build install
570 meson configure build
571 printf '%b\n' "90 " > "$zen_pipe"
572 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
573 ninja -C build install
576 rm "$install_pass_script"
577 mv -f "$install_log" "./build/install.log"
579 printf '%b\n' "100 " > "$zen_pipe"
582 (for i in $(seq 0 4 100)
586 done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close --percentage=0 2> /dev/null