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)
91 libgspell (for spelling checks)
94 ####################################################################
96 # Derived from: https://github.com/coto/server-easy-install (GPL)
97 ####################################################################
100 printf '%b\n' "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
105 OS="$(lowercase "$(uname)")"
109 if [ "${OS}" = "windowsnt" ]
112 elif [ "${OS}" = "darwin" ]
117 if [ "${OS}" = "SunOS" ]
121 OSSTR="${OS} ${REV}(${ARCH} $(uname -v))"
122 elif [ "${OS}" = "AIX" ]
124 # shellcheck disable=SC2034
125 OSSTR="${OS} $(oslevel) ($(oslevel -r))"
126 elif [ "${OS}" = "Linux" ]
128 if [ -f /etc/redhat-release ]
130 DistroBasedOn='RedHat'
131 DIST=$(sed s/\ release.*// /etc/redhat-release)
132 PSUEDONAME=$(sed s/.*\(// /etc/redhat-release | sed s/\)//)
133 REV=$(sed s/.*release\ // /etc/redhat-release | sed s/\ .*//)
134 elif [ -f /etc/SuSE-release ]
137 PSUEDONAME=$(tr "\n" ' ' < /etc/SuSE-release | sed s/VERSION.*//)
138 REV=$(tr "\n" ' ' < /etc/SuSE-release | sed s/.*=\ //)
139 elif [ -f /etc/mandrake-release ]
141 DistroBasedOn='Mandrake'
142 PSUEDONAME=$(sed s/.*\(// /etc/mandrake-release | sed s/\)//)
143 REV=$(cat | sed s/.*release\ // /etc/mandrake-release | sed s/\ .*//)
144 elif [ -f /etc/debian_version ]
146 DistroBasedOn='Debian'
147 if [ -f /etc/lsb-release ]
149 DIST=$(grep '^DISTRIB_ID' /etc/lsb-release | awk -F= '{ print $2 }')
150 PSUEDONAME=$(grep '^DISTRIB_CODENAME' /etc/lsb-release | awk -F= '{ print $2 }')
151 REV=$(grep '^DISTRIB_RELEASE' /etc/lsb-release | awk -F= '{ print $2 }')
154 if [ -f /etc/UnitedLinux-release ]
156 DIST="${DIST}[$(tr "\n" ' ' < /etc/UnitedLinux-release | sed s/VERSION.*//)]"
159 DistroBasedOn=$(lowercase $DistroBasedOn)
162 readonly DistroBasedOn
175 for file in $essential_array
177 if [ $((i % 2)) -ne 0 ]
179 if package_query "$file"
181 package_install "$file"
190 if package_query "libgtk-3-dev"
192 package_install libgtk-3-dev
195 if package_query "libgtk2.0-dev"
197 package_install libgtk2.0-dev
220 current_dir="$(basename "$PWD")"
221 if [ "$current_dir" = "geeqie" ]
224 sudo --askpass make uninstall
226 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
229 sudo --askpass rm -rf geeqie
232 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2> /dev/null
240 if [ "$DistroBasedOn" = "debian" ]
243 # shellcheck disable=SC2086
244 res=$(dpkg-query --show --showformat='${Status}' "$1" 2>> $install_log)
245 if [ "${res}" = "install ok installed" ]
257 if [ "$DistroBasedOn" = "debian" ]
259 # shellcheck disable=SC2024
260 sudo --askpass apt-get --assume-yes install "$@" >> "$install_log" 2>&1
266 rm "$install_pass_script" > /dev/null 2>&1
268 if [ -p "$zen_pipe" ]
270 printf '%b\n' "100" > "$zen_pipe"
271 printf '%b\n' "#End" > "$zen_pipe"
274 zenity --title="$title" --width=370 --text="Geeqie is not installed\nLog file: $install_log" --info 2> /dev/null
276 rm "$zen_pipe" > /dev/null 2>&1
286 # If uninstall has been run, maybe the current directory no longer exists
289 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2> /dev/null
296 if [ "$DistroBasedOn" != "debian" ]
298 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
299 Operating System: $OS
301 Psuedoname: $PSUEDONAME
303 DistroBasedOn: $DistroBasedOn
305 Machine: $MACH" 2> /dev/null
310 # Parse the command line
311 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
318 printf '%b\n' "$version"
322 printf '%b\n' "$description"
358 printf '%b\n' "Essential libraries:"
359 for file in $essential_array
361 printf '%b\n' "$file"
365 printf '%b\n' "Optional libraries:"
366 for file in $optional_array
368 printf '%b\n' "$file"
372 printf '%b\n' "Optional for GTK3:"
373 for file in $optional_gtk3_array
375 printf '%b\n' "$file"
381 # If a Geeqie folder already exists here, warn the user
384 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
389 # If it looks like a Geeqie download folder, assume an update
390 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
394 # If it looks like something else is already installed here, warn the user
395 if [ -d ".git" ] || [ -d "src" ]
397 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
405 # Use GTK3 as default
409 if [ "$mode" = "install" ]
411 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."
413 title="Install Geeqie and dependencies"
416 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."
418 title="Update Geeqie and re-install"
421 # When updating, use previous installation as default
424 if grep gtk-2.0 config.log > /dev/null
435 # Ask whether to install GTK2 or GTK3 or uninstall
437 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)
442 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
443 # so create a temporary script containing the command
444 install_pass_script=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
445 printf '%b\n' "#!/bin/sh
446 if zenity --password --title=\"$title\" --width=370 2>/dev/null
449 fi" > "$install_pass_script"
450 chmod +x "$install_pass_script"
451 export SUDO_ASKPASS=$install_pass_script
453 if [ "$gtk_version" = "Uninstall" ]
459 # Put the install log in tmp, to avoid writing to PWD during a new install
460 rm install.log 2> /dev/null
461 install_log=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
463 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2> /dev/null &
466 # Get the standard options that are not yet installed
468 for file in $optional_array
470 if [ $((i % 2)) -eq 0 ]
472 package_title="$file"
474 if package_query "$file"
476 if [ -z "$option_string" ]
478 option_string="${install_option:+${install_option}}\n${file}\n${file}"
480 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
487 # If GTK3 required, get the GTK3 options not yet installed
488 if [ -z "${gtk_version%%GTK3*}" ]
491 for file in $optional_gtk3_array
493 if [ $((i % 2)) -eq 0 ]
495 package_title="$file"
497 if package_query "$file"
499 if [ -z "$option_string" ]
501 option_string="${install_option:+${install_option}}\n${file}\n${file}"
503 option_string="${option_string:+${option_string}}\n$install_option\n${package_title}\n${file}"
511 kill $zen_pid 2> /dev/null
513 # Ask the user which options to install
514 if [ -n "$option_string" ]
516 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)
522 # Start of Zenity progress section
523 zen_pipe=$(mktemp -u "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
525 (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 &
527 printf '%b\n' "2" > "$zen_pipe"
528 printf '%b\n' "#Installing essential libraries..." > "$zen_pipe"
530 install_essential "$gtk_version"
532 printf '%b\n' "4" > "$zen_pipe"
533 printf '%b\n' "#Installing options..." > "$zen_pipe"
537 printf '%b\n' "6" > "$zen_pipe"
538 printf '%b\n' "#Installing extra loaders..." > "$zen_pipe"
540 printf '%b\n' "10" > "$zen_pipe"
541 printf '%b\n' "#Getting new sources from server..." > "$zen_pipe"
543 if [ "$mode" = "install" ]
545 if ! git clone git://geeqie.org/geeqie.git >> "$install_log" 2>&1
547 git_error=$(tail -n5 "$install_log" 2>&1)
548 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
552 if ! git checkout master >> "$install_log" 2>&1
554 git_error="$(tail -n25 "$install_log" 2>&1)"
555 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
558 if ! git pull >> "$install_log" 2>&1
560 git_error=$(tail -n5 "$install_log" 2>&1)
561 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
566 printf '%b\n' "20" > "$zen_pipe"
567 printf '%b\n' "#Cleaning installed version..." > "$zen_pipe"
569 if [ $mode = "install" ]
573 # shellcheck disable=SC2024
574 sudo --askpass make uninstall >> "$install_log" 2>&1
575 # shellcheck disable=SC2024
576 sudo --askpass make maintainer-clean >> "$install_log" 2>&1
579 printf '%b\n' "30" > "$zen_pipe"
580 printf '%b\n' "#Checkout required version..." > "$zen_pipe"
584 if ! git checkout master~"$BACK" >> "$install_log" 2>&1
586 git_error=$(tail -n5 "$install_log" 2>&1)
587 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
593 if ! git checkout "$COMMIT" >> "$install_log" 2>&1
595 git_error=$(tail -n5 "$install_log" 2>&1)
596 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
601 if ! git checkout "$TAG" >> "$install_log" 2>&1
603 git_error=$(tail -n5 "$install_log" 2>&1)
604 zenity --title="$title" --width=370 --height=400 --error --text="Git error:\n\n$git_error" 2> /dev/null
609 if [ "$DEBUG" = "yes" ]
613 debug_opt="--disable-debug-log"
616 printf '%b\n' "40" > "$zen_pipe"
617 printf '%b\n' "#Creating configuration files..." > "$zen_pipe"
619 if [ -z "${gtk_version%%GTK3*}" ]
621 ./autogen.sh "$debug_opt" >> "$install_log" 2>&1
623 ./autogen.sh "$debug_opt" --disable-gtk3 >> "$install_log" 2>&1
626 printf '%b\n' "60" > "$zen_pipe"
627 printf '%b\n' "#Compiling..." > "$zen_pipe"
629 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
630 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
632 if ! make -j >> "$install_log" 2>&1
634 zenity --title="$title" --width=370 --height=400 --error --text="Compile error" 2> /dev/null
639 printf '%b\n' "90 " > "$zen_pipe"
640 printf '%b\n' "#Installing Geeqie..." > "$zen_pipe"
642 # shellcheck disable=SC2024
643 sudo --askpass make install >> "$install_log" 2>&1
645 rm "$install_pass_script"
646 mv -f "$install_log" install.log
648 printf '%b\n' "100 " > "$zen_pipe"
651 (for i in $(seq 0 4 100)
655 done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n" --auto-close --percentage=0 2> /dev/null