summaryrefslogtreecommitdiff
path: root/lib
AgeCommit message (Collapse)AuthorFilesLines
2024-09-18Bump archspec to latest commit (#46445)Massimiliano Culpo2-7/+3
This should fix an issue with Neoverse XX detection Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2024-09-17variants: Unify metadata dictionaries to index by `when` (#44425)Todd Gamblin19-633/+1122
Continuing the work started in #40326, his changes the structure of Variant metadata on Packages from a single variant definition per name with a list of `when` specs: ``` name: (Variant, [when_spec, ...]) ``` to a Variant definition per `when_spec` per name: ``` when_spec: { name: Variant } ``` With this change, everything on a package *except* versions is keyed by `when` spec. This: 1. makes things consistent, in that conditional things are (nearly) all modeled in the same way; and 2. fixes an issue where we would lose information about multiple variant definitions in a package (see #38302). We can now have, e.g., different defaults for the same variant in different versions of a package. Some notes: 1. This required some pretty deep changes to the solver. Previously, the solver's job was to select value(s) for a single variant definition per name per package. Now, the solver needs to: a. Determine which variant definition should be used for a given node, which can depend on the node's version, compiler, target, other variants, etc. b. Select valid value(s) for variants for each node based on the selected variant definition. When multiple variant definitions are enabled via their `when=` clause, we will always prefer the *last* matching definition, by declaration order in packages. This is implemented by adding a `precedence` to each variant at definition time, and we ensure they are added to the solver in order of precedence. This has the effect that variant definitions from derived classes are preferred over definitions from superclasses, and the last definition within the same class sticks. This matches python semantics. Some examples: ```python class ROCmPackage(PackageBase): variant("amdgpu_target", ..., when="+rocm") class Hipblas(ROCmPackage): variant("amdgpu_target", ...) ``` The global variant in `hipblas` will always supersede the `when="+rocm"` variant in `ROCmPackage`. If `hipblas`'s variant was also conditional on `+rocm` (as it probably should be), we would again filter out the definition from `ROCmPackage` because it could never be activated. If you instead have: ```python class ROCmPackage(PackageBase): variant("amdgpu_target", ..., when="+rocm") class Hipblas(ROCmPackage): variant("amdgpu_target", ..., when="+rocm+foo") ``` The variant on `hipblas` will win for `+rocm+foo` but the one on `ROCmPackage` will win with `rocm~foo`. So, *if* we can statically determine if a variant is overridden, we filter it out. This isn't strictly necessary, as the solver can handle many definitions fine, but this reduces the complexity of the problem instance presented to `clingo`, and simplifies output in `spack info` for derived packages. e.g., `spack info hipblas` now shows only one definition of `amdgpu_target` where before it showed two, one of which would never be used. 2. Nearly all access to the `variants` dictionary on packages has been refactored to use the following class methods on `PackageBase`: * `variant_names(cls) -> List[str]`: get all variant names for a package * `has_variant(cls, name) -> bool`: whether a package has a variant with a given name * `variant_definitions(cls, name: str) -> List[Tuple[Spec, Variant]]`: all definitions of variant `name` that are possible, along with their `when` specs. * `variant_items() -> `: iterate over `pkg.variants.items()`, with impossible variants filtered out. Consolidating to these methods seems to simplify the code a lot. 3. The solver does a lot more validation on variant values at setup time now. In particular, it checks whether a variant value on a spec is valid given the other constraints on that spec. This allowed us to remove the crufty logic in `update_variant_validate`, which was needed because we previously didn't *know* after a solve which variant definition had been used. Now, variant values from solves are constructed strictly based on which variant definition was selected -- no more heuristics. 4. The same prevalidation can now be done in package audits, and you can run: ``` spack audit packages --strict-variants ``` This turns up around 18 different places where a variant specification isn't valid given the conditions on variant definitions in packages. I haven't fixed those here but will open a separate PR to iterate on them. I plan to make strict checking the defaults once all existing package issues are resolved. It's not clear to me that strict checking should be the default for the prevalidation done at solve time. There are a few other changes here that might be of interest: 1. The `generator` variant in `CMakePackage` is now only defined when `build_system=cmake`. 2. `spack info` has been updated to support the new metadata layout. 3. split out variant propagation into its own `.lp` file in the `solver` code. 4. Add better typing and clean up code for variant types in `variant.py`. 5. Add tests for new variant behavior.
2024-09-17drop main dep from build_environment/subprocess_context (#46426)Harmen Stoppels4-18/+18
2024-09-17untangle spack.config / spack.util.cpus & spack.spec (#46427)Harmen Stoppels9-72/+65
2024-09-17package_base.py: do not depend on spack.environment (#46424)Harmen Stoppels1-3/+1
2024-09-17imports: automate missing imports (#46410)Harmen Stoppels136-170/+383
2024-09-16Add repositories for "requirements" and "flag mixing" unit tests (#46412)Massimiliano Culpo2-181/+29
2024-09-16Add missing & remove redundant imports (#46407)Harmen Stoppels111-189/+14
2024-09-16Fix a few circular deps (#46373)Harmen Stoppels26-226/+196
2024-09-15fetch_strategy: show the effective URL on checksum validation failure (#46349)Harmen Stoppels1-20/+26
2024-09-13build(deps): bump urllib3 from 2.2.2 to 2.2.3 in /lib/spack/docs (#46368)dependabot[bot]1-1/+1
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.2.2 to 2.2.3. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.2.2...2.2.3) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-13Optionally output package namespace (#46359)Kyle Knoepfel1-0/+11
2024-09-13audit: deprecate certain globals (#44895)Harmen Stoppels2-10/+92
2024-09-13remove self-import cycles (#46371)Harmen Stoppels4-9/+5
2024-09-12build(deps): bump pytest from 8.3.2 to 8.3.3 in /lib/spack/docs (#46315)dependabot[bot]1-1/+1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.3.2 to 8.3.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.3.2...8.3.3) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-11bugfix: unit test broken everywhere by package change(#46344)Peter Scheibel1-1/+0
Openmpi provider statements were changed in #46102. The package change was fine in and of itself, but apparently one of our tests depends on the precise constraints used in those statements. I updated the test to remove the checks for constraints that were removed.
2024-09-11CUDA: support Grace Hopper 9.0a compute capability (#45540)Adam J. Stewart1-0/+25
* CUDA: support Grace Hopper 9.0a compute capability * Fix other packages * Add type annotations * Support ancient Python versions * isort * spec -> self.spec Co-authored-by: Andrew W Elble <aweits@rit.edu> * [@spackbot] updating style on behalf of adamjstewart --------- Co-authored-by: Andrew W Elble <aweits@rit.edu> Co-authored-by: adamjstewart <adamjstewart@users.noreply.github.com>
2024-09-10Deprecate `config:install_missing_compilers` (#46237)Massimiliano Culpo10-385/+19
The option config:install_missing_compilers is currently buggy, and has been for a while. Remove it, since it won't be needed when compilers are treated as dependencies. Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2024-09-10r: do not create dir in setup_dependent_package (#46282)Harmen Stoppels1-14/+10
2024-09-10spec.py: dedent format logic (#46279)Harmen Stoppels1-36/+33
2024-09-09Revert "Set module variables for all packages before running ↵Harmen Stoppels2-30/+1
setup_dependent_…" (#46283) This reverts commit 6f08db463149efdea126abf8fdc770f684b4199d.
2024-09-09reindex: do not assume fixed layout (#46170)Harmen Stoppels6-152/+274
`spack reindex` relies on projections from configuration to locate installed specs and prefixes. This is problematic because config can change over time, and we have reasons to do so when turning compilers into depedencies (removing `{compiler.name}-{compiler.version}` from projections) This commit makes reindex recursively search for .spack/ metadirs.
2024-09-09Fix regression in spec format string for indiviual variants (#46206)Jordan Galby2-2/+19
Fix a regression in {variants.X} and {variants.X.value} spec format strings.
2024-09-06Set module variables for all packages before running setup_dependent_package ↵Dan Lipsa2-1/+30
(#44327) When a package is running `setup_dependent_package` on a parent, ensure that module variables like `spack_cc` are available. This was often true prior to this commit, but externals were an exception. --------- Co-authored-by: John Parent <john.parent@kitware.com>
2024-09-06Remove deprecated config options (#44061)Massimiliano Culpo3-65/+0
These options have been deprecated in v0.21, and slated for removal in v0.23
2024-09-06Mixed-source cflags (#41049)Peter Scheibel8-174/+732
Allow flags from different sources (compilers, `require:`, command-line specs, and `depends_on`) to be merged together, and enforce a consistent order among them. The order is based on the sources, e.g. flags on specs from the command line always come last. Some flag order consistency issues are fixed: 1. Flags from `compilers.yaml` and the command line were always intra- and inter-source order consistent. 2. Flags from dependents and packages.yaml (introduced via `require:`) were not: for `-a -b` from one source and `-c` from another, the final result might rearrange `-a -b`, and would also be inconsistent in terms of whether `-c` came before or after. (1) is/was handled by going back to the original source, i.e., flags are retrieved directly from the command line spec rather than the solver. (2) is addressed by: * Keeping track of grouped flags in the solver * Keeping track of flag sources in the solver on a per-flag basis The latter info is used in this PR to enforce DAG ordering on flags applied from multiple dependents to the same package, e.g., for this graph: ``` a /|\ b | c \|/ d ``` If `a`, `b`, and `c` impose flags on `d`, the combined flags on `d` will contain the flags of `a`, `b`, and `c` -- in that order. Conflicting flags are allowed (e.g. -O2 and -O3). `Spec.satisifes()` has been updated such that X satisfies Y as long as X has *at least* all of the flags that Y has. This is also true in the solver constraints. `.satisfies` does not account for how order can change behavior (so `-O2 -O3` can satisfy `-O3 -O2`); it is expected that this can be addressed later (e.g. by prohibiting flag conflicts). `Spec.constrain` and `.intersects` have been updated to be consistent with this new definition of `.satisfies`.
2024-09-06Bootstrap GnuPG and `file` on Windows (#41810)John W. Parent8-83/+130
Spack can now bootstrap two new dependencies on Windows: GnuPG, and file. These dependencies are modeled as a separate package, and they install a cross-compiled binary. Details on how they binaries are built are in https://github.com/spack/windows-bootstrap-resources
2024-09-06fish: use shlex.quote instead of custom quote (#46251)Harmen Stoppels1-70/+43
2024-09-06db: more type hints (#46242)Harmen Stoppels1-23/+23
2024-09-05Allow deprecating more than one property in config (#46221)Massimiliano Culpo4-58/+70
* Allow deprecating more than one property in config This internal change allows the customization of errors and warnings to be printed when deprecating a property. Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com> * fix Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com> * Use a list comprehension for "issues" Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com> --------- Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2024-09-05Windows: Update pytest with echo and remove others (#45620)Nicole C.12-21/+7
* Windows: Update pytest with echo and remove others * Fix style * Remove unused pytest import in undevelop * Update test_test_part_pass to be Window compatible * Style
2024-09-05Avoid best-effort expansion of stacks (#40792)Massimiliano Culpo3-144/+35
fixes #40791 Currently stacks behave differently if used in unify:false environments, which leads to inconsistencies during concretization. For instance, we might have two abstract user specs that do not intersect with each other map to the same concrete spec in the environment. This is clearly wrong. This PR removes the best effort expansion, so that user specs are always applied strictly.
2024-09-05reindex: ensure database is empty before reindex (#46199)Harmen Stoppels1-5/+18
fixes two tests that did not clear the in-memory bits of a database before calling reindex.
2024-09-05Pass Database layout in constructor (#46219)Harmen Stoppels12-117/+96
Ensures that Database instances do not reference a global `spack.store.STORE.layout`. Simplify Database.{add,reindex} signature.
2024-09-05Remove `test_external_package_module` (#46218)Massimiliano Culpo1-14/+0
This test was possibly meant for the Cray platform, and currently is a no-op. Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2024-09-05spack deprecate: deprecate --link-type flag (#46202)Harmen Stoppels1-10/+5
2024-09-03solver: minor cleanup and optimization (#46176)Massimiliano Culpo2-15/+4
Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
2024-09-03database: remove a few class properties (#46175)Harmen Stoppels4-56/+51
2024-09-02db: type hints (#46168)Harmen Stoppels2-69/+73
2024-09-02projections: simplify expression (#46167)Harmen Stoppels1-6/+1
2024-09-02remove dead code: fs.is_writable_dir was used on file (#46166)Harmen Stoppels1-24/+2
2024-09-02package_base: sort deprecated versions later in `preferred_version` (#46025)Wouter Deconinck3-8/+7
2024-09-02cuda: add v12.6.1 (#46143)pauleonix1-1/+2
Update build system conflict between CUDA 12.6 and Clang 18
2024-09-02docs: update conditional definition arch (#46139)Georgia Stuart1-1/+1
Signed-off-by: Georgia Stuart <gstuart@umass.edu> Co-authored-by: Jordan Galby <67924449+Jordan474@users.noreply.github.com>
2024-09-01Remove redundant inspect.getmodule(self) idiom in packages (#46073)Harmen Stoppels22-97/+62
2024-08-30Remove `DetectedPackage` class (#46071)Massimiliano Culpo9-95/+55
This PR simplifies the code doing external spec detection by removing the `DetectedPackage` class. Now, functions accepting or returning lists of `DetectedPackage`, will accept or return list of specs. Performance doesn't seem to change if we use `Spec.__reduce__` instead of `DetectionPackage.__reduce__`.
2024-08-29CMakePackage: Set policy CMP0042 NEW on macos (#46114)Chris Marsh1-0/+5
so linking to shared libraries works well at runtime on darwin for all packages with cmake_minimum_required < 3.
2024-08-29windows_establish_runtime_linkage: post install hook (#46103)Harmen Stoppels2-2/+0
2024-08-29Executable: make the timeout message readable (#46098)Tamara Dahlgren1-3/+3
2024-08-29Remove "get_compiler_duplicates" (#46077)Massimiliano Culpo2-37/+0
This function is used only in tests.