diff options
Diffstat (limited to 'var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py')
-rw-r--r-- | var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py | 278 |
1 files changed, 156 insertions, 122 deletions
diff --git a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py index 2d0807fd60..5579e3146f 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py @@ -3,13 +3,93 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import glob import platform -import subprocess -from os import path +from spack.build_environment import dso_suffix from spack.package import * +linux_versions = [ + { + 'version': '2022.1.0', + 'cpp': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18717/l_dpcpp-cpp-compiler_p_2022.1.0.137_offline.sh', + 'sha256': '1027819581ba820470f351abfc2b2658ff2684ed8da9ed0e722a45774a2541d6' + }, + 'ftn': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18703/l_fortran-compiler_p_2022.1.0.134_offline.sh', + 'sha256': '583082abe54a657eb933ea4ba3e988eef892985316be13f3e23e18a3c9515020' + } + }, + + { + 'version': '2022.0.2', + 'cpp': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18478/l_dpcpp-cpp-compiler_p_2022.0.2.84_offline.sh', + 'sha256': 'ade5bbd203e7226ca096d7bf758dce07857252ec54e83908cac3849e6897b8f3' + }, + 'ftn': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18481/l_fortran-compiler_p_2022.0.2.83_offline.sh', + 'sha256': '78532b4118fc3d7afd44e679fc8e7aed1e84efec0d892908d9368e0c7c6b190c' + } + }, + + { + 'version': '2022.0.1', + 'cpp': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18435/l_dpcpp-cpp-compiler_p_2022.0.1.71_offline.sh', + 'sha256': 'c7cddc64c3040eece2dcaf48926ba197bb27e5a46588b1d7b3beddcdc379926a' + }, + 'ftn': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18436/l_fortran-compiler_p_2022.0.1.70_offline.sh', + 'sha256': '2cb28a04f93554bfeffd6cad8bd0e7082735f33d73430655dea86df8933f50d1' + } + }, + { + 'version': '2021.4.0', + 'cpp': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18209/l_dpcpp-cpp-compiler_p_2021.4.0.3201_offline.sh', + 'sha256': '9206bff1c2fdeb1ca0d5f79def90dcf3e6c7d5711b9b5adecd96a2ba06503828' + }, + 'ftn': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/18210/l_fortran-compiler_p_2021.4.0.3224_offline.sh', + 'sha256': 'de2fcf40e296c2e882e1ddf2c45bb8d25aecfbeff2f75fcd7494068d621eb7e0' + } + }, + { + 'version': '2021.3.0', + 'cpp': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/17928/l_dpcpp-cpp-compiler_p_2021.3.0.3168_offline.sh', + 'sha256': 'f848d81b7cabc76c2841c9757abb2290921efd7b82491d830605f5785600e7a1' + }, + 'ftn': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/17959/l_fortran-compiler_p_2021.3.0.3168_offline.sh', + 'sha256': 'c4553f7e707be8e8e196f625e4e7fbc8eff5474f64ab85fc7146b5ed53ebc87c' + } + }, + { + 'version': '2021.2.0', + 'cpp': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/17749/l_dpcpp-cpp-compiler_p_2021.2.0.118_offline.sh', + 'sha256': '5d01cbff1a574c3775510cd97ffddd27fdf56d06a6b0c89a826fb23da4336d59' + }, + 'ftn': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/17756/l_fortran-compiler_p_2021.2.0.136_offline.sh', + 'sha256': 'a62e04a80f6d2f05e67cd5acb03fa58857ee22c6bd581ec0651c0ccd5bdec5a1' + } + }, + { + 'version': '2021.1.2', + 'cpp': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/17513/l_dpcpp-cpp-compiler_p_2021.1.2.63_offline.sh', + 'sha256': '68d6cb638091990e578e358131c859f3bbbbfbf975c581fd0b4b4d36476d6f0a' + }, + 'ftn': { + 'url': 'https://registrationcenter-download.intel.com/akdlm/irc_nas/17508/l_fortran-compiler_p_2021.1.2.62_offline.sh', + 'sha256': '29345145268d08a59fa7eb6e58c7522768466dd98f6d9754540d1a0803596829' + } + } +] + @IntelOneApiPackage.update_description class IntelOneapiCompilers(IntelOneApiPackage): @@ -25,125 +105,15 @@ class IntelOneapiCompilers(IntelOneApiPackage): depends_on('patchelf', type='build') if platform.system() == 'Linux': - version('2022.1.0', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18717/l_dpcpp-cpp-compiler_p_2022.1.0.137_offline.sh', - sha256='1027819581ba820470f351abfc2b2658ff2684ed8da9ed0e722a45774a2541d6', - expand=False) - resource(name='fortran-installer', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18703/l_fortran-compiler_p_2022.1.0.134_offline.sh', - sha256='583082abe54a657eb933ea4ba3e988eef892985316be13f3e23e18a3c9515020', - expand=False, - placement='fortran-installer', - when='@2022.1.0') - version('2022.0.2', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18478/l_dpcpp-cpp-compiler_p_2022.0.2.84_offline.sh', - sha256='ade5bbd203e7226ca096d7bf758dce07857252ec54e83908cac3849e6897b8f3', - expand=False) - resource(name='fortran-installer', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18481/l_fortran-compiler_p_2022.0.2.83_offline.sh', - sha256='78532b4118fc3d7afd44e679fc8e7aed1e84efec0d892908d9368e0c7c6b190c', - expand=False, - placement='fortran-installer', - when='@2022.0.2') - version('2022.0.1', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18435/l_dpcpp-cpp-compiler_p_2022.0.1.71_offline.sh', - sha256='c7cddc64c3040eece2dcaf48926ba197bb27e5a46588b1d7b3beddcdc379926a', - expand=False) - resource(name='fortran-installer', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18436/l_fortran-compiler_p_2022.0.1.70_offline.sh', - sha256='2cb28a04f93554bfeffd6cad8bd0e7082735f33d73430655dea86df8933f50d1', - expand=False, - placement='fortran-installer', - when='@2022.0.1') - version('2021.4.0', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18209/l_dpcpp-cpp-compiler_p_2021.4.0.3201_offline.sh', - sha256='9206bff1c2fdeb1ca0d5f79def90dcf3e6c7d5711b9b5adecd96a2ba06503828', - expand=False) - resource(name='fortran-installer', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/18210/l_fortran-compiler_p_2021.4.0.3224_offline.sh', - sha256='de2fcf40e296c2e882e1ddf2c45bb8d25aecfbeff2f75fcd7494068d621eb7e0', - expand=False, - placement='fortran-installer', - when='@2021.4.0') - version('2021.3.0', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/17928/l_dpcpp-cpp-compiler_p_2021.3.0.3168_offline.sh', - sha256='f848d81b7cabc76c2841c9757abb2290921efd7b82491d830605f5785600e7a1', - expand=False) - resource(name='fortran-installer', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/17959/l_fortran-compiler_p_2021.3.0.3168_offline.sh', - sha256='c4553f7e707be8e8e196f625e4e7fbc8eff5474f64ab85fc7146b5ed53ebc87c', - expand=False, - placement='fortran-installer', - when='@2021.3.0') - version('2021.2.0', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/17749/l_dpcpp-cpp-compiler_p_2021.2.0.118_offline.sh', - sha256='5d01cbff1a574c3775510cd97ffddd27fdf56d06a6b0c89a826fb23da4336d59', - expand=False) - resource(name='fortran-installer', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/17756/l_fortran-compiler_p_2021.2.0.136_offline.sh', - sha256='a62e04a80f6d2f05e67cd5acb03fa58857ee22c6bd581ec0651c0ccd5bdec5a1', - expand=False, - placement='fortran-installer', - when='@2021.2.0') - version('2021.1.2', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/17513/l_dpcpp-cpp-compiler_p_2021.1.2.63_offline.sh', - sha256='68d6cb638091990e578e358131c859f3bbbbfbf975c581fd0b4b4d36476d6f0a', - expand=False) - resource(name='fortran-installer', - url='https://registrationcenter-download.intel.com/akdlm/irc_nas/17508/l_fortran-compiler_p_2021.1.2.62_offline.sh', - sha256='29345145268d08a59fa7eb6e58c7522768466dd98f6d9754540d1a0803596829', - expand=False, - placement='fortran-installer', - when='@2021.1.2') + for v in linux_versions: + version(v['version'], expand=False, **v['cpp']) + resource(name='fortran-installer', placement='fortran-installer', + when='@{0}'.format(v['version']), expand=False, **v['ftn']) @property def component_dir(self): return 'compiler' - def _ld_library_path(self): - dirs = ['lib', - join_path('lib', 'x64'), - join_path('lib', 'emu'), - join_path('lib', 'oclfpga', 'host', 'linux64', 'lib'), - join_path('lib', 'oclfpga', 'linux64', 'lib'), - join_path('compiler', 'lib', 'intel64_lin'), - join_path('compiler', 'lib')] - for dir in dirs: - yield join_path(self.component_path, 'linux', dir) - - def install(self, spec, prefix): - # install cpp - # Copy instead of install to speed up debugging - # subprocess.run(f'cp -r /opt/intel/oneapi/compiler {prefix}', shell=True) - super(IntelOneapiCompilers, self).install(spec, prefix) - - # install fortran - super(IntelOneapiCompilers, self).install( - spec, - prefix, - installer_path=glob.glob(join_path('fortran-installer', '*'))[0]) - - # Some installers have a bug and do not return an error code when failing - if not path.isfile(join_path(self.component_path, 'linux', - 'bin', 'intel64', 'ifort')): - raise RuntimeError('install failed') - - # set rpath so 'spack compiler add' can check version strings - # without setting LD_LIBRARY_PATH - rpath = ':'.join(self._ld_library_path()) - patch_dirs = [join_path('lib'), - join_path('compiler', 'lib', 'intel64_lin'), - join_path('compiler', 'lib', 'intel64'), - 'bin'] - for pd in patch_dirs: - patchables = glob.glob(join_path(self.component_path, 'linux', pd, '*')) - patchables.append(join_path(self.component_path, - 'linux', 'lib', 'icx-lto.so')) - for file in patchables: - # Try to patch all files, patchelf will do nothing if - # file should not be patched - subprocess.call(['patchelf', '--set-rpath', rpath, file]) - def setup_run_environment(self, env): """Adds environment variables to the generated module file. @@ -157,8 +127,72 @@ class IntelOneapiCompilers(IntelOneApiPackage): """ super(IntelOneapiCompilers, self).setup_run_environment(env) - bin = join_path(self.component_path, 'linux', 'bin') - env.set('CC', join_path(bin, 'icx')) - env.set('CXX', join_path(bin, 'icpx')) - env.set('F77', join_path(bin, 'ifx')) - env.set('FC', join_path(bin, 'ifx')) + env.set('CC', self.component_prefix.bin.icx) + env.set('CXX', self.component_prefix.bin.icpx) + env.set('F77', self.component_prefix.bin.ifx) + env.set('FC', self.component_prefix.bin.ifx) + + def install(self, spec, prefix): + # Copy instead of install to speed up debugging + # install_tree('/opt/intel/oneapi/compiler', self.prefix) + + # install cpp + super(IntelOneapiCompilers, self).install(spec, prefix) + + # install fortran + self.install_component(find('fortran-installer', '*')[0]) + + # Some installers have a bug and do not return an error code when failing + if not is_exe(self.component_prefix.linux.bin.intel64.ifort): + raise RuntimeError('install failed') + + @run_after('install') + def inject_rpaths(self): + # Sets rpath so the compilers can work without setting LD_LIBRARY_PATH. + patchelf = which('patchelf') + patchelf.add_default_arg('--set-rpath') + patchelf.add_default_arg(':'.join(self._ld_library_path())) + for pd in ['bin', 'lib', join_path('compiler', 'lib', 'intel64_lin')]: + for file in find(self.component_prefix.linux.join(pd), '*', + recursive=False): + # Try to patch all files, patchelf will do nothing and fail if file + # should not be patched + patchelf(file, fail_on_error=False) + + @run_after('install') + def extend_config_flags(self): + # Extends compiler config files to inject additional compiler flags. + + # Inject rpath flags to the runtime libraries. + # TODO: this uses a static string for the rpath argument, but should actually + # make sure that it matches the cc_rpath_arg etc. arguments defined in + # spack.compilers.oneapi and spack.compilers.intel (for now, these are + # inherited from spack.compilers.compiler.Compiler): these can theoretically be + # different for different compiler versions and for different languages (C, + # C++, and Fortran), but in practice are not. + # TODO: it is unclear whether we should really use all elements of + # _ld_library_path because it looks like the only rpath that needs to be + # injected is self.component_prefix.linux.compiler.lib.intel64_lin. + flags = ' '.join(['-Wl,-rpath,{0}'.format(d) for d in self._ld_library_path()]) + for cmp in ['icx', 'icpx', 'ifx', + join_path('intel64', 'icc'), + join_path('intel64', 'icpc'), + join_path('intel64', 'ifort')]: + cfg_file = self.component_prefix.linux.bin.join(cmp + '.cfg') + with open(cfg_file, 'w') as f: + f.write(flags) + set_install_permissions(cfg_file) + + def _ld_library_path(self): + # Returns an iterable of directories that might contain shared runtime libraries + # of the compilers themselves and the executables they produce. + for d in ['lib', + join_path('lib', 'x64'), + join_path('lib', 'emu'), + join_path('lib', 'oclfpga', 'host', 'linux64', 'lib'), + join_path('lib', 'oclfpga', 'linux64', 'lib'), + join_path('compiler', 'lib', 'intel64_lin'), + join_path('compiler', 'lib')]: + p = join_path(self.component_prefix.linux, d) + if find(p, '*.' + dso_suffix, recursive=False): + yield p |