revert 388a8fc9; prefer gcc4 if we can't determine the ABI
[ardour.git] / tools / linux_packaging / stage2.run.in
1 #!/bin/sh
2
3 ####################################
4 #
5 #       stage2.run
6 #       Ardour/Mixbus bundle installer
7 #       Todd Naugle
8 #
9 ###################################
10
11 MAJOR_VERSION="%REPLACE_MAJOR_VERSION%"
12
13 PGM_NAME="%REPLACE_PGM%"
14 PGM_VENDOR="%REPLACE_VENDOR%"
15 PGM_EXEC_FILE="%REPLACE_EXE%${MAJOR_VERSION}"
16
17 THE_SHELL="/bin/sh"
18
19 if test -z "$INSTALL_DEST_BASE"; then
20         INSTALL_DEST_BASE="/opt"
21         CALL_MKDIR=1
22 else
23         CALL_MKDIR=
24 fi
25
26 USER_BIN_DIR="/usr/local/bin"
27
28 PGM_NAME_LOWER=$(echo $PGM_NAME | tr '[:upper:]' '[:lower:]')
29
30 USER_NAME=$(logname)
31
32 #### Global Variables ####
33 HAS_XDG="T"
34 MULTABI_BUNDLE=""
35
36 ########################
37 # Function Definitions
38 ########################
39
40 VaildateYesNoQuestion ()
41 {
42         # $1 = Question Text
43         
44         local INPUT_OK="n"
45         local USER_INPUT=""
46
47         until test "y" = $INPUT_OK;
48         do
49                 echo ""
50                 read -p "$1 [y/n]: " USER_INPUT
51                 echo ""
52
53                 if [ ! -z $USER_INPUT ]; 
54                 then            
55                         if [ "Y" = $USER_INPUT -o "y" = $USER_INPUT -o "n" = $USER_INPUT -o "N" = $USER_INPUT ];
56                         then
57                                 INPUT_OK="y"
58                         fi
59                 fi
60         done
61         
62         echo $USER_INPUT | tr '[:upper:]' '[:lower:]'
63         
64 }
65
66 SystemInstall ()
67 {
68
69         # Determine which software install app to use and then install requested package
70         # $1 = Package Name
71
72         if which yum > /dev/null;
73         then
74                 ${SUPER} yum -y install $1
75                 rtrn=$?
76
77                 if [ $rtrn -ne 0 ];
78                 then
79                         echo ""
80                         echo "!!! ERROR !!! yum install failed for an unknown reason."
81                         echo "Please install package $1 after this installer completes."
82                         echo ""
83                 fi
84
85         elif which apt-get > /dev/null;
86         then
87                 ${SUPER} apt-get -y install $1
88                 rtrn=$?
89
90                 if [ $rtrn -ne 0 ];
91                 then
92                         echo ""
93                         echo "!!! ERROR !!! apt-get install failed for an unknown reason."
94                         echo "Please install package $1 after this installer completes."
95                         echo ""
96                 fi
97
98         else
99                 echo ""
100                 echo "!!! ERROR !!! - Not able to detect which software install tool to use (yum or apt-get)."
101                 echo "Please install package $1 using the system software install tool."
102                 echo ""
103                 rtrn=1
104         fi
105         
106         return $rtrn
107
108 }
109
110 ########################################################################
111 #                                 Main
112 ########################################################################
113 umask 0022
114
115 # If you double click a script, some systems don't get the PWD correct.
116 # Force it to be correct
117 PKG_PATH=$(dirname "$(readlink -f "$0")")
118 cd "${PKG_PATH}"
119
120 echo ""
121 echo "Welcome to the ${PGM_NAME} installer"
122 echo ""
123 echo "${PGM_NAME} will be installed for user ${USER_NAME} in ${INSTALL_DEST_BASE}"
124 echo ""
125 #############################
126 # Check for root privileges
127 #############################
128
129 SUPER=""
130 NORM_USER=""
131
132 if [ "$(id -u)" != "0" ]; then
133
134         if ! which sudo > /dev/null;
135         then
136                 echo ""
137                 echo "Sudo installed failed, attempting to install using su"
138                 echo "Please enter root password below"
139                 echo ""
140
141                 if ! su -s $THE_SHELL -c "./.stage2.run";
142                 then
143                         echo ""
144                         echo "!!! ERROR !!!"
145                         echo ""
146                         echo "This installer requires root privileges. It is currently not"
147                         echo "running as root AND an attempt to use su failed."
148                         echo ""
149                         echo "Please correct this by installing and configuring sudo or running"
150                         echo "the installer as root (su -s $THE_SHELL -c)."
151                         echo ""
152                         read -p "Press ENTER to exit installer:" BLAH
153                         exit 1
154                 fi
155                 exit
156         else
157                 sudo -k # make sudo forget about cached credentials
158         fi
159
160         if ! sudo date;
161         then
162                 echo ""
163                 echo "Attempting to install using su"
164                 echo "Please enter root password below"
165                 echo ""
166
167                 if ! su -s $THE_SHELL -c "./.stage2.run";
168                 then
169                         echo ""
170                         echo "!!! ERROR !!!"
171                         echo ""
172                         echo "This installer requires root privileges. It is currently not"
173                         echo "running as root AND an attempt to use both sudo and su failed."
174                         echo ""
175                         echo "Please correct this by installing and configuring sudo or running"
176                         echo "the installer as root (su -s $THE_SHELL -c)."
177                         echo ""
178                         read -p "Press ENTER to exit installer:" BLAH
179                         exit 1
180                 fi
181                 exit
182         fi
183         SUPER="sudo"
184         
185         # The quoting reqired for the su sanityCheck method does not work when used without
186         # su. Using sh -c in the normal case gets around that, but is a bit of a hack.
187         NORM_USER="sh -c"
188 else
189         NORM_USER="su -l $USER_NAME -s $THE_SHELL -c" 
190 fi
191
192 ###############################
193 # Check for install destination
194 ###############################
195
196 if test -n "$CALL_MKDIR"; then
197         ${SUPER} mkdir -p "$INSTALL_DEST_BASE"
198 fi
199
200 if [ ! -d ${INSTALL_DEST_BASE} ];
201 then
202         echo ""
203         echo "!!! ERROR !!! - Installation location ${INSTALL_DEST_BASE} does not exist!"
204         echo "Installation will not complete."
205         echo ""
206         read -p "Press ENTER to exit installer:" BLAH
207         exit 1
208 fi
209
210
211 ############################
212 # Determine processor type
213 ############################
214
215 case `uname -m` in
216         i[3456789]86|x86|i86pc)
217                 echo "Architecture is x86"
218                 ARCH='x86'
219                 ;;
220         x86_64|amd64|AMD64)
221                 echo "Architecture is x86_64"
222                 ARCH='x86_64'
223                 ;;
224         *)
225                 echo ""
226                 echo "!!! ERROR !!! - Unknown architecture `uname -m`"
227                 echo ""
228                 read -p "Press ENTER to exit installer:" BLAH
229                 exit 1
230                 ;;
231 esac
232
233 ###################
234 # Determine gcc ABI
235 ###################
236
237 if test -n "$MULTABI_BUNDLE"; then
238         if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --fail --gcc5 > /dev/null"; then
239                 ABI=-gcc4
240         else
241                 ABI=-gcc5
242         fi
243   # allow to manually override
244         if test "$1" = "--gcc4"; then
245                 ABI=-gcc4
246         fi
247         if test "$1" = "--gcc5"; then
248                 ABI=-gcc5
249         fi
250 else
251         ABI=
252 fi
253
254 ####################
255 # Check disk space
256 ####################
257
258 # We have to check the current folder and the INSTALL_DEST_BASE just
259 # in case they are on different devices
260 echo "Checking for required disk space"
261
262 if [ ! -e .${PGM_NAME}_${ARCH}${ABI}-*.size ]; then
263         echo ""
264         echo "!!! ERROR !!! Can't locate .size file for ${ARCH}${ABI} bundle."
265         echo "This package is broken or does not support ${ARCH}${ABI}."
266         echo ""
267         read -p "Press ENTER to exit installer:" BLAH
268         exit 1
269 else
270         REQUIRED_BYTES=$(cat .${PGM_NAME}_${ARCH}${ABI}-*.size)
271
272         #Installer needs 2x the space since the bundle is unpacked locally and then copied
273         REQUIRED_BYTES=$(($REQUIRED_BYTES + $REQUIRED_BYTES))
274
275         #Check space in current folder
276         FREE_BYTES=$(df -P -B 1 "${PKG_PATH}" | grep / | awk '{print $4}')
277
278         if [ ${FREE_BYTES} -le ${REQUIRED_BYTES} ] ; then
279                 echo ""
280                 echo "!!! ERROR !!! - Insufficient disk space in ${PKG_PATH}"
281                 echo "Install requires ${REQUIRED_BYTES} bytes and"
282                 echo "there is only ${FREE_BYTES} bytes of free space"
283                 echo ""
284                 read -p "Press ENTER to exit installer:" BLAH
285                 exit 1
286         fi
287
288         #Check space in INSTALL_DEST_BASE
289         FREE_BYTES=$(df -P -B 1 ${INSTALL_DEST_BASE} | grep / | awk '{print $4}')
290
291         if [ ${FREE_BYTES} -le ${REQUIRED_BYTES} ] ; then
292                 echo ""
293                 echo "!!! ERROR !!! - Insufficient disk space in ${INSTALL_DEST_BASE}"
294                 echo "Install requires ${REQUIRED_BYTES} bytes and"
295                 echo "there is only ${FREE_BYTES} bytes of free space"
296                 echo ""
297                 read -p "Press ENTER to exit installer:" BLAH
298                 exit 1
299         fi
300 fi
301
302 #############################
303 # Determine C11 stdlibc++ ABI
304 #############################
305
306 if test -z "$ABI"; then
307         if %REPLACE_GCC5%; then
308                 # Ardour was compiled with gcc5, warn on gcc4 systems
309                 if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc5 > /dev/null"; then
310                         echo ""
311                         echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
312                         echo ""
313                         echo "${PGM_NAME} was compiled with gcc5, your system uses an older version of the"
314                         echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
315                         echo "may cause crashes."
316                         echo ""
317                         ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
318                         if test "n" = $ANSWER; then
319                                 exit 1
320                         fi
321                 fi
322         else
323                 # Ardour was compiled with gcc4, warn on gcc5 systems
324                 if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc4 > /dev/null"; then
325                         echo ""
326                         echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
327                         echo ""
328                         echo "${PGM_NAME} was compiled with gcc4, your system uses a newer version of the"
329                         echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
330                         echo "may cause crashes."
331                         echo ""
332                         ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
333                         if test "n" = $ANSWER; then
334                                 exit 1
335                         fi
336                 fi
337         fi
338 fi
339
340 if %REPLACE_WINE%; then
341         if test -z "`which wine`"; then
342                 echo ""
343                 echo "!!! ERROR !!! - 'wine' was not found."
344                 echo ""
345                 echo "This version of ${PGM_NAME} with Windows VST support requires wine."
346                 echo "https://www.winehq.org/"
347                 echo ""
348                 read -p "Press ENTER to exit installer:" BLAH
349                 exit 1
350         fi
351 fi
352
353 #####################
354 # Unpack the bundle
355 #####################
356
357 FILESYSTEM_TYPE=$(df -P -T "${PKG_PATH}" | grep / | awk '{print $2}')
358 echo "Bundle is on ${FILESYSTEM_TYPE} filesystem"
359
360 # untar the correct bundle for us to install
361 echo "Unpacking bundle for $ARCH${ABI}"
362
363 if [ ! -e ${PGM_NAME}_${ARCH}${ABI}-*.tar ]; then
364         echo ""
365         echo "!!! ERROR !!! Can't locate ${ARCH}${ABI} bundle file."
366         echo ""
367         read -p "Press ENTER to exit installer:" BLAH
368         exit 1
369 fi
370
371 if ! tar -xf ${PGM_NAME}_${ARCH}${ABI}-*.tar; then
372         echo ""
373         echo "!!! ERROR !!! Can't unpack ${ARCH}${ABI} bundle file."
374         echo ""
375         read -p "Press ENTER to exit installer:" BLAH
376         exit 1
377 else
378         echo "Bundle unpacked"
379 fi
380
381 BUNDLE_DIR=$(basename `find -maxdepth 1 -type d -name "${PGM_NAME}_${ARCH}-*"`)
382
383
384 #######################
385 # Check for xdg utils
386 #######################
387
388 #load the file that contains the translated names of the users directories
389 if [ -e /home/${USER_NAME}/.config/user-dirs.dirs ]; then
390         . /home/${USER_NAME}/.config/user-dirs.dirs
391 fi
392
393 if [ "$(id -u)" != "0" ]; then
394         USER_DESKTOP_DIR=${XDG_DESKTOP_DIR:-$HOME/Desktop}
395 else
396         #running as root with su makes this more difficult
397         DESKTOP_FOLDER=$(echo ${XDG_DESKTOP_DIR:-$HOME/Desktop} | awk -F/ '{print $NF}')
398         USER_DESKTOP_DIR="/home/${USER_NAME}/${DESKTOP_FOLDER}"
399 fi
400
401 XDG_MENU_VER=$(xdg-desktop-menu --version 2> /dev/null)
402 if [ -z "$XDG_MENU_VER" ];
403 then
404         echo "System does not have xdg-desktop-menu installed"
405         HAS_XDG="F"
406 fi
407
408 XDG_ICON_VER=$(xdg-icon-resource --version 2> /dev/null)
409 if [ -z "$XDG_ICON_VER" ];
410 then
411         echo "System does not have xdg-icon-resource installed"
412         HAS_XDG="F"
413 fi
414
415 #################################################
416 # Set up libwine.so
417 #################################################
418 if %REPLACE_WINE%; then
419         echo ""
420         echo "Searching libwine.so (Windows VST support)"
421         # we need to add libwine to ardour's LD_LIBRARY_PATH
422         # libwine itself includes paths to the various system-components
423         # which may be different on each platform.
424         #
425         # There's some chicken/egg here: ardour.exe.so is linked against libwine.so
426         # at build-time. wine/wineloader assumes a windows-application (which does not use libwine
427         # directly) and does not set up the LD path to libwine itself. the application terminates
428         # (missing libs) before it even starts..
429         #
430         # wine itself does not provide means to find the location of libwine.
431         # /usr/bin/wine is usually shell-script and libwine.so can be found in
432         # various places on different distros.
433         #
434         # if this check were quick and easy.. it should be done in the startup-script, but it's not
435         # so here we go... (updating wine may require re-installing ardour)
436         #
437         # on recent Ubuntu wine does load both:
438         #   /usr/lib/i386-linux-gnu/libwine.so.1
439         # AND
440         #   /usr/lib/x86_64-linux-gnu/libwine.so.1
441         # so we need to work around this (thanks).
442         # (this hack break 64bit LinuxVST builds, but we don't do those anyway)
443
444         LIBWINE=$(
445                 LD_DEBUG=files wine `pwd`/${BUNDLE_DIR}/lib/ardour-vst-scanner.exe.so 2>&1 \
446                                                  | grep -e "calling init:.*libwine" \
447                                                  | sed 's/^.*calling init: //' \
448                                                  | grep -v x86_64-linux-gnu \
449                                                  | uniq \
450                         )
451         if ! test -f "$LIBWINE"; then
452                 echo ""
453                 echo "!!! ERROR !!! - 'libwine.so*' was not found."
454                 echo ""
455                 read -p "Press ENTER to exit installer:" BLAH
456                 exit 1
457         fi
458         echo "Using: $LIBWINE"
459   # this replaces/overwrites the bundled libwine
460         cp -L "$LIBWINE" `pwd`/${BUNDLE_DIR}/lib/libwine.so.1
461 fi
462
463 #################################################
464 # Check if system libs are OK (libc, etc)
465 #################################################
466
467 echo ""
468 echo "Checking system libs to see if they are compatible with ${PGM_NAME}."
469 echo ""
470
471 LIB_ERROR="F"
472 LD_PATH=`pwd`/${BUNDLE_DIR}/lib
473
474 # check the main App
475 LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd ${BUNDLE_DIR}/bin/${PGM_NAME_LOWER}-* 2>&1 > /dev/null | grep -v "no version information")
476
477 if [ -n "$LDD_RESULT" ];
478 then
479         echo "$LDD_RESULT"
480         LIB_ERROR="T"
481 fi
482         
483 # check the libs
484 LIB_FILES=$(find ${BUNDLE_DIR}/lib -name "*.so")
485
486 for path in $LIB_FILES
487 do
488         LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd $path 2>&1 > /dev/null | grep -v "no version information")
489         if [ -n "$LDD_RESULT" ];
490         then
491                 echo "$LDD_RESULT"
492                 LIB_ERROR="T"
493         fi
494 done
495
496 if test "T" = $LIB_ERROR;
497 then
498         echo ""
499         echo "!!! ERROR !!! - Missing library detected!"
500         echo "This system does not have the correct libs to run ${PGM_NAME}."
501         echo "Installation will not complete. Please use a compatible distro."
502         echo ""
503         read -p "Press ENTER to exit installer:" BLAH
504         exit 1
505 fi
506
507 ################################
508 # Setup derived variables
509 ################################
510 PGM_VERSION=$(echo ${BUNDLE_DIR} | cut -d- -f2)
511 PGM_BUILDTYPE=$(echo ${BUNDLE_DIR} | cut -d- -f3)
512
513 if [ -z ${PGM_BUILDTYPE} ];
514 then
515         PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}"
516         ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}"                    #no dash between name and version since dash seperates vendor from program
517         MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}.desktop"    #no dash between name and version since dash seperates vendor from program
518         DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}.desktop"
519 else
520         PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}-${PGM_BUILDTYPE}"
521         ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}"                   #no dash between name and version since dash seperates vendor from program
522         MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop"   #no dash between name and version since dash seperates vendor from program
523         DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop"
524 fi
525
526 PGM_EXEC_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/${PGM_EXEC_FILE}"
527 ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share/resources"
528 MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
529
530 ################################
531 # Install bundle and Menu/Link
532 ################################
533
534 # uninstall any older versions
535 UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}-*.uninstall.sh")
536 if [ ! -z "$UNINSTALLERS" ];
537 then
538         for i in $UNINSTALLERS; do
539                 echo ""
540                 echo "Found existing ${PGM_NAME} installation."
541                 
542                 ANSWER=$(VaildateYesNoQuestion "Do you want to run the uninstaller ${i} ?")
543
544                 if test "y" = $ANSWER;
545                 then
546                         echo ""
547                         echo "Running uninstaller $i"
548                         
549                         ${i}
550                         ${SUPER} rm -f ${i}
551                 fi
552         done
553 fi
554
555
556 # install 
557
558 echo ""
559 echo "Installing ${PGM_NAME} ${PGM_VERSION} in ${INSTALL_DEST_BASE}"
560 echo ""
561
562 # Copy the new version in the install directory
563 ${SUPER} mkdir ${INSTALL_DEST_BASE}/${PGM_FULL_NAME} 
564 ${SUPER} cp -Rf ${BUNDLE_DIR}/* ${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/
565
566 # write the desktop/menu file
567 echo "[Desktop Entry]" > /tmp/${MENU_FILE}
568 echo "Encoding=UTF-8" >> /tmp/${MENU_FILE}
569 echo "Version=1.0" >> /tmp/${MENU_FILE}
570 echo "Type=Application" >> /tmp/${MENU_FILE}
571 echo "Terminal=false" >> /tmp/${MENU_FILE}
572 echo "Exec=${PGM_EXEC_PATH}" >> /tmp/${MENU_FILE}
573 if [ -z ${PGM_BUILDTYPE} ];
574 then
575         echo "Name=${PGM_NAME}-${PGM_VERSION}" >> /tmp/${MENU_FILE}
576 else
577         echo "Name=${PGM_NAME}-${PGM_VERSION}-${PGM_BUILDTYPE}" >> /tmp/${MENU_FILE}
578 fi
579 echo "Icon=${ICON_NAME}" >> /tmp/${MENU_FILE}
580 echo "Comment=Digital Audio Workstation" >> /tmp/${MENU_FILE}
581 echo "Categories=AudioVideo;AudioEditing;Audio;Recorder;" >> /tmp/${MENU_FILE}
582
583 chmod ugo+rx /tmp/${MENU_FILE}
584 ${SUPER} mv /tmp/${MENU_FILE} ${MENU_FILE_PATH}/.
585
586 # install the Menu, Link, and Icon(s)
587 if [ "T" = ${HAS_XDG} ];
588 then
589         echo "Adding ${PGM_NAME} to the applications menu"
590         ${SUPER} xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME}-icon_16px.png ${ICON_NAME}
591         ${SUPER} xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME}-icon_22px.png ${ICON_NAME}
592         ${SUPER} xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME}-icon_32px.png ${ICON_NAME}
593         ${SUPER} xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME}-icon_48px.png ${ICON_NAME}
594         ${SUPER} xdg-icon-resource install --context apps --size 256 ${ICON_PATH}/${PGM_NAME}-icon_256px.png ${ICON_NAME}
595
596         if [ -e ${ICON_PATH}/${PGM_NAME}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ];
597         then
598                 ${SUPER} cp -f ${ICON_PATH}/${PGM_NAME}_icon.svg  /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
599         fi
600
601         ${SUPER} xdg-desktop-menu install ${MENU_FILE_PATH}/${MENU_FILE}
602         ${SUPER} xdg-desktop-menu forceupdate --mode system                     # Some systems need an extra kick
603         
604         echo ""
605         echo "Creating a desktop link for ${PGM_NAME} in ${USER_DESKTOP_DIR}"
606         cp ${MENU_FILE_PATH}/${MENU_FILE} ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
607         chmod ugo+rwx ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
608 else
609         echo ""
610         echo "Creating a desktop link for ${PGM_NAME} in ${USER_DESKTOP_DIR}"
611         cp ${MENU_FILE_PATH}/${MENU_FILE} ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
612         chmod ugo+rwx ${USER_DESKTOP_DIR}/${DESKTOP_LINK_FILE}
613 fi
614
615 echo ""
616 echo "Copying uninstall script to ${INSTALL_DEST_BASE}"
617 echo ""
618
619 ${SUPER} cp -f ${BUNDLE_DIR}/bin/*.uninstall.sh ${INSTALL_DEST_BASE}/.
620
621 # Create link to the program in user bin
622
623 echo ""
624 echo "Creating link ${PGM_NAME}${MAJOR_VERSION} in ${USER_BIN_DIR}"
625 echo ""
626
627 if [ -d "${USER_BIN_DIR}" ]; then
628         if [ -e "${USER_BIN_DIR}/${PGM_NAME}${MAJOR_VERSION}" ]; then
629                 ${SUPER} rm -f ${USER_BIN_DIR}/${PGM_NAME}${MAJOR_VERSION}
630         fi
631
632         cd "${USER_BIN_DIR}"
633         ${SUPER} ln -sf ${PGM_EXEC_PATH} ${PGM_NAME}${MAJOR_VERSION}
634         cd "${PKG_PATH}"
635         
636 else
637         echo "Can not create link because ${USER_BIN_DIR} does not exist"
638 fi
639
640 ###########################
641 # Check Jack and qjackctl
642 ###########################
643
644 echo ""
645 echo "Checking to see if Jack is installed"
646 echo ""
647
648 JACK_INSTALLED="f"
649
650 if which jackd > /dev/null; then
651         JACK_INSTALLED="t"
652         echo "Jack already present"
653 elif which jackdbus > /dev/null; then
654         echo ""
655         echo "jackdbus was found but not jackd. Jack version compatibility check cannot be performed."
656         echo ""
657         JACK_INSTALLED="i"
658 else
659         echo ""
660         echo "The program Jack is missing from this system. Jack is a required component of $PGM_NAME."
661         echo ""
662
663         ANSWER=$(VaildateYesNoQuestion "Install jack using system software repository?")
664
665         if test "y" = $ANSWER;
666         then
667                 echo "Attempting to install Jack"
668                 SystemInstall "jackd"
669                 
670                 if [ $? -ne 0 ];
671                 then
672                         echo ""
673                         read -p "Press ENTER to continue:" BLAH
674                 else
675                         JACK_INSTALLED="t"
676                 fi
677         fi
678 fi
679
680 # Check to see if Jack is new enough to operate correctly.
681
682 if [ "t" = ${JACK_INSTALLED} ];
683 then
684         JACK_VERSION_OK="f"
685         JACK_VER_STRING=$(jackd --version | grep -e "jackd.*protocol")
686         JACK_NAME=$(echo $JACK_VER_STRING | awk '{print $1}')
687         JACK_VERSION=$(echo $JACK_VER_STRING | awk '{print $3}')
688         JACK_VERSION_MAJOR=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $1}')
689         JACK_VERSION_MIDDLE=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $2}')
690         JACK_VERSION_MINOR=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $3}')
691
692         if [ "jackd" = ${JACK_NAME} ];
693         then
694                 if [ ${JACK_VERSION_MAJOR} -eq 0 ];
695                 then
696                         if [ ${JACK_VERSION_MIDDLE} -eq 121 ];
697                         then
698                                 if [ ${JACK_VERSION_MINOR} -ge 3 ];
699                                 then
700                                         JACK_VERSION_OK="t"
701                                 fi
702                         elif [ ${JACK_VERSION_MIDDLE} -gt 121 ];
703                         then
704                                 JACK_VERSION_OK="t"
705                         fi
706                 elif [ ${JACK_VERSION_MAJOR} -gt 0 ];
707                 then
708                         JACK_VERSION_OK="t"
709                 fi
710         elif [ "jackdmp" = ${JACK_NAME} ];
711         then
712                 if [ ${JACK_VERSION_MAJOR} -eq 1 ];
713                 then
714                         if [ ${JACK_VERSION_MIDDLE} -eq 9 ];
715                         then
716                                 if [ ${JACK_VERSION_MINOR} -ge 8 ];
717                                 then
718                                         JACK_VERSION_OK="t"
719                                 fi
720                         elif [ ${JACK_VERSION_MIDDLE} -gt 9 ];
721                         then
722                                 JACK_VERSION_OK="t"
723                         fi
724                 elif [ ${JACK_VERSION_MAJOR} -gt 1 ];
725                 then
726                         JACK_VERSION_OK="t"
727                 fi
728         fi
729
730         if [ "t" = ${JACK_VERSION_OK} ];
731         then
732                 echo ""
733                 echo "Jack Version Check OK (${JACK_VER_STRING})"
734                 echo ""
735         else
736                 echo ""
737                 echo "!!! WARNING !!! - The version of Jack on this system is too old!"
738                 echo "Using an old version of Jack is not recommended. Please update"
739                 echo "Jack for best results."
740                 echo ""
741                 echo "System Jack version:"
742                 echo "   ${JACK_VER_STRING}"
743                 echo ""
744                 echo "Recommended minimum versions:"
745                 echo "   Jack1 - 0.121.3"
746                 echo "   Jack2 - 1.9.8"
747                 echo ""
748                 read -p "Press ENTER to continue:" BLAH
749         fi
750 fi
751
752 if ! which qjackctl > /dev/null;
753 then
754         echo ""
755         echo "The program QjackCtl is missing from this system."
756         echo "QjackCtl is an extremely useful tool for any system that runs JACK applications like $PGM_NAME."
757         echo "We recommend that you install it."
758         echo ""
759
760         ANSWER=$(VaildateYesNoQuestion "Install QjackCtl using system software repository?")
761
762         if test "y" = $ANSWER;
763         then
764                 echo "Attempting to install QjackCtl"
765                 SystemInstall "qjackctl"
766
767                 if [ $? -ne 0 ];
768                 then
769                         echo ""
770                         read -p "Press ENTER to continue:" BLAH
771                 fi
772         fi
773 fi
774
775
776 ########################
777 # Run Sanity Check
778 ########################
779
780 USER_GROUP_ADJUSTED="f"
781
782 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -a > /dev/null";
783 then
784         echo ""
785         echo "System failed the quick sanity check... Looking for the cause"
786
787         if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -rt > /dev/null";
788         then
789                 echo ""
790                 echo "System does not allow realtime for the current user... Looking for a solution"            
791                 
792                 if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -hasaudiogroup > /dev/null";
793                 then
794                         if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -memberaudiogroup > /dev/null 2>&1";
795                         then
796                                 ## This is an odd case. We have an audio group and are a member.
797                                 echo ""
798                                 echo "!!! WARNING !!! - The current user can not execute realtime processes."
799                                 echo "This will adversely affect audio latency."
800                                 echo "This system has an audio group and the user is a member. If jack was"
801                                 echo "just installed, a simple log out/in may fix this."
802                                 echo ""
803                                 echo "For best results, please correct this on your system."
804                                 echo "(Hint: check /etc/security/limits.conf or /etc/security/limits.d/)" 
805                                 echo ""
806                                 read -p "Press ENTER to continue:" BLAH
807                         else
808                                 # Not a member of an audio group. Try to fix it.
809                                 
810                                 if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -hasgroup audio > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@audio.*rtprio" ";
811                                 then
812                                         # add user to audio group
813                                         echo ""
814                                         echo "Adding user ${USER_NAME} to the audio group."
815                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
816                                         echo ""
817                                         read -p "Press ENTER to continue:" BLAH
818
819                                         if ${SUPER} usermod -a -G audio ${USER_NAME};
820                                         then
821                                                 USER_GROUP_ADJUSTED="t"
822                                         else
823                                                 echo ""
824                                                 echo "!!! ERROR !!! - Not able to add user to the audio group (usermod failed)!"
825                                                 echo ""
826                                                 echo "Please add yourself to the audio group and re-login"
827                                                 echo ""
828                                                 read -p "Press ENTER to continue:" BLAH
829                                         fi
830
831                                 elif ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -hasgroup jackuser > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@jackuser.*rtprio" ";
832                                 then
833                                         # add user to jackuser group
834                                         echo ""
835                                         echo "Adding user ${USER_NAME} to the jackuser group."
836                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
837                                         echo ""
838                                         read -p "Press ENTER to continue:" BLAH
839
840                                         if ${SUPER} usermod -a -G jackuser ${USER_NAME};
841                                         then
842                                                 USER_GROUP_ADJUSTED="t"
843                                         else
844                                                 echo ""
845                                                 echo "!!! ERROR !!! - Not able to add user to the jackuser group."
846                                                 echo ""
847                                                 echo "Please add yourself to the audio group and re-login"
848                                                 echo ""
849                                                 read -p "Press ENTER to continue:" BLAH
850                                         fi
851                                         
852
853                                 fi
854                         fi
855                 else
856                         # No audio group found on this system!
857                         echo ""
858                         echo "!!! WARNING !!! - The system does not seem to have an audio group (audio or jackuser)."
859                         echo ""
860                         echo "We will not attempt to fix this. Please configure your system to allow"
861                         echo "non-root users to execute realtime tasks."
862                         echo ""
863                         read -p "Press ENTER to continue:" BLAH
864                 fi
865         fi
866
867         if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -freqscaling > /dev/null";
868         then
869                 echo ""
870                 echo "!!! WARNING !!! - Your system seems to use frequency scaling."
871                 echo "This can have a serious impact on audio latency."
872                 echo "For best results turn it off, e.g. by choosing the 'performance' governor."
873                 echo ""
874                 read -p "Press ENTER to continue:" BLAH
875         fi
876
877         if [ "f" = $USER_GROUP_ADJUSTED ];
878         then
879                 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -memlock > /dev/null";
880                 then
881                         echo ""
882                         echo "!!! WARNING !!! - You are not allowed to lock memory."
883                         echo ""
884                         echo "We will not attempt to fix this. Please configure your system to allow"
885                         echo "non-root users to execute lock memory."
886                         echo ""
887                         read -p "Press ENTER to continue:" BLAH
888                 fi
889         fi
890 fi
891
892
893 ########################
894 # Install Complete
895 ########################
896
897 echo ""
898 echo "Cleaning up"
899 rm -rf ${BUNDLE_DIR}/
900
901 echo ""
902 echo "!!! Install Complete !!!"
903
904 if [ "t" = $USER_GROUP_ADJUSTED ];
905 then
906         echo "You will need to logout and then login again for all changes to be complete"
907 fi
908
909 echo ""
910 read -p "Press ENTER to exit installer:" BLAH
911
912