2ea16250112b78527e373b4b104cfb20383de655
[ardour.git] / tools / linux_packaging / stage2.run
1 #!/bin/sh
2
3 ####################################
4 #
5 #       stage2.run
6 #       Ardour/Mixbus bundle installer
7 #       Todd Naugle
8 #
9 ###################################
10
11
12
13 PGM_NAME="Ardour"
14 PGM_VENDOR="Ardour"
15 PGM_EXEC_FILE="ardour3"
16
17 INSTALL_DEST_BASE="/opt"
18
19 PGM_NAME_LOWER=$(echo $PGM_NAME | tr '[:upper:]' '[:lower:]')
20
21 #### Global Variables ####
22 HAS_XDG="T"
23
24 ########################
25 # Function Definitions
26 ########################
27
28 VaildateYesNoQuestion ()
29 {
30         # $1 = Question Text
31         
32         local INPUT_OK="n"
33         local USER_INPUT=""
34
35         until test "y" = $INPUT_OK;
36         do
37                 echo ""
38                 read -p "$1 [y/n]: " USER_INPUT
39                 echo ""
40
41                 if [ ! -z $USER_INPUT ]; 
42                 then            
43                         if [ "Y" = $USER_INPUT -o "y" = $USER_INPUT -o "n" = $USER_INPUT -o "N" = $USER_INPUT ];
44                         then
45                                 INPUT_OK="y"
46                         fi
47                 fi
48         done
49         
50         echo $USER_INPUT | tr '[:upper:]' '[:lower:]'
51         
52 }
53
54 SystemInstall ()
55 {
56
57         # Determine which software install app to use and then install requested package
58         # $1 = Package Name
59
60         if which yum > /dev/null;
61         then
62                 sudo yum -y install $1
63                 rtrn=$?
64
65                 if [ $rtrn -ne 0 ];
66                 then
67                         echo ""
68                         echo "!!! ERROR !!! yum install failed for an unknown reason."
69                         echo "Please install package $1 after this installer completes."
70                         echo ""
71                 fi
72
73         elif which apt-get > /dev/null;
74         then
75                 sudo apt-get -y install $1
76                 rtrn=$?
77
78                 if [ $rtrn -ne 0 ];
79                 then
80                         echo ""
81                         echo "!!! ERROR !!! apt-get install failed for an unknown reason."
82                         echo "Please install package $1 after this installer completes."
83                         echo ""
84                 fi
85
86         else
87                 echo ""
88                 echo "!!! ERROR !!! - Not able to detect which software install tool to use (yum or apt-get)."
89                 echo "Please install package $1 using the system software install tool."
90                 echo ""
91                 rtrn=1
92         fi
93         
94         return $rtrn
95
96 }
97
98 ########################################################################
99 #                                 Main
100 ########################################################################
101
102 # If you double click a script, some systems don't get the PWD correct.
103 # Force it to be correct
104 PKG_PATH=$(dirname $(readlink -f $0))
105 cd ${PKG_PATH}
106
107 echo ""
108 echo "Welcome to the ${PGM_NAME} installer"
109 echo ""
110
111 ##############
112 # Check sudo
113 ##############
114
115 if ! sudo date;
116 then
117         echo ""
118         echo "!!! ERROR !!!"
119         echo ""
120         echo "Either you don't know the root password or the user is not allowed to sudo"
121         echo "Please correct this and run the installer again (hint: use visudo to edit sudoers file)"
122         echo ""
123         read -p "Press ENTER to exit installer:" BLAH
124         exit 1
125 fi
126
127 ############################
128 # Determine processor type
129 ############################
130
131 case `uname -m` in
132         i[3456789]86|x86|i86pc)
133                 echo "Architecture is x86"
134                 ARCH='x86'
135                 ;;
136         x86_64|amd64|AMD64)
137                 echo "Architecture is x86_64"
138                 ARCH='x86_64'
139                 ;;
140         *)
141                 echo ""
142                 echo "!!! ERROR !!! - Unknown architecture `uname -m`"
143                 echo ""
144                 read -p "Press ENTER to exit installer:" BLAH
145                 exit 1
146                 ;;
147 esac
148
149 # untar the correct bundle for us to install
150 echo "Unpacking bundle for $ARCH"
151 tar -xjf ${PGM_NAME}_${ARCH}-*.tar.bz2
152 BUNDLE_DIR=$(basename `find -maxdepth 1 -type d -name "${PGM_NAME}_${ARCH}-*"`)
153
154
155 #######################
156 # Check for xdg utils
157 #######################
158
159 XDG_MENU_VER=$(xdg-desktop-menu --version 2> /dev/null)
160 if [ -z "$XDG_MENU_VER" ];
161 then
162         echo "System does not have xdg-desktop-menu installed"
163         HAS_XDG="F"
164 fi
165
166 XDG_ICON_VER=$(xdg-icon-resource --version 2> /dev/null)
167 if [ -z "$XDG_ICON_VER" ];
168 then
169         echo "System does not have xdg-icon-resource installed"
170         HAS_XDG="F"
171 fi
172
173 #################################################
174 # Check if system libs are OK (libc, etc)
175 #################################################
176
177 echo ""
178 echo "Checking system libs to see if they are compatible with ${PGM_NAME}."
179 echo ""
180
181 LIB_ERROR="F"
182 LD_PATH=`pwd`/${BUNDLE_DIR}/lib
183
184 # check the main App
185 LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd ${BUNDLE_DIR}/bin/${PGM_NAME_LOWER}-* 2>&1 > /dev/null)
186
187 if [ -n "$LDD_RESULT" ];
188 then
189         echo "$LDD_RESULT"
190         LIB_ERROR="T"
191 fi
192         
193 # check the libs
194 LIB_FILES=$(find ${BUNDLE_DIR}/lib -name "*.so")
195
196 for path in $LIB_FILES
197 do
198         LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd $path 2>&1 > /dev/null)
199         if [ -n "$LDD_RESULT" ];
200         then
201                 echo "$LDD_RESULT"
202                 LIB_ERROR="T"
203         fi
204 done
205
206 if test "T" = $LIB_ERROR;
207 then
208         echo ""
209         echo "!!! ERROR !!! - Missing library detected!"
210         echo "This system does not have the correct libs to run ${PGM_NAME}."
211         echo "Installation will not complete. Please use a compatible distro."
212         echo ""
213         read -p "Press ENTER to exit installer:" BLAH
214         exit 1
215 fi
216
217 ################################
218 # Setup derived variables
219 ################################
220 PGM_VERSION=$(echo ${BUNDLE_DIR} | awk 'BEGIN { FS = "-" } ; { print $2 }' | awk 'BEGIN { FS = "_"} ; { print $1}')
221 PGM_BUILD=$(echo ${BUNDLE_DIR} | awk 'BEGIN { FS = "-" } ; { print $2 }' | awk 'BEGIN { FS = "_"} ; { print $2}')
222 PGM_BUILDTYPE=$(echo ${BUNDLE_DIR} | awk 'BEGIN { FS = "-" } ; { print $3 }')
223
224 if [ -z ${PGM_BUILDTYPE} ];
225 then
226         PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}_${PGM_BUILD}"
227         ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}"                    #no dash between name and version since dash seperates vendor from program
228         MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}.desktop"    #no dash between name and version since dash seperates vendor from program
229         DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}.desktop"
230 else
231         PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}_${PGM_BUILD}-${PGM_BUILDTYPE}"
232         ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}"                   #no dash between name and version since dash seperates vendor from program
233         MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop"   #no dash between name and version since dash seperates vendor from program
234         DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop"
235 fi
236
237 PGM_EXEC_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/${PGM_EXEC_FILE}"
238 ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/etc/icons"
239 MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
240
241         
242
243 ################################
244 # Install bundle and Menu/Link
245 ################################
246
247 if [ ! -d ${INSTALL_DEST_BASE} ];
248 then
249         echo ""
250         echo "!!! ERROR !!! - Installation location ${INSTALL_DEST_BASE} does not exist!"
251         echo "Installation will not complete."
252         echo ""
253         read -p "Press ENTER to exit installer:" BLAH
254         exit 1
255 fi
256
257 # uninstall any older versions
258 UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}*.uninstall.sh")
259 if [ ! -z "$UNINSTALLERS" ];
260 then
261         for i in $UNINSTALLERS; do
262                 echo ""
263                 echo "Found existing ${PGM_NAME} installation."
264                 
265                 ANSWER=$(VaildateYesNoQuestion "Do you want to run the uninstaller ${i} ?")
266
267                 if test "y" = $ANSWER;
268                 then
269                         echo ""
270                         echo "Running uninstaller $i"
271                         
272                         ${i}
273                         sudo rm -f ${i}
274                 fi
275         done
276 fi
277
278
279 # install 
280
281 echo ""
282 echo "Installing ${PGM_NAME} ${PGM_VERSION} built from ${PGM_BUILD} in ${INSTALL_DEST_BASE}"
283 echo ""
284
285 # Copy the new version in the install directory
286 sudo mkdir ${INSTALL_DEST_BASE}/${PGM_FULL_NAME} 
287 sudo cp -Rf     ${BUNDLE_DIR}/* ${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/
288
289 # write the desktop/menu file
290 echo "[Desktop Entry]" > /tmp/${MENU_FILE}
291 echo "Encoding=UTF-8" >> /tmp/${MENU_FILE}
292 echo "Version=1.0" >> /tmp/${MENU_FILE}
293 echo "Type=Application" >> /tmp/${MENU_FILE}
294 echo "Terminal=false" >> /tmp/${MENU_FILE}
295 echo "Exec=${PGM_EXEC_PATH}" >> /tmp/${MENU_FILE}
296 if [ -z ${PGM_BUILDTYPE} ];
297 then
298         echo "Name=${PGM_NAME}-${PGM_VERSION}" >> /tmp/${MENU_FILE}
299 else
300         echo "Name=${PGM_NAME}-${PGM_VERSION}-${PGM_BUILDTYPE}" >> /tmp/${MENU_FILE}
301 fi
302 echo "Icon=${ICON_NAME}" >> /tmp/${MENU_FILE}
303 echo "Comment=Digital Audio Workstation" >> /tmp/${MENU_FILE}
304 echo "Categories=AudioVideo;AudioEditing;Audio;Recorder;" >> /tmp/${MENU_FILE}
305
306 chmod ugo+rx /tmp/${MENU_FILE}
307 sudo mv /tmp/${MENU_FILE} ${MENU_FILE_PATH}/.
308
309 # install the Menu, Link, and Icon(s)
310 if [ "T" = ${HAS_XDG} ];
311 then
312         echo "Adding ${PGM_NAME} to the applications menu"
313         sudo xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_16px.png ${ICON_NAME}
314         sudo xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_22px.png ${ICON_NAME}
315         sudo xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_32px.png ${ICON_NAME}
316         sudo xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_48px.png ${ICON_NAME}
317
318         if [ -e ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ]; 
319         then
320                 sudo cp -f ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg  /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
321         fi
322
323         sudo xdg-desktop-menu install ${MENU_FILE_PATH}/${MENU_FILE}
324         sudo xdg-desktop-menu forceupdate --mode system                 # Some systems need an extra kick
325         
326         echo ""
327         echo "Creating a desktop link for ${PGM_NAME}"
328         cp ${MENU_FILE_PATH}/${MENU_FILE} ~/Desktop/${DESKTOP_LINK_FILE}
329         chmod ugo+rx ~/Desktop/${DESKTOP_LINK_FILE}
330 else
331         echo ""
332         echo "Creating a desktop link for ${PGM_NAME}"
333         cp ${MENU_FILE_PATH}/${MENU_FILE} ~/Desktop/${DESKTOP_LINK_FILE}
334         chmod ugo+rx ~/Desktop/${DESKTOP_LINK_FILE}
335 fi
336
337 echo ""
338 echo "Copying uninstall script to ${INSTALL_DEST_BASE}"
339 echo ""
340
341 sudo cp -f ${BUNDLE_DIR}/bin/*.uninstall.sh ${INSTALL_DEST_BASE}/.
342
343 ###########################
344 # Check Jack and qjackctl
345 ###########################
346
347 echo ""
348 echo "Checking to see if Jack is installed"
349 echo ""
350
351 if ! which jackd > /dev/null;
352 then
353         echo ""
354         echo "The program Jack is missing from this system. Jack is a required component of $PGM_NAME."
355         echo ""
356
357         ANSWER=$(VaildateYesNoQuestion "Install jack using system software repository?")
358
359         if test "y" = $ANSWER;
360         then
361                 echo "Attempting to install Jack"
362                 SystemInstall "jackd"
363
364                 if [ $? -ne 0 ];
365                 then
366                         echo ""
367                         read -p "Press ENTER to continue:" BLAH
368                 fi
369         fi
370 else
371         echo "Jack OK"
372 fi
373
374
375 if ! which qjackctl > /dev/null;
376 then
377         echo ""
378         echo "The program QjackCtl is missing from this system."
379         echo "QjackCtl is an extremely useful tool for any system that runs JACK applications like $PGM_NAME."
380         echo "We recommend that you install it."
381         echo ""
382
383         ANSWER=$(VaildateYesNoQuestion "Install QjackCtl using system software repository?")
384
385         if test "y" = $ANSWER;
386         then
387                 echo "Attempting to install QjackCtl"
388                 SystemInstall "qjackctl"
389
390                 if [ $? -ne 0 ];
391                 then
392                         echo ""
393                         read -p "Press ENTER to continue:" BLAH
394                 fi
395         fi
396 fi
397
398
399 ########################
400 # Run Sanity Check
401 ########################
402
403 USER_GROUP_ADJUSTED="f"
404
405 if ! ./${BUNDLE_DIR}/bin/sanityCheck -a > /dev/null;
406 then
407         echo ""
408         echo "System failed the quick sanity check... Looking for the cause"
409
410         if ! ./${BUNDLE_DIR}/bin/sanityCheck -rt > /dev/null;
411         then
412                 echo ""
413                 echo "System does not allow realtime for the current user... Looking for a solution"            
414                 
415                 if ./${BUNDLE_DIR}/bin/sanityCheck -hasaudiogroup > /dev/null;
416                 then
417                         if ./${BUNDLE_DIR}/bin/sanityCheck -memberaudiogroup > /dev/null 2>&1;
418                         then
419                                 ## This is an odd case. We have an audio group and are a member.
420                                 echo ""
421                                 echo "!!! WARNING !!! - The current user can not execute realtime processes."
422                                 echo "This will adversely affect audio latency."
423                                 echo "This system has an audio group and the user is a member. If jack was"
424                                 echo "just installed, a simple log out/in may fix this."
425                                 echo ""
426                                 echo "For best results, please correct this on your system."
427                                 echo "(Hint: check /etc/security/limits.conf or /etc/security/limits.d/)" 
428                                 echo ""
429                                 read -p "Press ENTER to continue:" BLAH
430                         else
431                                 # Not a member of an audio group. Try to fix it.
432                                 
433                                 if ./${BUNDLE_DIR}/bin/sanityCheck -hasgroup audio > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@audio.*rtprio";
434                                 then
435                                         # add user to audio group
436                                         echo ""
437                                         echo "Adding user `whoami` to the audio group."
438                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
439                                         echo ""
440                                         read -p "Press ENTER to continue:" BLAH
441
442                                         user=`whoami`
443                                         if sudo usermod -a -G audio $user;
444                                         then
445                                                 USER_GROUP_ADJUSTED="t"
446                                         else
447                                                 echo ""
448                                                 echo "!!! ERROR !!! - Not able to add user to the audio group (usermod failed)!"
449                                                 echo ""
450                                                 echo "Please add yourself to the audio group and re-login"
451                                                 echo ""
452                                                 read -p "Press ENTER to continue:" BLAH
453                                         fi
454
455                                 elif ./${BUNDLE_DIR}/bin/sanityCheck -hasgroup jackuser > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@jackuser.*rtprio";
456                                 then
457                                         # add user to jackuser group
458                                         echo ""
459                                         echo "Adding user `whoami` to the jackuser group."
460                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
461                                         echo ""
462                                         read -p "Press ENTER to continue:" BLAH
463
464                                         user=`whoami`
465                                         if sudo usermod -a -G jackuser $user;
466                                         then
467                                                 USER_GROUP_ADJUSTED="t"
468                                         else
469                                                 echo ""
470                                                 echo "!!! ERROR !!! - Not able to add user to the jackuser group."
471                                                 echo ""
472                                                 echo "Please add yourself to the audio group and re-login"
473                                                 echo ""
474                                                 read -p "Press ENTER to continue:" BLAH
475                                         fi
476                                         
477
478                                 fi
479                         fi
480                 else
481                         # No audio group found on this system!
482                         echo ""
483                         echo "!!! WARNING !!! - The system does not seem to have an audio group (audio or jackuser)."
484                         echo ""
485                         echo "We will not attempt to fix this. Please configure your system to allow"
486                         echo "non-root users to execute realtime tasks."
487                         echo ""
488                         read -p "Press ENTER to continue:" BLAH
489                 fi
490         fi
491
492         if ! ./${BUNDLE_DIR}/bin/sanityCheck -freqscaling > /dev/null;
493         then
494                 echo ""
495                 echo "!!! WARNING !!! - Your system seems to use frequency scaling."
496                 echo "This can have a serious impact on audio latency. You have two choices:"
497                 echo "(1) turn it off, e.g. by chosing the 'performance' governor."
498                 echo "(2) Use the HPET clocksource by passing \"-c h\" to JACK"
499                 echo "(this second option only works on relatively recent computers)"
500                 echo ""
501                 read -p "Press ENTER to continue:" BLAH
502         fi
503
504         if [ "f" = $USER_GROUP_ADJUSTED ];
505         then
506                 if ! ./${BUNDLE_DIR}/bin/sanityCheck -memlock > /dev/null;
507                 then
508                         echo ""
509                         echo "!!! WARNING !!! - You are not allowed to lock memory."
510                         echo ""
511                         echo "We will not attempt to fix this. Please configure your system to allow"
512                         echo "non-root users to execute lock memory."
513                         echo ""
514                         read -p "Press ENTER to continue:" BLAH
515                 fi
516         fi
517 fi
518
519
520 ########################
521 # Install Complete
522 ########################
523
524 echo ""
525 echo "Cleaning up"
526 rm -rf ${BUNDLE_DIR}/
527
528 echo ""
529 echo "!!! Install Complete !!!"
530
531 if [ "t" = $USER_GROUP_ADJUSTED ];
532 then
533         echo "You will need to logout and then login again for all changes to be complete"
534 fi
535
536 echo ""
537 read -p "Press ENTER to exit installer:" BLAH
538
539