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.*//)]"
159 OS=$(lowercase "$OS")
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" ]
427 # Put the install log in tmp, to avoid writing to PWD during a new install
428 rm install.log 2> /dev/null
429 install_log=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
431 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2> /dev/null &
434 # Get the standard options that are not yet installed
436 for file in $optional_array
438 if [ $((i % 2)) -eq 0 ]
440 package_title="$file"
442 if package_query "$file"
444 if [ -z "$option_string" ]
446 option_string="${install_option:+${install_option}}\n${package_title}\n${file}"
448 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
455 kill "$zen_pid" 2> /dev/null
457 # Ask the user which options to install
458 if [ -n "$option_string" ]
460 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)
466 # Start of Zenity progress section
467 zen_pipe=$(mktemp -u "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
469 (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 &
471 printf '%b\n' "2" > "$zen_pipe"
472 printf '%b\n' "#Installing essential libraries..." > "$zen_pipe"
474 install_essential "$gtk_version"
476 printf '%b\n' "4" > "$zen_pipe"
477 printf '%b\n' "#Installing options..." > "$zen_pipe"
481 printf '%b\n' "6" > "$zen_pipe"
482 printf '%b\n' "#Installing extra loaders..." > "$zen_pipe"
484 printf '%b\n' "10" > "$zen_pipe"
485 printf '%b\n' "#Getting new sources from server..." > "$zen_pipe"
487 if [ "$mode" = "install" ]
489 if ! git clone git://geeqie.org/geeqie.git >> "$install_log" 2>&1
491 git_error=$(tail -n5 "$install_log" 2>&1)
492 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
496 if ! git checkout master >> "$install_log" 2>&1
498 git_error="$(tail -n25 "$install_log" 2>&1)"
499 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
502 if ! git pull >> "$install_log" 2>&1
504 git_error=$(tail -n5 "$install_log" 2>&1)
505 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
510 printf '%b\n' "20" > "$zen_pipe"
511 printf '%b\n' "#Cleaning installed version..." > "$zen_pipe"
513 if [ "$mode" = "install" ]
517 sudo --askpass ninja -C build uninstall
520 printf '%b\n' "30" > "$zen_pipe"
521 printf '%b\n' "#Checkout required version..." > "$zen_pipe"
525 if ! git checkout master~"$BACK" >> "$install_log" 2>&1
527 git_error=$(tail -n5 "$install_log" 2>&1)
528 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
531 elif [ -n "$COMMIT" ]
534 if ! git checkout "$COMMIT" >> "$install_log" 2>&1
536 git_error=$(tail -n5 "$install_log" 2>&1)
537 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
542 if ! git checkout "$TAG" >> "$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 printf '%b\n' "40" > "$zen_pipe"
551 printf '%b\n' "#Creating configuration files..." > "$zen_pipe"
553 if [ -z "${gtk_version%%GTK3*}" ]
556 printf '%b\n' "90 " > "$zen_pipe"
557 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
558 ninja -C build install
561 meson configure build
562 printf '%b\n' "90 " > "$zen_pipe"
563 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
564 ninja -C build install
567 rm "$install_pass_script"
568 mv -f "$install_log" "./build/install.log"
570 printf '%b\n' "100 " > "$zen_pipe"
573 (for i in $(seq 0 4 100)
577 done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close --percentage=0 2> /dev/null