Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def package_step(self):
"""Package installed software (e.g., into an RPM), if requested, using selected package tool."""
if build_option('package'):
pkgtype = build_option('package_type')
pkgdir_dest = os.path.abspath(package_path())
opt_force = build_option('force')
self.log.info("Generating %s package in %s", pkgtype, pkgdir_dest)
pkgdir_src = package(self)
mkdir(pkgdir_dest)
for src_file in glob.glob(os.path.join(pkgdir_src, "*.%s" % pkgtype)):
dest_file = os.path.join(pkgdir_dest, os.path.basename(src_file))
if os.path.exists(dest_file) and not opt_force:
raise EasyBuildError("Unable to copy package %s to %s (already exists).", src_file, dest_file)
else:
copy_file(src_file, pkgdir_dest)
self.log.info("Copied package %s to %s", src_file, pkgdir_dest)
else:
self.log.info("Skipping package step (not enabled)")
def package_with_fpm(easyblock):
"""
This function will build a package using fpm and return the directory where the packages are
"""
workdir = tempfile.mkdtemp(prefix='eb-pkgs-')
pkgtype = build_option('package_type')
_log.info("Will be creating %s package(s) in %s", pkgtype, workdir)
origdir = change_dir(workdir)
package_naming_scheme = ActivePNS()
pkgname = package_naming_scheme.name(easyblock.cfg)
pkgver = package_naming_scheme.version(easyblock.cfg)
pkgrel = package_naming_scheme.release(easyblock.cfg)
_log.debug("Got the PNS values name: %s version: %s release: %s", pkgname, pkgver, pkgrel)
cmdlist = [
PKG_TOOL_FPM,
'--workdir', workdir,
'--name', pkgname,
'--provides', pkgname,
optflags = ([self.options.option(x) for x in self.COMPILER_OPT_FLAGS if self.options.get(x, False)] +
[self.options.option(default_opt_level)])[:1]
# only apply if the vectorize toolchainopt is explicitly set
# otherwise the individual compiler toolchain file should make sure that
# vectorization is disabled for noopt and lowopt, and enabled otherwise.
if self.options.get('vectorize') is not None:
vectoptions = self.options.option('vectorize')
vectflags = vectoptions[self.options['vectorize']]
# avoid double use of such flags, or e.g. -fno-tree-vectorize followed by -ftree-vectorize
if isinstance(optflags[0], list):
optflags[0] = [flag for flag in optflags[0] if flag not in vectoptions.values()]
optflags.append(vectflags)
optarchflags = []
if build_option('optarch') == OPTARCH_GENERIC:
# don't take 'optarch' toolchain option into account when --optarch=GENERIC is used,
# *always* include the flags that correspond to generic compilation (which are listed in 'optarch' option)
optarchflags.append(self.options.option('optarch'))
elif self.options.get('optarch', False):
optarchflags.append(self.options.option('optarch'))
precflags = [self.options.option(x) for x in self.COMPILER_PREC_FLAGS if self.options.get(x, False)] + \
[self.options.option('defaultprec')]
self.variables.nextend('OPTFLAGS', optflags + optarchflags)
self.variables.nextend('PRECFLAGS', precflags[:1])
# precflags last
for var in ['CFLAGS', 'CXXFLAGS']:
self.variables.join(var, 'OPTFLAGS', 'PRECFLAGS')
self.variables.nextend(var, flags)
Open new pull request using specified files
:param paths: paths to categorized lists of files (easyconfigs, files to delete, patches)
:param ecs: list of parsed easyconfigs, incl. for dependencies (if robot is enabled)
:param title: title to use for pull request
:param descr: description to use for description
:param commit_msg: commit message to use
"""
pr_branch_name = build_option('pr_branch_name')
pr_target_account = build_option('pr_target_account')
pr_target_repo = build_option('pr_target_repo')
# collect GitHub info we'll need
# * GitHub username to push branch to repo
# * GitHub token to open PR
github_user = build_option('github_user')
if github_user is None:
raise EasyBuildError("GitHub user must be specified to use --new-pr")
github_account = build_option('github_org') or build_option('github_user')
github_token = fetch_github_token(github_user)
if github_token is None:
raise EasyBuildError("GitHub token for user '%s' must be available to use --new-pr", github_user)
# create branch, commit files to it & push to GitHub
file_info, deleted_paths, git_repo, branch, diff_stat = _easyconfigs_pr_common(paths, ecs,
pr_branch=pr_branch_name,
start_account=pr_target_account,
commit_msg=commit_msg)
# label easyconfigs for new software and/or new easyconfigs for existing software
labels = []
def remove_file(path):
"""Remove file at specified path."""
# early exit in 'dry run' mode
if build_option('extended_dry_run'):
dry_run_msg("file %s removed" % path, silent=build_option('silent'))
return
try:
# note: file may also be a broken symlink...
if os.path.exists(path) or os.path.islink(path):
os.remove(path)
except OSError as err:
raise EasyBuildError("Failed to remove file %s: %s", path, err)
def categorize_paths(self, basepaths):
"""
Returns a list of paths where all known (valid) module classes have
been added to each of the given base paths.
"""
valid_module_classes = build_option('valid_module_classes')
paths = []
for path in basepaths:
for moduleclass in valid_module_classes:
paths.extend([os.path.join(path, moduleclass)])
return paths
if not forced and build_option('extended_dry_run'):
dry_run_msg("file written: %s" % path, silent=build_option('silent'))
return
if os.path.exists(path):
if not append:
if always_overwrite or build_option('force'):
_log.info("Overwriting existing file %s", path)
else:
raise EasyBuildError("File exists, not overwriting it without --force: %s", path)
if backup:
backed_up_fp = back_up_file(path)
_log.info("Existing file %s backed up to %s", path, backed_up_fp)
if verbose:
print_msg("Backup of %s created at %s" % (path, backed_up_fp), silent=build_option('silent'))
# figure out mode to use for open file handle
# cfr. https://docs.python.org/3/library/functions.html#open
mode = 'a' if append else 'w'
# special care must be taken with binary data in Python 3
if sys.version_info[0] >= 3 and isinstance(data, bytes):
mode += 'b'
# note: we can't use try-except-finally, because Python 2.4 doesn't support it as a single block
try:
mkdir(os.path.dirname(path), parents=True)
with open(path, mode) as handle:
handle.write(data)
except IOError as err:
raise EasyBuildError("Failed to write to %s: %s", path, err)
def resolve_dependencies(easyconfigs, modtool, retain_all_deps=False, raise_error_missing_ecs=True):
"""
Work through the list of easyconfigs to determine an optimal order
:param easyconfigs: list of easyconfigs
:param modtool: ModulesTool instance to use
:param retain_all_deps: boolean indicating whether all dependencies must be retained, regardless of availability;
retain all deps when True, check matching build option when False
:param raise_error_missing_ecs: raise an error when one or more easyconfig files could not be found
"""
robot = build_option('robot_path')
# retain all dependencies if specified by either the resp. build option or the dedicated named argument
retain_all_deps = build_option('retain_all_deps') or retain_all_deps
avail_modules = modtool.available()
if retain_all_deps:
# assume that no modules are available when forced, to retain all dependencies
avail_modules = []
_log.info("Forcing all dependencies to be retained.")
else:
if len(avail_modules) == 0:
_log.warning("No installed modules. Your MODULEPATH is probably incomplete: %s" % os.getenv('MODULEPATH'))
ordered_ecs = []
# all available modules can be used for resolving dependencies except those that will be installed
being_installed = [p['full_mod_name'] for p in easyconfigs]
avail_modules = [m for m in avail_modules if m not in being_installed]
def det_easyconfig_paths(orig_paths):
"""
Determine paths to easyconfig files.
:param orig_paths: list of original easyconfig paths
:return: list of paths to easyconfig files
"""
from_pr = build_option('from_pr')
robot_path = build_option('robot_path')
# list of specified easyconfig files
ec_files = orig_paths[:]
if from_pr is not None:
pr_files = fetch_easyconfigs_from_pr(from_pr)
if ec_files:
# replace paths for specified easyconfigs that are touched in PR
for i, ec_file in enumerate(ec_files):
for pr_file in pr_files:
if ec_file == os.path.basename(pr_file):
ec_files[i] = pr_file
else:
# if no easyconfigs are specified, use all the ones touched in the PR
ec_files = [path for path in pr_files if path.endswith('.eb')]