intel compiler: fix link time error with LLVMgold.so (#28731)
				
					
				
			The Intel compiler will, at link time, call `ld -plugin LLVMgold.so`, which expects libraries like `libimfo.so` to be found either in the `LD_LIBRARY_PATH` or in `LLVMgold.so`s RPATH. As `LLVMgold.so` already uses RUNPATH, I used that to extend this to the necessary library locations. This PR should fix issues: https://github.com/spack/spack/issues/10308 https://github.com/spack/spack/issues/18606 https://github.com/spack/spack/issues/17100 https://github.com/spack/spack/issues/21237 https://github.com/spack/spack/issues/4261 Co-authored-by: Stephen Sachs <stesachs@amazon.com>
This commit is contained in:
		@@ -24,6 +24,7 @@
 | 
				
			|||||||
    install,
 | 
					    install,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import spack.error
 | 
				
			||||||
from spack.build_environment import dso_suffix
 | 
					from spack.build_environment import dso_suffix
 | 
				
			||||||
from spack.package import InstallError, PackageBase, run_after
 | 
					from spack.package import InstallError, PackageBase, run_after
 | 
				
			||||||
from spack.util.environment import EnvironmentModifications
 | 
					from spack.util.environment import EnvironmentModifications
 | 
				
			||||||
@@ -1333,5 +1334,42 @@ def uninstall_ism(self):
 | 
				
			|||||||
        debug_print(os.getcwd())
 | 
					        debug_print(os.getcwd())
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def base_lib_dir(self):
 | 
				
			||||||
 | 
					        """Provide the library directory located in the base of Intel installation.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        d = self.normalize_path('')
 | 
				
			||||||
 | 
					        d = os.path.join(d, 'lib')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        debug_print(d)
 | 
				
			||||||
 | 
					        return d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @run_after('install')
 | 
				
			||||||
 | 
					    def modify_LLVMgold_rpath(self):
 | 
				
			||||||
 | 
					        """Add libimf.so and other required libraries to the RUNPATH of LLVMgold.so.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        These are needed explicitly at dependent link time when
 | 
				
			||||||
 | 
					        `ld -plugin LLVMgold.so` is called by the compiler.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        if self._has_compilers:
 | 
				
			||||||
 | 
					            LLVMgold_libs = find_libraries('LLVMgold', self.base_lib_dir,
 | 
				
			||||||
 | 
					                                           shared=True, recursive=True)
 | 
				
			||||||
 | 
					            # Ignore ia32 entries as they mostly ignore throughout the rest
 | 
				
			||||||
 | 
					            # of the file.
 | 
				
			||||||
 | 
					            # The first entry in rpath preserves the original, the seconds entry
 | 
				
			||||||
 | 
					            # is the location of libimf.so. If this relative location is changed
 | 
				
			||||||
 | 
					            # in compiler releases, then we need to search for libimf.so instead
 | 
				
			||||||
 | 
					            # of this static path.
 | 
				
			||||||
 | 
					            for lib in LLVMgold_libs:
 | 
				
			||||||
 | 
					                if not self.spec.satisfies('^patchelf'):
 | 
				
			||||||
 | 
					                    raise spack.error.SpackError(
 | 
				
			||||||
 | 
					                        'Attempting to patch RPATH in LLVMgold.so.'
 | 
				
			||||||
 | 
					                        + '`patchelf` dependency should be set in package.py'
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                patchelf = Executable('patchelf')
 | 
				
			||||||
 | 
					                rpath = ':'.join([patchelf('--print-rpath', lib, output=str).strip(),
 | 
				
			||||||
 | 
					                                  '$ORIGIN/../compiler/lib/intel64_lin'])
 | 
				
			||||||
 | 
					                patchelf('--set-rpath', rpath, lib)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Check that self.prefix is there after installation
 | 
					    # Check that self.prefix is there after installation
 | 
				
			||||||
    run_after('install')(PackageBase.sanity_check_prefix)
 | 
					    run_after('install')(PackageBase.sanity_check_prefix)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,8 @@ class IntelParallelStudio(IntelPackage):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    maintainers = ['rscohn2']
 | 
					    maintainers = ['rscohn2']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    depends_on('patchelf', type='build')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # As of 2016, the product comes in three "editions" that vary by scope.
 | 
					    # As of 2016, the product comes in three "editions" that vary by scope.
 | 
				
			||||||
    #
 | 
					    #
 | 
				
			||||||
    # In Spack, select the edition via the version number in the spec, e.g.:
 | 
					    # In Spack, select the edition via the version number in the spec, e.g.:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,8 @@ class Intel(IntelPackage):
 | 
				
			|||||||
    # Robert Cohn
 | 
					    # Robert Cohn
 | 
				
			||||||
    maintainers = ['rscohn2']
 | 
					    maintainers = ['rscohn2']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    depends_on('patchelf', type='build')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Same as in ../intel-parallel-studio/package.py, Composer Edition,
 | 
					    # Same as in ../intel-parallel-studio/package.py, Composer Edition,
 | 
				
			||||||
    # but the version numbering in Spack differs.
 | 
					    # but the version numbering in Spack differs.
 | 
				
			||||||
    version('20.0.4',              sha256='ac1efeff608a8c3a416e6dfe20364061e8abf62d35fbaacdffe3fc9676fc1aa3', url='https://registrationcenter-download.intel.com/akdlm/irc_nas/tec/17117/parallel_studio_xe_2020_update4_composer_edition.tgz')
 | 
					    version('20.0.4',              sha256='ac1efeff608a8c3a416e6dfe20364061e8abf62d35fbaacdffe3fc9676fc1aa3', url='https://registrationcenter-download.intel.com/akdlm/irc_nas/tec/17117/parallel_studio_xe_2020_update4_composer_edition.tgz')
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user