intel-oneapi packages: support root installs (#23401)
When installing OneAPI packages as root (e.g. in a container), the installer places cache files in /var/intel/installercache that interfere with future Spack installs. This ensures that when running an installation as a root user that this is removed.
This commit is contained in:
		@@ -7,6 +7,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import getpass
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
from sys import platform
 | 
					from sys import platform
 | 
				
			||||||
from os.path import basename, dirname, isdir
 | 
					from os.path import basename, dirname, isdir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,6 +49,22 @@ def install(self, spec, prefix, installer_path=None):
 | 
				
			|||||||
            installer_path = basename(self.url_for_version(spec.version))
 | 
					            installer_path = basename(self.url_for_version(spec.version))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if platform == 'linux':
 | 
					        if platform == 'linux':
 | 
				
			||||||
 | 
					            # Intel installer assumes and enforces that all components
 | 
				
			||||||
 | 
					            # are installed into a single prefix. Spack wants to
 | 
				
			||||||
 | 
					            # install each component in a separate prefix. The
 | 
				
			||||||
 | 
					            # installer mechanism is implemented by saving install
 | 
				
			||||||
 | 
					            # information in a directory called installercache for
 | 
				
			||||||
 | 
					            # future runs. The location of the installercache depends
 | 
				
			||||||
 | 
					            # on the userid. For root it is always in /var/intel. For
 | 
				
			||||||
 | 
					            # non-root it is in $HOME/intel.
 | 
				
			||||||
 | 
					            #
 | 
				
			||||||
 | 
					            # The method for preventing this install from interfering
 | 
				
			||||||
 | 
					            # with other install depends on the userid. For root, we
 | 
				
			||||||
 | 
					            # delete the installercache before and after install. For
 | 
				
			||||||
 | 
					            # non root we redefine the HOME environment variable.
 | 
				
			||||||
 | 
					            if getpass.getuser() == 'root':
 | 
				
			||||||
 | 
					                shutil.rmtree('/var/intel/installercache', ignore_errors=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            bash = Executable('bash')
 | 
					            bash = Executable('bash')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Installer writes files in ~/intel set HOME so it goes to prefix
 | 
					            # Installer writes files in ~/intel set HOME so it goes to prefix
 | 
				
			||||||
@@ -57,6 +75,9 @@ def install(self, spec, prefix, installer_path=None):
 | 
				
			|||||||
                 '--eula', 'accept',
 | 
					                 '--eula', 'accept',
 | 
				
			||||||
                 '--install-dir', prefix)
 | 
					                 '--install-dir', prefix)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if getpass.getuser() == 'root':
 | 
				
			||||||
 | 
					                shutil.rmtree('/var/intel/installercache', ignore_errors=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Some installers have a bug and do not return an error code when failing
 | 
					        # Some installers have a bug and do not return an error code when failing
 | 
				
			||||||
        if not isdir(join_path(prefix, self.component_dir)):
 | 
					        if not isdir(join_path(prefix, self.component_dir)):
 | 
				
			||||||
            raise RuntimeError('install failed')
 | 
					            raise RuntimeError('install failed')
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user