e18cebd6d7
git-svn-id: svn://localhost/ardour2/branches/3.0@8962 d708f5d6-7413-0410-9779-e7cbd77b26cf
540 lines
14 KiB
Bash
Executable File
540 lines
14 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
####################################
|
|
#
|
|
# stage2.run
|
|
# Ardour/Mixbus bundle installer
|
|
# Todd Naugle
|
|
#
|
|
###################################
|
|
|
|
|
|
|
|
PGM_NAME="Ardour"
|
|
PGM_VENDOR="Ardour"
|
|
PGM_EXEC_FILE="ardour3"
|
|
|
|
INSTALL_DEST_BASE="/opt"
|
|
|
|
PGM_NAME_LOWER=$(echo $PGM_NAME | tr '[:upper:]' '[:lower:]')
|
|
|
|
#### Global Variables ####
|
|
HAS_XDG="T"
|
|
|
|
########################
|
|
# Function Definitions
|
|
########################
|
|
|
|
VaildateYesNoQuestion ()
|
|
{
|
|
# $1 = Question Text
|
|
|
|
local INPUT_OK="n"
|
|
local USER_INPUT=""
|
|
|
|
until test "y" = $INPUT_OK;
|
|
do
|
|
echo ""
|
|
read -p "$1 [y/n]: " USER_INPUT
|
|
echo ""
|
|
|
|
if [ ! -z $USER_INPUT ];
|
|
then
|
|
if [ "Y" = $USER_INPUT -o "y" = $USER_INPUT -o "n" = $USER_INPUT -o "N" = $USER_INPUT ];
|
|
then
|
|
INPUT_OK="y"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo $USER_INPUT | tr '[:upper:]' '[:lower:]'
|
|
|
|
}
|
|
|
|
SystemInstall ()
|
|
{
|
|
|
|
# Determine which software install app to use and then install requested package
|
|
# $1 = Package Name
|
|
|
|
if which yum > /dev/null;
|
|
then
|
|
sudo yum -y install $1
|
|
rtrn=$?
|
|
|
|
if [ $rtrn -ne 0 ];
|
|
then
|
|
echo ""
|
|
echo "!!! ERROR !!! yum install failed for an unknown reason."
|
|
echo "Please install package $1 after this installer completes."
|
|
echo ""
|
|
fi
|
|
|
|
elif which apt-get > /dev/null;
|
|
then
|
|
sudo apt-get -y install $1
|
|
rtrn=$?
|
|
|
|
if [ $rtrn -ne 0 ];
|
|
then
|
|
echo ""
|
|
echo "!!! ERROR !!! apt-get install failed for an unknown reason."
|
|
echo "Please install package $1 after this installer completes."
|
|
echo ""
|
|
fi
|
|
|
|
else
|
|
echo ""
|
|
echo "!!! ERROR !!! - Not able to detect which software install tool to use (yum or apt-get)."
|
|
echo "Please install package $1 using the system software install tool."
|
|
echo ""
|
|
rtrn=1
|
|
fi
|
|
|
|
return $rtrn
|
|
|
|
}
|
|
|
|
########################################################################
|
|
# Main
|
|
########################################################################
|
|
|
|
# If you double click a script, some systems don't get the PWD correct.
|
|
# Force it to be correct
|
|
PKG_PATH=$(dirname $(readlink -f $0))
|
|
cd ${PKG_PATH}
|
|
|
|
echo ""
|
|
echo "Welcome to the ${PGM_NAME} installer"
|
|
echo ""
|
|
|
|
##############
|
|
# Check sudo
|
|
##############
|
|
|
|
if ! sudo date;
|
|
then
|
|
echo ""
|
|
echo "!!! ERROR !!!"
|
|
echo ""
|
|
echo "Either you don't know the root password or the user is not allowed to sudo"
|
|
echo "Please correct this and run the installer again (hint: use visudo to edit sudoers file)"
|
|
echo ""
|
|
read -p "Press ENTER to exit installer:" BLAH
|
|
exit 1
|
|
fi
|
|
|
|
############################
|
|
# Determine processor type
|
|
############################
|
|
|
|
case `uname -m` in
|
|
i[3456789]86|x86|i86pc)
|
|
echo "Architecture is x86"
|
|
ARCH='x86'
|
|
;;
|
|
x86_64|amd64|AMD64)
|
|
echo "Architecture is x86_64"
|
|
ARCH='x86_64'
|
|
;;
|
|
*)
|
|
echo ""
|
|
echo "!!! ERROR !!! - Unknown architecture `uname -m`"
|
|
echo ""
|
|
read -p "Press ENTER to exit installer:" BLAH
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# untar the correct bundle for us to install
|
|
echo "Unpacking bundle for $ARCH"
|
|
tar -xjf ${PGM_NAME}_${ARCH}-*.tar.bz2
|
|
BUNDLE_DIR=$(basename `find -maxdepth 1 -type d -name "${PGM_NAME}_${ARCH}-*"`)
|
|
|
|
|
|
#######################
|
|
# Check for xdg utils
|
|
#######################
|
|
|
|
XDG_MENU_VER=$(xdg-desktop-menu --version 2> /dev/null)
|
|
if [ -z "$XDG_MENU_VER" ];
|
|
then
|
|
echo "System does not have xdg-desktop-menu installed"
|
|
HAS_XDG="F"
|
|
fi
|
|
|
|
XDG_ICON_VER=$(xdg-icon-resource --version 2> /dev/null)
|
|
if [ -z "$XDG_ICON_VER" ];
|
|
then
|
|
echo "System does not have xdg-icon-resource installed"
|
|
HAS_XDG="F"
|
|
fi
|
|
|
|
#################################################
|
|
# Check if system libs are OK (libc, etc)
|
|
#################################################
|
|
|
|
echo ""
|
|
echo "Checking system libs to see if they are compatible with ${PGM_NAME}."
|
|
echo ""
|
|
|
|
LIB_ERROR="F"
|
|
LD_PATH=`pwd`/${BUNDLE_DIR}/lib
|
|
|
|
# check the main App
|
|
LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd ${BUNDLE_DIR}/bin/${PGM_NAME_LOWER}-* 2>&1 > /dev/null)
|
|
|
|
if [ -n "$LDD_RESULT" ];
|
|
then
|
|
echo "$LDD_RESULT"
|
|
LIB_ERROR="T"
|
|
fi
|
|
|
|
# check the libs
|
|
LIB_FILES=$(find ${BUNDLE_DIR}/lib -name "*.so")
|
|
|
|
for path in $LIB_FILES
|
|
do
|
|
LDD_RESULT=$(LD_LIBRARY_PATH=${LD_PATH} ldd $path 2>&1 > /dev/null)
|
|
if [ -n "$LDD_RESULT" ];
|
|
then
|
|
echo "$LDD_RESULT"
|
|
LIB_ERROR="T"
|
|
fi
|
|
done
|
|
|
|
if test "T" = $LIB_ERROR;
|
|
then
|
|
echo ""
|
|
echo "!!! ERROR !!! - Missing library detected!"
|
|
echo "This system does not have the correct libs to run ${PGM_NAME}."
|
|
echo "Installation will not complete. Please use a compatible distro."
|
|
echo ""
|
|
read -p "Press ENTER to exit installer:" BLAH
|
|
exit 1
|
|
fi
|
|
|
|
################################
|
|
# Setup derived variables
|
|
################################
|
|
PGM_VERSION=$(echo ${BUNDLE_DIR} | awk 'BEGIN { FS = "-" } ; { print $2 }' | awk 'BEGIN { FS = "_"} ; { print $1}')
|
|
PGM_BUILD=$(echo ${BUNDLE_DIR} | awk 'BEGIN { FS = "-" } ; { print $2 }' | awk 'BEGIN { FS = "_"} ; { print $2}')
|
|
PGM_BUILDTYPE=$(echo ${BUNDLE_DIR} | awk 'BEGIN { FS = "-" } ; { print $3 }')
|
|
|
|
if [ -z ${PGM_BUILDTYPE} ];
|
|
then
|
|
PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}_${PGM_BUILD}"
|
|
ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}" #no dash between name and version since dash seperates vendor from program
|
|
MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}.desktop" #no dash between name and version since dash seperates vendor from program
|
|
DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}.desktop"
|
|
else
|
|
PGM_FULL_NAME="${PGM_NAME}-${PGM_VERSION}_${PGM_BUILD}-${PGM_BUILDTYPE}"
|
|
ICON_NAME="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}" #no dash between name and version since dash seperates vendor from program
|
|
MENU_FILE="${PGM_VENDOR}-${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop" #no dash between name and version since dash seperates vendor from program
|
|
DESKTOP_LINK_FILE="${PGM_NAME}_${PGM_VERSION}_${PGM_BUILDTYPE}.desktop"
|
|
fi
|
|
|
|
PGM_EXEC_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/${PGM_EXEC_FILE}"
|
|
ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/etc/icons"
|
|
MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
|
|
|
|
|
|
|
|
################################
|
|
# Install bundle and Menu/Link
|
|
################################
|
|
|
|
if [ ! -d ${INSTALL_DEST_BASE} ];
|
|
then
|
|
echo ""
|
|
echo "!!! ERROR !!! - Installation location ${INSTALL_DEST_BASE} does not exist!"
|
|
echo "Installation will not complete."
|
|
echo ""
|
|
read -p "Press ENTER to exit installer:" BLAH
|
|
exit 1
|
|
fi
|
|
|
|
# uninstall any older versions
|
|
UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}*.uninstall.sh")
|
|
if [ ! -z "$UNINSTALLERS" ];
|
|
then
|
|
for i in $UNINSTALLERS; do
|
|
echo ""
|
|
echo "Found existing ${PGM_NAME} installation."
|
|
|
|
ANSWER=$(VaildateYesNoQuestion "Do you want to run the uninstaller ${i} ?")
|
|
|
|
if test "y" = $ANSWER;
|
|
then
|
|
echo ""
|
|
echo "Running uninstaller $i"
|
|
|
|
${i}
|
|
sudo rm -f ${i}
|
|
fi
|
|
done
|
|
fi
|
|
|
|
|
|
# install
|
|
|
|
echo ""
|
|
echo "Installing ${PGM_NAME} ${PGM_VERSION} built from ${PGM_BUILD} in ${INSTALL_DEST_BASE}"
|
|
echo ""
|
|
|
|
# Copy the new version in the install directory
|
|
sudo mkdir ${INSTALL_DEST_BASE}/${PGM_FULL_NAME}
|
|
sudo cp -Rf ${BUNDLE_DIR}/* ${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/
|
|
|
|
# write the desktop/menu file
|
|
echo "[Desktop Entry]" > /tmp/${MENU_FILE}
|
|
echo "Encoding=UTF-8" >> /tmp/${MENU_FILE}
|
|
echo "Version=1.0" >> /tmp/${MENU_FILE}
|
|
echo "Type=Application" >> /tmp/${MENU_FILE}
|
|
echo "Terminal=false" >> /tmp/${MENU_FILE}
|
|
echo "Exec=${PGM_EXEC_PATH}" >> /tmp/${MENU_FILE}
|
|
if [ -z ${PGM_BUILDTYPE} ];
|
|
then
|
|
echo "Name=${PGM_NAME}-${PGM_VERSION}" >> /tmp/${MENU_FILE}
|
|
else
|
|
echo "Name=${PGM_NAME}-${PGM_VERSION}-${PGM_BUILDTYPE}" >> /tmp/${MENU_FILE}
|
|
fi
|
|
echo "Icon=${ICON_NAME}" >> /tmp/${MENU_FILE}
|
|
echo "Comment=Digital Audio Workstation" >> /tmp/${MENU_FILE}
|
|
echo "Categories=AudioVideo;AudioEditing;Audio;Recorder;" >> /tmp/${MENU_FILE}
|
|
|
|
chmod ugo+rx /tmp/${MENU_FILE}
|
|
sudo mv /tmp/${MENU_FILE} ${MENU_FILE_PATH}/.
|
|
|
|
# install the Menu, Link, and Icon(s)
|
|
if [ "T" = ${HAS_XDG} ];
|
|
then
|
|
echo "Adding ${PGM_NAME} to the applications menu"
|
|
sudo xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_16px.png ${ICON_NAME}
|
|
sudo xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_22px.png ${ICON_NAME}
|
|
sudo xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_32px.png ${ICON_NAME}
|
|
sudo xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_48px.png ${ICON_NAME}
|
|
|
|
if [ -e ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ];
|
|
then
|
|
sudo cp -f ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
|
|
fi
|
|
|
|
sudo xdg-desktop-menu install ${MENU_FILE_PATH}/${MENU_FILE}
|
|
sudo xdg-desktop-menu forceupdate --mode system # Some systems need an extra kick
|
|
|
|
echo ""
|
|
echo "Creating a desktop link for ${PGM_NAME}"
|
|
cp ${MENU_FILE_PATH}/${MENU_FILE} ~/Desktop/${DESKTOP_LINK_FILE}
|
|
chmod ugo+rx ~/Desktop/${DESKTOP_LINK_FILE}
|
|
else
|
|
echo ""
|
|
echo "Creating a desktop link for ${PGM_NAME}"
|
|
cp ${MENU_FILE_PATH}/${MENU_FILE} ~/Desktop/${DESKTOP_LINK_FILE}
|
|
chmod ugo+rx ~/Desktop/${DESKTOP_LINK_FILE}
|
|
fi
|
|
|
|
echo ""
|
|
echo "Copying uninstall script to ${INSTALL_DEST_BASE}"
|
|
echo ""
|
|
|
|
sudo cp -f ${BUNDLE_DIR}/bin/*.uninstall.sh ${INSTALL_DEST_BASE}/.
|
|
|
|
###########################
|
|
# Check Jack and qjackctl
|
|
###########################
|
|
|
|
echo ""
|
|
echo "Checking to see if Jack is installed"
|
|
echo ""
|
|
|
|
if ! which jackd > /dev/null;
|
|
then
|
|
echo ""
|
|
echo "The program Jack is missing from this system. Jack is a required component of $PGM_NAME."
|
|
echo ""
|
|
|
|
ANSWER=$(VaildateYesNoQuestion "Install jack using system software repository?")
|
|
|
|
if test "y" = $ANSWER;
|
|
then
|
|
echo "Attempting to install Jack"
|
|
SystemInstall "jackd"
|
|
|
|
if [ $? -ne 0 ];
|
|
then
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
fi
|
|
fi
|
|
else
|
|
echo "Jack OK"
|
|
fi
|
|
|
|
|
|
if ! which qjackctl > /dev/null;
|
|
then
|
|
echo ""
|
|
echo "The program QjackCtl is missing from this system."
|
|
echo "QjackCtl is an extremely useful tool for any system that runs JACK applications like $PGM_NAME."
|
|
echo "We recommend that you install it."
|
|
echo ""
|
|
|
|
ANSWER=$(VaildateYesNoQuestion "Install QjackCtl using system software repository?")
|
|
|
|
if test "y" = $ANSWER;
|
|
then
|
|
echo "Attempting to install QjackCtl"
|
|
SystemInstall "qjackctl"
|
|
|
|
if [ $? -ne 0 ];
|
|
then
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
|
|
########################
|
|
# Run Sanity Check
|
|
########################
|
|
|
|
USER_GROUP_ADJUSTED="f"
|
|
|
|
if ! ./${BUNDLE_DIR}/bin/sanityCheck -a > /dev/null;
|
|
then
|
|
echo ""
|
|
echo "System failed the quick sanity check... Looking for the cause"
|
|
|
|
if ! ./${BUNDLE_DIR}/bin/sanityCheck -rt > /dev/null;
|
|
then
|
|
echo ""
|
|
echo "System does not allow realtime for the current user... Looking for a solution"
|
|
|
|
if ./${BUNDLE_DIR}/bin/sanityCheck -hasaudiogroup > /dev/null;
|
|
then
|
|
if ./${BUNDLE_DIR}/bin/sanityCheck -memberaudiogroup > /dev/null 2>&1;
|
|
then
|
|
## This is an odd case. We have an audio group and are a member.
|
|
echo ""
|
|
echo "!!! WARNING !!! - The current user can not execute realtime processes."
|
|
echo "This will adversely affect audio latency."
|
|
echo "This system has an audio group and the user is a member. If jack was"
|
|
echo "just installed, a simple log out/in may fix this."
|
|
echo ""
|
|
echo "For best results, please correct this on your system."
|
|
echo "(Hint: check /etc/security/limits.conf or /etc/security/limits.d/)"
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
else
|
|
# Not a member of an audio group. Try to fix it.
|
|
|
|
if ./${BUNDLE_DIR}/bin/sanityCheck -hasgroup audio > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@audio.*rtprio";
|
|
then
|
|
# add user to audio group
|
|
echo ""
|
|
echo "Adding user `whoami` to the audio group."
|
|
echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
|
|
user=`whoami`
|
|
if sudo usermod -a -G audio $user;
|
|
then
|
|
USER_GROUP_ADJUSTED="t"
|
|
else
|
|
echo ""
|
|
echo "!!! ERROR !!! - Not able to add user to the audio group (usermod failed)!"
|
|
echo ""
|
|
echo "Please add yourself to the audio group and re-login"
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
fi
|
|
|
|
elif ./${BUNDLE_DIR}/bin/sanityCheck -hasgroup jackuser > /dev/null && find /etc/security -type f -name "*.conf" | xargs grep -q "^@jackuser.*rtprio";
|
|
then
|
|
# add user to jackuser group
|
|
echo ""
|
|
echo "Adding user `whoami` to the jackuser group."
|
|
echo "This should allow you to run realtime tasks. Please re-login for this change to take affect."
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
|
|
user=`whoami`
|
|
if sudo usermod -a -G jackuser $user;
|
|
then
|
|
USER_GROUP_ADJUSTED="t"
|
|
else
|
|
echo ""
|
|
echo "!!! ERROR !!! - Not able to add user to the jackuser group."
|
|
echo ""
|
|
echo "Please add yourself to the audio group and re-login"
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
fi
|
|
|
|
|
|
fi
|
|
fi
|
|
else
|
|
# No audio group found on this system!
|
|
echo ""
|
|
echo "!!! WARNING !!! - The system does not seem to have an audio group (audio or jackuser)."
|
|
echo ""
|
|
echo "We will not attempt to fix this. Please configure your system to allow"
|
|
echo "non-root users to execute realtime tasks."
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
fi
|
|
fi
|
|
|
|
if ! ./${BUNDLE_DIR}/bin/sanityCheck -freqscaling > /dev/null;
|
|
then
|
|
echo ""
|
|
echo "!!! WARNING !!! - Your system seems to use frequency scaling."
|
|
echo "This can have a serious impact on audio latency. You have two choices:"
|
|
echo "(1) turn it off, e.g. by chosing the 'performance' governor."
|
|
echo "(2) Use the HPET clocksource by passing \"-c h\" to JACK"
|
|
echo "(this second option only works on relatively recent computers)"
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
fi
|
|
|
|
if [ "f" = $USER_GROUP_ADJUSTED ];
|
|
then
|
|
if ! ./${BUNDLE_DIR}/bin/sanityCheck -memlock > /dev/null;
|
|
then
|
|
echo ""
|
|
echo "!!! WARNING !!! - You are not allowed to lock memory."
|
|
echo ""
|
|
echo "We will not attempt to fix this. Please configure your system to allow"
|
|
echo "non-root users to execute lock memory."
|
|
echo ""
|
|
read -p "Press ENTER to continue:" BLAH
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
|
|
########################
|
|
# Install Complete
|
|
########################
|
|
|
|
echo ""
|
|
echo "Cleaning up"
|
|
rm -rf ${BUNDLE_DIR}/
|
|
|
|
echo ""
|
|
echo "!!! Install Complete !!!"
|
|
|
|
if [ "t" = $USER_GROUP_ADJUSTED ];
|
|
then
|
|
echo "You will need to logout and then login again for all changes to be complete"
|
|
fi
|
|
|
|
echo ""
|
|
read -p "Press ENTER to exit installer:" BLAH
|
|
|
|
|