ardour/tools/linux_packaging/stage2.run

622 lines
16 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
${SUPER} 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
${SUPER} 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 for root privileges
#############################
SUPER=""
if [ "$(id -u)" != "0" ]; then
if ! which sudo > /dev/null;
then
echo ""
echo "!!! ERROR !!!"
echo ""
echo "The installer requires root privileges. It is currently not"
echo "running as root AND the program sudo is missing from this system."
echo ""
echo "Please correct this by installing and configuring sudo or running"
echo "the installer as root."
echo ""
read -p "Press ENTER to exit installer:" BLAH
exit 1
fi
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"
echo "(hint: use visudo to edit sudoers file)"
echo ""
read -p "Press ENTER to exit installer:" BLAH
exit 1
fi
SUPER="sudo"
else
echo ""
echo "!!! Warning !!!"
echo ""
echo "The installer is running as the root user which is not the prefered method."
echo "There are checks run at the end of the installer to help ensure proper operation"
echo "of ${PGM_NAME} (realtime priviledges, memory locking, frequency scaling)."
echo "Running as root will invalidate these tests."
echo ""
read -p "Press ENTER to continue:" BLAH
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
####################
# Check disk space
####################
# We have to check the current folder and the INSTALL_DEST_BASE just
# in case they are on different devices
echo "Checking for required disk space"
if [ ! -e .${PGM_NAME}_${ARCH}-*.size ]; then
echo ""
echo "!!! ERROR !!! Can't locate .size file for ${ARCH} bundle."
echo ""
exit 1
else
REQUIRED_BYTES=$(cat .${PGM_NAME}_${ARCH}-*.size)
#Check space in current folder
FREE_BYTES=$(df -P -B 1 ${PKG_PATH} | grep / | awk '{print $4}')
if [ ${FREE_BYTES} -le ${REQUIRED_BYTES} ] ; then
echo ""
echo "!!! ERROR !!! - Insufficient disk space in ${PKG_PATH}"
echo ""
exit 1
fi
#Check space in INSTALL_DEST_BASE
FREE_BYTES=$(df -B 1 ${INSTALL_DEST_BASE} | grep / | awk '{print $4}')
if [ ${FREE_BYTES} -le ${REQUIRED_BYTES} ] ; then
echo ""
echo "!!! ERROR !!! - Insufficient disk space in ${INSTALL_DEST_BASE}"
echo ""
exit 1
fi
fi
#####################
# Unpack the bundle
#####################
# 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}
${SUPER} 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
${SUPER} mkdir ${INSTALL_DEST_BASE}/${PGM_FULL_NAME}
${SUPER} 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}
${SUPER} 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"
${SUPER} xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_16px.png ${ICON_NAME}
${SUPER} xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_22px.png ${ICON_NAME}
${SUPER} xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_32px.png ${ICON_NAME}
${SUPER} 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
${SUPER} cp -f ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
fi
${SUPER} xdg-desktop-menu install ${MENU_FILE_PATH}/${MENU_FILE}
${SUPER} 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 ""
${SUPER} 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 ${SUPER} 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 ${SUPER} 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