summaryrefslogtreecommitdiff
path: root/lib
AgeCommit message (Collapse)AuthorFilesLines
2021-10-15Revert "Don't run lsb_release on linux (#26707)" (#26754)Harmen Stoppels2-4/+1
This reverts commit fcac95b0654a84151ad51a9123f74e8cdfcf8d26.
2021-10-15EnvironmentModifications: allow disabling stack tracing (#26706)Harmen Stoppels2-14/+29
Currently Spack keeps track of the origin in the code of any modification to the environment variables. This is very slow and enabled unconditionally even in code paths where the origin of the modification is never queried. The only place where we inspect the origins of environment modifications is before we start a build, If there's an override of the type `e.set(...)` after incremental changes like `e.append_path(..)`, which is a "suspicious" change. This is very rare though. If an override like this ever happens, it might mean a package is broken. If that leads to build errors, we can just ask the user to run `spack -d install ...` and check the warnings issued by Spack to find the origins of the problem.
2021-10-14Stand-alone tests: disallow re-using an alias (#25881)Tamara Dahlgren4-8/+82
It can be frustrating to successfully run `spack test run --alias <name>` only to find you cannot get the results because you already use `<name>` in some previous stand-alone test execution. This PR prevents that from happening.
2021-10-14ASP-based solver: add a rule for version uniqueness in virtual packages (#26740)Massimiliano Culpo2-0/+10
fixes #26718 A virtual package may or may not have a version, but it never has more than one. Previously we were missing a rule for that.
2021-10-14Constrain abstract specs rather than concatenating strings in the "when" ↵Massimiliano Culpo6-11/+73
context manager (#26700) Using the Spec.constrain method doesn't work since it might trigger a repository lookup which could break our directives and triggers a circular import error. To fix that we introduce a function to merge abstract anonymous specs, based only on package names, which does not perform any lookup in the repository.
2021-10-14Don't run lsb_release on linux (#26707)Harmen Stoppels2-1/+4
Running `lsb_release` on Linux takes about 50ms because it is written in Python. We do not use the output, so this change makes use not call it.
2021-10-13buildcache: do one less tar file extraction Patrick Gartung2-35/+25
The buildcache is now extracted in a temporary folder within the current store, moved to its final place and relocated. "spack clean -s" has been extended to also clean the temporary extraction directory. Add hardlinks with absolute paths for libraries in the corge, garply and quux packages to detect incorrect handling of hardlinks in tests.
2021-10-12Improve error messages for bootstrap download failures (#26599)Harmen Stoppels5-23/+100
2021-10-12Add missing spack command in basic usage tutorial (#26646)Alexander Jaust1-2/+2
The `find` command was missing for the examples forcing colorized output. Without this (or another suitable) command, spack produces output that is not using any color. Thus, without the `find` command one does not see any difference between forced colorized and non-colorized output.
2021-10-12spack: Add package (#25979)Harmen Stoppels1-1/+1
* Make python 2 use 'from __future__ import absolute_import' to allow import spack.pkgkit * Add Spack * Improve ranges
2021-10-12allowing spack monitor to handle redirect (#26666)Vanessasaurus1-0/+16
when deployed on kubernetes, the server sends back permanent redirect responses. This is elegantly handled by the requests library, but not urllib that we have to use here, so I have to manually handle it by parsing the exception to get the Location header, and then retrying the request there. Signed-off-by: vsoch <vsoch@users.noreply.github.com>
2021-10-12ASP-based solver: decrease the priority of multi-valued variant optimization ↵Massimiliano Culpo2-10/+31
for root (#26677) The ASP-based solver maximizes the number of values in multi-valued variants (if other higher order constraints are met), to avoid cases where only a subset of the values that have been specified on the command line or imposed by another constraint are selected. Here we swap the priority of this optimization target with the selection of the default providers, to avoid unexpected results like the one in #26598
2021-10-12Fix potentially broken shutil.rmtree in tests (#26665)Harmen Stoppels1-1/+4
Seems like https://bugs.python.org/issue29699 is relevant. Better to just ignore errors when removing them tmpdir. The OS will remove it anyways. Errors are happening randomly from tests that are using this fixture.
2021-10-12Avoid quadratic complexity in log parser (#26568)Harmen Stoppels1-62/+21
TL;DR: there are matching groups trying to match 1 or more occurrences of something. We don't use the matching group. Therefore it's sufficient to test for 1 occurrence. This reduce quadratic complexity to linear time. --- When parsing logs of an mpich build, I'm getting a 4 minute (!!) wait with 16 threads for regexes to run: ``` In [1]: %time p.parse("mpich.log") Wall time: 4min 14s ``` That's really unacceptably slow... After some digging, it seems a few regexes tend to have `O(n^2)` scaling where `n` is the string / log line length. I don't think they *necessarily* should scale like that, but it seems that way. The common pattern is this ``` ([^:]+): error ``` which matches `: error` literally, and then one or more non-colons before that. So for a log line like this: ``` abcdefghijklmnopqrstuvwxyz: error etc etc ``` Any of these are potential group matches when using `search` in Python: ``` abcdefghijklmnopqrstuvwxyz bcdefghijklmnopqrstuvwxyz cdefghijklmnopqrstuvwxyz ⋮ yz z ``` but clearly the capture group should return the longest match. My hypothesis is that Python has a very bad implementation of `search` that somehow considers all of these, even though it can be implemented in linear time by scanning for `: error` first, and then greedily expanding the longest possible `[^:]+` match to the left. If Python indeed considers all possible matches, then with `n` matches of length `1 .. n` you see the `O(n^2)` slowness (i verified this by replacing + with {1,k} and doubling `k`, it doubles the execution time indeed). This PR fixes this by removing the `+`, so effectively changing the O(n^2) into a O(n) worst case. The reason we are fine with dropping `+` is that we don't use the capture group anywhere, so, we just ensure `:: error` is not a match but `x: error` is. After going from O(n^2) to O(n), the 15MB mpich build log is parsed in `1.288s`, so about 200x faster. Just to be sure I've also updated `^CMake Error.*:` to `^CMake Error`, so that it does not match with all the possible `:`'s in the line. Another option is to use `.*?` there to make it quit scanning as soon as possible, but what line that starts with `CMake Error` that does not have a colon is really a false positive...
2021-10-11installer: Support showing status information in terminal title (#16259)Michael Kuhn3-1/+43
Installing packages with a lot of dependencies does not have an easy way of judging the current progress (apart from running `spack spec -I pkg` in another terminal). This change allows Spack to update the terminal's title with status information, including its current progress as well as information about the current and total number of packages.
2021-10-11Only install env modifications in <prefix>/.spack (#24081)Harmen Stoppels7-29/+79
- Do not store the full list of environment variables in <prefix>/.spack/spack-build-env.txt because it may contain user secrets. - Only store environment variable modifications upon installation. - Variables like PATH may still contain user and system paths to make spack-build-env.txt sourceable. Variables containing paths are modified through prepending/appending, and if we don't apply these to the current environment variable, we end up with statements like `export PATH=/path/to/spack/bin` with system paths missing, meaning no system binaries are in the path, which is a bad user experience. - Do write the full environment to spack-build-env.txt in the staging dir, but ensure it is readonly for the current user, to make it a bit safer on shared systems.
2021-10-11Add `spack env activate --temp` (#25388)Harmen Stoppels2-16/+54
Creates an environment in a temporary directory and activates it, which is useful for a quick ephemeral environment: ``` $ spack env activate -p --temp [spack-1a203lyg] $ spack add zlib ==> Adding zlib to environment /tmp/spack-1a203lyg ==> Updating view at /tmp/spack-1a203lyg/.spack-env/view ```
2021-10-11Remove unused --dependencies flag (#25731)Harmen Stoppels1-1/+1
2021-10-08Remove DB reindex during a read operation (#26601)Massimiliano Culpo2-12/+16
The DB should be what is trusted for certain operations. If it is not present when read we should assume the corresponding store is empty, rather than trying a write operation during a read. * Add a unit test * Document what needs to be there in tests
2021-10-08Fix leaky spack.binary_distribution.binary_index in tests (#26609)Harmen Stoppels2-7/+20
* Fix issues with leaky binary index across tests * More rigorous binary_index reset as now other tests are failing :(
2021-10-08Allow Version('') and map it to the empty tuple (#25953)Tamara Dahlgren2-4/+21
2021-10-07add hash field to spec on find --json and assert in test its there (#26443)Daniel G Travieso2-6/+9
Co-authored-by: Daniel Travieso <daniel@dgtravieso.com>
2021-10-07Fix for license symlinking issue. (#26576)Paul Ferrell1-1/+1
When a symlink to a license file exists but is broken, the license symlink post-install hook fails because os.path.exists() checks the existence of the target not the symlink itself. os.path.lexists() is the proper function to use.
2021-10-07Pipelines: retry service job on system errors (#26508)Scott Wittenburg1-0/+12
Retry rebuild-index, cleanup, and no-op jobs automatically if they fail due to infrastructure-related problems.
2021-10-07Memoize the result of spack.platforms.host() (#26573)Harmen Stoppels1-0/+1
2021-10-06Provide more info in `SbangPathError` to aid CI debugging (#26316)Tamara Dahlgren2-3/+24
2021-10-06Restore the correct computation of stores in environments (#26560)Massimiliano Culpo4-2/+66
Environments push/pop scopes upon activation. If some lazily evaluated value depending on the current configuration was computed and cached before the scopes are pushed / popped there will be an inconsistency in the current state. This PR fixes the issue for stores, but it would be better to move away from global state.
2021-10-06Remove the spack.architecture module (#25986)Massimiliano Culpo32-428/+271
The `spack.architecture` module contains an `Arch` class that is very similar to `spack.spec.ArchSpec` but points to platform, operating system and target objects rather than "names". There's a TODO in the class since 2016: https://github.com/spack/spack/blob/abb0f6e27c45758c37fd45d663214b86413fb4f6/lib/spack/spack/architecture.py#L70-L75 and this PR basically addresses that. Since there are just a few places where the `Arch` class was used, here we query the relevant platform objects where they are needed directly from `spack.platforms`. This permits to clean the code from vestigial logic. Modifications: - [x] Remove the `spack.architecture` module and replace its use by `spack.platforms` - [x] Remove unneeded tests
2021-10-05Use gnuconfig package for config file replacement for RISC-V. (#26364)Kevin Pedretti5-10/+86
* Use gnuconfig package for config file replacement for RISC-V. This extends the changes in #26035 to handle RISC-V. Before this change, many packages fail to configure on riscv64 due to config.guess being too old to know about RISC-V. This is seen out of the box when clingo fails to build from source due to pkgconfig failing to configure, throwing error: "configure: error: cannot guess build type; you must specify one". * Add riscv64 architecture * Update vendored archspec from upstream project. These archspec updates include changes needed to support riscv64. * Update archspec's __init__.py to reflect the commit hash of archspec being used.
2021-10-05Move shell aware env into spack.environment.shell (#25608)Harmen Stoppels12-218/+346
Cherry-picked from #25564 so this is standalone. With this PR we can activate an environment in Spack itself, without computing changes to environment variables only necessary for "shell aware" env activation. 1. Activating an environment: ```python spack.environment.activate(Environment(xyz)) -> None ``` this basically just sets `_active_environment` and modifies some config scopes. 2. Activating an environment **and** getting environment variable modifications for the shell: ```python spack.environment.shell.activate(Environment(xyz)) -> EnvironmentModifications ``` This should make it easier/faster to do unit tests and scripting with spack, without the cli interface.
2021-10-05Isolate bootstrap configuration from user configuration (#26071)Massimiliano Culpo5-27/+96
* Isolate bootstrap configuration from user configuration * Search for build dependencies automatically if bootstrapping from sources The bootstrapping logic will search for build dependencies automatically if bootstrapping anything form sources. Any external spec, if found, is written in a scope that is specific to bootstrapping. * Don't clean the bootstrap store with "spack clean -a" * Copy bootstrap.yaml and config.yaml in the bootstrap area
2021-10-04cc: make error messages more clearTodd Gamblin1-6/+7
- [x] Our wrapper error messages are sometimes hard to differentiate from other build output, so prefix all errors from `die()` with '[spack cc] ERROR:' - [x] The error we raise when running, say, `fc` without a Fortran compiler was not clear enough. Clarify the message and the comment.
2021-10-04cc: convert compiler wrapper to posix shellTodd Gamblin2-292/+434
This converts everything in cc to POSIX sh, except for the parts currently handled with bash arrays. Tests are still passing. This version tries to be as straightforward as possible. Specifically, most conversions are kept simple -- convert ifs to ifs, handle indirect expansion the way we do in `setup-env.sh`, only mess with the logic in `cc`, and don't mess with the python code at all. The big refactor is for arrays. We can't rely on bash's nice arrays and be ignorant of separators anymore. So: 1. To avoid complicated separator logic, there are three types of lists. They are: * `$lsep`-separated lists, which end with `_list`. `lsep` is customizable, but we picked `^G` (alarm bell) for `$lsep` because it's ASCII and it's unlikely that it would actually appear in any arguments. If we need to get fancier (and I will lose faith in the world if we do) then we could consider XON or XOFF. * `:`-separated directory lists, which end with `_dirs`, `_DIRS`, `PATH`, or `PATHS` * Whitespace-separated lists (like flags), which can have any other name. Whitespace and colon-separated lists come with the territory with PATHs from env vars and lists of flags. `^G` separated lists are what we use for most internal variables, b/c it's more likely to work. 2. To avoid subshells, use a bunch of functions that do dirty `eval` stuff instead. This adds 3 functions to deal with lists: * `append LISTNAME ELEMENT [SEP]` will put `ELEMENT` at the end of the list called `LISTNAME`. You can optionally say what separator you expect to use. Note that we are taking advantage of everything being global and passing lists by name. * `prepend LISTNAME ELEMENT [SEP]` like append, but puts `ELEMENT` at the start of `LISTNAME` * `extend LISTNAME1 LISTNAME2 [PREFIX]` appends everything in LISTNAME2 to LISTNAME1, and optionally prepends `PREFIX` to every element (this is useful for things like `-I`, `-isystem `, etc. * `preextend LISTNAME1 LISTNAME2 [PREFIX]` prepends everything in LISTNAME2 to LISTNAME1 in order, and optionally prepends `PREFIX` to every element. The routines determine the separator for each argument by its name, so we don't have to pass around separators everywhere. Amazingly, as long as you do not expand variables' values within an `eval` environment, you can do all this and still preserve quoting. When iterating over lists, the user of this API still has to set and unset `IFS` properly. We ended up having to ignore shellcheck SC2034 (unused variable), because using evals all over the place means that shellcheck doesn't notice that our list variables are actually used. So far this is looking pretty good. I took the most complex unit test I could find (which runs a sample link line) and ran the same command line 200 times in a shell script. Times are roughly as follows: For this invocation: ```console $ bash -c 'time (for i in `seq 1 200`; do ~/test_cc.sh > /dev/null; done)' ``` I get the following performance numbers (the listed shells are what I put in `cc`'s shebang): **Original** * Old version of `cc` with arrays and `bash v3.2.57` (macOS builtin): `4.462s` (`.022s` / call) * Old version of `cc` with arrays and `bash v5.1.8` (Homebrew): `3.267s` (`.016s` / call) **Using many subshells (#26408)** * with `bash v3.2.57`: `25.302s` (`.127s` / call) * with `bash v5.1.8`: `27.801s` (`.139s` / call) * with `dash`: `15.302s` (`.077s` / call) This version didn't seem to work with zsh. **This PR (no subshells)** * with `bash v3.2.57`: `4.973s` (`.025s` / call) * with `bash v5.1.8`: `4.984s` (`.025s` / call) * with `zsh`: `2.995s` (`.015s` / call) * with `dash`: `1.890s` (`.0095s` / call) Dash, with the new posix design, is easily the winner. So there are several interesting things to note here: 1. Running the posix version in `bash` is slower than using `bash` arrays. That is to be expected because it's doing a bunch of string processing where it likely did not have to before, at least in `bash`. 2. `zsh`, at least on macOS, is significantly faster than the ancient `bash` they ship with the system. Using `zsh` with the new version also makes the posix wrappers faster than `develop`. So it's worth preferring `zsh` if we have it. I suppose we should also try this with newer `bash` on Linux. 3. `bash v5.1.8` seems to be significantly faster than the old system `bash v3.2.57` for arrays. For straight POSIX stuff, it's a little slower. It did not seem to matter whether `--posix` was used. 4. `dash` is way faster than `bash` or `zsh`, so the real payoff just comes from being able to use it. I am not sure if that is mostly startup time, but it's significant. `dash` is ~2.4x faster than the original `bash` with arrays. So, doing a lot of string stuff is slower than arrays, but converting to posix seems worth it to be able to exploit `dash`. - [x] Convert all but array-related portions to sh - [x] Fix basic shellcheck issues. - [x] Convert arrays to use a few convenience functions: `append` and `extend` - [x] Get `cc` tests passing. - [x] Add `cc` tests where needed passing. - [x] Benchmarking. Co-authored-by: Tom Scogland <scogland1@llnl.gov> Co-authored-by: Danny McClanahan <1305167+cosmicexplorer@users.noreply.github.com>
2021-10-04Stand-alone tests: distinguish NO-TESTS from PASSED (#25880)Tamara Dahlgren2-2/+31
Co-authored-by: Seth R. Johnson <johnsonsr@ornl.gov>
2021-10-04Avoid replacing symlinked spack.yaml when concretizing an environment (#26428)Pedro Demarchi Gomes2-1/+20
2021-10-04Improve an error message in stage.py (#23737)Andreas Baumbach1-1/+2
2021-10-04Fix NonVirtualInHierarchyError message format (#26008)Dylan Simon1-1/+1
2021-10-04Build ppc64le docker images (#26442)Massimiliano Culpo3-5/+32
* Update archspec * Add ppc64le to docker images
2021-10-04Update Spec.full_hash docstring (#26456)Massimiliano Culpo1-4/+1
The docstring is outdated since #21735 when the build hash has been included in the full hash.
2021-10-03Fix JSONDecodeError when using compiler modules (#25624)Jordan Galby2-2/+2
When using modules for compiler (and/or external package), if a package's `setup_[dependent_]build_environment` sets `PYTHONHOME`, it can influence the python subprocess executed to gather module information. The error seen was: ``` json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) ``` But the actual hidden error happened in the `python -c 'import json...'` subprocess, which made it return an empty string as json: ``` ModuleNotFoundError: No module named 'encodings' ``` This fix uses `python -E` to ignore `PYTHONHOME` and `PYTHONPATH`. Should be safe here because the python subprocess code only use packages built-in python. The python subprocess in `environment.py` was also patched to be safe and consistent.
2021-10-03Remove .99 from version ranges (#26422)Harmen Stoppels3-6/+6
In most cases, .99 can be omitted thanks to #26402 .
2021-10-01Simplify setup_package in build environment (#26070)Harmen Stoppels1-29/+22
* Remove redundant preserve environment code in build environment * Remove fix for a bug in a module See https://github.com/spack/spack/issues/3153#issuecomment-280460041, this shouldn't be part of core spack. * Don't module unload cray-libsci on all platforms
2021-10-01Fix error message when test throws AttributeError (#25895)Cory Bloor1-4/+6
Narrow the scope of the try/except block, to avoid a misleading error message if fn() throws an AttributeError.
2021-10-01Allow non-empty ranges 1.1.0:1.1 (#26402)Harmen Stoppels2-2/+23
2021-10-01Spack install: handle failed restore of backup (#25647)Harmen Stoppels3-35/+200
Spack has logic to preserve an installation prefix when it is being overwritten: if the new install fails, the old files are restored. This PR adds error handling for when this backup restoration fails (i.e. the new install fails, and then some unexpected error prevents restoration from the backup).
2021-10-01Service jobs do not need an active environmentScott Wittenburg1-5/+0
2021-10-01Add oneAPI packages from 2021.4 release (#26401)Anna Masalskaya1-0/+12
2021-10-01bootstrapping: improve error messages (#26399)Harmen Stoppels2-8/+26
2021-09-30Add info command tests to increase coverage (#26127)Tamara Dahlgren1-0/+16
2021-09-30Replace spec-related install_test asserts with exceptions; added unit tests ↵Tamara Dahlgren2-6/+57
(#25982)