blob: e91938c3c1331d2475e08bb781432040f40422a3 (
plain) (
tree)
|
|
#!/bin/bash
fetch_source() {
local version url
mkdir -p src
cde src
for version in $NVIDIA_VERSIONS; do
for url in $REQUIRED_URL; do
url="${url//%VERSION%/$version}"
pinfo "Downloading '$url'"
wget -O "${version}.run" "$url" && continue 2
done
perror "Could not download installer for $version"
done
}
build() {
local bundle destdir builddir version
pdebug "--- chroot ---------------------------------------------------------------------"
pdebug "- -"
pdebug "- Notice: This may take a while! -"
pdebug "- -"
pdebug "- Please keep note the Nvidia installer _will_ complain about -"
pdebug "- several warnings and errors. It will do this in any case. -"
pdebug "- -"
pdebug "- This does _not_ mean the library module compilation was unsuccessful! -"
pdebug "- -"
pdebug "--------------------------------------------------------------------------------"
declare -A pciids
local file RESULT NVIDIA_MODULES drmfile filenum
filenum=10
for version in $NVIDIA_VERSIONS; do
bundle="${MODULE_WORK_DIR}/src/${version}.run"
builddir="${MODULE_BUILD_DIR}/${version}"
destdir="${builddir}/NVIDIA"
pdebug "Unpacking NVidia-Installer ..."
[ -d "$destdir" ] && rm -rf "$destdir"
sh "$bundle" --extract-only --target "$destdir" || perror "Could not extract $bundle to $destdir."
if ! [ -s "$builddir/supportedchips.html" ]; then
download "${REQUIRED_HTML//%VERSION%/$version}" "$builddir/supportedchips.html"
fi
local KMOD_ERROR="(ERROR: The nvidia kernel module was not created.|.ko failed to build)"
local KMOD_LOG="/var/log/nvidia-installer.kmod.log"
pinfo "Ready to chroot - may take some time."
chroot_run "${builddir}" <<-EOF
echo "Removing nvidia from /proc/modules so we can build on hosts with nvidia (....)"
ln -nfs /usr/bin/true /usr/sbin/lsmod
grep -v nvidia /proc/modules > /tmp/modules
mount --bind /tmp/modules /proc/modules
/NVIDIA/nvidia-installer --no-nouveau-check --no-backup --no-rpms \
--no-distro-scripts --no-cc-version-check --no-x-check --no-precompiled-interface --silent \
--skip-module-unload --no-kernel-module-source \
--no-nvidia-modprobe \
--log-file-name="$KMOD_LOG" --kernel-source-path "/$KERNEL_HEADERS_DIR"
grep -qE "$KMOD_ERROR" "$KMOD_LOG" \
|| /NVIDIA/nvidia-installer --no-nouveau-check --no-backup --no-rpms \
--no-distro-scripts --no-cc-version-check --no-x-check --no-precompiled-interface --silent \
--skip-module-unload --no-kernel-module-source \
--no-nvidia-modprobe \
--no-kernel-module
exit 0 # Fake it since it will try to load the module and probably fail
EOF
rm -f -- "${builddir}/usr/sbin/lsmod" # Don't want this outside the container
if grep -qE "$KMOD_ERROR" "${builddir}${KMOD_LOG}"; then
pwarning "Could not compile all kernel modules: $( grep -E "$KMOD_ERROR" "${builddir}${KMOD_LOG}" )"
perror "Bailing out..."
fi
pinfo "chroot terminated, cleaning up"
# move whiteout list to its /opt/openslx/etc/nvidia.whiteout (inside $builddir, for lib target)
if [ -e "${builddir}/overlay.whiteout.list" ]; then
mkdir -p "${builddir}/opt/openslx/etc"
mv "${builddir}/overlay.whiteout.list" "${builddir}/opt/openslx/etc/nvidia.whiteout"
fi
ldconfig -v -n -r "${builddir}" /usr/lib/x86_64-linux-gnu/ /usr/lib/x86_64-linux-gnu/vdpau/ /usr/lib/xorg/modules/extensions/
# These sometimes maybe don't get created
[ -f "${builddir}/usr/lib/x86_64-linux-gnu/vdpau/libvdpau_nvidia.so.${version}" ] \
&& ln -nfs "vdpau/libvdpau_nvidia.so.${version}" "${builddir}/usr/lib/x86_64-linux-gnu/libvdpau_nvidia.so"
if [ -f "${builddir}/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.${version}" ]; then
ln -nfs "libGLX_nvidia.so.${version}" "${builddir}/usr/lib/x86_64-linux-gnu/libGLX_nvidia.so.0"
ln -nfs "libGLX_nvidia.so.${version}" "${builddir}/usr/lib/x86_64-linux-gnu/libGLX_indirect.so.0"
fi
[ -f "${builddir}/usr/lib/xorg/modules/extensions/libglxserver_nvidia.so.${version}" ] \
&& ln -nfs "libglxserver_nvidia.so.${version}" "${builddir}/usr/lib/xorg/modules/extensions/libglxserver_nvidia.so"
# Kernel related - outside of version subdir ($builddir)
NVIDIA_MODULES="${MODULE_BUILD_DIR}/lib/modules/nvidia/${version}"
mkdir -p "$NVIDIA_MODULES"
pinfo "Copying kernel modules..."
for file in nvidia.ko nvidia-uvm.ko nvidia-modeset.ko nvidia-drm.ko; do
RESULT=$(find "$builddir/NVIDIA/kernel" -name "$file" | head -n 1)
[ -z "$RESULT" ] && perror "Could not find built module $file in ./NVIDIA/kernel"
pinfo "Fetching ${file}..."
strip -g "$RESULT" || pwarning "Could not strip $file"
cp "$RESULT" "$NVIDIA_MODULES" || perror "Could not copy $file"
done
mkdir -p "${MODULE_BUILD_DIR}/drm.cfg.d"
drmfile="${MODULE_BUILD_DIR}/drm.cfg.d/$(( filenum++ ))-nvidia-$version"
cat > "$drmfile" <<-BLOFF
@nvidia-${version} acpi_ipmi nvidia/$version/nvidia.ko nvidia/$version/nvidia-uvm.ko nvidia/$version/nvidia-modeset.ko nvidia/$version/nvidia-drm.ko
@nvidia-${version}_fallback nouveau
BLOFF
if ! [ -s "${builddir}/supportedchips.html" ]; then
pwarning "No supportedchips.html -- THE GOGGLES, THEY DO NOTHING!"
else
local mode line dev version
pinfo "Creating drm.cfg"
local regex='^<td[^>]*>([0-9A-F]{4})(\s+[0-9A-F]{4}\s+[0-9A-F]{4})?<'
mode=0
while read -r line; do
if [[ "$line" =~ '<a name="legacy_' ]]; then
break # For now, we stop here; older versions will be fetched from their own html file
elif [[ "$mode" = 0 ]] && [[ "$line" =~ ^'<tr' ]]; then
mode=1
elif [[ "$mode" = 1 ]] && [[ "$line" =~ ^'<td' ]]; then
mode=2
elif [[ "$mode" = 2 ]] && [[ "$line" =~ $regex ]]; then
mode=0
dev="${BASH_REMATCH[1]}"
dev="${dev~~}"
if [ -n "${pciids[$dev]}" ]; then
pdebug "$dev already handled"
else
echo "10de:$dev @nvidia-$version"
pciids[$dev]=1
fi
else
mode=0
dev=
fi
done < "${builddir}/supportedchips.html" >> "$drmfile"
fi
rm -rf -- "$destdir"
done
}
post_copy() {
:
}
|