diff options
author | Chris Green <greenc@fnal.gov> | 2019-05-16 19:15:33 -0500 |
---|---|---|
committer | Greg Becker <becker33@llnl.gov> | 2019-05-17 09:15:32 +0900 |
commit | b9370bf20bd8edcbff4455bc7b3fa43a4e6ed837 (patch) | |
tree | 1f5db57f76485492a33eb9235a13966b22c94210 | |
parent | f90507a22777bce105b6175678a1f25769ac0b09 (diff) | |
download | spack-b9370bf20bd8edcbff4455bc7b3fa43a4e6ed837.tar.gz spack-b9370bf20bd8edcbff4455bc7b3fa43a4e6ed837.tar.bz2 spack-b9370bf20bd8edcbff4455bc7b3fa43a4e6ed837.tar.xz spack-b9370bf20bd8edcbff4455bc7b3fa43a4e6ed837.zip |
Allow command access to dump/pickle_environment from #8476 (#11434)
* Allow command access to dump/pickle_environment from #8476
-rw-r--r-- | lib/spack/spack/cmd/build_env.py | 42 | ||||
-rw-r--r-- | lib/spack/spack/test/cmd/build_env.py | 21 |
2 files changed, 56 insertions, 7 deletions
diff --git a/lib/spack/spack/cmd/build_env.py b/lib/spack/spack/cmd/build_env.py index 43d74344d9..87961fcb9c 100644 --- a/lib/spack/spack/cmd/build_env.py +++ b/lib/spack/spack/cmd/build_env.py @@ -12,8 +12,10 @@ 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 -description = "show install environment for a spec, and run commands" +description = "run a command in a spec's install environment, " \ + "or dump its environment to screen or file" section = "build" level = "long" @@ -21,8 +23,22 @@ 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="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 build_env(parser, args): @@ -49,11 +65,23 @@ def build_env(parser, args): build_environment.setup_package(spec.package, args.dirty) - if not cmd: - # If no command act like the "env" command and print out env vars. - for key, val in os.environ.items(): - print("%s=%s" % (key, val)) + 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) - else: - # Otherwise execute the command with the new environment + 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/test/cmd/build_env.py b/lib/spack/spack/test/cmd/build_env.py index aaf1e0fbc2..379de521b2 100644 --- a/lib/spack/spack/test/cmd/build_env.py +++ b/lib/spack/spack/test/cmd/build_env.py @@ -3,6 +3,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +from six.moves import cPickle import pytest from spack.main import SpackCommand, SpackCommandError @@ -27,3 +28,23 @@ def test_it_just_runs(pkg): def test_it_just_fails(pkg, error_cls): with pytest.raises(error_cls): info(pkg) + + +_out_file = 'env.out' + + +@pytest.mark.usefixtures('config') +def test_dump(tmpdir): + with tmpdir.as_cwd(): + info('--dump', _out_file, 'zlib') + with open(_out_file) as f: + assert(any(line.startswith('PATH=') for line in f.readlines())) + + +@pytest.mark.usefixtures('config') +def test_pickle(tmpdir): + with tmpdir.as_cwd(): + info('--pickle', _out_file, 'zlib') + environment = cPickle.load(open(_out_file, 'rb')) + assert(type(environment) == dict) + assert('PATH' in environment) |