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)
84 # Optional for GTK3 only
85 optional_gtk3_array="libchamplain gtk (for GPS maps)
86 libchamplain-gtk-0.12-dev
87 libchamplain (for GPS maps)
89 libpoppler (for pdf file preview)
92 ####################################################################
94 # Derived from: https://github.com/coto/server-easy-install (GPL)
95 ####################################################################
98 printf '%b\n' "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
103 OS="$(lowercase "$(uname)")"
107 if [ "${OS}" = "windowsnt" ]
110 elif [ "${OS}" = "darwin" ]
115 if [ "${OS}" = "SunOS" ]
119 OSSTR="${OS} ${REV}(${ARCH} $(uname -v))"
120 elif [ "${OS}" = "AIX" ]
122 # shellcheck disable=SC2034
123 OSSTR="${OS} $(oslevel) ($(oslevel -r))"
124 elif [ "${OS}" = "Linux" ]
126 if [ -f /etc/redhat-release ]
128 DistroBasedOn='RedHat'
129 DIST=$(sed s/\ release.*// /etc/redhat-release)
130 PSUEDONAME=$(sed s/.*\(// /etc/redhat-release | sed s/\)//)
131 REV=$(sed s/.*release\ // /etc/redhat-release | sed s/\ .*//)
132 elif [ -f /etc/SuSE-release ]
135 PSUEDONAME=$(tr "\n" ' ' < /etc/SuSE-release | sed s/VERSION.*//)
136 REV=$(tr "\n" ' ' < /etc/SuSE-release | sed s/.*=\ //)
137 elif [ -f /etc/mandrake-release ]
139 DistroBasedOn='Mandrake'
140 PSUEDONAME=$(sed s/.*\(// /etc/mandrake-release | sed s/\)//)
141 REV=$(cat | sed s/.*release\ // /etc/mandrake-release | sed s/\ .*//)
142 elif [ -f /etc/debian_version ]
144 DistroBasedOn='Debian'
145 if [ -f /etc/lsb-release ]
147 DIST=$(grep '^DISTRIB_ID' /etc/lsb-release | awk -F= '{ print $2 }')
148 PSUEDONAME=$(grep '^DISTRIB_CODENAME' /etc/lsb-release | awk -F= '{ print $2 }')
149 REV=$(grep '^DISTRIB_RELEASE' /etc/lsb-release | awk -F= '{ print $2 }')
152 if [ -f /etc/UnitedLinux-release ]
154 DIST="${DIST}[$(tr "\n" ' ' < /etc/UnitedLinux-release | sed s/VERSION.*//)]"
157 DistroBasedOn=$(lowercase $DistroBasedOn)
160 readonly DistroBasedOn
173 for file in $essential_array
175 if [ $((i % 2)) -ne 0 ]
177 if package_query "$file"
179 package_install "$file"
188 if package_query "libgtk-3-dev"
190 package_install libgtk-3-dev
193 if package_query "libgtk2.0-dev"
195 package_install libgtk2.0-dev
218 current_dir="$(basename "$PWD")"
219 if [ "$current_dir" = "geeqie" ]
222 sudo --askpass make uninstall
224 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
227 sudo --askpass rm -rf geeqie
230 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2> /dev/null
238 if [ "$DistroBasedOn" = "debian" ]
241 # shellcheck disable=SC2086
242 res=$(dpkg-query --show --showformat='${Status}' "$1" 2>> $install_log)
243 if [ "${res}" = "install ok installed" ]
255 if [ "$DistroBasedOn" = "debian" ]
257 # shellcheck disable=SC2024
258 sudo --askpass apt-get --assume-yes install "$@" >> "$install_log" 2>&1
264 rm "$install_pass_script" > /dev/null 2>&1
266 if [ -p "$zen_pipe" ]
268 printf '%b\n' "100" > "$zen_pipe"
269 printf '%b\n' "#End" > "$zen_pipe"
272 zenity --title="$title" --width=370 --text="Geeqie is not installed\nLog file: $install_log" --info 2> /dev/null
274 rm "$zen_pipe" > /dev/null 2>&1
284 # If uninstall has been run, maybe the current directory no longer exists
287 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2> /dev/null
294 if [ "$DistroBasedOn" != "debian" ]
296 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
297 Operating System: $OS
299 Psuedoname: $PSUEDONAME
301 DistroBasedOn: $DistroBasedOn
303 Machine: $MACH" 2> /dev/null
308 # Parse the command line
309 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
316 printf '%b\n' "$version"
320 printf '%b\n' "$description"
356 printf '%b\n' "Essential libraries:"
357 for file in $essential_array
359 printf '%b\n' "$file"
363 printf '%b\n' "Optional libraries:"
364 for file in $optional_array
366 printf '%b\n' "$file"
370 printf '%b\n' "Optional for GTK3:"
371 for file in $optional_gtk3_array
373 printf '%b\n' "$file"
379 # If a Geeqie folder already exists here, warn the user
382 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
387 # If it looks like a Geeqie download folder, assume an update
388 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
392 # If it looks like something else is already installed here, warn the user
393 if [ -d ".git" ] || [ -d "src" ]
395 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
403 # Use GTK3 as default
407 if [ "$mode" = "install" ]
409 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."
411 title="Install Geeqie and dependencies"
414 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."
416 title="Update Geeqie and re-install"
419 # When updating, use previous installation as default
422 if grep gtk-2.0 config.log > /dev/null
433 # Ask whether to install GTK2 or GTK3 or uninstall
435 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)
440 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
441 # so create a temporary script containing the command
442 install_pass_script=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
443 printf '%b\n' "#!/bin/sh
444 if zenity --password --title=\"$title\" --width=370 2>/dev/null
447 fi" > "$install_pass_script"
448 chmod +x "$install_pass_script"
449 export SUDO_ASKPASS=$install_pass_script
451 if [ "$gtk_version" = "Uninstall" ]
457 # Put the install log in tmp, to avoid writing to PWD during a new install
458 rm install.log 2> /dev/null
459 install_log=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
461 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2> /dev/null &
464 # Get the standard options that are not yet installed
466 for file in $optional_array
468 if [ $((i % 2)) -eq 0 ]
470 package_title="$file"
472 if package_query "$file"
474 if [ -z "$option_string" ]
476 option_string="${install_option:+${install_option}}\n${file}\n${file}"
478 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
485 # If GTK3 required, get the GTK3 options not yet installed
486 if [ -z "${gtk_version%%GTK3*}" ]
489 for file in $optional_gtk3_array
491 if [ $((i % 2)) -eq 0 ]
493 package_title="$file"
495 if package_query "$file"
497 if [ -z "$option_string" ]
499 option_string="${install_option:+${install_option}}\n${file}\n${file}"
501 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
509 kill $zen_pid 2> /dev/null
511 # Ask the user which options to install
512 if [ -n "$option_string" ]
514 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)
520 # Start of Zenity progress section
521 zen_pipe=$(mktemp -u "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
523 (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 &
525 printf '%b\n' "2" > "$zen_pipe"
526 printf '%b\n' "#Installing essential libraries..." > "$zen_pipe"
528 install_essential "$gtk_version"
530 printf '%b\n' "4" > "$zen_pipe"
531 printf '%b\n' "#Installing options..." > "$zen_pipe"
535 printf '%b\n' "6" > "$zen_pipe"
536 printf '%b\n' "#Installing extra loaders..." > "$zen_pipe"
538 printf '%b\n' "10" > "$zen_pipe"
539 printf '%b\n' "#Getting new sources from server..." > "$zen_pipe"
541 if [ "$mode" = "install" ]
543 if ! git clone git://geeqie.org/geeqie.git >> "$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
550 if ! git checkout master >> "$install_log" 2>&1
552 git_error="$(tail -n25 "$install_log" 2>&1)"
553 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
556 if ! git pull >> "$install_log" 2>&1
558 git_error=$(tail -n5 "$install_log" 2>&1)
559 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
564 printf '%b\n' "20" > "$zen_pipe"
565 printf '%b\n' "#Cleaning installed version..." > "$zen_pipe"
567 if [ $mode = "install" ]
571 # shellcheck disable=SC2024
572 sudo --askpass make uninstall >> "$install_log" 2>&1
573 # shellcheck disable=SC2024
574 sudo --askpass make maintainer-clean >> "$install_log" 2>&1
577 printf '%b\n' "30" > "$zen_pipe"
578 printf '%b\n' "#Checkout required version..." > "$zen_pipe"
582 if ! git checkout master~"$BACK" >> "$install_log" 2>&1
584 git_error=$(tail -n5 "$install_log" 2>&1)
585 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
591 if ! git checkout "$COMMIT" >> "$install_log" 2>&1
593 git_error=$(tail -n5 "$install_log" 2>&1)
594 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
599 if ! git checkout "$TAG" >> "$install_log" 2>&1
601 git_error=$(tail -n5 "$install_log" 2>&1)
602 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
607 if [ "$DEBUG" = "yes" ]
611 debug_opt="--disable-debug-log"
614 printf '%b\n' "40" > "$zen_pipe"
615 printf '%b\n' "#Creating configuration files..." > "$zen_pipe"
617 if [ -z "${gtk_version%%GTK3*}" ]
619 ./autogen.sh "$debug_opt" >> "$install_log" 2>&1
621 ./autogen.sh "$debug_opt" --disable-gtk3 >> "$install_log" 2>&1
624 printf '%b\n' "60" > "$zen_pipe"
625 printf '%b\n' "#Compiling..." > "$zen_pipe"
627 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
628 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
630 if ! make -j >> "$install_log" 2>&1
632 zenity --title="$title" --width=370 --height=400 --error --text="Compile error" 2> /dev/null
637 printf '%b\n' "90 " > "$zen_pipe"
638 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
640 # shellcheck disable=SC2024
641 sudo --askpass make install >> "$install_log" 2>&1
643 rm "$install_pass_script"
644 mv -f "$install_log" install.log
646 printf '%b\n' "100 " > "$zen_pipe"
649 (for i in $(seq 0 4 100)
653 done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close --percentage=0 2> /dev/null