mirror_ubuntu-kernels/debian/scripts/dkms-build

272 lines
7.4 KiB
Bash
Executable File

#!/bin/sh
set -e
dkms_dir="$1"
abi_flavour="$2"
sign="$3"
pkgname="$4"
pkgdir="$5"
dbgpkgdir="$6"
package="$7"
shift 7
here=$(dirname "$(readlink -f "${0}")")
srcdir=$(pwd)
cd "$dkms_dir" || exit 1
built_using_record()
{
local subst="$1"
local built_using="$2"
if [ ! -f "$subst" ]; then
touch "$subst"
fi
if ! grep -q -s "^linux:BuiltUsing=" "$subst"; then
echo "linux:BuiltUsing=" >>"$subst"
fi
sed -i -e "s/^\(linux:BuiltUsing=.*\)/\1$built_using, /" "$subst"
}
# ABI: returns present in $? and located path in lpackage_path when found.
package_present()
{
for lpackage_path in "$1"_*.deb
do
break
done
[ -f "$lpackage_path" ]
}
# Download and extract the DKMS package -- note there may be more
# than one package to install.
for package_path in "$@"
do
package_file=$(basename "$package_path")
echo "II: dkms-build downloading $package ($package_file)"
rpackage=$( echo "$package_path" | sed -e 's@.*/@@' -e 's@_.*@@' )
lpackage=$( echo "$rpackage" | sed -e 's@=.*@@' )
while true
do
if package_present "$lpackage"; then
break
fi
case "$package_path" in
pool/*)
# Attempt download from the launchpad librarian first.
"$here/file-downloader" "https://launchpad.net/ubuntu/+archive/primary/+files/$package_file" || true
if package_present "$lpackage"; then
break
fi
# Download from the available pools.
for pool in $( grep -h '^deb ' /etc/apt/sources.list /etc/apt/sources.list.d/*.list | awk '{print $2}' | sort -u )
do
if package_present "$lpackage"; then
break
fi
url="$pool/$package_path"
"$here/file-downloader" "$url" && break || true
# No components in PPAs.
url=$(echo "$url" | sed -e 's@/pool/[^/]*/@/pool/main/@')
"$here/file-downloader" "$url" && break || true
done
;;
http*:*)
"$here/file-downloader" "$package_path"
;;
*/*)
cp -p "$package_path" .
;;
*)
apt-get download "$rpackage"
;;
esac
break
done
if ! package_present "$lpackage"; then
echo "EE: $lpackage not found"
exit 1
fi
dpkg -x "$lpackage"_*.deb "$package"
lversion=$( echo "$lpackage_path" | sed -e 's@.*/@@' -e 's@_[^_]*$@@' -e 's@.*_@@')
#built_using_record "$srcdir/debian/$pkgname.substvars" "$built_using$lpackage (= $lversion)"
done
# Pick out the package/version from the dkms.conf.
for dkms_conf in "$package/usr/src"/*/"dkms.conf"
do
break
done
# It seems some packages have a # in the name which works fine if the
# package is installed directly, but not so much if we build it out
# of the normal location.
sed -i -e '/^PACKAGE_NAME=/ s/#//g' "$dkms_conf"
# Run any dkms-package specfic configuration steps
dkms_config_specific="$srcdir/$0-configure--$package"
dkms_config_generic=$(echo "$dkms_config_specific" | sed -e 's/-[0-9][0-9]*$/-N/')
for dkms_config in "$dkms_config_specific" "$dkms_config_generic"
do
if [ -z "$dkms_config" -o ! -e "$dkms_config" ]; then
continue
fi
echo "II: dkms-build-configure $(basename "$dkms_config") found, executing"
"$dkms_config" \
"$srcdir" \
"$dkms_conf" \
"$dkms_dir" \
"$abi_flavour" \
"$sign" \
"$pkgname" \
"$pkgdir" \
"$dbgpkgdir" \
"$package" \
"$@" || exit 1
break
done
cat - <<'EOF' >>"$dkms_conf"
POST_BUILD="ubuntu-save-objects ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build ${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/objects $POST_BUILD"
EOF
ubuntu_script="$(dirname "$dkms_conf")/ubuntu-save-objects"
cat - <<'EOF' >"$ubuntu_script"
#!/bin/sh
from="$1"
to="$2"
script="$3"
shift 2
# Copy the objects.
echo "II: copying objects to '$to'"
mkdir -p "$to"
(cd "$from" && find -name \*.o -o -name \*.mod | cpio -Lpd "$to")
# Call the original post_install script if there is one.
[ "$script" = '' ] && exit 0
shift
exec "$(dirname "$0")/$script" "$@"
EOF
chmod +x "$ubuntu_script"
dkms_package=$( sed -ne 's/PACKAGE_NAME="\(.*\)"/\1/p' "$dkms_conf" )
dkms_version=$( sed -ne 's/PACKAGE_VERSION="\(.*\)"/\1/p' "$dkms_conf" )
# Build the DKMS binaries.
echo "II: dkms-build building $package"
fakeroot=""
[ $(id -u) -ne 0 ] && fakeroot="/usr/bin/fakeroot"
rc=0
$fakeroot /usr/sbin/dkms build --no-prepare-kernel --no-clean-kernel \
-k "$abi_flavour" ${ARCH:+-a $ARCH} \
--sourcetree "$dkms_dir/source" \
--dkmstree "$dkms_dir/build" \
--kernelsourcedir "$dkms_dir/headers/linux-headers-$abi_flavour" \
"$dkms_conf" || rc=$?
# Find the log and add it to our own.
for log in "$dkms_dir/build/$dkms_package/$dkms_version/$abi_flavour"/*/"log/make.log" "$dkms_dir/build/$dkms_package/$dkms_version/build/make.log"
do
if [ -f "$log" ]; then
sed -e "s@$dkms_dir@<<DKMSDIR>>@g" <"$log"
break
fi
done
# If this build failed then exit here.
[ "$rc" != 0 ] && exit "$rc"
# Install the modules with debug symbols we possibly built,
# and strip the original modules for the next install step.
if [ -n "$dbgpkgdir" ]; then
dbgpkgdir="$dbgpkgdir/$package"
echo "II: dkms-build installing $package into $dbgpkgdir (debug symbols)"
install -d "$dbgpkgdir"
find "$dkms_dir/build/$dkms_package/$dkms_version/$abi_version" -name \*.ko |
while read module; do
vmodule=$( basename "$module" )
# Check for '.debug_info' section in order to copy module.
# Useful if debug symbols are requested but not built for
# any reason (including not yet supported by DKMS package).
# Strip module just in case even if section isn't present.
if ${CROSS_COMPILE}objdump -h -j '.debug_info' "$module" >/dev/null 2>&1
then
echo "copying $vmodule"
cp "$module" "$dbgpkgdir"
else
echo "ignoring $vmodule (missing debug symbols)"
fi
# Just 'strip -g' as '/usr/sbin/dkms' does.
echo "stripping $vmodule"
strip -g "$module"
done
fi
# Install and optionally sign the modules we have built.
pkgdir="$pkgdir/$package"
echo "II: dkms-build installing $package into $pkgdir"
install -d "$pkgdir"
find "$dkms_dir/build/$dkms_package/$dkms_version/$abi_version" -name \*.ko |
while read module; do
vmodule=$( basename "$module" )
case "$sign" in
--*)
echo "copying $vmodule"
cp "$module" "$pkgdir"
;;
*)
echo "signing $vmodule"
$sign "$module" "$pkgdir/$vmodule"
;;
esac
done
find "$dkms_dir/build/$dkms_package/$dkms_version/objects" -name \*.o -print | \
while read object
do
"$srcdir/debian/scripts/fix-filenames" "$object" "$dkms_dir"
done
# This assumes that .mod files are in the top level build tree
# If there are ever .mod files in sub-directories, the dirname of objectlist needs to be stripped as well
find "$dkms_dir/build/$dkms_package/$dkms_version/objects" -name \*.mod -print | \
while read objectlist
do
sed "s|^$dkms_dir/build/$dkms_package/$dkms_version/build/||" -i $objectlist
done
# Finally see if there is a dkms-package specific post processor present. Hand
# it the original source directory, destination package directory, the objects
# as squirreled away, and the log in case it is useful. Finally pass a formed
# signing command line in case we need to do that.
dkms_build_specific="$srcdir/$0--$package"
dkms_build_generic=$(echo "$dkms_build_specific" | sed -n -e 's/-[0-9][0-9]*[a-z]*$/-N/p')
for dkms_build in "$dkms_build_specific" "$dkms_build_generic"
do
if [ -z "$dkms_build" -o ! -e "$dkms_build" ]; then
continue
fi
echo "II: dkms-build override $(basename "$dkms_build") found, executing"
"$dkms_build" \
"$srcdir" \
"$dkms_dir/build/$dkms_package/$dkms_version/objects" \
"$log" \
"$dkms_dir" \
"$abi_flavour" \
"$sign" \
"$pkgname" \
"$pkgdir" \
"$dbgpkgdir" \
"$package" \
"$@" || exit 1
break
done
echo "II: dkms-build build $package complete"