ardour/tools/linux_packaging/stage2.run

548 lines
14 KiB
Plaintext
Raw Normal View History

#!/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"
if [ ! -e ${PGM_NAME}_${ARCH}-*.tar.bz2 ]; then
echo ""
echo "!!! ERROR !!! Can't locate ${ARCH} bundle file."
echo ""
exit 1
fi
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