diff --git a/easybuild/easyblocks/r/rosetta.py b/easybuild/easyblocks/r/rosetta.py deleted file mode 100644 index 71630c7902..0000000000 --- a/easybuild/easyblocks/r/rosetta.py +++ /dev/null @@ -1,287 +0,0 @@ -## -# Copyright 2009-2023 Ghent University -# -# This file is part of EasyBuild, -# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en), -# with support of Ghent University (http://ugent.be/hpc), -# the Flemish Supercomputer Centre (VSC) (https://www.vscentrum.be), -# Flemish Research Foundation (FWO) (http://www.fwo.be/en) -# and the Department of Economy, Science and Innovation (EWI) (http://www.ewi-vlaanderen.be/en). -# -# https://github.com/easybuilders/easybuild -# -# EasyBuild is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation v2. -# -# EasyBuild is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with EasyBuild. If not, see . -## -""" -EasyBuild support for building and installing Rosetta, implemented as an easyblock - -@author: Stijn De Weirdt (Ghent University) -@author: Dries Verdegem (Ghent University) -@author: Kenneth Hoste (Ghent University) -@author: Pieter De Baets (Ghent University) -@author: Jens Timmerman (Ghent University) -""" -import fileinput -import os -import re -import shutil -import sys -import easybuild.tools.toolchain as toolchain -from easybuild.easyblocks.icc import get_icc_version -from easybuild.framework.easyblock import EasyBlock -from easybuild.tools.build_log import EasyBuildError -from easybuild.tools.filetools import change_dir, extract_file, mkdir, write_file -from easybuild.tools.modules import get_software_version -from easybuild.tools.run import run_cmd -from easybuild.tools.systemtools import get_shared_lib_ext - - -class EB_Rosetta(EasyBlock): - """Support for building/installing Rosetta.""" - - def __init__(self, *args, **kwargs): - """Add extra config options specific to Rosetta.""" - super(EB_Rosetta, self).__init__(*args, **kwargs) - - self.srcdir = None - self.cxx = None - - def extract_step(self): - """Extract sources, if they haven't been already.""" - super(EB_Rosetta, self).extract_step() - # locate sources, and unpack if necessary - # old 'bundles' tarballs contain a gzipped tarball for source, recent ones contain unpacked source - try: - subdirs = os.listdir(self.builddir) - if len(subdirs) == 1: - prefix = os.path.join(self.builddir, subdirs[0]) - else: - raise EasyBuildError("Found no or multiple subdirectories, expected exactly one: %s", subdirs) - - self.srcdir = os.path.join(prefix, 'rosetta_source') - if not os.path.exists(self.srcdir): - self.srcdir = os.path.join(prefix, 'main', 'source') - if not os.path.exists(self.srcdir): - src_tarball = os.path.join(prefix, 'rosetta%s_source.tgz' % self.version) - if os.path.isfile(src_tarball): - self.srcdir = extract_file(src_tarball, prefix, change_into_dir=False) - change_dir(self.srcdir) - else: - raise EasyBuildError("Neither source directory '%s', nor source tarball '%s' found.", - self.srcdir, src_tarball) - except OSError as err: - raise EasyBuildError("Getting Rosetta sources dir ready failed: %s", err) - - def detect_cxx(self): - """Detect compiler name""" - # 'cxx' configure option excepts compiler name like 'gcc', 'icc', 'clang'; i.e. actually the C compiler command - # see also main/source/tools/build/basic.settings in Rosetta sources - self.cxx = os.getenv('CC_SEQ') - if self.cxx is None: - self.cxx = os.getenv('CC') - - def configure_step(self): - """ - Configure build by creating tools/build/user.settings from configure options. - """ - # construct build options - defines = ['NDEBUG'] - self.cfg.update('buildopts', "mode=release") - - self.detect_cxx() - cxx_ver = None - if self.toolchain.comp_family() in [toolchain.GCC]: # @UndefinedVariable - cxx_ver = '.'.join(get_software_version('GCC').split('.')[:2]) - elif self.toolchain.comp_family() in [toolchain.INTELCOMP]: # @UndefinedVariable - cxx_ver = '.'.join(get_icc_version().split('.')[:2]) - else: - raise EasyBuildError("Don't know how to determine C++ compiler version.") - self.cfg.update('buildopts', "cxx=%s cxx_ver=%s" % (self.cxx, cxx_ver)) - - if self.toolchain.options.get('usempi', None): - self.cfg.update('buildopts', 'extras=mpi') - defines.extend(['USEMPI', 'MPICH_IGNORE_CXX_SEEK']) - - # make sure important environment variables are passed down - # e.g., compiler env vars for MPI wrappers - env_vars = {} - for (key, val) in os.environ.items(): - if key in ['I_MPI_CC', 'I_MPI_CXX', 'MPICH_CC', 'MPICH_CXX', 'OMPI_CC', 'OMPI_CXX']: - env_vars.update({key: val}) - self.log.debug("List of extra environment variables to pass down: %s" % str(env_vars)) - - # create user.settings file - paths = os.getenv('PATH') - paths = paths.split(':') if paths else [] - ld_library_paths = os.getenv('LD_LIBRARY_PATH') - ld_library_paths = ld_library_paths.split(':') if ld_library_paths else [] - cpaths = os.getenv('CPATH') - cpaths = cpaths.split(':') if cpaths else [] - flags = [str(f).strip('-') for f in self.toolchain.variables['CXXFLAGS'].copy()] - - txt = '\n'.join([ - "settings = {", - " 'user': {", - " 'prepends': {", - " 'library_path': %s," % str(ld_library_paths), - " 'include_path': %s," % str(cpaths), - " },", - " 'appends': {", - " 'program_path': %s," % str(paths), - " 'flags': {", - " 'compile': %s," % str(flags), - # " 'mode': %s," % str(o_flags), - " },", - " 'defines': %s," % str(defines), - " },", - " 'overrides': {", - " 'cc': '%s'," % os.getenv('CC'), - " 'cxx': '%s'," % os.getenv('CXX'), - " 'ENV': {", - " 'INTEL_LICENSE_FILE': '%s'," % os.getenv('INTEL_LICENSE_FILE'), # Intel license file - " 'PATH': %s," % str(paths), - " 'LD_LIBRARY_PATH': %s," % str(ld_library_paths), - ]) - txt += '\n' - for (key, val) in env_vars.items(): - txt += " '%s': '%s',\n" % (key, val) - txt += '\n'.join([ - " },", - " },", - " 'removes': {", - " },", - " },", - "}", - ]) - us_fp = os.path.join(self.srcdir, "tools/build/user.settings") - self.log.debug("Creating '%s' with: %s", us_fp, txt) - write_file(us_fp, txt) - - # make sure specified compiler version is accepted by patching it in - os_fp = os.path.join(self.srcdir, "tools/build/options.settings") - cxxver_re = re.compile(r'(.*"%s".*)(,\s*"\*"\s*],.*)' % self.cxx, re.M) - for line in fileinput.input(os_fp, inplace=1, backup='.orig.eb'): - line = cxxver_re.sub(r'\1, "%s"\2' % cxx_ver, line) - sys.stdout.write(line) - - def build_step(self): - """ - Build Rosetta using 'python ./scons.py bin -j ' - """ - try: - os.chdir(self.srcdir) - except OSError as err: - raise EasyBuildError("Failed to change to %s: %s", self.srcdir, err) - par = '' - if self.cfg['parallel']: - par = "-j %s" % self.cfg['parallel'] - cmd = "python ./scons.py %s %s bin" % (self.cfg['buildopts'], par) - run_cmd(cmd, log_all=True, simple=True) - - def install_step(self): - """ - Copy built files (from e.g. build/src/release/linux/2.6/64/x86/icc/10.0/mpi) to /bin, - and copy (or untar) database and bioTools to install directory - """ - shlib_ext = get_shared_lib_ext() - - bindir = os.path.join(self.installdir, 'bin') - libdir = os.path.join(self.installdir, 'lib') - mkdir(bindir) - mkdir(libdir) - - for build_subdir in ['src', 'external']: - builddir = os.path.join('build', build_subdir) - if not os.path.exists(builddir): - continue - # walk the build/src dir to leaf - try: - while len(os.listdir(builddir)) == 1: - builddir = os.path.join(builddir, os.listdir(builddir)[0]) - except OSError as err: - raise EasyBuildError("Failed to walk build/src dir: %s", err) - # copy binaries/libraries to install dir - lib_re = re.compile(r"^lib.*\.%s$" % shlib_ext) - try: - for fil in os.listdir(builddir): - srcfile = os.path.join(builddir, fil) - if os.path.isfile(srcfile): - if lib_re.match(fil): - self.log.debug("Copying %s to %s" % (srcfile, libdir)) - shutil.copy2(srcfile, os.path.join(libdir, fil)) - else: - self.log.debug("Copying %s to %s" % (srcfile, bindir)) - shutil.copy2(srcfile, os.path.join(bindir, fil)) - except OSError as err: - raise EasyBuildError("Copying executables from %s to bin/lib install dirs failed: %s", builddir, err) - - os.chdir(self.cfg['start_dir']) - - def extract_and_copy(dirname_tmpl, optional=False, symlinks=False): - """Copy specified directory, after extracting it (if required).""" - try: - srcdir = os.path.join(self.cfg['start_dir'], dirname_tmpl % '') - if not os.path.exists(srcdir): - # try to extract if directory is not there yet - src_tarball = os.path.join(self.cfg['start_dir'], (dirname_tmpl % self.version) + '.tgz') - if os.path.isfile(src_tarball): - srcdir = extract_file(src_tarball, self.cfg['start_dir']) - - if os.path.exists(srcdir): - shutil.copytree(srcdir, os.path.join(self.installdir, os.path.basename(srcdir)), - symlinks=symlinks) - elif not optional: - raise EasyBuildError("Neither source directory '%s', nor source tarball '%s' found.", - srcdir, src_tarball) - except OSError as err: - raise EasyBuildError("Getting Rosetta %s dir ready failed: %s", dirname_tmpl, err) - - # (extract and) copy database, docs, demos (incl tutorials) and biotools (if it's there) - if os.path.exists(os.path.join(self.cfg['start_dir'], 'main', 'database')): - extract_and_copy(os.path.join('main', 'database') + '%s') - else: - extract_and_copy('rosetta_database%s') - - extract_and_copy('demos%s', optional=True, symlinks=True) - extract_and_copy('documentation%s', optional=True, symlinks=True) - extract_and_copy('BioTools%s', optional=True) - if os.path.exists(os.path.join(self.cfg['start_dir'], 'tools')): - extract_and_copy('tools%s', optional=True) - else: - extract_and_copy('rosetta_tools%s', optional=True) - - def make_module_extra(self): - """Define extra environment variables specific to Rosetta.""" - txt = super(EB_Rosetta, self).make_module_extra() - txt += self.module_generator.set_environment('ROSETTA3_DB', os.path.join(self.installdir, 'database')) - return txt - - def sanity_check_step(self): - """Custom sanity check for Rosetta.""" - - # self.cxx is usually set by the configure step, but if configure is - # not executed (e.g. with --module-only), we need to set it here. - if self.cxx is None: - self.detect_cxx() - - infix = '' - if self.toolchain.options.get('usempi', None): - infix = 'mpi.' - - binaries = ["AbinitioRelax", "backrub", "cluster", "combine_silent", "extract_pdbs", - "idealize_jd2", "packstat", "relax", "score_jd2", "score"] - custom_paths = { - 'files': ["bin/%s.%slinux%srelease" % (x, infix, self.cxx) for x in binaries], - 'dirs': [], - } - super(EB_Rosetta, self).sanity_check_step(custom_paths=custom_paths)