summaryrefslogblamecommitdiffstats
path: root/core/modules/nvidia-common/module.build
blob: e91938c3c1331d2475e08bb781432040f40422a3 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12

                
                         
                    
               
                                           





                                                                     


























                                                                                                                       


                                                                                                       

                                                                                                         

                                                             




                                                                                                     
                                                                                   
                                                                                                                            
                                                                                
                                                      


                                                                                                       
                                                                                              
                                                                                                                            

                                                                                
                                                  
 

                                                                                       
                                                                                             

                                                                                                                            



                                                      
                                                                                                               




                                                                                                            










                                                                                                                                             

                                                                                  









                                                                                                         

                                                                                        
                                         
                                                                                                                                                                                       




                                                                                          
                                                   
                                                
                                                                                             







                                                                                                                              
                                                                                       
                                              

                                                                







                                                                                          



                                                                              
 







                                    
#!/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() {
	:
}