#!/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='^]*>([0-9A-F]{4})(\s+[0-9A-F]{4}\s+[0-9A-F]{4})?<' mode=0 while read -r line; do if [[ "$line" =~ '> "$drmfile" fi rm -rf -- "$destdir" done } post_copy() { : }