def _stop_at_phase_during_install(args, calling_fn, phase_mapping): if not args.package: tty.die("configure requires at least one package argument") # TODO: to be refactored with code in install specs = spack.cmd.parse_specs(args.package, concretize=True) if len(specs) != 1: tty.error('only one spec can be installed at a time.') spec = specs.pop() pkg = spec.package try: key = [cls for cls in phase_mapping if isinstance(pkg, cls)].pop() phase = phase_mapping[key] # Install package dependencies if needed parser = argparse.ArgumentParser() inst.setup_parser(parser) tty.msg('Checking dependencies for {0}'.format(args.package)) cli_args = ['-v'] if args.verbose else [] install_args = parser.parse_args(cli_args + ['--only=dependencies']) install_args.package = args.package inst.install(parser, install_args) # Install package and stop at the given phase cli_args = ['-v'] if args.verbose else [] install_args = parser.parse_args(cli_args + ['--only=package']) install_args.package = args.package inst.install(parser, install_args, stop_at=phase) except IndexError: tty.error( 'Package {0} has no {1} phase, or its {1} phase is not separated from install' .format( # NOQA: ignore=E501 spec.name, calling_fn.__name__))
def _stop_at_phase_during_install(args, calling_fn, phase_mapping): if not args.package: tty.die("configure requires at least one package argument") # TODO: to be refactored with code in install specs = spack.cmd.parse_specs(args.package, concretize=True) if len(specs) != 1: tty.error('only one spec can be installed at a time.') spec = specs.pop() pkg = spec.package try: key = [cls for cls in phase_mapping if isinstance(pkg, cls)].pop() phase = phase_mapping[key] # Install package dependencies if needed parser = argparse.ArgumentParser() inst.setup_parser(parser) tty.msg('Checking dependencies for {0}'.format(args.package)) cli_args = ['-v'] if args.verbose else [] install_args = parser.parse_args(cli_args + ['--only=dependencies']) install_args.package = args.package inst.install(parser, install_args) # Install package and stop at the given phase cli_args = ['-v'] if args.verbose else [] install_args = parser.parse_args(cli_args + ['--only=package']) install_args.package = args.package inst.install(parser, install_args, stop_at=phase) except IndexError: tty.error( 'Package {0} has no {1} phase, or its {1} phase is not separated from install'.format( # NOQA: ignore=E501 spec.name, calling_fn.__name__) )
def setup(self, args): if not args.spec: tty.die("spack setup requires a package spec argument.") specs = spack.cmd.parse_specs(args.spec) if len(specs) > 1: tty.die("spack setup only takes one spec.") # Take a write lock before checking for existence. with spack.store.db.write_transaction(): spec = specs[0] if not spack.repo.exists(spec.name): tty.die("No package for '{0}' was found.".format(spec.name), " Use `spack create` to create a new package") if not spec.versions.concrete: tty.die( "spack setup spec must have a single, concrete version. " "Did you forget a package version number?") spec.concretize() package = spack.repo.get(spec) if not isinstance(package, spack.CMakePackage): tty.die( 'Support for {0} derived packages not yet implemented'.format( package.build_system_class ) ) # It's OK if the package is already installed. # Forces the build to run out of the current directory. package.stage = DIYStage(os.getcwd()) # TODO: make this an argument, not a global. spack.do_checksum = False # Install dependencies if requested to do so if not args.ignore_deps: parser = argparse.ArgumentParser() install.setup_parser(parser) inst_args = copy.deepcopy(args) inst_args = parser.parse_args( ['--only=dependencies'] + args.spec, namespace=inst_args ) install.install(parser, inst_args) # Generate spconfig.py tty.msg( 'Generating spconfig.py [{0}]'.format(package.spec.cshort_spec) ) write_spconfig(package) # Install this package to register it in the DB and permit # module file regeneration inst_args = copy.deepcopy(args) inst_args = parser.parse_args( ['--only=package', '--fake'] + args.spec, namespace=inst_args ) install.install(parser, inst_args)
def setup(self, args): if not args.spec: tty.die("spack setup requires a package spec argument.") specs = spack.cmd.parse_specs(args.spec) if len(specs) > 1: tty.die("spack setup only takes one spec.") # Take a write lock before checking for existence. with spack.installed_db.write_transaction(): spec = specs[0] if not spack.repo.exists(spec.name): tty.warn("No such package: %s" % spec.name) create = tty.get_yes_or_no("Create this package?", default=False) if not create: tty.msg("Exiting without creating.") sys.exit(1) else: tty.msg("Running 'spack edit -f %s'" % spec.name) edit_package(spec.name, spack.repo.first_repo(), None, True) return if not spec.versions.concrete: tty.die("spack setup spec must have a single, concrete version. " "Did you forget a package version number?") spec.concretize() package = spack.repo.get(spec) if not isinstance(package, spack.CMakePackage): tty.die( 'Support for {0} derived packages not yet implemented'.format( package.build_system_class)) # It's OK if the package is already installed. # Forces the build to run out of the current directory. package.stage = DIYStage(os.getcwd()) # TODO: make this an argument, not a global. spack.do_checksum = False # Install dependencies if requested to do so if not args.ignore_deps: parser = argparse.ArgumentParser() install.setup_parser(parser) inst_args = copy.deepcopy(args) inst_args = parser.parse_args(['--only=dependencies'] + args.spec, namespace=inst_args) install.install(parser, inst_args) # Generate spconfig.py tty.msg('Generating spconfig.py [{0}]'.format( package.spec.cshort_spec)) write_spconfig(package) # Install this package to register it in the DB and permit # module file regeneration inst_args = copy.deepcopy(args) inst_args = parser.parse_args(['--only=package', '--fake'] + args.spec, namespace=inst_args) install.install(parser, inst_args)
def test_installing_both(self): parser = argparse.ArgumentParser() install.setup_parser(parser) args = parser.parse_args(['--log-format=junit', 'X']) install.install(parser, args) self.assertEqual(len(FILE_REGISTRY), 1) for _, content in FILE_REGISTRY.items(): self.assertTrue('tests="2"' in content) self.assertTrue('failures="0"' in content) self.assertTrue('errors="0"' in content)
def test_dependency_already_installed(self): pkgX.installed = True pkgY.installed = True parser = argparse.ArgumentParser() install.setup_parser(parser) args = parser.parse_args(['--log-format=junit', 'X']) install.install(parser, args) self.assertEqual(len(FILE_REGISTRY), 1) for _, content in FILE_REGISTRY.items(): self.assertTrue('tests="2"' in content) self.assertTrue('failures="0"' in content) self.assertTrue('errors="0"' in content) self.assertEqual( sum('skipped' in line for line in content.split('\n')), 2)
def test_relative_rpaths_create_default_layout(tmpdir, mirror_directory_rel, install_mockery): """ Test the creation and installation of buildcaches with relative rpaths into the default directory layout scheme. """ gspec = Spec('garply') gspec.concretize() cspec = Spec('corge') cspec.concretize() global mirror_path_rel mirror_path_rel = mirror_directory_rel # Install patchelf needed for relocate in linux test environment iparser = argparse.ArgumentParser() install.setup_parser(iparser) # Install some packages with dependent packages iargs = iparser.parse_args(['--no-cache', cspec.name]) install.install(iparser, iargs) # setup argument parser parser = argparse.ArgumentParser() buildcache.setup_parser(parser) # set default buildcache args create_args = [ 'create', '-a', '-u', '-r', '-d', str(mirror_path_rel), cspec.name ] # create build cache with relatived rpaths args = parser.parse_args(create_args) buildcache.buildcache(parser, args) # create mirror index args = parser.parse_args( ['update-index', '-d', 'file://%s' % str(mirror_path_rel)]) buildcache.buildcache(parser, args) # Uninstall the package and deps uparser = argparse.ArgumentParser() uninstall.setup_parser(uparser) uargs = uparser.parse_args(['-y', '--dependents', gspec.name]) uninstall.uninstall(uparser, uargs) bindist.clear_spec_cache() spack.stage.purge()
def test_default_rpaths_create_install_default_layout(tmpdir, mirror_directory_def, install_mockery): """ Test the creation and installation of buildcaches with default rpaths into the default directory layout scheme. """ gspec = Spec('garply') gspec.concretize() cspec = Spec('corge') cspec.concretize() iparser = argparse.ArgumentParser() install.setup_parser(iparser) # Install some packages with dependent packages iargs = iparser.parse_args(['--no-cache', cspec.name]) install.install(iparser, iargs) global mirror_path_def mirror_path_def = mirror_directory_def mparser = argparse.ArgumentParser() mirror.setup_parser(mparser) margs = mparser.parse_args( ['add', '--scope', 'site', 'test-mirror-def', 'file://%s' % mirror_path_def]) mirror.mirror(mparser, margs) margs = mparser.parse_args(['list']) mirror.mirror(mparser, margs) # setup argument parser parser = argparse.ArgumentParser() buildcache.setup_parser(parser) # Set default buildcache args create_args = ['create', '-a', '-u', '-d', str(mirror_path_def), cspec.name] install_args = ['install', '-a', '-u', cspec.name] # Create a buildache args = parser.parse_args(create_args) buildcache.buildcache(parser, args) # Test force overwrite create buildcache create_args.insert(create_args.index('-a'), '-f') args = parser.parse_args(create_args) buildcache.buildcache(parser, args) # create mirror index args = parser.parse_args(['update-index', '-d', 'file://%s' % str(mirror_path_def)]) buildcache.buildcache(parser, args) # list the buildcaches in the mirror args = parser.parse_args(['list', '-a', '-l', '-v']) buildcache.buildcache(parser, args) # Uninstall the package and deps uparser = argparse.ArgumentParser() uninstall.setup_parser(uparser) uargs = uparser.parse_args(['-y', '--dependents', gspec.name]) uninstall.uninstall(uparser, uargs) # test install args = parser.parse_args(install_args) buildcache.buildcache(parser, args) # This gives warning that spec is already installed buildcache.buildcache(parser, args) # test overwrite install install_args.insert(install_args.index('-a'), '-f') args = parser.parse_args(install_args) buildcache.buildcache(parser, args) args = parser.parse_args(['keys', '-f']) buildcache.buildcache(parser, args) args = parser.parse_args(['list']) buildcache.buildcache(parser, args) args = parser.parse_args(['list', '-a']) buildcache.buildcache(parser, args) args = parser.parse_args(['list', '-l', '-v']) buildcache.buildcache(parser, args) bindist.clear_spec_cache() spack.stage.purge() margs = mparser.parse_args( ['rm', '--scope', 'site', 'test-mirror-def']) mirror.mirror(mparser, margs)
def setup(self, args): tty.warn('DEPRECATED: use `spack dev-build` instead') if not args.spec: tty.die("spack setup requires a package spec argument.") specs = spack.cmd.parse_specs(args.spec) if len(specs) > 1: tty.die("spack setup only takes one spec.") # Take a write lock before checking for existence. with spack.store.db.write_transaction(): spec = specs[0] if not spack.repo.path.exists(spec.name): tty.die("No package for '{0}' was found.".format(spec.name), " Use `spack create` to create a new package") if not spec.versions.concrete: tty.die("spack setup spec must have a single, concrete version. " "Did you forget a package version number?") spec.concretize() package = spack.repo.get(spec) if not isinstance(package, spack.build_systems.cmake.CMakePackage): tty.die( 'Support for {0} derived packages not yet implemented'.format( package.build_system_class)) # It's OK if the package is already installed. # Forces the build to run out of the current directory. package.stage = DIYStage(os.getcwd()) # disable checksumming if requested if args.no_checksum: spack.config.set('config:checksum', False, scope='command_line') # Install dependencies if requested to do so if not args.ignore_deps: parser = argparse.ArgumentParser() install.setup_parser(parser) inst_args = copy.deepcopy(args) inst_args = parser.parse_args(['--only=dependencies'] + args.spec, namespace=inst_args) install.install(parser, inst_args) # Generate spconfig.py tty.msg('Generating spconfig.py [{0}]'.format( package.spec.cshort_spec)) dirty = args.dirty if args.shebang is None: shebang = sys.executable elif args.shebang == 'env': shebang = '/usr/bin/env python' else: shebang = args.shebang write_spconfig(package, dirty, shebang) # Install this package to register it in the DB and permit # module file regeneration inst_args = copy.deepcopy(args) inst_args = parser.parse_args(['--only=package', '--fake'] + args.spec, namespace=inst_args) install.install(parser, inst_args)