Lua bind MonitorProcessor
[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 ! "${PKG_PATH}/.gcc-glibmm-abi-check" --fail --gcc5; 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 ! "${PKG_PATH}/.gcc-glibmm-abi-check" --gcc5; 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 ! "${PKG_PATH}/.gcc-glibmm-abi-check" --gcc4 ; 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."
661         echo ""
662         echo "Jack is a very useful utility to allow you to interconnect $PGM_NAME and other audio/MIDI applications."
663         echo "You can use $PGM_NAME without it, but you may find it useful to have around."
664         echo ""
665
666         ANSWER=$(VaildateYesNoQuestion "Install jack using system software repository?")
667
668         if test "y" = $ANSWER;
669         then
670                 echo "Attempting to install Jack"
671                 SystemInstall "jackd"
672                 
673                 if [ $? -ne 0 ];
674                 then
675                         echo ""
676                         read -p "Press ENTER to continue:" BLAH
677                 else
678                         JACK_INSTALLED="t"
679                 fi
680         fi
681 fi
682
683 # Check to see if Jack is new enough to operate correctly.
684
685 if [ "t" = ${JACK_INSTALLED} ];
686 then
687         JACK_VERSION_OK="f"
688         JACK_VER_STRING=$(jackd --version | grep -e "jackd.*protocol")
689         JACK_NAME=$(echo $JACK_VER_STRING | awk '{print $1}')
690         JACK_VERSION=$(echo $JACK_VER_STRING | awk '{print $3}')
691         JACK_VERSION_MAJOR=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $1}')
692         JACK_VERSION_MIDDLE=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $2}')
693         JACK_VERSION_MINOR=$(echo $JACK_VERSION | awk 'BEGIN{FS="."}{print $3}')
694
695         if [ "jackd" = ${JACK_NAME} ];
696         then
697                 if [ ${JACK_VERSION_MAJOR} -eq 0 ];
698                 then
699                         if [ ${JACK_VERSION_MIDDLE} -eq 121 ];
700                         then
701                                 if [ ${JACK_VERSION_MINOR} -ge 3 ];
702                                 then
703                                         JACK_VERSION_OK="t"
704                                 fi
705                         elif [ ${JACK_VERSION_MIDDLE} -gt 121 ];
706                         then
707                                 JACK_VERSION_OK="t"
708                         fi
709                 elif [ ${JACK_VERSION_MAJOR} -gt 0 ];
710                 then
711                         JACK_VERSION_OK="t"
712                 fi
713         elif [ "jackdmp" = ${JACK_NAME} ];
714         then
715                 if [ ${JACK_VERSION_MAJOR} -eq 1 ];
716                 then
717                         if [ ${JACK_VERSION_MIDDLE} -eq 9 ];
718                         then
719                                 if [ ${JACK_VERSION_MINOR} -ge 8 ];
720                                 then
721                                         JACK_VERSION_OK="t"
722                                 fi
723                         elif [ ${JACK_VERSION_MIDDLE} -gt 9 ];
724                         then
725                                 JACK_VERSION_OK="t"
726                         fi
727                 elif [ ${JACK_VERSION_MAJOR} -gt 1 ];
728                 then
729                         JACK_VERSION_OK="t"
730                 fi
731         fi
732
733         if [ "t" = ${JACK_VERSION_OK} ];
734         then
735                 echo ""
736                 echo "Jack Version Check OK (${JACK_VER_STRING})"
737                 echo ""
738         else
739                 echo ""
740                 echo "!!! WARNING !!! - The version of Jack on this system is too old!"
741                 echo "Using an old version of Jack is not recommended. Please update"
742                 echo "Jack for best results."
743                 echo ""
744                 echo "System Jack version:"
745                 echo "   ${JACK_VER_STRING}"
746                 echo ""
747                 echo "Recommended minimum versions:"
748                 echo "   Jack1 - 0.121.3"
749                 echo "   Jack2 - 1.9.8"
750                 echo ""
751                 read -p "Press ENTER to continue:" BLAH
752         fi
753 fi
754
755 if ! which qjackctl > /dev/null;
756 then
757         echo ""
758         echo "The program QjackCtl is missing from this system."
759         echo "QjackCtl is an extremely useful tool for any system that runs JACK applications like $PGM_NAME."
760         echo "We recommend that you install it."
761         echo ""
762
763         ANSWER=$(VaildateYesNoQuestion "Install QjackCtl using system software repository?")
764
765         if test "y" = $ANSWER;
766         then
767                 echo "Attempting to install QjackCtl"
768                 SystemInstall "qjackctl"
769
770                 if [ $? -ne 0 ];
771                 then
772                         echo ""
773                         read -p "Press ENTER to continue:" BLAH
774                 fi
775         fi
776 fi
777
778
779 ########################
780 # Run Sanity Check
781 ########################
782
783 USER_GROUP_ADJUSTED="f"
784
785 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -a > /dev/null";
786 then
787         echo ""
788         echo "System failed the quick sanity check... Looking for the cause"
789
790         if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -rt > /dev/null";
791         then
792                 echo ""
793                 echo "System does not allow realtime for the current user... Looking for a solution"            
794                 
795                 if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -hasaudiogroup > /dev/null";
796                 then
797                         if ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -memberaudiogroup > /dev/null 2>&1";
798                         then
799                                 ## This is an odd case. We have an audio group and are a member.
800                                 echo ""
801                                 echo "!!! WARNING !!! - The current user can not execute realtime processes."
802                                 echo "This will adversely affect audio latency."
803                                 echo "This system has an audio group and the user is a member. If jack was"
804                                 echo "just installed, a simple log out/in may fix this."
805                                 echo ""
806                                 echo "For best results, please correct this on your system."
807                                 echo "(Hint: check /etc/security/limits.conf or /etc/security/limits.d/)" 
808                                 echo ""
809                                 read -p "Press ENTER to continue:" BLAH
810                         else
811                                 # Not a member of an audio group. Try to fix it.
812                                 
813                                 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" ";
814                                 then
815                                         # add user to audio group
816                                         echo ""
817                                         echo "Adding user ${USER_NAME} to the audio group."
818                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
819                                         echo ""
820                                         read -p "Press ENTER to continue:" BLAH
821
822                                         if ${SUPER} usermod -a -G audio ${USER_NAME};
823                                         then
824                                                 USER_GROUP_ADJUSTED="t"
825                                         else
826                                                 echo ""
827                                                 echo "!!! ERROR !!! - Not able to add user to the audio group (usermod failed)!"
828                                                 echo ""
829                                                 echo "Please add yourself to the audio group and re-login"
830                                                 echo ""
831                                                 read -p "Press ENTER to continue:" BLAH
832                                         fi
833
834                                 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" ";
835                                 then
836                                         # add user to jackuser group
837                                         echo ""
838                                         echo "Adding user ${USER_NAME} to the jackuser group."
839                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
840                                         echo ""
841                                         read -p "Press ENTER to continue:" BLAH
842
843                                         if ${SUPER} usermod -a -G jackuser ${USER_NAME};
844                                         then
845                                                 USER_GROUP_ADJUSTED="t"
846                                         else
847                                                 echo ""
848                                                 echo "!!! ERROR !!! - Not able to add user to the jackuser group."
849                                                 echo ""
850                                                 echo "Please add yourself to the audio group and re-login"
851                                                 echo ""
852                                                 read -p "Press ENTER to continue:" BLAH
853                                         fi
854                                         
855
856                                 fi
857                         fi
858                 else
859                         # No audio group found on this system!
860                         echo ""
861                         echo "!!! WARNING !!! - The system does not seem to have an audio group (audio or jackuser)."
862                         echo ""
863                         echo "We will not attempt to fix this. Please configure your system to allow"
864                         echo "non-root users to execute realtime tasks."
865                         echo ""
866                         read -p "Press ENTER to continue:" BLAH
867                 fi
868         fi
869
870         if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -freqscaling > /dev/null";
871         then
872                 echo ""
873                 echo "!!! WARNING !!! - Your system seems to use frequency scaling."
874                 echo "This can have a serious impact on audio latency."
875                 echo "For best results turn it off, e.g. by choosing the 'performance' governor."
876                 echo ""
877                 read -p "Press ENTER to continue:" BLAH
878         fi
879
880         if [ "f" = $USER_GROUP_ADJUSTED ];
881         then
882                 if ! ${NORM_USER} "${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/sanityCheck -memlock > /dev/null";
883                 then
884                         echo ""
885                         echo "!!! WARNING !!! - You are not allowed to lock memory."
886                         echo ""
887                         echo "We will not attempt to fix this. Please configure your system to allow"
888                         echo "non-root users to execute lock memory."
889                         echo ""
890                         read -p "Press ENTER to continue:" BLAH
891                 fi
892         fi
893 fi
894
895
896 ########################
897 # Install Complete
898 ########################
899
900 echo ""
901 echo "Cleaning up"
902 rm -rf ${BUNDLE_DIR}/
903
904 echo ""
905 echo "!!! Install Complete !!!"
906
907 if [ "t" = $USER_GROUP_ADJUSTED ];
908 then
909         echo "You will need to logout and then login again for all changes to be complete"
910 fi
911
912 echo ""
913 read -p "Press ENTER to exit installer:" BLAH
914
915