def software_options(self): # software build options descr = ("Software search and build options", ("Specify software search and build options: EasyBuild will search for a " "matching easyconfig and build it. When called with the try prefix " "(i.e. --try-X ), EasyBuild will search for a matching easyconfig " "and if none are found, try to generate one based on a close matching one " "(NOTE: --try-X is best effort, it might produce wrong builds!)") ) opts = OrderedDict({ 'amend':(("Specify additional search and build parameters (can be used multiple times); " "for example: versionprefix=foo or patches=one.patch,two.patch)"), None, 'append', None, {'metavar': 'VAR=VALUE[,VALUE]'}), 'software-name': ("Search and build software with name", None, 'store', None, {'metavar': 'NAME'}), 'software-version': ("Search and build software with version", None, 'store', None, {'metavar': 'VERSION'}), 'toolchain': ("Search and build with toolchain (name and version)", None, 'extend', None, {'metavar': 'NAME,VERSION'}), 'toolchain-name': ("Search and build with toolchain name", None, 'store', None, {'metavar': 'NAME'}), 'toolchain-version': ("Search and build with toolchain version", None, 'store', None, {'metavar': 'VERSION'}), }) longopts = opts.keys() for longopt in longopts: hlp = opts[longopt][0] hlp = "Try to %s (USE WITH CARE!)" % (hlp[0].lower() + hlp[1:]) opts["try-%s" % longopt] = (hlp,) + opts[longopt][1:] self.log.debug("software_options: descr %s opts %s" % (descr, opts)) self.add_group_parser(opts, descr)
def software_options(self): # software build options descr = ("Software search and build options", ("Specify software search and build options: EasyBuild will search for a " "matching easyconfig and build it. When called with the try prefix " "(i.e. --try-X ), EasyBuild will search for a matching easyconfig " "and if none are found, try to generate one based on a close matching one " "(NOTE: --try-X is best effort, it might produce wrong builds!)") ) opts = OrderedDict({ 'software-name':("Search and build software with name", None, 'store', None, {'metavar':'NAME'}), 'software-version':("Search and build software with version", None, 'store', None, {'metavar':'VERSION'}), 'toolchain':("Search and build with toolchain (name and version)", None, 'extend', None, {'metavar':'NAME,VERSION'}), 'toolchain-name':("Search and build with toolchain name", None, 'store', None, {'metavar':'NAME'}), 'toolchain-version':("Search and build with toolchain version", None, 'store', None, {'metavar':'VERSION'}), 'amend':(("Specify additional search and build parameters (can be used multiple times); " "for example: versionprefix=foo or patches=one.patch,two.patch)"), None, 'append', None, {'metavar':'VAR=VALUE[,VALUE]'}), }) longopts = opts.keys() for longopt in longopts: hlp = opts[longopt][0] hlp = "Try to %s (USE WITH CARE!)" % (hlp[0].lower() + hlp[1:]) opts["try-%s" % longopt] = (hlp,) + opts[longopt][1:] self.log.debug("software_options: descr %s opts %s" % (descr, opts)) self.add_group_parser(opts, descr)
def sanity_check_step(self): """Custom sanity check for EasyBuild.""" # list of dirs to check, by package # boolean indicates whether dir is expected to reside in Python lib/pythonX/site-packages dir subdirs_by_pkg = [ ('framework', [('easybuild/framework', True), ('easybuild/tools', True)]), ('easyblocks', [('easybuild/easyblocks', True)]), ('easyconfigs', [('easybuild/easyconfigs', False)]), ] # final list of directories to check, by setup tool # order matters, e.g. setuptools before distutils eb_dirs = OrderedDict() eb_dirs['setuptools'] = [] eb_dirs['distutils.core'] = flatten([x[1] for x in subdirs_by_pkg]) # determine setup tool (setuptools or distutils) setup_tool = None for tool in eb_dirs.keys(): self.log.debug("Trying %s.." % tool) try: exec "from %s import setup" % tool del setup setup_tool = tool break except ImportError: pass self.log.debug('setup_tool: %s' % setup_tool) # for a setuptools installation, we need to figure out the egg dirs since we don't know the individual package versions if setup_tool == 'setuptools': try: installed_dirs = os.listdir( os.path.join(self.installdir, self.pylibdir)) for (pkg, subdirs) in subdirs_by_pkg: sel_dirs = [ x for x in installed_dirs if x.startswith('easybuild_%s' % pkg) ] if not len(sel_dirs) == 1: self.log.error( "Failed to isolate installed egg dir for easybuild-%s" % pkg) for (subdir, _) in subdirs: # eggs always go in Python lib/pythonX/site-packages dir with setuptools eb_dirs['setuptools'].append( (os.path.join(sel_dirs[0], subdir), True)) except OSError, err: self.log.error( "Failed to determine sanity check dir paths: %s" % err)
def sanity_check_step(self): """Custom sanity check for EasyBuild.""" # list of dirs to check, by package # boolean indicates whether dir is expected to reside in Python lib/pythonX/site-packages dir subdirs_by_pkg = [ ('framework', [('easybuild/framework', True), ('easybuild/tools', True)]), ('easyblocks', [('easybuild/easyblocks', True)]), ('easyconfigs', [('easybuild/easyconfigs', False)]), ] # final list of directories to check, by setup tool # order matters, e.g. setuptools before distutils eb_dirs = OrderedDict() eb_dirs['setuptools'] = [] eb_dirs['distutils.core'] = flatten([x[1] for x in subdirs_by_pkg]) # determine setup tool (setuptools or distutils) setup_tool = None for tool in eb_dirs.keys(): self.log.debug("Trying %s.." % tool) try: exec "from %s import setup" % tool del setup setup_tool = tool break except ImportError: pass self.log.debug('setup_tool: %s' % setup_tool) # for a setuptools installation, we need to figure out the egg dirs since we don't know the individual package versions if setup_tool == 'setuptools': try: installed_dirs = os.listdir(os.path.join(self.installdir, self.pylibdir)) for (pkg, subdirs) in subdirs_by_pkg: sel_dirs = [x for x in installed_dirs if x.startswith('easybuild_%s' % pkg)] if not len(sel_dirs) == 1: self.log.error("Failed to isolate installed egg dir for easybuild-%s" % pkg) for (subdir, _) in subdirs: # eggs always go in Python lib/pythonX/site-packages dir with setuptools eb_dirs['setuptools'].append((os.path.join(sel_dirs[0], subdir), True)) except OSError, err: self.log.error("Failed to determine sanity check dir paths: %s" % err)
def software_options(self): # software build options descr = ( "Software search and build options", ( "Specify software search and build options: EasyBuild will search for a " "matching easyconfig and build it. When called with the try prefix " "(i.e. --try-X ), EasyBuild will search for a matching easyconfig " "and if none are found, try to generate one based on a close matching one " "(NOTE: --try-X is best effort, it might produce wrong builds!)" ), ) opts = OrderedDict( { "amend": ( ( "Specify additional search and build parameters (can be used multiple times); " "for example: versionprefix=foo or patches=one.patch,two.patch)" ), None, "append", None, {"metavar": "VAR=VALUE[,VALUE]"}, ), "software": ( "Search and build software with given name and version", None, "extend", None, {"metavar": "NAME,VERSION"}, ), "software-name": ( "Search and build software with given name", None, "store", None, {"metavar": "NAME"}, ), "software-version": ( "Search and build software with given version", None, "store", None, {"metavar": "VERSION"}, ), "toolchain": ( "Search and build with given toolchain (name and version)", None, "extend", None, {"metavar": "NAME,VERSION"}, ), "toolchain-name": ( "Search and build with given toolchain name", None, "store", None, {"metavar": "NAME"}, ), "toolchain-version": ( "Search and build with given toolchain version", None, "store", None, {"metavar": "VERSION"}, ), } ) longopts = opts.keys() for longopt in longopts: hlp = opts[longopt][0] hlp = "Try to %s (USE WITH CARE!)" % (hlp[0].lower() + hlp[1:]) opts["try-%s" % longopt] = (hlp,) + opts[longopt][1:] # additional options that don't need a --try equivalent opts.update({"from-pr": ("Obtain easyconfigs from specified PR", int, "store", None, {"metavar": "PR#"})}) self.log.debug("software_options: descr %s opts %s" % (descr, opts)) self.add_group_parser(opts, descr)
def sanity_check_step(self): """Custom sanity check for EasyBuild.""" # check whether easy-install.pth contains correct entries easy_install_pth = os.path.join(self.installdir, self.pylibdir, 'easy-install.pth') if os.path.exists(easy_install_pth): easy_install_pth_txt = read_file(easy_install_pth) for pkg in [p for p in self.easybuild_pkgs if p not in ['setuptools', 'vsc-install']]: if pkg == 'vsc-base': # don't include strict version check for vsc-base pkg_regex = re.compile(r"^\./%s" % pkg.replace('-', '_'), re.M) else: major_minor_version = '.'.join(self.version.split('.')[:2]) pkg_regex = re.compile(r"^\./%s-%s" % (pkg.replace('-', '_'), major_minor_version), re.M) if not pkg_regex.search(easy_install_pth_txt): raise EasyBuildError("Failed to find pattern '%s' in %s: %s", pkg_regex.pattern, easy_install_pth, easy_install_pth_txt) # list of dirs to check, by package # boolean indicates whether dir is expected to reside in Python lib/pythonX/site-packages dir subdirs_by_pkg = { 'easybuild-framework': [('easybuild/framework', True), ('easybuild/tools', True)], 'easybuild-easyblocks': [('easybuild/easyblocks', True)], 'easybuild-easyconfigs': [('easybuild/easyconfigs', False)], } if LooseVersion(self.version) >= LooseVersion('2.0'): subdirs_by_pkg.update({ 'vsc-base': [('vsc/utils', True)], }) # final list of directories to check, by setup tool # order matters, e.g. setuptools before distutils eb_dirs = OrderedDict() eb_dirs['setuptools'] = [] eb_dirs['distutils.core'] = flatten([x for x in subdirs_by_pkg.values()]) # determine setup tool (setuptools or distutils) setup_tool = None for tool in eb_dirs.keys(): self.log.debug("Trying %s.." % tool) try: exec "from %s import setup" % tool del setup setup_tool = tool break except ImportError: pass self.log.debug('setup_tool: %s' % setup_tool) # for a setuptools installation, we need to figure out the egg dirs, # since we don't know the individual package versions if setup_tool == 'setuptools': try: installed_dirs = os.listdir(os.path.join(self.installdir, self.pylibdir)) for (pkg, subdirs) in subdirs_by_pkg.items(): sel_dirs = [x for x in installed_dirs if x.startswith(pkg.replace('-', '_'))] if not len(sel_dirs) == 1: raise EasyBuildError("Failed to isolate installed egg dir for %s", pkg) for (subdir, _) in subdirs: # eggs always go in Python lib/pythonX/site-packages dir with setuptools eb_dirs['setuptools'].append((os.path.join(sel_dirs[0], subdir), True)) except OSError as err: raise EasyBuildError("Failed to determine sanity check dir paths: %s", err) # set of sanity check paths to check for EasyBuild custom_paths = { 'files': ['bin/eb'], 'dirs': [self.pylibdir] + [[x, os.path.join(self.pylibdir, x)][y] for (x, y) in eb_dirs[setup_tool]], } # make sure we don't trip over deprecated behavior in old EasyBuild versions eb_cmd = 'eb' if LooseVersion(self.version) <= LooseVersion('1.16.0'): eb_cmd = 'EASYBUILD_DEPRECATED=1.0 eb' # set of sanity check commands to run for EasyBuild custom_commands = [ # this may spit out a wrong version, but that should be safe to ignore # occurs when the EasyBuild being used is newer than the EasyBuild being installed (eb_cmd, '--version'), (eb_cmd, '-a'), (eb_cmd, '-e ConfigureMake -a'), ] # (temporary) cleanse copy of initial environment to avoid conflict with (potentially) loaded EasyBuild module self.real_initial_environ = copy.deepcopy(self.initial_environ) for env_var in ['_LMFILES_', 'LOADEDMODULES']: if env_var in self.initial_environ: self.initial_environ.pop(env_var) os.environ.pop(env_var) self.log.debug("Unset $%s in current env and copy of original env to make sanity check work" % env_var) super(EB_EasyBuildMeta, self).sanity_check_step(custom_paths=custom_paths, custom_commands=custom_commands)
def sanity_check_step(self): """Custom sanity check for EasyBuild.""" # check whether easy-install.pth contains correct entries easy_install_pth = os.path.join(self.installdir, self.pylibdir, 'easy-install.pth') if os.path.exists(easy_install_pth): easy_install_pth_txt = read_file(easy_install_pth) for pkg in self.easybuild_pkgs: if pkg == 'vsc-base': # don't include strict version check for vsc-base pkg_regex = re.compile(r"^\./%s" % pkg.replace('-', '_'), re.M) else: major_minor_version = '.'.join(self.version.split('.')[:2]) pkg_regex = re.compile(r"^\./%s-%s" % (pkg.replace('-', '_'), major_minor_version), re.M) if not pkg_regex.search(easy_install_pth_txt): raise EasyBuildError("Failed to find pattern '%s' in %s: %s", pkg_regex.pattern, easy_install_pth, easy_install_pth_txt) # list of dirs to check, by package # boolean indicates whether dir is expected to reside in Python lib/pythonX/site-packages dir subdirs_by_pkg = { 'easybuild-framework': [('easybuild/framework', True), ('easybuild/tools', True)], 'easybuild-easyblocks': [('easybuild/easyblocks', True)], 'easybuild-easyconfigs': [('easybuild/easyconfigs', False)], } if LooseVersion(self.version) >= LooseVersion('2.0'): subdirs_by_pkg.update({ 'vsc-base': [('vsc/utils', True)], }) # final list of directories to check, by setup tool # order matters, e.g. setuptools before distutils eb_dirs = OrderedDict() eb_dirs['setuptools'] = [] eb_dirs['distutils.core'] = flatten([x for x in subdirs_by_pkg.values()]) # determine setup tool (setuptools or distutils) setup_tool = None for tool in eb_dirs.keys(): self.log.debug("Trying %s.." % tool) try: exec "from %s import setup" % tool del setup setup_tool = tool break except ImportError: pass self.log.debug('setup_tool: %s' % setup_tool) # for a setuptools installation, we need to figure out the egg dirs, # since we don't know the individual package versions if setup_tool == 'setuptools': try: installed_dirs = os.listdir(os.path.join(self.installdir, self.pylibdir)) for (pkg, subdirs) in subdirs_by_pkg.items(): sel_dirs = [x for x in installed_dirs if x.startswith(pkg.replace('-', '_'))] if not len(sel_dirs) == 1: raise EasyBuildError("Failed to isolate installed egg dir for %s", pkg) for (subdir, _) in subdirs: # eggs always go in Python lib/pythonX/site-packages dir with setuptools eb_dirs['setuptools'].append((os.path.join(sel_dirs[0], subdir), True)) except OSError, err: raise EasyBuildError("Failed to determine sanity check dir paths: %s", err)