From fa1d0a8a4d41616e4689ca0c80318269f55c5c9e Mon Sep 17 00:00:00 2001 From: Christoph Junghans Date: Wed, 23 Aug 2017 15:08:52 -0600 Subject: Add --source option to spack install (#4102) - -- source will copy source into prefix along with the package. - added a test for --source, as well --- lib/spack/spack/cmd/install.py | 4 ++++ lib/spack/spack/package.py | 11 +++++++++++ lib/spack/spack/test/cmd/install.py | 12 ++++++++++++ share/spack/spack-completion.bash | 2 +- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index ec1efdc9cf..83ebe71787 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -68,6 +68,9 @@ the dependencies""" subparser.add_argument( '--restage', action='store_true', dest='restage', help="if a partial install is detected, delete prior state") + subparser.add_argument( + '--source', action='store_true', dest='install_source', + help="install source files in prefix") subparser.add_argument( '-n', '--no-checksum', action='store_true', dest='no_checksum', help="do not check packages against checksum") @@ -314,6 +317,7 @@ def install(parser, args, **kwargs): 'keep_prefix': args.keep_prefix, 'keep_stage': args.keep_stage, 'restage': args.restage, + 'install_source': args.install_source, 'install_deps': 'dependencies' in args.things_to_install, 'make_jobs': args.jobs, 'run_tests': args.run_tests, diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 64db8013d0..c13a566e27 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1193,6 +1193,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): def do_install(self, keep_prefix=False, keep_stage=False, + install_source=False, install_deps=True, skip_patch=False, verbose=False, @@ -1213,6 +1214,8 @@ class PackageBase(with_metaclass(PackageMeta, object)): keep_stage (bool): By default, stage is destroyed only if there are no exceptions during build. Set to True to keep the stage even with exceptions. + install_source (bool): By default, source is not installed, but + for debugging it might be useful to keep it around. install_deps (bool): Install dependencies before installing this package skip_patch (bool): Skip patch stage of build if True. @@ -1260,6 +1263,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): dep.package.do_install( keep_prefix=keep_prefix, keep_stage=keep_stage, + install_source=install_source, install_deps=install_deps, fake=fake, skip_patch=skip_patch, @@ -1312,6 +1316,13 @@ class PackageBase(with_metaclass(PackageMeta, object)): if fake: self.do_fake_install() else: + source_path = self.stage.source_path + if install_source and os.path.isdir(source_path): + src_target = join_path( + self.spec.prefix, 'share', self.name, 'src') + tty.msg('Copying source to {0}'.format(src_target)) + install_tree(self.stage.source_path, src_target) + # Do the real install in the source directory. self.stage.chdir_to_source() diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index eef5605275..2886aa5d6a 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -24,6 +24,7 @@ ############################################################################## import argparse import os +import filecmp import pytest @@ -130,3 +131,14 @@ def test_install_output_on_python_error(builtin_mock, mock_archive, mock_fetch, assert isinstance(install.error, spack.build_environment.ChildError) assert install.error.name == 'InstallError' assert 'raise InstallError("Expected failure.")' in out + + +def test_install_with_source( + builtin_mock, mock_archive, mock_fetch, config, install_mockery): + """Verify that source has been copied into place.""" + install('--source', '--keep-stage', 'trivial-install-test-package') + spec = Spec('trivial-install-test-package').concretized() + src = os.path.join( + spec.prefix.share, 'trivial-install-test-package', 'src') + assert filecmp.cmp(os.path.join(mock_archive.path, 'configure'), + os.path.join(src, 'configure')) diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 408aaf61ac..05ae403eb5 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -456,7 +456,7 @@ function _spack_install { then compgen -W "-h --help --only -j --jobs --keep-prefix --keep-stage -n --no-checksum -v --verbose --fake --clean --dirty - --run-tests --log-format --log-file" -- "$cur" + --run-tests --log-format --log-file --source" -- "$cur" else compgen -W "$(_all_packages)" -- "$cur" fi -- cgit v1.2.3-70-g09d2