summaryrefslogblamecommitdiffstats
path: root/remote/modules/nvidia_libs/nvidia_libs.build
blob: 49f78d5b2d58c00e6a05d3cebf5784fe78d77452 (plain) (tree)
1
2
3
4
5
6
7
8
9
                
                    





                                                                        
                                        
                              
                                              





                                                                                                 
        






                                                                                                                                   
        
                       


                                                                                                                                 
                                                                                                 
                                            
                                                                                                                                        

                    
        


                                                                                                                                                                                                             
                






                                                                                                                                     
                   
         
        
                          
                                                                        
                                                                                                                                        
         
        

                                                                                                                                  




                                                                                                             
         
        



                                                                                                               
                                                              
                                                                                           
                                                          

                                                                                             

                    
        

                                                                                             
                                             
         
        
                    
                                                     
                 
                                         
                  
        
                                                        
                  
        
                                               
                     
        







                                                                                                 
                                                                                                 


                                                                                                 
                                              
        
                                        
                   
        

                                       
        
                                                      






                  
fetch_source() {
	mkdir -p src
	cd src || perror "Could not change into src directory."
	download "$REQUIRED_URL"
}

build() {
	local KERNELSRCDIR="$MODULE_DIR/../kernel/ksrc"	# kernel sources
	local TEMPDIR="$MODULE_DIR/temp"
	local ROOTLOWERDIR="/"
	local ROOTUPPERDIR="$MODULE_BUILD_DIR"
	local ROOTBINDDIR="$TEMPDIR/rootbind"
	local ROOTMOUNTDIR="$TEMPDIR/rootmount"
	local BINDMOUNTS="/dev /proc /run /sys"
	local NVIDIA="$MODULE_DIR/src/$REQUIRED_NVIDIA"
	local NVIDIAEXTRACTDIR="$ROOTMOUNTDIR/NVIDIA"
	local NVEXTRACTDIR="/NVIDIA"				# This is relative to the chroot.
	
	make_dirs () {
		[ -d "$TEMPDIR" ] && rm -rf "$TEMPDIR"
		mkdir -p "$TEMPDIR"			|| perror "Could not create base directory for mount directories $TEMPDIR."
		for DIR in "$ROOTBINDDIR" "$ROOTMOUNTDIR"; do
			mkdir -p "$DIR"			|| perror "Could not create directory for mount directory $DIR."
		done
	}
	
	mount_dirs () {
		mount -o bind "$ROOTLOWERDIR" "$ROOTBINDDIR"	|| perror "Could not mount (bind) $ROOTLOWERDIR to $ROOTBINDDIR."
		mount -o remount,ro "$ROOTBINDDIR"		|| perror "Could not remount $ROOTBINDDIR ro read-only."
		mount -t overlayfs overlayfs -o lowerdir="$ROOTBINDDIR",upperdir="$ROOTUPPERDIR" "$ROOTMOUNTDIR"  \
		|| perror "Could not mount (overlayfs) $ROOTLOWERDIR, $ROOTUPPERDIR to $BINDDIR."
		for MOUNT in $BINDMOUNTS; do
			mount -o bind "$MOUNT" "$ROOTMOUNTDIR/$MOUNT"	|| perror "Could not mount (bind) $MOUNTS into chroot root dir."
		done
	}
	
	# We inject a bashrc to be executed later within the chroot.
	gen_bashrc () {
		local COMMON_OPTIONS=' --no-nouveau-check --no-network --no-backup --no-rpms --no-runlevel-check --no-distro-scripts --no-cc-version-check --no-x-check --no-precompiled-interface --silent '
		
		cat >"$ROOTMOUNTDIR/$HOME/.bashrc"<<-EOF
		echo "chroot successful."
		alias ll='ls -alF'				# A little convenience for debugging purposes.
		PS1='\[\e[1;33m\]chroot@\h:\w\$ \[\e[1;32m\]'	# To recognize the chroot instantly when debugging (yellow on black).
		cd "$NVEXTRACTDIR"
		./nvidia-installer $COMMON_OPTIONS --no-kernel-module		# Do the work!
		exit						# Out-comment this for debugging: Then script stays in chroot.
		EOF
	}
	
	unpack_nvidia () {
		[ -d "$NVIDIAEXTRACTDIR" ] && rm -rf "$NVIDIAEXTRACTDIR"
		sh "$NVIDIA" --extract-only --target "$NVIDIAEXTRACTDIR" ||	perror "Could not extract $NVIDIA to $NVIDIAEXTRACTDIR."
	}
	
	umount_dirs () {
		# Let's tidy the place, or at least the mounts: Otherwise these would stack up, and we do not like that, don't we.
		for MOUNT in $BINDMOUNTS; do
			umount "$ROOTMOUNTDIR/$MOUNT"	|| pwarning "Could not unmount $ROOTMOUNTDIR/$MOUNT!"
		done
		umount "$ROOTMOUNTDIR"			|| pwarning "Could not unmount $ROOTMOUNTDIR!"
		umount "$ROOTBINDDIR"			|| pwarning "Could not unmount $ROOTBINDDIR!"
	}
	
	handle_whiteouts () {
		local WHITEOUT_LIST="${MODULE_BUILD_DIR}/opt/openslx/etc/nvidia.whiteout"
		rm -f -- "$WHOUTEOUT_LIST"
		mkdir -p "$(dirname "$WHITEOUT_LIST")" || perror "Could not create $(dirname "$WHITEOUT_LIST")"
		pdebug "Searching for overlayfs-whiteouts ..."
		for WHITEOUT in $(find "$MODULE_BUILD_DIR" -lname "(overlay-whiteout)"); do
			pdebug "Whiteout found: $WHITEOUT"
			echo "/./${WHITEOUT#$MODULE_BUILD_DIR}" >> "$WHITEOUT_LIST"
			rm -f -- "$WHITEOUT" || perror "Could not delete whiteout $WHITEOUT!"
		done
	}
	
	clean_temp () {
		rm -rf "$TEMPDIR" || perror "Could not clean/delete temp directory $TEMPDIR."
		rm -rf "$ROOTUPPERDIR/NVIDIA"
	}
	
	# Main stuff
	pdebug "Generating temporary directories ..."
	make_dirs
	pdebug "Mounting directories ..."
	mount_dirs
	
	pdebug "Injecting .bashrc into later chroot ..."
	gen_bashrc
	
	pdebug "Unpacking NVidia-Installer ..."
	unpack_nvidia
	
	pinfo "Ready to chroot - compiling may take some time."
	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 "--------------------------------------------------------------------------------"
	chroot "$ROOTMOUNTDIR"
	pinfo "chroot terminated, cleaning up"
	
	pdebug "Unmount directories ..."
	umount_dirs
	
	pdebug "Handling whiteouts ..."
	handle_whiteouts
	
	pdebug "Cleaning / deleting temp directories."
	clean_temp
}

post_copy() {
	:
}