remove concrete spec constraint from spack develop (#46911)
				
					
				
			Remove the constraint for concrete specs and simply take the max(version) if a version is not given. This should default to the highest infinity version which is also the logical best guess for doing development. * Remove concrete verision constriant for develop, set docs * Add unit-test * Update lib/spack/docs/environments.rst Co-authored-by: kwryankrattiger <80296582+kwryankrattiger@users.noreply.github.com> * Update lib/spack/spack/cmd/develop.py Co-authored-by: Greg Becker <becker33@llnl.gov> * Consolidate env collection in cmd * Style --------- Co-authored-by: kwryankrattiger <80296582+kwryankrattiger@users.noreply.github.com> Co-authored-by: Greg Becker <becker33@llnl.gov>
This commit is contained in:
		@@ -425,9 +425,13 @@ Developing Packages in a Spack Environment
 | 
			
		||||
 | 
			
		||||
The ``spack develop`` command allows one to develop Spack packages in
 | 
			
		||||
an environment. It requires a spec containing a concrete version, and
 | 
			
		||||
will configure Spack to install the package from local source. By
 | 
			
		||||
default, it will also clone the package to a subdirectory in the
 | 
			
		||||
environment. This package will have a special variant ``dev_path``
 | 
			
		||||
will configure Spack to install the package from local source. 
 | 
			
		||||
If a version is not provided from the command line interface then spack 
 | 
			
		||||
will automatically pick the highest version the package has defined.
 | 
			
		||||
This means any infinity versions (``develop``, ``main``, ``stable``) will be
 | 
			
		||||
preferred in this selection process.
 | 
			
		||||
By default, ``spack develop`` will also clone the package to a subdirectory in the
 | 
			
		||||
environment for the local source. This package will have a special variant ``dev_path``
 | 
			
		||||
set, and Spack will ensure the package and its dependents are rebuilt
 | 
			
		||||
any time the environment is installed if the package's local source
 | 
			
		||||
code has been modified. Spack's native implementation to check for modifications
 | 
			
		||||
 
 | 
			
		||||
@@ -85,8 +85,14 @@ def _retrieve_develop_source(spec: spack.spec.Spec, abspath: str) -> None:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def develop(parser, args):
 | 
			
		||||
    # Note: we could put develop specs in any scope, but I assume
 | 
			
		||||
    # users would only ever want to do this for either (a) an active
 | 
			
		||||
    # env or (b) a specified config file (e.g. that is included by
 | 
			
		||||
    # an environment)
 | 
			
		||||
    # TODO: when https://github.com/spack/spack/pull/35307 is merged,
 | 
			
		||||
    # an active env is not required if a scope is specified
 | 
			
		||||
    env = spack.cmd.require_active_env(cmd_name="develop")
 | 
			
		||||
    if not args.spec:
 | 
			
		||||
        env = spack.cmd.require_active_env(cmd_name="develop")
 | 
			
		||||
        if args.clone is False:
 | 
			
		||||
            raise SpackError("No spec provided to spack develop command")
 | 
			
		||||
 | 
			
		||||
@@ -116,16 +122,18 @@ def develop(parser, args):
 | 
			
		||||
        raise SpackError("spack develop requires at most one named spec")
 | 
			
		||||
 | 
			
		||||
    spec = specs[0]
 | 
			
		||||
 | 
			
		||||
    version = spec.versions.concrete_range_as_version
 | 
			
		||||
    if not version:
 | 
			
		||||
        raise SpackError("Packages to develop must have a concrete version")
 | 
			
		||||
        # look up the maximum version so infintiy versions are preferred for develop
 | 
			
		||||
        version = max(spec.package_class.versions.keys())
 | 
			
		||||
        tty.msg(f"Defaulting to highest version: {spec.name}@{version}")
 | 
			
		||||
    spec.versions = spack.version.VersionList([version])
 | 
			
		||||
 | 
			
		||||
    # If user does not specify --path, we choose to create a directory in the
 | 
			
		||||
    # active environment's directory, named after the spec
 | 
			
		||||
    path = args.path or spec.name
 | 
			
		||||
    if not os.path.isabs(path):
 | 
			
		||||
        env = spack.cmd.require_active_env(cmd_name="develop")
 | 
			
		||||
        abspath = spack.util.path.canonicalize_path(path, default_wd=env.path)
 | 
			
		||||
    else:
 | 
			
		||||
        abspath = path
 | 
			
		||||
@@ -149,13 +157,6 @@ def develop(parser, args):
 | 
			
		||||
 | 
			
		||||
        _retrieve_develop_source(spec, abspath)
 | 
			
		||||
 | 
			
		||||
    # Note: we could put develop specs in any scope, but I assume
 | 
			
		||||
    # users would only ever want to do this for either (a) an active
 | 
			
		||||
    # env or (b) a specified config file (e.g. that is included by
 | 
			
		||||
    # an environment)
 | 
			
		||||
    # TODO: when https://github.com/spack/spack/pull/35307 is merged,
 | 
			
		||||
    # an active env is not required if a scope is specified
 | 
			
		||||
    env = spack.cmd.require_active_env(cmd_name="develop")
 | 
			
		||||
    tty.debug("Updating develop config for {0} transactionally".format(env.name))
 | 
			
		||||
    with env.write_transaction():
 | 
			
		||||
        if args.build_directory is not None:
 | 
			
		||||
 
 | 
			
		||||
@@ -65,6 +65,12 @@ def test_develop_no_clone(self, tmpdir):
 | 
			
		||||
            develop("--no-clone", "-p", str(tmpdir), "mpich@1.0")
 | 
			
		||||
            self.check_develop(e, spack.spec.Spec("mpich@=1.0"), str(tmpdir))
 | 
			
		||||
 | 
			
		||||
    def test_develop_no_version(self, tmpdir):
 | 
			
		||||
        env("create", "test")
 | 
			
		||||
        with ev.read("test") as e:
 | 
			
		||||
            develop("--no-clone", "-p", str(tmpdir), "mpich")
 | 
			
		||||
            self.check_develop(e, spack.spec.Spec("mpich@=main"), str(tmpdir))
 | 
			
		||||
 | 
			
		||||
    def test_develop(self):
 | 
			
		||||
        env("create", "test")
 | 
			
		||||
        with ev.read("test") as e:
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ class Mpich(Package):
 | 
			
		||||
 | 
			
		||||
    variant("debug", default=False, description="Compile MPICH with debug flags.")
 | 
			
		||||
 | 
			
		||||
    version("main", branch="main", git="https://github.com/pmodels/mpich")
 | 
			
		||||
    version("3.0.4", md5="9c5d5d4fe1e17dd12153f40bc5b6dbc0")
 | 
			
		||||
    version("3.0.3", md5="0123456789abcdef0123456789abcdef")
 | 
			
		||||
    version("3.0.2", md5="0123456789abcdef0123456789abcdef")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user