diff --git a/lib/spack/spack/cmd/build_env.py b/lib/spack/spack/cmd/build_env.py index 128d167a291..c3fe3c93b9c 100644 --- a/lib/spack/spack/cmd/build_env.py +++ b/lib/spack/spack/cmd/build_env.py @@ -2,86 +2,17 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from __future__ import print_function - import argparse -import os - -import llnl.util.tty as tty -import spack.build_environment as build_environment -import spack.cmd import spack.cmd.common.arguments as arguments -from spack.util.environment import dump_environment, pickle_environment +import spack.cmd.common.env_utility as env_utility description = "run a command in a spec's install environment, " \ "or dump its environment to screen or file" section = "build" level = "long" - -def setup_parser(subparser): - arguments.add_common_arguments(subparser, ['clean', 'dirty']) - subparser.add_argument( - '--dump', metavar="FILE", - help="dump a source-able environment to FILE" - ) - subparser.add_argument( - '--pickle', metavar="FILE", - help="dump a pickled source-able environment to FILE" - ) - subparser.add_argument( - 'spec', nargs=argparse.REMAINDER, - metavar='spec [--] [cmd]...', - help="spec of package environment to emulate") - subparser.epilog\ - = 'If a command is not specified, the environment will be printed ' \ - 'to standard output (cf /usr/bin/env) unless --dump and/or --pickle ' \ - 'are specified.\n\nIf a command is specified and spec is ' \ - 'multi-word, then the -- separator is obligatory.' +setup_parser = env_utility.setup_parser def build_env(parser, args): - if not args.spec: - tty.die("spack build-env requires a spec.") - - # Specs may have spaces in them, so if they do, require that the - # caller put a '--' between the spec and the command to be - # executed. If there is no '--', assume that the spec is the - # first argument. - sep = '--' - if sep in args.spec: - s = args.spec.index(sep) - spec = args.spec[:s] - cmd = args.spec[s + 1:] - else: - spec = args.spec[0] - cmd = args.spec[1:] - - specs = spack.cmd.parse_specs(spec, concretize=True) - if len(specs) > 1: - tty.die("spack build-env only takes one spec.") - spec = specs[0] - - build_environment.setup_package(spec.package, args.dirty) - - if args.dump: - # Dump a source-able environment to a text file. - tty.msg("Dumping a source-able environment to {0}".format(args.dump)) - dump_environment(args.dump) - - if args.pickle: - # Dump a source-able environment to a pickle file. - tty.msg( - "Pickling a source-able environment to {0}".format(args.pickle)) - pickle_environment(args.pickle) - - if cmd: - # Execute the command with the new environment - os.execvp(cmd[0], cmd) - - elif not bool(args.pickle or args.dump): - # If no command or dump/pickle option act like the "env" command - # and print out env vars. - for key, val in os.environ.items(): - print("%s=%s" % (key, val)) + env_utility.emulate_env_utility('build-env', 'build', args) diff --git a/lib/spack/spack/cmd/common/env_utility.py b/lib/spack/spack/cmd/common/env_utility.py new file mode 100644 index 00000000000..08d460b4250 --- /dev/null +++ b/lib/spack/spack/cmd/common/env_utility.py @@ -0,0 +1,82 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from __future__ import print_function + +import argparse +import os + +import llnl.util.tty as tty +import spack.build_environment as build_environment +import spack.paths +import spack.cmd +import spack.cmd.common.arguments as arguments +from spack.util.environment import dump_environment, pickle_environment + + +def setup_parser(subparser): + arguments.add_common_arguments(subparser, ['clean', 'dirty']) + subparser.add_argument( + '--dump', metavar="FILE", + help="dump a source-able environment to FILE" + ) + subparser.add_argument( + '--pickle', metavar="FILE", + help="dump a pickled source-able environment to FILE" + ) + subparser.add_argument( + 'spec', nargs=argparse.REMAINDER, + metavar='spec [--] [cmd]...', + help="specs of package environment to emulate") + subparser.epilog\ + = 'If a command is not specified, the environment will be printed ' \ + 'to standard output (cf /usr/bin/env) unless --dump and/or --pickle ' \ + 'are specified.\n\nIf a command is specified and spec is ' \ + 'multi-word, then the -- separator is obligatory.' + + +def emulate_env_utility(cmd_name, context, args): + if not args.spec: + tty.die("spack %s requires a spec." % cmd_name) + + # Specs may have spaces in them, so if they do, require that the + # caller put a '--' between the spec and the command to be + # executed. If there is no '--', assume that the spec is the + # first argument. + sep = '--' + if sep in args.spec: + s = args.spec.index(sep) + spec = args.spec[:s] + cmd = args.spec[s + 1:] + else: + spec = args.spec[0] + cmd = args.spec[1:] + + specs = spack.cmd.parse_specs(spec, concretize=True) + if len(specs) > 1: + tty.die("spack %s only takes one spec." % cmd_name) + spec = specs[0] + + build_environment.setup_package(spec.package, args.dirty, context) + + if args.dump: + # Dump a source-able environment to a text file. + tty.msg("Dumping a source-able environment to {0}".format(args.dump)) + dump_environment(args.dump) + + if args.pickle: + # Dump a source-able environment to a pickle file. + tty.msg( + "Pickling a source-able environment to {0}".format(args.pickle)) + pickle_environment(args.pickle) + + if cmd: + # Execute the command with the new environment + os.execvp(cmd[0], cmd) + + elif not bool(args.pickle or args.dump): + # If no command or dump/pickle option act like the "env" command + # and print out env vars. + for key, val in os.environ.items(): + print("%s=%s" % (key, val)) diff --git a/lib/spack/spack/cmd/test_env.py b/lib/spack/spack/cmd/test_env.py new file mode 100644 index 00000000000..5c0a91d20c8 --- /dev/null +++ b/lib/spack/spack/cmd/test_env.py @@ -0,0 +1,18 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import argparse +import spack.cmd.common.arguments as arguments +import spack.cmd,common.env_utility as env_utility + +description = "run a command in a spec's test environment, " \ + "or dump its environment to screen or file" +section = "administration" +level = "long" + +setup_parser = env_utility.setup_parser + + +def test_env(parser, args): + env_utility.emulate_env_utility('test-env', 'test', args)