diff options
Diffstat (limited to 'var/spack/repos/builtin/packages/fsl/package.py')
-rw-r--r-- | var/spack/repos/builtin/packages/fsl/package.py | 184 |
1 files changed, 152 insertions, 32 deletions
diff --git a/var/spack/repos/builtin/packages/fsl/package.py b/var/spack/repos/builtin/packages/fsl/package.py index 35f4978698..5511096e53 100644 --- a/var/spack/repos/builtin/packages/fsl/package.py +++ b/var/spack/repos/builtin/packages/fsl/package.py @@ -8,42 +8,157 @@ from spack.util.environment import EnvironmentModifications import os -class Fsl(Package): +class Fsl(Package, CudaPackage): """FSL is a comprehensive library of analysis tools for FMRI, MRI and DTI - brain imaging data. + brain imaging data.""" - Note: A manual download is required for FSL. - Spack will search your current directory for the download file. - Alternatively, add this file to a mirror so that Spack can find it. - For instructions on how to set up a mirror, see - http://spack.readthedocs.io/en/latest/mirrors.html""" + # NOTE: A manual download is required for FSL. Spack will search your + # current directory for the download file. Alternatively, add this file to + # a mirror so that Spack can find it. For instructions on how to set up a + # mirror, see http://spack.readthedocs.io/en/latest/mirrors.html homepage = "https://fsl.fmrib.ox.ac.uk" url = "file://{0}/fsl-5.0.10-sources.tar.gz".format(os.getcwd()) manual_download = True - version('5.0.10', '64823172a08aad679833240ba64c8e30') + version('6.0.4', sha256='58b88f38e080b05d70724d57342f58e1baf56e2bd3b98506a72b4446cad5033e') + version('5.0.10', sha256='ca183e489320de0e502a7ba63230a7f55098917a519e8c738b005d526e700842') depends_on('python', type=('build', 'run')) depends_on('expat') depends_on('libx11') depends_on('glu') - depends_on('zlib') - depends_on('libpng') - depends_on('boost') - depends_on('sqlite') - - conflicts('%gcc@6:', when='@5.0.10') + depends_on('libiconv') + depends_on('openblas', when='@6:') + depends_on('vtk@:8') + + conflicts('%gcc@:4.7,5.5:') + conflicts('^cuda@9.2:') + conflicts('cuda_arch=none', when='+cuda', + msg='must select a CUDA architecture') + conflicts('platform=darwin', + msg='currently only packaged for linux') + + patch('build_log.patch') + patch('eddy_Makefile.patch', when='@6:') + patch('iconv.patch') + patch('fslpython_install_v5.patch', when='@:5') + patch('fslpython_install_v6.patch', when='@6:') + + # These patches disable FSL's attempts to try to submit a subset of FSL + # computations to an SGE queue system. That auto-submit mechanism only + # works for SGE and requires someone to edit the fsl_sub script to + # accommodate their system. These patches disable the auto submission + # scheme and allow the fsl_sub script to behave the same on all systems, + # and without further modification, whether the computation is submitted to + # a "local" system, like a workstation, or as a batch job to a cluster + # queueing system, regardless of queue system type. + patch('fsl_sub_v5.patch', when='@:5') + patch('fsl_sub_v6.patch', when='@6:') def patch(self): # Uncomment lines in source file to allow building from source with working_dir(join_path(self.stage.source_path, 'etc', 'fslconf')): sourced = FileFilter('fsl.sh') sourced.filter('#FSLCONFDIR', 'FSLCONFDIR') - sourced.filter('#FSLMACHTYPE', 'FSLMACHTYPE') - # Fix error in build script - buildscript = FileFilter('build') - buildscript.filter('mist-clean', 'mist') + + if self.spec.satisfies('@6:'): + sourced.filter('#FSLMACHTYPE', 'FSLMACHTYPE') + else: + sourced.filter(r'#(FSLMACHTYPE).*', r'\1=linux_64-gcc4.8') + + if self.spec.satisfies('@:5'): + with working_dir(join_path(self.stage.source_path, 'config', + 'common')): + buildproj = FileFilter('buildproj') + buildproj.filter(r'(^FSLMACHTYPE).*', r'\1=linux_64-gcc4.8') + + # Capture the settings file + if self.spec.satisfies('@6:'): + settings_file = join_path(self.stage.source_path, 'config', + 'buildSettings.mk') + vtk_file = settings_file + else: + settings_file = join_path(self.stage.source_path, 'config', + 'linux_64-gcc4.8', 'systemvars.mk') + externals_file = join_path(self.stage.source_path, 'config', + 'linux_64-gcc4.8', 'externallibs.mk') + vtk_file = externals_file + + build_settings = FileFilter(settings_file) + vtk_settings = FileFilter(vtk_file) + + build_settings.filter(r'^CUDAVER', '#CUDAVER') + build_settings.filter(r'(^CC)\s*=.*', r'\1 = {0}'.format(spack_cc)) + build_settings.filter(r'(^CXX)\s*=.*', r'\1 = {0}'.format(spack_cxx)) + build_settings.filter(r'(^CXX11)\s*=.*', r'\1 = {0}'.format(spack_cxx)) + + vtk_suffix = self.spec['vtk'].version.up_to(2) + vtk_lib_dir = self.spec['vtk'].prefix.lib64 + vtk_include_dir = join_path(self.spec['vtk'].prefix.include, + 'vtk-{0}'.format(vtk_suffix)) + + vtk_settings.filter(r'(^VTKDIR_INC)\s*=.*', + r'\1 = {0}'.format(vtk_include_dir)) + vtk_settings.filter(r'(^VTKDIR_LIB)\s*=.*', + r'\1 = {0}'.format(vtk_lib_dir)) + vtk_settings.filter(r'(^VTKSUFFIX)\s*=.*', + r'\1 = -{0}'.format(vtk_suffix)) + + if '+cuda' in self.spec: + cuda_arch = self.spec.variants['cuda_arch'].value + cuda_gencode = ' '.join(self.cuda_flags(cuda_arch)) + cuda_installation = self.spec['cuda'].prefix + + build_settings.filter(r'(^CUDA_INSTALLATION)\s*=.*', + r'\1 = {0}'.format(cuda_installation)) + build_settings.filter(r'(^LIB_CUDA)\s*=.*', + r'\1 = {0}'.format( + join_path( + cuda_installation, + 'lib64'))) + build_settings.filter(r'(^INC_CUDA)\s*=.*', + r'\1 = {0}'.format( + join_path( + cuda_installation, + 'include'))) + build_settings.filter(r'(^NVCC11)\s*=.*', + r'\1 = {0}'.format( + join_path( + cuda_installation, 'bin', + 'nvcc'))) + build_settings.filter(r'(^NVCC)\s*=.*', + r'\1 = {0}'.format( + join_path( + cuda_installation, 'bin', + 'nvcc'))) + build_settings.filter(r'(^GENCODE_FLAGS)\s*=.*', + r'\1 = {0}'.format(cuda_gencode)) + + if self.spec.satisfies('@6:'): + build_settings.filter(r'(^EDDYBUILDPARAMETERS)\s*=.*', + r'\1 = "cuda=1" "cpu=1"') + build_settings.filter(r'(^fdt_MASTERBUILD)\s*=.*', + r'\1 = COMPILE_GPU=1') + build_settings.filter(r'(^ptx2_MASTERBUILD)\s*=.*', + r'\1 = COMPILE_GPU=1') + else: + with open(settings_file, 'a') as f: + f.write('COMPILE_GPU=1\n') + else: + build_settings.filter(r'^CUDA_INSTALLATION', '#CUDA_INSTALLATION') + build_settings.filter(r'^GENCODE_FLAGS', '#GENCODE_FLAGS') + build_settings.filter(r'^LIB_CUDA', '#LIB_CUDA') + build_settings.filter(r'^INC_CUDA', '#INC_CUDA') + build_settings.filter(r'^NVCC', '#NVCC') + + if self.spec.satisfies('@6:'): + build_settings.filter(r'(^EDDYBUILDPARAMETERS)\s*=.*', + r'\1 = "cpu=1"') + build_settings.filter(r'(^fdt_MASTERBUILD)\s*=.*', + r'\1 = COMPILE_GPU=0') + build_settings.filter(r'(^ptx2_MASTERBUILD)\s*=.*', + r'\1 = COMPILE_GPU=0') def install(self, spec, prefix): build = Executable('./build') @@ -51,6 +166,20 @@ class Fsl(Package): install_tree('.', prefix) + @run_after('install') + def postinstall(self): + # The PYTHON related environment variables need to be unset here so + # the post install script does not get confused. + vars_to_unset = ['PYTHONPATH', 'PYTHONHOME'] + + with spack.util.environment.preserve_environment(*vars_to_unset): + for v in vars_to_unset: + del os.environ[v] + + script = Executable(join_path(prefix, 'etc', 'fslconf', + 'post_install.sh')) + script('-f', prefix) + def setup_build_environment(self, env): if not self.stage.source_path: self.stage.fetch() @@ -66,18 +195,9 @@ class Fsl(Package): env.extend(EnvironmentModifications.from_sourcing_file(fslsetup)) def setup_run_environment(self, env): - # Here, run-time environment variables are being set manually. - # Normally these would be added to the modulefile at build-time - # by sourcing fsl.sh, but incorrect paths were being set, pointing to - # the staging directory rather than the install directory. + # Set the environment variables after copying tree env.set('FSLDIR', self.prefix) - env.set('FSLOUTPUTTYPE', 'NIFTI_GZ') - env.set('FSLMULTIFILEQUIT', 'TRUE') - env.set('FSLTCLSH', self.prefix.bin.fsltclsh) - env.set('FSLWISH', self.prefix.bin.fslwish) - env.set('FSLLOCKDIR', '') - env.set('FSLMACHINELIST', '') - env.set('FSLREMOTECALL', '') - env.set('FSLGECUDAQ', 'cuda.q') - - env.prepend_path('PATH', self.prefix) + fslsetup = join_path(self.prefix, 'etc', 'fslconf', 'fsl.sh') + + if os.path.isfile(fslsetup): + env.extend(EnvironmentModifications.from_sourcing_file(fslsetup)) |