blob: 914d658c8b7d584e7e91483a0ca83a1636ccaadc [file] [log] [blame]
#!/bin/bash
version=0.2.4
protocol=
distrib=unknown
distribver=0.0
tmpdir=$TMPDIR
if test -z "$tmpdir"; then
tmpdir="/tmp"
fi
tmpdir=$tmpdir/alsa-compile-script
baseurl="http://www.alsa-project.org/snapshot/?package="
package=alsa-driver
packagedefault=true
url=
urldefault=
gittree="git://git.alsa-project.org/"
usegit=false
httpdownloader=
clean=
compile=
install=
quiet=
yes=
kernelmodules=
kmodlist=
kmodremove=
kmodclean=
depmodbin=
modinfobin=
runargs=
patches=
kmodmesg=
withdebug=
fuser_prg=fuser
insmod_prg=insmod
rmmod_prg=rmmod
lsmod_prg=lsmod
modprobe_prg=modprobe
test -x /sbin/fuser && fuser_prg=/sbin/fuser
test -x /sbin/insmod && insmod_prg=/sbin/insmod
test -x /sbin/rmmod && rmmod_prg=/sbin/rmmod
test -x /sbin/lsmod && lsmod_prg=/sbin/lsmod
test -x /sbin/modprobe && modprobe_prg=/sbin/modprobe
usage() {
echo "Usage: $0 [OPTION]..."
cat <<EOF
This is a script version $version doing ALSA code compilation and installation.
Report any problems to <alsa-devel@alsa-project.org> mailing list.
Operation modes:
-h, --help print this help, then exit
-e, --examples print text with examples, then exit
-q, --quiet quiet mode
-y, --yes do not ask any questions - answer is always yes
-c, --clean[=package] do overall clean, do package clean
--url=url package url
--git=giturl work with git tree
--compile force compilation
--install install binaries and headers
--patch=patch apply code patch (can be used multiple times)
--tmpdir=dir set temporary directory (overrides TMPDIR envval)
--kmodules[=mods] reinsert kernel modules or insert specified modules
to current kernel; more modules can be delimited
with ',' and arguments can be delimited with ':'
--kmodlist list ALSA toplevel kernel modules
--kmodremove remove ALSA kernel modules from kernel
--kmodclean remove installed ALSA kernel modules from /lib/modules
--kmodmesg show ALSA kernel related messages
--run program [args] run a program using fresh alsa-lib
--with-debug=dbgopt set debug options to dbgopt (for alsa-driver)
Package selection:
--driver compile alsa-driver package (default)
--lib compile alsa-lib package
--utils compile alsa-utils package
--plugins compile alsa-plugins package
--firmware compile alsa-firmware package
--oss compile alsa-oss package
EOF
}
examples() {
cat <<EOF
$0 examples:
Install latest ALSA driver snapshot to system:
alsa-compile.sh --driver --install
Try new ALSA driver snapshot without installing it to system. The existing
ALSA kernel modules are replaced with fresh ones:
alsa-compile.sh --driver --kmodules
Do both (installation and modules replacement):
alsa-compile.sh --driver --install --kmodules
Install latest ALSA library snapshot to system:
alsa-compile.sh --lib --install
Run application using latest ALSA library snapshot. The new alsa-lib is not
installed to system:
alsa-compile.sh --run <your_program_including_arguments>
Do not want to fetch sources? Use file: protocol to specify current or
explicit directory containing sources:
alsa-compile.sh --driver --url=file:///home/alsa/alsa-driver
EOF
}
while :
do
case "$1" in
-h|--help)
usage
exit 0
;;
-e|--examples)
examples
exit 0
;;
-q|--quiet)
quiet=true ;;
-y|--yes)
yes=true ;;
-c*|--clean*)
clean="full"
case "$#,$1" in
*,*=*)
clean=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
1,*)
;;
*)
clean="$2"
shift ;;
esac
;;
--url*)
case "$#,$1" in
*,*=*)
url=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
1,*)
usage ;;
*)
url="$2"
shift ;;
esac
if test -d "$url"; then
url="file:///$url"
fi
;;
--git*)
case "$#,$1" in
*,*=*)
url=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
1,*)
url="$gittree" ;;
*)
url="$2"
shift ;;
esac
;;
--with-debug*)
case "$#,$1" in
*,*=*)
withdebug=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
1,*)
usage ;;
*)
withdebug="$2"
shift ;;
esac
;;
--compile)
compile=true
;;
--install)
install=true
;;
--patch*)
case "$#,$1" in
*,*=*)
patch=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
1,*)
usage ;;
*)
patch="$2"
shift ;;
esac
patches="$patches $patch"
;;
--driver|--lib|--utils|--plugins|--firmware|--oss)
pkg="$1"
pkg=${pkg:2}
package="alsa-$pkg"
packagedefault=
;;
--run)
package="alsa-lib"
packagedefault=
shift
runargs="$@"
break
;;
--tmpdir*)
case "$#,$1" in
*,*=*)
tmpdir=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
1,*)
usage ;;
*)
tmpdir="$2"
shift ;;
esac
tmpdir="$tmpdir/alsa-compile-script"
;;
--kmodules*)
case "$#,$1" in
*,*=*)
kernelmodules=`expr "z$1" : 'z-[^=]*=\(.*\)'`
;;
1,*)
kernelmodules="reinstall" ;;
*)
kernelmodules="$2"
shift ;;
esac
;;
--kmodlist)
kmodlist=true
;;
--kmodremove)
kmodremove=true
;;
--kmodclean)
dir="/lib/modules/`uname -r`/updates/alsa"
echo "Removing kernel modules in $dir:"
if test -d $dir; then
if ! rm -rf $dir; then
echo >&2 "Cannot remove tree $dir."
exit 1
fi
fi
echo " success"
exit 0
;;
--kmodmesg)
kmodmesg=true
;;
*)
test -n "$1" && echo "Unknown parameter '$1'"
break
;;
esac
shift
done
if test -z "$url"; then
url="$baseurl$package"
urldefault=true
fi
# Echo "true" or "false", depending on $yes and user response to prompt
# $1 is prompt message
question_bool() {
if test "$yes" = "yes"; then
echo "true"
else
echo >&2 -n "$1 (Y/ ) "
read i
local i=${i:0:1}
if test "$i" = "Y" -o "$i" = "y"; then
echo "true"
else
echo "false"
fi
fi
}
# Set $distrib and $distribver
check_distribution() {
distrib=$(lsb_release -ds 2> /dev/null)
if test -z "$distrib"; then
if test -f /etc/redhat-release; then
distrib="Fedora"
install_package lsb
distrib=
fi
distrib=$(lsb_release -ds 2> /dev/null)
distrib=$(echo $distrib)
fi
local tmp=${distrib:0:25}
if test "$tmp" == "\"Red Hat Enterprise Linux"; then
distrib="RHEL"
else
distrib=$(echo $distrib | cut -d ' ' -f 1)
fi
tmp=${distrib:0:1}
if test "$tmp" = "\""; then
distrib=${distrib:1}
fi
distribver=$(lsb_release -rs 2> /dev/null)
if test -z "$distrib"; then
echo >&2 "Unable to determine Linux distribution."
exit 1
fi
if test -z "$distribver"; then
echo >&2 "Unable to determine Linux distribution version."
exit 1
fi
echo "Detected Linux distribution '$distrib $distribver'."
}
# Echo "true" if rpm installed, else "false"
# $1 is rpm name
is_rpm_installed() {
local a=$(rpm -qi $1 | head -1 | cut -d ' ' -f 1)
if test "$a" = "Name"; then
echo "true"
else
echo "false"
fi
}
# Echo "true" if deb installed, else "false"
is_deb_installed() {
dpkg -l $1 2>&1 | grep -Eq '^ii'
if test "$?" = "0"; then
echo "true"
else
echo "false"
fi
}
# Install package
# $1 is package name
install_package() {
pkg="$1"
case "$distrib" in
openSUSE)
test "$pkg" == "alsa-lib-devel" && pkg="alsa-devel"
;;
Fedora|RHEL|CentOS|Scientific)
test "$pkg" == "lsb" && pkg="redhat-lsb"
;;
Debian|Ubuntu)
test "$pkg" == "lsb" && pkg="lsb-release"
test "$pkg" == "git" && pkg="git-core"
test "$pkg" == "alsa-lib-devel" && pkg="libasound2-dev"
test "$pkg" == "gettext-tools" && pkg="gettext-base"
test "$pkg" == "gettext-devel" && pkg="gettext"
test "$pkg" == "ncurses-devel" && pkg="ncurses-bin"
;;
*)
echo >&2 "Cannot install $1 for unsupported distribution $distrib."
exit 1
esac
echo "Trying to install package '$pkg':"
case "$distrib" in
openSUSE)
zypper install $pkg
;;
Fedora|RHEL|CentOS|Scientific)
yum install -y $pkg
;;
Debian|Ubuntu)
apt-get install -y $pkg
;;
*)
echo >&2 "Cannot install $pkg for unsupported distribution $distrib."
exit 1
esac
if test $(is_rpm_installed $pkg) = "false" -a "$pkg" = "git"; then
case "$distrib" in
RHEL)
install_package perl-DBI
rm -f $tmpdir/git.rpm
ver="1.7.2.2-1.el${distribver:0:1}.rf"
wget -O $tmpdir/git.rpm http://packages.sw.be/git/perl-Git-$ver.$(uname -m).rpm
if test -s $tmpdir/git.rpm; then
rpm -Uvh --nodeps $tmpdir/git.rpm
fi
wget -O $tmpdir/git.rpm http://packages.sw.be/git/git-$ver.$(uname -m).rpm
if test -s $tmpdir/git.rpm; then
rpm -Uvh $tmpdir/git.rpm
fi
rm -f $tmpdir/git.rpm
;;
esac
fi
if test $(is_rpm_installed $pkg) = "false" ; then
echo >&2 "Package '$pkg' was not installed."
exit 1
fi
echo " installed"
}
# Ensure the relevant kernel header sources for $distrib are installed
check_kernel_source() {
echo "Checking kernel build environment:"
case "$distrib" in
openSUSE)
if test $(is_rpm_installed kernel-source) = "false" ; then
install_package kernel-source
fi
;;
Fedora|RHEL|CentOS|Scientific)
if uname --kernel-release | grep -q '\.PAE$'; then
local kernel_devel=kernel-PAE-devel
else
local kernel_devel=kernel-devel
fi
if test $(is_rpm_installed $kernel_devel) = "false" ; then
install_package $kernel_devel
fi
;;
Debian|Ubuntu)
local kernel_devel="linux-source-$(uname --kernel-release | sed 's/-.*$//')"
if test $(is_deb_installed $kernel_devel) = "false" ; then
install_package $kernel_devel
fi
;;
*)
echo >&2 "Cannot install kernel sources for unsupported distribution $distrib."
exit 1
;;
esac
echo " passed"
}
# Cache or restore $protocol and $url and $package in $tmpdir
check_environment() {
local env="$tmpdir/environment.base"
if ! test -s $env; then
if ! test -d $tmpdir ; then
mkdir -p $tmpdir
if ! test -d $tmpdir; then
echo >&2 "Unable to create directory $tmpdir."
exit 1
fi
fi
echo "Using temporary tree $tmpdir."
check_distribution
test -x /bin/depmod && depmodbin=/bin/depmod
test -x /sbin/depmod && depmodbin=/sbin/depmod
if test -z "$depmodbin"; then
echo >&2 "Unable to find depmod utility."
exit 1
fi
test -x /bin/modinfo && modinfobin=/bin/modinfo
test -x /sbin/modinfo && modinfobin=/sbin/modinfo
if test -z "$modinfobin"; then
echo >&2 "Unable to find modinfo utility."
exit 1
fi
echo "protocol=$protocol" >> $env
echo "distrib=\"$distrib\"" >> $env
echo "distribver=\"$distribver\"" >> $env
echo "url=\"$url\"" >> $env
echo "package=\"$package\"" >> $env
echo "depmodbin=\"$depmodbin\"" >> $env
echo "modinfobin=\"$modinfobin\"" >> $env
local b=$(basename $env)
echo "File $b has been created."
else
local b=$(basename $env)
echo "File $b is cached."
local opackage="$package"
local ourl="$url"
. $env
if test "$packagedefault" != "true"; then
package="$opackage"
fi
if test "$urldefault" != "true"; then
url="$ourl"
fi
fi
}
# Read/set $httpdownloader from CWD(!) and ensure tools available
check_compilation_environment() {
local env="environment.compile"
if ! test -s $env; then
local a=$(wget --version | head -1 | cut -d ' ' -f 2)
if test "$a" = "Wget"; then
httpdownloader="wget"
else
local a=$(curl --version | head -1 | cut -d ' ' -f 1 )
if test "$a" = "curl"; then
httpdownloader="curl"
fi
fi
if test -z "$httpdownloader"; then
echo >&2 "Unable to determine HTTP downloader."
exit 1
fi
local a=$(git --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "git"; then
install_package git
else
echo "Program git found."
fi
local a=$(autoconf --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "autoconf"; then
install_package autoconf
else
echo "Program autoconf found."
fi
local a=$(aclocal --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "aclocal"; then
install_package automake
else
echo "Program aclocal found."
fi
local a=$(gcc --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "gcc" ; then
install_package gcc
else
echo "Program gcc found."
fi
local a=$(patch --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "patch" ; then
install_package patch
else
echo "Program patch found."
fi
local a=$(diff --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "diff" ; then
install_package diffutils
else
echo "Program diff found."
fi
local a=$(make --version | head -1 | cut -d ' ' -f 1)
local b=$(make --version | head -1 | cut -d ' ' -f 2)
if test "$a" != "make" -a "$b" != "make" -a \
"$a" != "Make" -a "$b" != "Make"; then
install_package make
else
echo "Program make found."
fi
check_kernel_source
echo "httpdownloader=$httpdownloader" >> $env
echo "File $env has been created."
else
echo "File $env is cached."
. $env
fi
if test -z "$present_tool_git"; then
if test "$protocol" = "git"; then
local a=$(git --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "git"; then
install_package git
else
echo "Program git found."
echo "present_tool_git=y" >> $env
fi
fi
fi
if test -z "$present_tool_gettext"; then
if test "$package" = "alsa-utils"; then
local a=$(gettext --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "gettext"; then
install_package gettext-tools
local a=$(gettextize --version | head -1 | cut -d ' ' -f 1)
if test -z "$a"; then
install_package gettext-devel
fi
else
local a=$(gettextize --version | head -1 | cut -d ' ' -f 1)
if test -z "$a"; then
install_package gettext-devel
else
echo "Program gettext found."
echo "present_tool_gettext=y" >> $env
fi
fi
fi
fi
if test -z "$present_tool_xmlto"; then
if test "$package" = "alsa-utils"; then
local a=$(xmlto --version | head -1 | cut -d ' ' -f 1)
if test "$a" != "xmlto"; then
install_package xmlto
else
echo "Program xmlto found."
echo "present_tool_xmlto=y" >> $env
fi
fi
fi
if test -z "$present_tool_alsa_lib"; then
if test "$package" = "alsa-utils"; then
if ! test -r "/usr/include/alsa/asoundlib.h"; then
install_package alsa-lib-devel
else
echo "Package alsa-lib-devel found."
echo "present_tool_alsa_lib=y" >> $env
fi
fi
fi
if test -z "$present_tool_ncurses"; then
if test "$package" = "alsa-utils"; then
local a=$(ncurses6-config --version | head -1 | cut -d '.' -f 1)
local b=$(ncurses5-config --version | head -1 | cut -d '.' -f 1)
if test "$a" != "5" -a "$a" != "6" -a "$b" != "5" -a "$b" != "6"; then
install_package ncurses-devel
else
echo "Package ncurses-devel found."
echo "present_tool_ncurses=y" >> $env
fi
fi
fi
}
# Log and execute $@ and check success
do_cmd() {
echo "> $@"
$@ || exit 1
}
# Download file with $httpdownloader and check size
# $1 is url
# $2 is destination filename
download_http_file() {
echo "Downloading '$1':"
case "$httpdownloader" in
wget)
do_cmd wget -q -O $2 $1
;;
curl)
do_cmd curl -s -o $2 $1
;;
*)
echo >&2 "Unknown httpdownloader '$httpdownloader'."
exit 1
;;
esac
local size=$(stat -c%s $2)
if test -z "$size" -o $size -le 0; then
echo " failed ($size)"
echo >&2 "Unable to download file '$1'."
exit 1
else
echo " success ($size bytes)"
fi
}
# Create git clone
# $1 is git url prefix
# $2 is project name and destination dirname
git_clone() {
do_cmd git clone "$1$2.git" "$2"
}
# Compile $package, applying $patches
do_compile() {
local cmd="./gitcompile"
case "$package" in
alsa-driver)
local dbgopt="$withdebug"
test -z "$dbgopt" && local dbgopt="full"
local cmd="./gitcompile --with-debug=$dbgopt --with-isapnp=yes --with-sequencer=yes --with-moddir=updates/alsa"
;;
esac
if test -z "$patches"; then
case "$package" in
alsa-driver)
test -r acore/hwdep.o && local cmd="make"
;;
alsa-lib)
test -r src/.libs/libasound.so.2.0.0 && local cmd="make"
;;
esac
else
for patch in $patches; do
local pstrip=1
if ! patch -s -p$pstrip -N --dry-run < $patch; then
local pstrip=0
if ! patch -s -p$pstrip -N --dry-run < $patch; then
echo >&2 "Cannot apply patch $patch."
exit 1
fi
fi
echo "Applying patch $patch: "
if ! patch -p$pstrip -N < $patch; then
exit 1
fi
done
fi
echo "Running $cmd:"
if ! $cmd; then
local a=$(pwd)
echo >&2 "Working directory $a."
echo >&2 "Compilation of $package failed."
echo >&2 "Report this problem to the <alsa-devel@alsa-project.org> mailing list."
exit 1
fi
}
# Install $package as root
do_install() {
if ! test "$UID" -eq 0 ; then
echo >&2 "Root priviledges required for installation."
echo >&2 "Login as root to continue."
exit 1
fi
local cmd="make install"
case "$package" in
alsa-driver)
cat <<EOF
WARNING! You chose to install new ALSA kernel modules. To reuse the ALSA
kernel modules provided by the kernel package, invoke command:
$0 --kmodclean
EOF
if test $(question_bool "Really continue (Ctrl-C to abort)?") = "true"; then
local cmd="make install-modules"
fi
;;
esac
do_cmd $cmd
}
# Kill processes currently accessing the audio devices
kill_audio_apps() {
local pids0=$($fuser_prg /dev/snd/* 2> /dev/null)
local pids1=$($fuser_prg /dev/mixer* 2> /dev/null)
local pids2=$($fuser_prg /dev/sequencer* 2> /dev/null)
local pids=
for pid in $pids0 $pids1 $pids2; do
local pids="$pids $pid"
done
if ! test -z "$pids"; then
echo
echo "WARNING! An audio application uses ALSA driver:"
echo
for pid in $pids; do
ps --no-headers -p $pids || exit 1
done
echo
if test $(question_bool "Would you like to kill these apps?") = "true"; then
for pid in $pids; do
do_cmd kill $pid
done
sleep 2
local killed=
for pid in $pids; do
local a=$(ps --no-headers -p $pids)
if test -n "$a"; then
do_cmd kill -9 $pid
local killed="true"
fi
done
if test "$killed" = "true"; then
sleep 2
for pid in $pids; do
local a=$(ps --no-headers -p $pids)
if test -n "$a"; then
echo >&2 "Unable to kill application:"
echo >&2 " $a"
exit 1
fi
done
fi
else
echo >&2 "Cannot continue with running audio applications."
exit 1
fi
fi
}
# List available modules, cwd==source-tree
parse_modules() {
if ! test -s "$tmpdir/modules.dep"; then
local rel=$(uname -r)
cd modules
for i in snd-dummy.*; do
local i1=$(echo $i | sed -e 's/dummy/dummy1/g')
ln -sf $i $i1 || exit 1
done
cd ..
local pdst="xxxx/lib/modules/$rel"
mkdir -p $pdst/modules || exit 1
for i in modules/*.*o; do
ln -sf ../../../../../$i $pdst/$i || exit 1
done
local p=$(pwd)
if ! $depmodbin -b $p/xxxx ; then
echo >&2 "depmod failed."
exit 1
fi
if ! cp $pdst/modules.dep "$tmpdir/modules.dep" ; then
echo >&2 "cp problem."
exit 1
fi
rm -rf xxxx || exit 1
echo "File modules.dep has been created."
else
echo "File modules.dep is cached."
fi
if ! test -s "$tmpdir/modules.top" ; then
for i in modules/*.*o; do
if test -r $i; then
local a=$($modinfobin $i | grep "parm:" | grep "enable:")
if ! test -z "$a"; then
local a=$(basename $i | cut -d . -f 1)
echo $a >> "$tmpdir/modules.top"
fi
else
echo >&2 "permissions $tmpdir/$i problem."
exit 1
fi
done
echo "File modules.top has been created."
else
echo "File modules.top is cached."
fi
}
# Echo the list of loaded sound modules
current_modules() {
$lsmod_prg | cut -d ' ' -f 1 | grep -E "^(snd[_-]|snd$|ac97_bus$)"
}
# Remove kernel modules, using two phases
# $@ is module names
my_rmmod() {
local phase2=
while test -n "$1"; do
if ! $rmmod_prg $1 2> /dev/null > /dev/null; then
local phase2="$phase2 $1"
else
echo "> rmmod $1"
fi
shift
done
for mod in $phase2; do
echo "> rmmod $mod"
if ! $rmmod_prg $mod ; then
echo >&2 "Unable to remove kernel module $mod."
exit 1
fi
done
}
# Insert kernel modules with arguments
my_insmod() {
while test -n "$1"; do
local xmod=
local args=
local nofail=
for x in $1; do
if test -z "$xmod"; then
local xmod=$x
else
local args="$args $x"
fi
done
if test "$xmod" = "snd-dummy1"; then
args="index=999"
nofail=true
fi
local xmod1=$(echo $xmod | cut -d ':' -f 1)
if test "$xmod1" != "$xmod"; then
local args1=$(echo $xmod | cut -d ':' -f 2-)
args="$args $args1"
xmod="$xmod1"
fi
if test -r modules/$xmod.ko; then
local mod=modules/$xmod.ko
echo "> insmod $mod $args"
if test -n "$nofail"; then
$insmod_prg $mod $args 2> /dev/null
elif ! $insmod_prg $mod $args; then
echo >&2 "Unable to insert kernel module $xmod.ko."
exit 1
fi
else
if test -r modules/$xmod.o; then
local mod=modules/$xmod.o
echo "> insmod $mod $args"
if test -n "$nofail"; then
$insmod_prg $mod.o $args
elif ! $insmod_prg $mod.o $args; then
echo >&2 "Unable to insert kernel module $xmod.o."
exit 1
fi
else
echo >&2 "Unable to find kernel module $xmod."
exit 1
fi
fi
shift
done
}
# List latest kernel messages
# $1 is prefix
show_kernel_messages() {
cat > $tmpdir/run.awk <<EOF
/Dummy soundcard not found or device busy/ { delete lines }
{ lines[length(lines)+1] = \$0 }
END {
for (x = 2; x <= length(lines); x++)
print prefix lines[x]
}
EOF
dmesg | awk -f $tmpdir/run.awk -v prefix="$1"
rm $tmpdir/run.awk || exit 1
}
# Reload kernel modules
# $@ is list of kernel modules, default is current modules
do_kernel_modules() {
local usermods="$@"
local curmods=$(current_modules)
local dst=
if test -z "$curmods" -a -z "$usermods"; then
echo >&2 "Unable to determine current ALSA kernel modules."
exit 1
fi
if test -n "$usermods"; then
dst="$tmpdir/modules.user"
rm -f $dst || exit 1
else
dst="$tmpdir/modules.insmod"
fi
parse_modules
if ! test -s $dst; then
local topmods=$(cat "$tmpdir/modules.top")
cat > "$tmpdir/run.awk" <<EOF
function basename(name) {
split(name, y, "[/.]")
return y[length(y)-1]
}
function skipempty(dst, src, delim, x, y) {
split(src, y, delim)
for (x in y) {
if (length(y[x]) > 0) {
dst[x] = y[x]
}
}
}
function skipemptyuser(dst, src, delim, x, y, z, m) {
split(src, y, delim)
for (x in y) {
if (length(y[x]) > 0) {
z = index(y[x], ":")
if (z > 1) {
m = substr(y[x], 0, z - 1)
modargs[m] = substr(y[x], z)
} else {
m = y[x]
}
if (substr(m, 0, 4) != "snd-")
m = "snd-" m
dst[x] = m
}
}
}
function moduleindex(mod, x) {
for (x in modules) {
if (modules[x] == mod)
return x
}
return 0;
}
function addmodule(mod, v, j, k) {
if (moduleindex(mod) > 0)
return
v = split(deps[mod], j, " ")
for (k = 1; k <= v; k++)
addmodule(j[k])
modules[length(modules)+1] = mod
}
function addslavemodules(mod, exclude, m, v, j, k)
{
for (m in deps) {
v = split(deps[m], j, " ")
for (k = 1; k <= v; k++) {
if (j[k] == mod && m != exclude) {
addmodule(m)
}
}
}
}
function addtopmodule(mod, v, j, k, z)
{
v = split(deps[mod], j, " ")
for (k = 1; k <= v; k++) {
for (z = 1; z <= length(alldeps); z++) {
if (j[k] == alldeps[z])
addslavemodules(j[k], mod)
}
}
addmodule(mod)
addslavemodules(mod)
}
BEGIN {
if (length(usermods) > 0)
skipemptyuser(acurmods, usermods, " ")
else
skipempty(acurmods, curmods, " ")
skipempty(atopmods, topmods, " ")
for (b in atopmods)
alldeps[b] = atopmods[b]
# hack to load HDA codec modules
alldeps[length(alldeps)+1] = "snd-hda-codec"
}
{
split(\$0, a, "[: ]")
first = 1
for (b = 1; b <= length(a); b++) {
if (length(a[b]) <= 0)
continue
base = basename(a[b])
if (first) {
mod = base
deps[mod] = ""
first = 0
} else {
if (length(deps[mod]) > 0)
deps[mod] = deps[mod] " " base
else
deps[mod] = base
}
}
delete a
}
END {
addmodule("snd-page-alloc")
addmodule("snd-dummy1")
# all direct toplevel modules dependencies
for (mod in deps) {
split(deps[mod], mods, " ")
for (d in atopmods) {
if (mod != atopmods[d])
continue
for (b in acurmods) {
mod1 = acurmods[b]
v = gsub("_", "-", mod1)
if (mod != acurmods[b] && mod != mod1)
continue
addtopmodule(mod)
break
}
}
}
addmodule("snd-seq")
addmodule("snd-mixer-oss")
for (b in modules) {
if ("snd-pcm" == modules[b])
addmodule("snd-pcm-oss")
}
for (b = 1; b <= length(modules); b++) {
mod = modules[b]
if (length(mod) > 0) {
arg = ""
for (d in modargs) {
if (d == mod)
arg = modargs[d]
}
print mod arg
}
}
}
EOF
awk -f "$tmpdir/run.awk" \
-v curmods="$curmods" \
-v usermods="$usermods" \
-v topmods="$topmods" \
"$tmpdir/modules.dep" > $dst || exit 1
rm "$tmpdir/run.awk" || exit 1
if ! test -s $dst; then
if test -n "$usermods"; then
echo >&2 "Unable to determine specified ALSA kernel modules."
else
echo >&2 "Unable to determine current ALSA kernel modules."
fi
exit 1
fi
if test -z "$usermods"; then
echo "File modules.insmod has been created."
fi
else
if test -z "$usermods"; then
echo "File modules.insmod is cached."
fi
fi
kill_audio_apps
my_rmmod $curmods
dmesg > ../dmesg.txt.1
$modprobe_prg soundcore
my_insmod $(cat $dst)
echo "Kernel modules ready:"
cat /proc/asound/cards
if ! alsactl init 2> /dev/null > /dev/null ; then
echo "Mixer initialized using 'alsactl init' command."
else
echo "Use a mixer application (like alsamixer) to set reasonable volume levels."
fi
dmesg > ../dmesg.txt.2
show_kernel_messages " [kmsg] "
}
# If $package is alsa-driver then reinstall $kernelmodules
kernel_modules() {
if test "$package" != "alsa-driver"; then
echo >&2 "--kernel-modules works only for alsa-driver package."
exit 1
fi
if test "$kernelmodules" = "reinstall"; then
do_kernel_modules
else
local a=$(echo $kernelmodules | sed -e 's/,/ /g')
do_kernel_modules $a
fi
}
# If $package is alsa-driver then list available modules
kernel_modules_list() {
if test "$package" != "alsa-driver"; then
echo >&2 "--kmodlist works only for alsa-driver package."
exit 1
fi
parse_modules
local topmods=$(cat "$tmpdir/modules.top")
for mod in $topmods; do
local desc=$($modinfobin -F description modules/$mod.*o)
echo "$mod: $desc"
done
}
# If $package is alsa-driver then remove current modules
kernel_modules_remove() {
if test "$package" != "alsa-driver"; then
echo >&2 "--kmodremove works only for alsa-driver package."
exit 1
fi
local curmods=$(current_modules)
if test -z "$curmods"; then
echo "No ALSA kernel modules to remove."
exit 0
fi
kill_audio_apps
my_rmmod $curmods
echo "ALSA kernel modules removed."
}
package_switch() {
packagedir="$tmpdir/$package.dir"
packagestatus="$tmpdir/$package.status"
tree=
status=
if test -r $packagedir; then
tree=$(cat $packagedir)
fi
if test -r $packagestatus; then
status=$(cat $packagestatus)
fi
}
rundir=$(pwd)
export LC_ALL=C
export LANGUAGE=C
if test "$kmodmesg" = "true"; then
show_kernel_messages
exit 0
fi
if test -n "$clean"; then
if test "$clean" = "full"; then
echo -n "Removing tree $tmpdir:"
if test -d "$tmpdir"; then
if ! rm -rf "$tmpdir"; then
echo " failed"
exit 1
fi
fi
echo " success"
else
package_switch $clean
package="$clean"
echo -n "Removing package $package:"
rm "$tmpdir/environment.*" 2> /dev/null
if test "$package" = "alsa-driver"; then
rm -rf "$tmpdir/modules.*"
rm -rf "$tmpdir/run.awk"
fi
if test -n "$tree"; then
if test -d "$tmpdir/$tree"; then
if ! rm -rf "$tmpdir/$tree"; then
echo " failed"
exit 1
fi
fi
rm -f "$packagedir"
echo " success"
elif test -d $package; then
rm -rf $package
echo " success"
else
echo " success"
fi
fi
exit 0
fi
protocol=$(echo $url | cut -d ':' -f 1)
check_environment
do_cmd cd $tmpdir
package_switch $package
if test "$kmodremove" = "true"; then
kernel_modules_remove
exit 0
fi
if test "$kmodlist" = "true" -a -z "$compile" -a -n "$tree" -a -n "$status"; then
do_cmd cd $tree
kernel_modules_list
exit 0
fi
if test -n "$kernelmodules" -a -z "$compile" -a -n "$tree" -a -n "$status"; then
do_cmd cd $tree
kernel_modules
exit 0
fi
case "$protocol" in
http|https|ftp|file)
check_compilation_environment
if test -n "$tree"; then
echo "$package tree $tree is present."
echo "Reusing it."
echo "Use '$0 --clean=$package' command to refetch and rebuild."
else
snapshot="snapshot.tar.bz2"
if test "$protocol" = "file"; then
tree=$(echo $url | cut -d ':' -f 2)
if test "${tree:0:1}" = "/"; then
tree=${tree:1}
fi
if test "${tree:0:1}" = "/"; then
tree=${tree:1}
fi
if test -r "$rundir/$tree/gitcompile"; then
tree="$rundir/$tree"
elif test -r "$rundir/$tree/../gitcompile"; then
tree="$rundir/$tree/.."
elif test -r "$rundir/$tree/../$package/gitcompile"; then
tree="$rundir/$tree/../$package"
fi
if test -d "$tree"; then
tree=$(cd "$tree" && pwd)
else
echo >&2 "Fatal: $package tree '$tree' not found."
exit 1
fi
else
download_http_file $url $snapshot
do_cmd tar xjf $snapshot
rm $snapshot
tree=$(ls | grep $package)
fi
fi
if ! test -x $tree/gitcompile ; then
echo >&2 "Fatal: $package tree '$tree' not found."
exit 1
fi
echo "Sources unpacked to $tree"
echo $tree > $packagedir
do_cmd cd $tree
do_compile
status="compile"
echo $status > $packagestatus
if test "$install" = "true"; then
do_install
else
echo "ALSA package $package was successfully built."
echo "Binaries are in $tmpdir/$tree directory."
fi
cd ..
;;
git)
check_compilation_environment
if test -n "$tree" ; then
echo "$package tree $package is present."
echo "Reusing it."
echo "Use '$0 --clean=$package' command to refetch and rebuild."
else
git_clone $url $package
echo "$package" > $packagedir
fi
do_cmd cd $package
do_compile
status="compile"
echo $status > $packagestatus
if test "$install" = "true"; then
do_install
else
echo "ALSA package $package was successfully built."
echo "Binaries are in $tmpdir/$package directory."
fi
cd ..
;;
*)
echo >&2 "Unknown protocol '$protocol'."
exit 1
esac
if test "$kmodlist" = "true"; then
if test -z "$tree" -o -z "$status"; then
echo >&2 "Package $package is not compiled."
echo >&2 "Cannot list kernel modules."
exit 1
fi
do_cmd cd $tree
kernel_modules_list
exit 0
fi
if test -n "$kernelmodules"; then
if test -z "$tree" -o -z "$status"; then
echo >&2 "Package $package is not compiled."
echo >&2 "Cannot insert kernel modules."
exit 1
fi
do_cmd cd $tree
kernel_modules
exit 0
fi
if test -n "$runargs"; then
if test "$package" != "alsa-lib"; then
libtree=
libstatus=
if test -r "$tmpdir/alsa-lib.dir"; then
libtree=$(cat $tmpdir/alsa-lib.dir)
fi
if test -r "$tmpdir/alsa-lib.status"; then
libstatus=$(cat $tmpdir/alsa-lib.status)
fi
else
libtree=$tree
libstatus=$status
fi
if test -z "$libtree" -o -z "$libstatus"; then
echo >&2 "Package $package is not compiled."
echo >&2 "Cannot use alsa-lib."
exit 1
fi
f="$tmpdir/$libtree/src/.libs/libasound.so.2.0.0"
if test -r $f; then
do_cmd "export LD_PRELOAD=$f"
do_cmd "export ALSA_CONFIG_PATH=\"$tmpdir/$libtree/src/conf/alsa.conf\""
do_cmd $runargs
else
echo >&2 "Unable to find alsa-lib.so."
exit 1
fi
fi
exit 0