add linux packaging script(s) from 2.0-ongoing
[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="ardour2"
16
17 INSTALL_DEST_BASE="/usr/local/bin"
18
19 #### Derived Variables ####
20 PGM_NAME_LOWER=$(echo $PGM_NAME | tr '[:upper:]' '[:lower:]')
21 ICON_NAME="${PGM_VENDOR}-${PGM_NAME}"
22 MENU_FILE="${PGM_VENDOR}-${PGM_NAME}.desktop"
23 DESKTOP_LINK_FILE="${PGM_NAME}.desktop"
24
25 PGM_EXEC_PATH="${INSTALL_DEST_BASE}/${PGM_NAME}/bin/${PGM_EXEC_FILE}"
26 ICON_PATH="${INSTALL_DEST_BASE}/${PGM_NAME}/etc/icons"
27 MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_NAME}/${MENU_FILE}"
28
29 #### Global Variables ####
30 HAS_XDG="T"
31
32 ########################
33 # Function Definitions
34 ########################
35
36 VaildateYesNoQuestion ()
37 {
38         # $1 = Question Text
39         
40         local INPUT_OK="n"
41         local USER_INPUT=""
42
43         until test "y" = $INPUT_OK;
44         do
45                 echo ""
46                 read -p "$1 [y/n]: " USER_INPUT
47                 echo ""
48
49                 if [ ! -z $USER_INPUT ]; 
50                 then            
51                         if [ "Y" = $USER_INPUT -o "y" = $USER_INPUT -o "n" = $USER_INPUT -o "N" = $USER_INPUT ];
52                         then
53                                 INPUT_OK="y"
54                         fi
55                 fi
56         done
57         
58         echo $USER_INPUT | tr '[:upper:]' '[:lower:]'
59         
60 }
61
62 SystemInstall ()
63 {
64
65         # Determine which software install app to use and then install requested package
66         # $1 = Package Name
67
68         if which yum > /dev/null;
69         then
70                 sudo yum -y install $1
71                 rtrn=$?
72
73                 if [ $rtrn -ne 0 ];
74                 then
75                         echo ""
76                         echo "!!! ERROR !!! yum install failed for an unknown reason."
77                         echo "Please install package $1 after this installer completes."
78                         echo ""
79                 fi
80
81         elif which apt-get > /dev/null;
82         then
83                 sudo apt-get -y install $1
84                 rtrn=$?
85
86                 if [ $rtrn -ne 0 ];
87                 then
88                         echo ""
89                         echo "!!! ERROR !!! apt-get install failed for an unknown reason."
90                         echo "Please install package $1 after this installer completes."
91                         echo ""
92                 fi
93
94         else
95                 echo ""
96                 echo "!!! ERROR !!! - Not able to detect which software install tool to use (yum or apt-get)."
97                 echo "Please install package $1 using the system software install tool."
98                 echo ""
99                 rtrn=1
100         fi
101         
102         return $rtrn
103
104 }
105
106 ########################################################################
107 #                                 Main
108 ########################################################################
109
110 ##############
111 # Check sudo
112 ##############
113
114 if ! sudo date;
115 then
116         echo ""
117         echo "!!! ERROR !!!"
118         echo ""
119         echo "Either you don't know the root password or the user is not allowed to sudo"
120         echo "Please correct this and run the installer again (hint: use visudo to edit sudoers file)"
121         echo ""
122         read -p "Press ENTER to exit installer:" BLAH
123         exit 1
124 fi
125
126 ############################
127 # Determine processor type
128 ############################
129
130 case `uname -m` in
131         i[3456789]86|x86|i86pc)
132                 echo "Architecture is x86"
133                 ARCH='x86'
134                 BUNDLE_DIR=${PGM_NAME}_${ARCH}-*
135                 ;;
136         x86_64|amd64|AMD64)
137                 echo "Architecture is x86_64"
138                 ARCH='x86_64'
139                 BUNDLE_DIR=${PGM_NAME}_${ARCH}-*
140                 ;;
141         *)
142                 echo ""
143                 echo "!!! ERROR !!! - Unknown architecture `uname -m`"
144                 echo ""
145                 read -p "Press ENTER to exit installer:" BLAH
146                 exit 1
147                 ;;
148 esac
149
150 # untar the correct bundle for us to install
151 echo "Unpacking bundle for $ARCH"
152 tar -xjf ${BUNDLE_DIR}.tar.bz2
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
219 ################################
220 # Install bundle and Menu/Link
221 ################################
222
223 # uninstall any older versions
224 if [ -d ${INSTALL_DEST_BASE}/${PGM_NAME} ];
225 then
226         echo ""
227         echo "Removing existing ${PGM_NAME} installation from ${INSTALL_DEST_BASE}"
228         echo ""
229
230         if [ "T" = ${HAS_XDG} ];
231         then
232                 sudo xdg-desktop-menu uninstall ${MENU_FILE_PATH}
233                 sudo xdg-icon-resource uninstall --size 16 ${ICON_NAME}
234                 sudo xdg-icon-resource uninstall --size 22 ${ICON_NAME}
235                 sudo xdg-icon-resource uninstall --size 32 ${ICON_NAME}
236                 sudo xdg-icon-resource uninstall --size 48 ${ICON_NAME}
237
238                 if [ -e /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg ]; 
239                 then
240                         sudo rm -f /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
241                 fi
242         fi
243
244         if [ -e ~/Desktop/${DESKTOP_LINK_FILE} ];
245         then
246                 sudo rm -f ~/Desktop/${DESKTOP_LINK_FILE}
247         fi
248
249         # delete the old package
250         sudo rm -rf ${INSTALL_DEST_BASE}/${PGM_NAME}
251 fi
252
253 echo ""
254 echo "Installing ${PGM_NAME} in ${INSTALL_DEST_BASE}"
255 echo ""
256
257 # Copy the new version in the install directory
258 sudo mkdir ${INSTALL_DEST_BASE}/${PGM_NAME} 
259 sudo cp -Rf     ${BUNDLE_DIR}/* ${INSTALL_DEST_BASE}/${PGM_NAME}
260
261 # write the desktop/menu file
262 echo "[Desktop Entry]" > /tmp/${MENU_FILE}
263 echo "Encoding=UTF-8" >> /tmp/${MENU_FILE}
264 echo "Version=1.0" >> /tmp/${MENU_FILE}
265 echo "Type=Application" >> /tmp/${MENU_FILE}
266 echo "Terminal=false" >> /tmp/${MENU_FILE}
267 echo "Exec=${PGM_EXEC_PATH}" >> /tmp/${MENU_FILE}
268 echo "Name=${PGM_NAME}" >> /tmp/${MENU_FILE}
269 echo "Icon=${ICON_NAME}" >> /tmp/${MENU_FILE}
270 echo "Comment=Digital Audio Workstation" >> /tmp/${MENU_FILE}
271 echo "Categories=AudioVideo;Audio;Recorder;" >> /tmp/${MENU_FILE}
272
273 chmod ugo+rx /tmp/${MENU_FILE}
274 sudo mv /tmp/${MENU_FILE} ${MENU_FILE_PATH}
275
276 # install the Menu, Link, and Icon(s)
277 if [ "T" = ${HAS_XDG} ];
278 then
279         echo "Adding ${PGM_NAME} to the applications menu"
280         sudo xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_16px.png ${ICON_NAME}
281         sudo xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_22px.png ${ICON_NAME}
282         sudo xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_32px.png ${ICON_NAME}
283         sudo xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_48px.png ${ICON_NAME}
284
285         if [ -e ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ]; 
286         then
287                 sudo cp -f ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg  /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
288         fi
289
290         sudo xdg-desktop-menu install ${MENU_FILE_PATH}
291
292         echo "Creating a desktop link for ${PGM_NAME}"
293         cp ${MENU_FILE_PATH} ~/Desktop/${DESKTOP_LINK_FILE}
294         chmod ugo+rx ~/Desktop/${DESKTOP_LINK_FILE}
295 else
296         echo "Creating a desktop link for ${PGM_NAME}"
297         cp ${MENU_FILE_PATH} ~/Desktop/${DESKTOP_LINK_FILE}
298         chmod ugo+rx ~/Desktop/${DESKTOP_LINK_FILE}
299 fi
300
301
302 ###########################
303 # Check Jack and qjackctl
304 ###########################
305
306 echo ""
307 echo "Checking to see if Jack is installed"
308
309 if ! which jackd > /dev/null;
310 then
311         echo ""
312         echo "The program Jack is missing from this system. Jack is a required component of $PGM_NAME."
313         echo ""
314
315         ANSWER=$(VaildateYesNoQuestion "Install jack using system software repository?")
316
317         if test "y" = $ANSWER;
318         then
319                 echo "Attempting to install Jack"
320                 SystemInstall "jackd"
321
322                 if [ $? -ne 0 ];
323                 then
324                         echo ""
325                         read -p "Press ENTER to continue:" BLAH
326                 fi
327         fi
328 else
329         echo "Jack OK"
330 fi
331
332
333 if ! which qjackctl > /dev/null;
334 then
335         echo ""
336         echo "The program QjackCtl is missing from this system. QjackCtl is an OPTIONAL component of $PGM_NAME."
337         echo ""
338
339         ANSWER=$(VaildateYesNoQuestion "Install QjackCtl using system software repository?")
340
341         if test "y" = $ANSWER;
342         then
343                 echo "Attempting to install QjackCtl"
344                 SystemInstall "qjackctl"
345
346                 if [ $? -ne 0 ];
347                 then
348                         echo ""
349                         read -p "Press ENTER to continue:" BLAH
350                 fi
351         fi
352 fi
353
354
355 ########################
356 # Run Sanity Check
357 ########################
358
359 USER_GROUP_ADJUSTED="f"
360
361 if ! ./${BUNDLE_DIR}/sanityCheck -a > /dev/null;
362 then
363         echo ""
364         echo "System failed the quick sanity check... Looking for the cause"
365
366         if ! ./${BUNDLE_DIR}/sanityCheck -rt > /dev/null;
367         then
368                 echo ""
369                 echo "System does not allow realtime for the current user... Looking for a solution"            
370                 
371                 if ./${BUNDLE_DIR}/sanityCheck -hasaudiogroup > /dev/null;
372                 then
373                         if ./${BUNDLE_DIR}/sanityCheck -memberaudiogroup > /dev/null 2>&1;
374                         then
375                                 ## This is an odd case. We have an audio group and are a member.
376                                 echo ""
377                                 echo "!!! WARNING !!! - The current user can not execute realtime processes."
378                                 echo "This will adversely affect audio latency."
379                                 echo "This system has an audio group and the user is a member. If jack was"
380                                 echo "just installed, a simple log out/in may fix this."
381                                 echo ""
382                                 echo "For best results, please correct this on your system."
383                                 echo "(Hint: check /etc/security/limits.conf or /etc/security/limits.d/)" 
384                                 echo ""
385                                 read -p "Press ENTER to continue:" BLAH
386                         else
387                                 # Not a member of an audio group. Try to fix it.
388                                 
389                                 if ./${BUNDLE_DIR}/sanityCheck -hasgroup audio > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@audio.*rtprio";
390                                 then
391                                         # add user to audio group
392                                         echo ""
393                                         echo "Adding user `whoami` to the audio group."
394                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
395                                         echo ""
396                                         read -p "Press ENTER to continue:" BLAH
397
398                                         user=`whoami`
399                                         if sudo usermod -a -G audio $user;
400                                         then
401                                                 USER_GROUP_ADJUSTED="t"
402                                         else
403                                                 echo ""
404                                                 echo "!!! ERROR !!! - Not able to add user to the audio group (usermod failed)!"
405                                                 echo ""
406                                                 echo "Please add yourself to the audio group and re-login"
407                                                 echo ""
408                                                 read -p "Press ENTER to continue:" BLAH
409                                         fi
410
411                                 elif ./${BUNDLE_DIR}/sanityCheck -hasgroup jackuser > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@jackuser.*rtprio";
412                                 then
413                                         # add user to jackuser group
414                                         echo ""
415                                         echo "Adding user `whoami` to the jackuser group."
416                                         echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
417                                         echo ""
418                                         read -p "Press ENTER to continue:" BLAH
419
420                                         user=`whoami`
421                                         if sudo usermod -a -G jackuser $user;
422                                         then
423                                                 USER_GROUP_ADJUSTED="t"
424                                         else
425                                                 echo ""
426                                                 echo "!!! ERROR !!! - Not able to add user to the jackuser group."
427                                                 echo ""
428                                                 echo "Please add yourself to the audio group and re-login"
429                                                 echo ""
430                                                 read -p "Press ENTER to continue:" BLAH
431                                         fi
432                                         
433
434                                 fi
435                         fi
436                 else
437                         # No audio group found on this system!
438                         echo ""
439                         echo "!!! WARNING !!! - The system does not seem to have an audio group (audio or jackuser)."
440                         echo ""
441                         echo "We will not attempt to fix this. Please configure your system to allow"
442                         echo "non-root users to execute realtime tasks."
443                         echo ""
444                         read -p "Press ENTER to continue:" BLAH
445                 fi
446         fi
447
448         if ! ./${BUNDLE_DIR}/sanityCheck -freqscaling > /dev/null;
449         then
450                 echo ""
451                 echo "!!! WARNING !!! - Your system seems to use frequency scaling."
452                 echo "This can have a serious impact on audio latency. You have two choices:"
453                 echo "(1) turn it off, e.g. by chosing the 'performance' governor."
454                 echo "(2) Use the HPET clocksource by passing \"-c h\" to JACK"
455                 echo "(this second option only works on relatively recent computers)"
456                 echo ""
457                 read -p "Press ENTER to continue:" BLAH
458         fi
459
460         if [ "f" = $USER_GROUP_ADJUSTED ];
461         then
462                 if ! ./${BUNDLE_DIR}/sanityCheck -memlock > /dev/null;
463                 then
464                         echo ""
465                         echo "!!! WARNING !!! - You are not allowed to lock memory."
466                         echo ""
467                         echo "We will not attempt to fix this. Please configure your system to allow"
468                         echo "non-root users to execute lock memory."
469                         echo ""
470                         read -p "Press ENTER to continue:" BLAH
471                 fi
472         fi
473 fi
474
475
476 ########################
477 # Install Complete
478 ########################
479
480 echo ""
481 echo "Cleaning up"
482 rm -rf ${BUNDLE_DIR}/
483
484 echo ""
485 echo "!!! Install Complete !!!"
486
487 if [ "t" = $USER_GROUP_ADJUSTED ];
488 then
489         echo "You will need to logout and then login again for all changes to be complete"
490 fi
491
492 echo ""
493 read -p "Press ENTER to close this window:" BLAH
494
495