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)"
82 "libomp (required by libraw)"
86 # Optional for GTK3 only
88 "libchamplain gtk (for GPS maps)"
89 "libchamplain-gtk-0.12-dev"
90 "libchamplain (for GPS maps)"
91 "libchamplain-0.12-dev"
92 "libpoppler (for pdf file preview)"
96 ####################################################################
98 # Derived from: https://github.com/coto/server-easy-install (GPL)
99 ####################################################################
102 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
107 OS=`lowercase \`uname\``
111 if [ "${OS}" == "windowsnt" ]
114 elif [ "${OS}" == "darwin" ]
119 if [ "${OS}" = "SunOS" ]
123 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
124 elif [ "${OS}" = "AIX" ]
126 OSSTR="${OS} `oslevel` (`oslevel -r`)"
127 elif [ "${OS}" = "Linux" ]
129 if [ -f /etc/redhat-release ]
131 DistroBasedOn='RedHat'
132 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
133 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
134 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
135 elif [ -f /etc/SuSE-release ]
138 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
139 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
140 elif [ -f /etc/mandrake-release ]
142 DistroBasedOn='Mandrake'
143 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
144 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
145 elif [ -f /etc/debian_version ]
147 DistroBasedOn='Debian'
148 if [ -f /etc/lsb-release ]
150 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
151 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
152 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
155 if [ -f /etc/UnitedLinux-release ]
157 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
160 DistroBasedOn=`lowercase $DistroBasedOn`
163 readonly DistroBasedOn
174 arraylength=${#essential_array[@]}
175 for (( i=0; i<${arraylength}; i=i+1 ));
177 package_query ${essential_array[$i]}
180 package_install ${essential_array[$i]}
184 if [[ $1 == "GTK3" ]]
186 package_query "libgtk-3-dev"
189 package_install libgtk-3-dev
192 package_query "libgtk2.0-dev"
195 package_install libgtk2.0-dev
218 current_dir=$(basename $PWD)
219 if [[ $current_dir == "geeqie" ]]
221 sudo --askpass make uninstall
222 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" ]]
240 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
241 if [[ "$res" == "install ok installed"* ]]
253 if [[ $DistroBasedOn == "debian" ]]
255 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
261 rm $install_pass_script >/dev/null 2>&1
262 #~ rm $install_log >/dev/null 2>&1
264 if [[ -p $zen_pipe ]]
266 echo "100" > $zen_pipe
267 echo "#End" > $zen_pipe
270 zenity --title="$title" --width=370 --text=$'Geeqie is not installed\nLog file: '$install_log --info 2>/dev/null
272 rm $zen_pipe >/dev/null 2>&1
279 # If uninstall has been run, maybe the current directory no longer exists
283 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
290 if [[ $DistroBasedOn != "debian" ]]
292 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
293 Operating System: $OS
295 Psuedoname: $PSUEDONAME
297 DistroBasedOn: $DistroBasedOn
299 Machine: $MACH" 2>/dev/null
304 # Parse the command line
305 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
351 echo "Essential libraries:"
352 arraylength=${#essential_array[@]}
353 for (( i=0; i<${arraylength}; i=i+1 ));
355 echo ${essential_array[$i]}
359 echo "Optional libraries:"
360 arraylength=${#optional_array[@]}
361 for (( i=0; i<${arraylength}; i=i+1 ));
363 echo ${optional_array[$i]}
367 echo "Optional for GTK3:"
368 arraylength=${#optional_gtk3_array[@]}
369 for (( i=0; i<${arraylength}; i=i+1 ));
371 echo ${optional_gtk3_array[$i]}
377 # If a Geeqie folder already exists here, warn the user
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\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
385 # If it looks like a Geeqie download folder, assume an update
386 if [ -d ".git" ] && [ -d "src" ] && [ -f "geeqie.1" ]
390 # If it looks like something else is already installed here, warn the user
391 if [ -d ".git" ] || [ -d "src" ]
393 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
401 # Use GTK3 as default
405 if [[ $mode == "install" ]]
407 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."
409 title="Install Geeqie and dependencies"
412 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."
414 title="Update Geeqie and re-install"
417 # When updating, use previous installation as default
418 if [[ -f config.log ]]
420 grep gtk-2.0 config.log >/dev/null
432 # Ask whether to install GTK2 or GTK3 or uninstall
434 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)
441 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
442 # so create a temporary script containing the command
443 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
445 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
450 \n' > $install_pass_script
451 chmod +x $install_pass_script
452 export SUDO_ASKPASS=$install_pass_script
454 if [[ $gtk_version == "Uninstall" ]]
460 # Put the install log in tmp, to avoid writing to PWD during a new install
461 rm install.log 2>/dev/null
462 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
464 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
467 # Get the standard options that are not yet installed
468 arraylength=${#optional_array[@]}
469 for (( i=0; i<${arraylength}; i=i+2 ));
471 package_query ${optional_array[$i+1]}
474 if [ -z "$option_string" ]
476 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
478 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
483 # If GTK3 required, get the GTK3 options not yet installed
484 if [[ "$gtk_version" == "GTK3"* ]]
486 arraylength=${#optional_gtk3_array[@]}
487 for (( i=0; i<${arraylength}; i=i+2 ));
489 package_query ${optional_gtk3_array[$i+1]}
492 if [ -z "$option_string" ]
494 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
496 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
502 kill $zen_pid 2>/dev/null
504 # Ask the user which options to install
505 if [ -n "$option_string" ]
507 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)
515 # Start of Zenity progress section
516 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
518 (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 &
521 echo "#Installing essential libraries..." > $zen_pipe
523 install_essential $gtk_version
526 echo "#Installing options..." > $zen_pipe
531 echo "#Installing extra loaders..." > $zen_pipe
533 echo "10" > $zen_pipe
534 echo "#Getting new sources from server..." > $zen_pipe
536 if [[ $mode == "install" ]]
538 ret=$(git clone git://www.geeqie.org/geeqie.git >>$install_log 2>&1)
540 git checkout master >>$install_log 2>&1
543 git_error=$(tail -n5 $install_log 2>&1)
544 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
547 ret=$(git pull >>$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
557 echo "20" > $zen_pipe
558 echo "#Cleaning installed version..." > $zen_pipe
560 if [[ $mode == "install" ]]
564 sudo --askpass make uninstall >>$install_log 2>&1
565 sudo --askpass make maintainer-clean >>$install_log 2>&1
568 echo "30" > $zen_pipe
569 echo "#Checkout required version..." > $zen_pipe
573 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
576 git_error=$(tail -n5 $install_log 2>&1)
577 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
582 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
585 git_error=$(tail -n5 $install_log 2>&1)
586 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
591 ret=$(git checkout "$TAG" >>$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 [[ "$DEBUG" == "yes" ]]
605 debug_opt="--disable-debug-log"
608 echo "40" > $zen_pipe
609 echo "#Creating configuration files..." > $zen_pipe
611 if [[ $gtk_version == "GTK3"* ]]
613 ./autogen.sh "$debug_opt" >>$install_log 2>&1
615 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
618 echo "60" > $zen_pipe
619 echo "#Compiling..." > $zen_pipe
621 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
622 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
623 make -j >>$install_log 2>&1
627 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
632 echo "90 " > $zen_pipe
633 echo "#Installing Geeqie..." > $zen_pipe
635 sudo --askpass make install >>$install_log 2>&1
637 rm $install_pass_script
638 mv -f $install_log install.log;
640 echo "100 " > $zen_pipe
643 (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