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)"
84 "libarchive (for compressed files e.g. zip, including timezone)"
88 # Optional for GTK3 only
90 "libchamplain gtk (for GPS maps)"
91 "libchamplain-gtk-0.12-dev"
92 "libchamplain (for GPS maps)"
93 "libchamplain-0.12-dev"
94 "libpoppler (for pdf file preview)"
98 ####################################################################
100 # Derived from: https://github.com/coto/server-easy-install (GPL)
101 ####################################################################
104 echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/"
109 OS=`lowercase \`uname\``
113 if [ "${OS}" == "windowsnt" ]
116 elif [ "${OS}" == "darwin" ]
121 if [ "${OS}" = "SunOS" ]
125 OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
126 elif [ "${OS}" = "AIX" ]
128 OSSTR="${OS} `oslevel` (`oslevel -r`)"
129 elif [ "${OS}" = "Linux" ]
131 if [ -f /etc/redhat-release ]
133 DistroBasedOn='RedHat'
134 DIST=`cat /etc/redhat-release |sed s/\ release.*//`
135 PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
136 REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
137 elif [ -f /etc/SuSE-release ]
140 PSUEDONAME=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
141 REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
142 elif [ -f /etc/mandrake-release ]
144 DistroBasedOn='Mandrake'
145 PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
146 REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
147 elif [ -f /etc/debian_version ]
149 DistroBasedOn='Debian'
150 if [ -f /etc/lsb-release ]
152 DIST=`cat /etc/lsb-release | grep '^DISTRIB_ID' | awk -F= '{ print $2 }'`
153 PSUEDONAME=`cat /etc/lsb-release | grep '^DISTRIB_CODENAME' | awk -F= '{ print $2 }'`
154 REV=`cat /etc/lsb-release | grep '^DISTRIB_RELEASE' | awk -F= '{ print $2 }'`
157 if [ -f /etc/UnitedLinux-release ]
159 DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
162 DistroBasedOn=`lowercase $DistroBasedOn`
165 readonly DistroBasedOn
176 arraylength=${#essential_array[@]}
177 for (( i=0; i<${arraylength}; i=i+1 ));
179 package_query ${essential_array[$i]}
182 package_install ${essential_array[$i]}
186 if [[ $1 == "GTK3" ]]
188 package_query "libgtk-3-dev"
191 package_install libgtk-3-dev
194 package_query "libgtk2.0-dev"
197 package_install libgtk2.0-dev
220 current_dir=$(basename $PWD)
221 if [[ $current_dir == "geeqie" ]]
223 sudo --askpass make uninstall
224 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" ]]
242 res=$(dpkg-query --show --showformat='${Status}' $1 2>>$install_log)
243 if [[ "$res" == "install ok installed"* ]]
255 if [[ $DistroBasedOn == "debian" ]]
257 sudo --askpass apt-get --assume-yes install $@ >>$install_log 2>&1
263 rm $install_pass_script >/dev/null 2>&1
264 #~ rm $install_log >/dev/null 2>&1
266 if [[ -p $zen_pipe ]]
268 echo "100" > $zen_pipe
269 echo "#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
281 # If uninstall has been run, maybe the current directory no longer exists
285 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Folder $PWD does not exist!" 2>/dev/null
292 if [[ $DistroBasedOn != "debian" ]]
294 zenity --error --title="Install Geeqie and dependencies" --width=370 --text="Unknown operating system:\n
295 Operating System: $OS
297 Psuedoname: $PSUEDONAME
299 DistroBasedOn: $DistroBasedOn
301 Machine: $MACH" 2>/dev/null
306 # Parse the command line
307 OPTS=$(getopt -o vhc:t:b:ld: --long version,help,commit:,tag:,back:,list,debug: -- "$@")
353 echo "Essential libraries:"
354 arraylength=${#essential_array[@]}
355 for (( i=0; i<${arraylength}; i=i+1 ));
357 echo ${essential_array[$i]}
361 echo "Optional libraries:"
362 arraylength=${#optional_array[@]}
363 for (( i=0; i<${arraylength}; i=i+1 ));
365 echo ${optional_array[$i]}
369 echo "Optional for GTK3:"
370 arraylength=${#optional_gtk3_array[@]}
371 for (( i=0; i<${arraylength}; i=i+1 ));
373 echo ${optional_gtk3_array[$i]}
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
420 if [[ -f config.log ]]
422 grep gtk-2.0 config.log >/dev/null
434 # Ask whether to install GTK2 or GTK3 or uninstall
436 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)
443 # Environment variable SUDO_ASKPASS cannot be "zenity --password",
444 # so create a temporary script containing the command
445 install_pass_script=$(mktemp --tmpdir geeqie_install_XXXXXX.sh)
447 zenity --password --title=\"'$title$'\" --width=370 2>/dev/null
452 \n' > $install_pass_script
453 chmod +x $install_pass_script
454 export SUDO_ASKPASS=$install_pass_script
456 if [[ $gtk_version == "Uninstall" ]]
462 # Put the install log in tmp, to avoid writing to PWD during a new install
463 rm install.log 2>/dev/null
464 install_log=$(mktemp --tmpdir geeqie_install_XXXXXX.log)
466 sleep 100 | zenity --title="$title" --text="Checking for installed files" --width=370 --progress --pulsate 2>/dev/null &
469 # Get the standard options that are not yet installed
470 arraylength=${#optional_array[@]}
471 for (( i=0; i<${arraylength}; i=i+2 ));
473 package_query ${optional_array[$i+1]}
476 if [ -z "$option_string" ]
478 option_string="$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
480 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_array[$i]}"$'\n'"${optional_array[$i+1]}"
485 # If GTK3 required, get the GTK3 options not yet installed
486 if [[ "$gtk_version" == "GTK3"* ]]
488 arraylength=${#optional_gtk3_array[@]}
489 for (( i=0; i<${arraylength}; i=i+2 ));
491 package_query ${optional_gtk3_array[$i+1]}
494 if [ -z "$option_string" ]
496 option_string="$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
498 option_string="$option_string"$'\n'"$install_option"$'\n'"${optional_gtk3_array[$i]}"$'\n'"${optional_gtk3_array[$i+1]}"
504 kill $zen_pid 2>/dev/null
506 # Ask the user which options to install
507 if [ -n "$option_string" ]
509 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)
517 # Start of Zenity progress section
518 zen_pipe=$(mktemp --dry-run --tmpdir geeqie_install_pipe_XXXXXX)
520 (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 &
523 echo "#Installing essential libraries..." > $zen_pipe
525 install_essential $gtk_version
528 echo "#Installing options..." > $zen_pipe
533 echo "#Installing extra loaders..." > $zen_pipe
535 echo "10" > $zen_pipe
536 echo "#Getting new sources from server..." > $zen_pipe
538 if [[ $mode == "install" ]]
540 ret=$(git clone git://geeqie.org/geeqie.git >>$install_log 2>&1)
542 git checkout master >>$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
549 ret=$(git pull >>$install_log 2>&1)
554 git_error=$(tail -n5 $install_log 2>&1)
555 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
559 echo "20" > $zen_pipe
560 echo "#Cleaning installed version..." > $zen_pipe
562 if [[ $mode == "install" ]]
566 sudo --askpass make uninstall >>$install_log 2>&1
567 sudo --askpass make maintainer-clean >>$install_log 2>&1
570 echo "30" > $zen_pipe
571 echo "#Checkout required version..." > $zen_pipe
575 ret=$(git checkout master~"$BACK" >>$install_log 2>&1)
578 git_error=$(tail -n5 $install_log 2>&1)
579 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
584 ret=$(git checkout "$COMMIT" >>$install_log 2>&1)
587 git_error=$(tail -n5 $install_log 2>&1)
588 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
593 ret=$(git checkout "$TAG" >>$install_log 2>&1)
597 git_error=$(tail -n5 $install_log 2>&1)
598 zenity --title="$title" --width=370 --height=400 --error --text=$'Git error:\n\n'"$git_error" 2>/dev/null
603 if [[ "$DEBUG" == "yes" ]]
607 debug_opt="--disable-debug-log"
610 echo "40" > $zen_pipe
611 echo "#Creating configuration files..." > $zen_pipe
613 if [[ $gtk_version == "GTK3"* ]]
615 ./autogen.sh "$debug_opt" >>$install_log 2>&1
617 ./autogen.sh "$debug_opt" --disable-gtk3 >>$install_log 2>&1
620 echo "60" > $zen_pipe
621 echo "#Compiling..." > $zen_pipe
623 export CFLAGS=$CFLAGS" -Wno-deprecated-declarations"
624 export CXXFLAGS=$CXXFLAGS" -Wno-deprecated-declarations"
625 make -j >>$install_log 2>&1
629 zenity --title="$title" --width=370 --height=400 --error --text=$'Compile error' 2>/dev/null
634 echo "90 " > $zen_pipe
635 echo "#Installing Geeqie..." > $zen_pipe
637 sudo --askpass make install >>$install_log 2>&1
639 rm $install_pass_script
640 mv -f $install_log install.log;
642 echo "100 " > $zen_pipe
645 (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