cmd/solve: use interface from cmd/spec (#47182)
Currently, `spack solve` has different spec selection semantics than `spack spec`. `spack solve` currently does not allow specifying a single spec when an environment is active. This PR modifies `spack solve` to inherit the interface from `spack spec`, and to use the same spec selection logic. This will allow for better use of `spack solve --show opt` for debugging. --------- Co-authored-by: Todd Gamblin <tgamblin@llnl.gov>
This commit is contained in:
parent
d48d993ae7
commit
e81ce18cad
@ -3,7 +3,6 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
import argparse
|
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
@ -12,13 +11,12 @@
|
|||||||
|
|
||||||
import spack
|
import spack
|
||||||
import spack.cmd
|
import spack.cmd
|
||||||
import spack.cmd.common.arguments
|
import spack.cmd.spec
|
||||||
import spack.config
|
import spack.config
|
||||||
import spack.environment
|
import spack.environment
|
||||||
import spack.hash_types as ht
|
import spack.hash_types as ht
|
||||||
import spack.solver.asp as asp
|
import spack.solver.asp as asp
|
||||||
import spack.spec
|
import spack.spec
|
||||||
from spack.cmd.common import arguments
|
|
||||||
|
|
||||||
description = "concretize a specs using an ASP solver"
|
description = "concretize a specs using an ASP solver"
|
||||||
section = "developer"
|
section = "developer"
|
||||||
@ -41,42 +39,6 @@ def setup_parser(subparser):
|
|||||||
" solutions models found by asp program\n"
|
" solutions models found by asp program\n"
|
||||||
" all all of the above",
|
" all all of the above",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Below are arguments w.r.t. spec display (like spack spec)
|
|
||||||
arguments.add_common_arguments(subparser, ["long", "very_long", "namespaces"])
|
|
||||||
|
|
||||||
install_status_group = subparser.add_mutually_exclusive_group()
|
|
||||||
arguments.add_common_arguments(install_status_group, ["install_status", "no_install_status"])
|
|
||||||
|
|
||||||
subparser.add_argument(
|
|
||||||
"-y",
|
|
||||||
"--yaml",
|
|
||||||
action="store_const",
|
|
||||||
dest="format",
|
|
||||||
default=None,
|
|
||||||
const="yaml",
|
|
||||||
help="print concrete spec as yaml",
|
|
||||||
)
|
|
||||||
subparser.add_argument(
|
|
||||||
"-j",
|
|
||||||
"--json",
|
|
||||||
action="store_const",
|
|
||||||
dest="format",
|
|
||||||
default=None,
|
|
||||||
const="json",
|
|
||||||
help="print concrete spec as json",
|
|
||||||
)
|
|
||||||
subparser.add_argument(
|
|
||||||
"-c",
|
|
||||||
"--cover",
|
|
||||||
action="store",
|
|
||||||
default="nodes",
|
|
||||||
choices=["nodes", "edges", "paths"],
|
|
||||||
help="how extensively to traverse the DAG (default: nodes)",
|
|
||||||
)
|
|
||||||
subparser.add_argument(
|
|
||||||
"-t", "--types", action="store_true", default=False, help="show dependency types"
|
|
||||||
)
|
|
||||||
subparser.add_argument(
|
subparser.add_argument(
|
||||||
"--timers",
|
"--timers",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
@ -86,9 +48,8 @@ def setup_parser(subparser):
|
|||||||
subparser.add_argument(
|
subparser.add_argument(
|
||||||
"--stats", action="store_true", default=False, help="print out statistics from clingo"
|
"--stats", action="store_true", default=False, help="print out statistics from clingo"
|
||||||
)
|
)
|
||||||
subparser.add_argument("specs", nargs=argparse.REMAINDER, help="specs of packages")
|
|
||||||
|
|
||||||
spack.cmd.common.arguments.add_concretizer_args(subparser)
|
spack.cmd.spec.setup_parser(subparser)
|
||||||
|
|
||||||
|
|
||||||
def _process_result(result, show, required_format, kwargs):
|
def _process_result(result, show, required_format, kwargs):
|
||||||
@ -164,11 +125,12 @@ def solve(parser, args):
|
|||||||
|
|
||||||
# If we have an active environment, pick the specs from there
|
# If we have an active environment, pick the specs from there
|
||||||
env = spack.environment.active_environment()
|
env = spack.environment.active_environment()
|
||||||
if env and args.specs:
|
if args.specs:
|
||||||
msg = "cannot give explicit specs when an environment is active"
|
specs = spack.cmd.parse_specs(args.specs)
|
||||||
raise RuntimeError(msg)
|
elif env:
|
||||||
|
specs = list(env.user_specs)
|
||||||
specs = list(env.user_specs) if env else spack.cmd.parse_specs(args.specs)
|
else:
|
||||||
|
tty.die("spack solve requires at least one spec or an active environment")
|
||||||
|
|
||||||
solver = asp.Solver()
|
solver = asp.Solver()
|
||||||
output = sys.stdout if "asp" in show else None
|
output = sys.stdout if "asp" in show else None
|
||||||
|
@ -96,20 +96,19 @@ def spec(parser, args):
|
|||||||
if args.install_status:
|
if args.install_status:
|
||||||
tree_context = spack.store.STORE.db.read_transaction
|
tree_context = spack.store.STORE.db.read_transaction
|
||||||
|
|
||||||
# Use command line specified specs, otherwise try to use environment specs.
|
env = ev.active_environment()
|
||||||
|
|
||||||
if args.specs:
|
if args.specs:
|
||||||
input_specs = spack.cmd.parse_specs(args.specs)
|
input_specs = spack.cmd.parse_specs(args.specs)
|
||||||
concretized_specs = spack.cmd.parse_specs(args.specs, concretize=True)
|
concretized_specs = spack.cmd.parse_specs(args.specs, concretize=True)
|
||||||
specs = list(zip(input_specs, concretized_specs))
|
specs = list(zip(input_specs, concretized_specs))
|
||||||
else:
|
elif env:
|
||||||
env = ev.active_environment()
|
|
||||||
if env:
|
|
||||||
env.concretize()
|
env.concretize()
|
||||||
specs = env.concretized_specs()
|
specs = env.concretized_specs()
|
||||||
|
|
||||||
|
if not args.format:
|
||||||
# environments are printed together in a combined tree() invocation,
|
# environments are printed together in a combined tree() invocation,
|
||||||
# except when using --yaml or --json, which we print spec by spec below.
|
# except when using --yaml or --json, which we print spec by spec below.
|
||||||
if not args.format:
|
|
||||||
tree_kwargs["key"] = spack.traverse.by_dag_hash
|
tree_kwargs["key"] = spack.traverse.by_dag_hash
|
||||||
tree_kwargs["hashes"] = args.long or args.very_long
|
tree_kwargs["hashes"] = args.long or args.very_long
|
||||||
print(spack.spec.tree([concrete for _, concrete in specs], **tree_kwargs))
|
print(spack.spec.tree([concrete for _, concrete in specs], **tree_kwargs))
|
||||||
|
@ -1831,7 +1831,7 @@ _spack_restage() {
|
|||||||
_spack_solve() {
|
_spack_solve() {
|
||||||
if $list_options
|
if $list_options
|
||||||
then
|
then
|
||||||
SPACK_COMPREPLY="-h --help --show -l --long -L --very-long -N --namespaces -I --install-status --no-install-status -y --yaml -j --json -c --cover -t --types --timers --stats -U --fresh --reuse --fresh-roots --reuse-deps --deprecated"
|
SPACK_COMPREPLY="-h --help --show --timers --stats -l --long -L --very-long -N --namespaces -I --install-status --no-install-status -y --yaml -j --json --format -c --cover -t --types -U --fresh --reuse --fresh-roots --reuse-deps --deprecated"
|
||||||
else
|
else
|
||||||
_all_packages
|
_all_packages
|
||||||
fi
|
fi
|
||||||
|
@ -2747,12 +2747,16 @@ complete -c spack -n '__fish_spack_using_command restage' -s h -l help -f -a hel
|
|||||||
complete -c spack -n '__fish_spack_using_command restage' -s h -l help -d 'show this help message and exit'
|
complete -c spack -n '__fish_spack_using_command restage' -s h -l help -d 'show this help message and exit'
|
||||||
|
|
||||||
# spack solve
|
# spack solve
|
||||||
set -g __fish_spack_optspecs_spack_solve h/help show= l/long L/very-long N/namespaces I/install-status no-install-status y/yaml j/json c/cover= t/types timers stats U/fresh reuse fresh-roots deprecated
|
set -g __fish_spack_optspecs_spack_solve h/help show= timers stats l/long L/very-long N/namespaces I/install-status no-install-status y/yaml j/json format= c/cover= t/types U/fresh reuse fresh-roots deprecated
|
||||||
complete -c spack -n '__fish_spack_using_command_pos_remainder 0 solve' -f -k -a '(__fish_spack_specs_or_id)'
|
complete -c spack -n '__fish_spack_using_command_pos_remainder 0 solve' -f -k -a '(__fish_spack_specs_or_id)'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s h -l help -f -a help
|
complete -c spack -n '__fish_spack_using_command solve' -s h -l help -f -a help
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s h -l help -d 'show this help message and exit'
|
complete -c spack -n '__fish_spack_using_command solve' -s h -l help -d 'show this help message and exit'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l show -r -f -a show
|
complete -c spack -n '__fish_spack_using_command solve' -l show -r -f -a show
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l show -r -d 'select outputs'
|
complete -c spack -n '__fish_spack_using_command solve' -l show -r -d 'select outputs'
|
||||||
|
complete -c spack -n '__fish_spack_using_command solve' -l timers -f -a timers
|
||||||
|
complete -c spack -n '__fish_spack_using_command solve' -l timers -d 'print out timers for different solve phases'
|
||||||
|
complete -c spack -n '__fish_spack_using_command solve' -l stats -f -a stats
|
||||||
|
complete -c spack -n '__fish_spack_using_command solve' -l stats -d 'print out statistics from clingo'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s l -l long -f -a long
|
complete -c spack -n '__fish_spack_using_command solve' -s l -l long -f -a long
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s l -l long -d 'show dependency hashes as well as versions'
|
complete -c spack -n '__fish_spack_using_command solve' -s l -l long -d 'show dependency hashes as well as versions'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s L -l very-long -f -a very_long
|
complete -c spack -n '__fish_spack_using_command solve' -s L -l very-long -f -a very_long
|
||||||
@ -2764,17 +2768,15 @@ complete -c spack -n '__fish_spack_using_command solve' -s I -l install-status -
|
|||||||
complete -c spack -n '__fish_spack_using_command solve' -l no-install-status -f -a install_status
|
complete -c spack -n '__fish_spack_using_command solve' -l no-install-status -f -a install_status
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l no-install-status -d 'do not show install status annotations'
|
complete -c spack -n '__fish_spack_using_command solve' -l no-install-status -d 'do not show install status annotations'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s y -l yaml -f -a format
|
complete -c spack -n '__fish_spack_using_command solve' -s y -l yaml -f -a format
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s y -l yaml -d 'print concrete spec as yaml'
|
complete -c spack -n '__fish_spack_using_command solve' -s y -l yaml -d 'print concrete spec as YAML'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s j -l json -f -a format
|
complete -c spack -n '__fish_spack_using_command solve' -s j -l json -f -a format
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s j -l json -d 'print concrete spec as json'
|
complete -c spack -n '__fish_spack_using_command solve' -s j -l json -d 'print concrete spec as JSON'
|
||||||
|
complete -c spack -n '__fish_spack_using_command solve' -l format -r -f -a format
|
||||||
|
complete -c spack -n '__fish_spack_using_command solve' -l format -r -d 'print concrete spec with the specified format string'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s c -l cover -r -f -a 'nodes edges paths'
|
complete -c spack -n '__fish_spack_using_command solve' -s c -l cover -r -f -a 'nodes edges paths'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s c -l cover -r -d 'how extensively to traverse the DAG (default: nodes)'
|
complete -c spack -n '__fish_spack_using_command solve' -s c -l cover -r -d 'how extensively to traverse the DAG (default: nodes)'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s t -l types -f -a types
|
complete -c spack -n '__fish_spack_using_command solve' -s t -l types -f -a types
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s t -l types -d 'show dependency types'
|
complete -c spack -n '__fish_spack_using_command solve' -s t -l types -d 'show dependency types'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l timers -f -a timers
|
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l timers -d 'print out timers for different solve phases'
|
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l stats -f -a stats
|
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l stats -d 'print out statistics from clingo'
|
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s U -l fresh -f -a concretizer_reuse
|
complete -c spack -n '__fish_spack_using_command solve' -s U -l fresh -f -a concretizer_reuse
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -s U -l fresh -d 'do not reuse installed deps; build newest configuration'
|
complete -c spack -n '__fish_spack_using_command solve' -s U -l fresh -d 'do not reuse installed deps; build newest configuration'
|
||||||
complete -c spack -n '__fish_spack_using_command solve' -l reuse -f -a concretizer_reuse
|
complete -c spack -n '__fish_spack_using_command solve' -l reuse -f -a concretizer_reuse
|
||||||
|
Loading…
Reference in New Issue
Block a user