4 ## @brief This script will 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
40 # Optional for both GTK2 and GTK3
42 "LCMS (for color management)"
44 "exiv2 (for exif handling)"
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 "libwebp (for WebP images)"
76 "libdjvulibre (for DjVu images)"
78 "libopenjp2 (for JP2 images)"
80 "libraw (for CR3 images)"
84 # Optional for GTK3 only
86 "libchamplain gtk (for GPS maps)"
87 "libchamplain-gtk-0.12-dev"
88 "libchamplain (for GPS maps)"
89 "libchamplain-0.12-dev"
90 "libpoppler (for pdf file preview)"
94 ####################################################################
96 # Derived from: https://github.com/coto/server-easy-install (GPL)
97 ####################################################################
100 echo "$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 OSSTR="${OS} `oslevel` (`oslevel -r`)"
125 elif [ "${OS}" = "Linux" ]
127 if [ -f /etc/redhat-release ]
129 DistroBasedOn='RedHat'
130 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
131 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
132 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
133 elif [ -f /etc/SuSE-release ]
136 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
137 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
138 elif [ -f /etc/mandrake-release ]
140 DistroBasedOn='Mandrake'
141 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
142 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
143 elif [ -f /etc/debian_version ]
145 DistroBasedOn='Debian'
146 if [ -f /etc/lsb-release ]
148 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
149 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
150 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
153 if [ -f /etc/UnitedLinux-release ]
155 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
158 DistroBasedOn=`lowercase $DistroBasedOn`
161 readonly DistroBasedOn
172 arraylength=${#essential_array[@]}
173 for (( i=0; i<${arraylength}; i=i+1 ));
175 package_query ${essential_array[$i]}
178 package_install ${essential_array[$i]}
182 if [[ $1 == "GTK3" ]]
184 package_query "libgtk-3-dev"
187 package_install libgtk-3-dev
190 package_query "libgtk2.0-dev"
193 package_install libgtk2.0-dev
216 current_dir=$(basename $PWD)
217 if [[ $current_dir == "geeqie" ]]
219 sudo --askpass make uninstall
220 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
225 sudo --askpass rm -rf geeqie
228 zenity --title="Uninstall Geeqie" --width=370 --text="This is not a geeqie installation folder!\n\n$PWD" --warning 2>/dev/null
236 if [[ $DistroBasedOn == "debian" ]]
238 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
239 if [[ "$res" == "install ok installed"* ]]
251 if [[ $DistroBasedOn == "debian" ]]
253 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
259 rm $install_pass_script >/dev/null 2>&1
260 #~ rm $install_log >/dev/null 2>&1
262 if [[ -p $zen_pipe ]]
264 echo "100" > $zen_pipe
265 echo "#End" > $zen_pipe
268 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
270 rm $zen_pipe >/dev/null 2>&1
277 # If uninstall has been run, maybe the current directory no longer exists
281 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
288 if [[ $DistroBasedOn != "debian" ]]
290 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
291 Operating System: $OS
293 Psuedoname: $PSUEDONAME
295 DistroBasedOn: $DistroBasedOn
297 Machine: $MACH" 2>/dev/null
302 # Parse the command line
303 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
349 echo "Essential libraries:"
350 arraylength=${#essential_array[@]}
351 for (( i=0; i<${arraylength}; i=i+1 ));
353 echo ${essential_array[$i]}
357 echo "Optional libraries:"
358 arraylength=${#optional_array[@]}
359 for (( i=0; i<${arraylength}; i=i+1 ));
361 echo ${optional_array[$i]}
365 echo "Optional for GTK3:"
366 arraylength=${#optional_gtk3_array[@]}
367 for (( i=0; i<${arraylength}; i=i+1 ));
369 echo ${optional_gtk3_array[$i]}
375 # If a Geeqie folder already exists here, warn the user
378 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
383 # If it looks like a Geeqie download folder, assume an update
384 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
388 # If it looks like something else is already installed here, warn the user
389 if [ -d ".git" ] || [ -d "src" ]
391 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
399 # Use GTK3 as default
403 if [[ $mode == "install" ]]
405 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."
407 title="Install Geeqie and dependencies"
410 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."
412 title="Update Geeqie and re-install"
415 # When updating, use previous installation as default
416 if [[ -f config.log ]]
418 grep gtk-2.0 config.log >/dev/null
430 # Ask whether to install GTK2 or GTK3 or uninstall
432 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)
439 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
440 # so create a temporary script containing the command
441 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
443 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
448 \n' > $install_pass_script
449 chmod +x $install_pass_script
450 export SUDO_ASKPASS=$install_pass_script
452 if [[ $gtk_version == "Uninstall" ]]
458 # Put the install log in tmp, to avoid writing to PWD during a new install
459 rm install.log 2>/dev/null
460 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
462 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
465 # Get the standard options that are not yet installed
466 arraylength=${#optional_array[@]}
467 for (( i=0; i<${arraylength}; i=i+2 ));
469 package_query ${optional_array[$i+1]}
472 if [ -z "$option_string" ]
474 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
476 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
481 # If GTK3 required, get the GTK3 options not yet installed
482 if [[ "$gtk_version" == "GTK3"* ]]
484 arraylength=${#optional_gtk3_array[@]}
485 for (( i=0; i<${arraylength}; i=i+2 ));
487 package_query ${optional_gtk3_array[$i+1]}
490 if [ -z "$option_string" ]
492 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
494 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
500 kill $zen_pid 2>/dev/null
502 # Ask the user which options to install
503 if [ -n "$option_string" ]
505 options=$(echo "$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)
513 # Start of Zenity progress section
514 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
516 (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 &
519 echo "#Installing essential libraries..." > $zen_pipe
521 install_essential $gtk_version
524 echo "#Installing options..." > $zen_pipe
529 echo "#Installing extra loaders..." > $zen_pipe
531 echo "10" > $zen_pipe
532 echo "#Getting new sources from server..." > $zen_pipe
534 if [[ $mode == "install" ]]
536 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
538 git checkout master >>$install_log 2>&1
541 git_error=$(tail -n5 $install_log 2>&1)
542 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
545 ret=$(git pull >>$install_log 2>&1)
550 git_error=$(tail -n5 $install_log 2>&1)
551 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
555 echo "20" > $zen_pipe
556 echo "#Cleaning installed version..." > $zen_pipe
558 if [[ $mode == "install" ]]
562 sudo --askpass make uninstall >>$install_log 2>&1
563 sudo --askpass make maintainer-clean >>$install_log 2>&1
566 echo "30" > $zen_pipe
567 echo "#Checkout required version..." > $zen_pipe
571 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
574 git_error=$(tail -n5 $install_log 2>&1)
575 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
580 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
583 git_error=$(tail -n5 $install_log 2>&1)
584 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
589 ret=$(git checkout "$TAG" >>$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 [[ "$DEBUG" == "yes" ]]
603 debug_opt="--disable-debug-log"
606 echo "40" > $zen_pipe
607 echo "#Creating configuration files..." > $zen_pipe
609 if [[ $gtk_version == "GTK3"* ]]
611 ./autogen.sh "$debug_opt" >>$install_log 2>&1
613 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
616 echo "60" > $zen_pipe
617 echo "#Compiling..." > $zen_pipe
619 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
620 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
621 make -j >>$install_log 2>&1
625 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
630 echo "90 " > $zen_pipe
631 echo "#Installing Geeqie..." > $zen_pipe
633 sudo --askpass make install >>$install_log 2>&1
635 rm $install_pass_script
636 mv -f $install_log install.log;
638 echo "100 " > $zen_pipe
641 (for i in $(seq 0 4 100); do echo "$i"; sleep 0.1; done) | zenity --progress --title="$title" --width=370 --text="Geeqie installation complete...\n$zonedetect_message" --auto-close --percentage=0 2>/dev/null