Compare commits
110 Commits
develop-20
...
devtools-r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ddc5dc7da3 | ||
|
|
0663ac3633 | ||
|
|
f80df0ca47 | ||
|
|
367abcb801 | ||
|
|
8fc1ba2d7a | ||
|
|
668a5b45e5 | ||
|
|
70171d6caf | ||
|
|
0f1898c82a | ||
|
|
db16335aec | ||
|
|
3082ce6a22 | ||
|
|
fe0cf80e05 | ||
|
|
a5e6097af7 | ||
|
|
d4a1618e07 | ||
|
|
48a21970d1 | ||
|
|
864d47043c | ||
|
|
c2af2bcac3 | ||
|
|
7c79c744b6 | ||
|
|
94d143763e | ||
|
|
6f9425c593 | ||
|
|
05953e4491 | ||
|
|
6b236f130c | ||
|
|
fa08de669e | ||
|
|
c2193b5470 | ||
|
|
b5b94d89d3 | ||
|
|
dd57b58c2f | ||
|
|
29a30963b3 | ||
|
|
3447e425f0 | ||
|
|
518da16833 | ||
|
|
4633327e60 | ||
|
|
6930176ac6 | ||
|
|
bb64b22066 | ||
|
|
8b0ab67de4 | ||
|
|
dbf21bf843 | ||
|
|
af3a29596e | ||
|
|
80944d22f7 | ||
|
|
f56efaff3e | ||
|
|
83bb2002b4 | ||
|
|
16fa3b9f07 | ||
|
|
6cd2241e49 | ||
|
|
6af45230b4 | ||
|
|
a8285f0eec | ||
|
|
e7456e1aab | ||
|
|
dd636dd3fb | ||
|
|
a73c95b734 | ||
|
|
33b355a085 | ||
|
|
f7630f265b | ||
|
|
9744e86d02 | ||
|
|
ff6bbf03a1 | ||
|
|
0767c8673e | ||
|
|
9aa75eaf65 | ||
|
|
73f012b999 | ||
|
|
c7a8a83cbf | ||
|
|
5f87db98ea | ||
|
|
d05dc8a468 | ||
|
|
afa2a2566e | ||
|
|
581f45b639 | ||
|
|
92780a9af6 | ||
|
|
2ea8e6c820 | ||
|
|
ac976a4bf4 | ||
|
|
e5f3ffc04f | ||
|
|
7aaed4d6f3 | ||
|
|
f5d717cd5a | ||
|
|
cb018fd7eb | ||
|
|
e5cebb6b6f | ||
|
|
4738b45fb1 | ||
|
|
343ed8a3fa | ||
|
|
58e5315089 | ||
|
|
26649e71f9 | ||
|
|
2f2d9ae30d | ||
|
|
f9c0a15ba0 | ||
|
|
14cb923dd8 | ||
|
|
544a121248 | ||
|
|
cd6bb9e159 | ||
|
|
e420a685a9 | ||
|
|
40a5c1ff2d | ||
|
|
6933e1c3cb | ||
|
|
160bfd881d | ||
|
|
81997ae6d6 | ||
|
|
702a2250fa | ||
|
|
3a0f9ce226 | ||
|
|
a095c8113d | ||
|
|
4ef433b64d | ||
|
|
f228c7cbcc | ||
|
|
e9ca16ab07 | ||
|
|
47ac2b8d09 | ||
|
|
b1b8500eba | ||
|
|
060a1ff2f3 | ||
|
|
9ed9a541c9 | ||
|
|
1ebf1c8d1c | ||
|
|
c2f3943e9e | ||
|
|
1ba530bff5 | ||
|
|
cc09e88a4a | ||
|
|
2f3801196d | ||
|
|
d03289c38b | ||
|
|
e720d8640a | ||
|
|
00602cda4f | ||
|
|
35882130ce | ||
|
|
1586c8c786 | ||
|
|
a9e78dc7d8 | ||
|
|
b53b235cff | ||
|
|
33cb8c988f | ||
|
|
6511d3dfff | ||
|
|
272ca0fc24 | ||
|
|
a8f42b865f | ||
|
|
7739c54eb5 | ||
|
|
bd1bb7d1ba | ||
|
|
6983db1392 | ||
|
|
2a797f90b4 | ||
|
|
2e097b4cbd | ||
|
|
a1282337c0 |
3
.github/workflows/bootstrap.yml
vendored
3
.github/workflows/bootstrap.yml
vendored
@@ -159,6 +159,9 @@ jobs:
|
||||
brew install cmake bison@2.7 tree
|
||||
- name: Checkout
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
||||
- uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # @v2
|
||||
with:
|
||||
python-version: "3.12"
|
||||
- name: Bootstrap clingo
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
|
||||
2
.github/workflows/style/requirements.txt
vendored
2
.github/workflows/style/requirements.txt
vendored
@@ -1,4 +1,4 @@
|
||||
black==23.9.1
|
||||
black==23.10.1
|
||||
clingo==5.6.2
|
||||
flake8==6.1.0
|
||||
isort==5.12.0
|
||||
|
||||
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,3 +1,33 @@
|
||||
# v0.20.3 (2023-10-31)
|
||||
|
||||
## Bugfixes
|
||||
|
||||
- Fix a bug where `spack mirror set-url` would drop configured connection info (reverts #34210)
|
||||
- Fix a minor issue with package hash computation for Python 3.12 (#40328)
|
||||
|
||||
|
||||
# v0.20.2 (2023-10-03)
|
||||
|
||||
## Features in this release
|
||||
|
||||
Spack now supports Python 3.12 (#40155)
|
||||
|
||||
## Bugfixes
|
||||
|
||||
- Improve escaping in Tcl module files (#38375)
|
||||
- Make repo cache work on repositories with zero mtime (#39214)
|
||||
- Ignore errors for newer, incompatible buildcache version (#40279)
|
||||
- Print an error when git is required, but missing (#40254)
|
||||
- Ensure missing build dependencies get installed when using `spack install --overwrite` (#40252)
|
||||
- Fix an issue where Spack freezes when the build process unexpectedly exits (#39015)
|
||||
- Fix a bug where installation failures cause an unrelated `NameError` to be thrown (#39017)
|
||||
- Fix an issue where Spack package versions would be incorrectly derived from git tags (#39414)
|
||||
- Fix a bug triggered when file locking fails internally (#39188)
|
||||
- Prevent "spack external find" to error out when a directory cannot be accessed (#38755)
|
||||
- Fix multiple performance regressions in environments (#38771)
|
||||
- Add more ignored modules to `pyproject.toml` for `mypy` (#38769)
|
||||
|
||||
|
||||
# v0.20.1 (2023-07-10)
|
||||
|
||||
## Spack Bugfixes
|
||||
|
||||
@@ -66,7 +66,7 @@ Resources:
|
||||
* **Matrix space**: [#spack-space:matrix.org](https://matrix.to/#/#spack-space:matrix.org):
|
||||
[bridged](https://github.com/matrix-org/matrix-appservice-slack#matrix-appservice-slack) to Slack.
|
||||
* [**Github Discussions**](https://github.com/spack/spack/discussions):
|
||||
not just for discussions, also Q&A.
|
||||
not just for discussions, but also Q&A.
|
||||
* **Mailing list**: [groups.google.com/d/forum/spack](https://groups.google.com/d/forum/spack)
|
||||
* **Twitter**: [@spackpm](https://twitter.com/spackpm). Be sure to
|
||||
`@mention` us!
|
||||
|
||||
@@ -1526,6 +1526,30 @@ any MPI implementation will do. If another package depends on
|
||||
error. Likewise, if you try to plug in some package that doesn't
|
||||
provide MPI, Spack will raise an error.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Explicit binding of virtual dependencies
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
There are packages that provide more than just one virtual dependency. When interacting with them, users
|
||||
might want to utilize just a subset of what they could provide, and use other providers for virtuals they
|
||||
need.
|
||||
|
||||
It is possible to be more explicit and tell Spack which dependency should provide which virtual, using a
|
||||
special syntax:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack spec strumpack ^[virtuals=mpi] intel-parallel-studio+mkl ^[virtuals=lapack] openblas
|
||||
|
||||
Concretizing the spec above produces the following DAG:
|
||||
|
||||
.. figure:: images/strumpack_virtuals.svg
|
||||
:scale: 60 %
|
||||
:align: center
|
||||
|
||||
where ``intel-parallel-studio`` *could* provide ``mpi``, ``lapack``, and ``blas`` but is used only for the former. The ``lapack``
|
||||
and ``blas`` dependencies are satisfied by ``openblas``.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Specifying Specs by Hash
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
BIN
lib/spack/docs/images/setup_env.png
Normal file
BIN
lib/spack/docs/images/setup_env.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 296 KiB |
534
lib/spack/docs/images/strumpack_virtuals.svg
Normal file
534
lib/spack/docs/images/strumpack_virtuals.svg
Normal file
@@ -0,0 +1,534 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><!-- Generated by graphviz version 2.40.1 (20161225.0304)
|
||||
--><!-- Title: G Pages: 1 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="3044pt" height="1683pt" viewBox="0.00 0.00 3043.65 1682.80">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1678.8)">
|
||||
<title>G</title>
|
||||
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1678.8 3039.6456,-1678.8 3039.6456,4 -4,4"/>
|
||||
<!-- hkcrbrtf2qex6rvzuok5tzdrbam55pdn -->
|
||||
<g id="node1" class="node">
|
||||
<title>hkcrbrtf2qex6rvzuok5tzdrbam55pdn</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M2407.965,-1198.3002C2407.965,-1198.3002 1948.1742,-1198.3002 1948.1742,-1198.3002 1942.1742,-1198.3002 1936.1742,-1192.3002 1936.1742,-1186.3002 1936.1742,-1186.3002 1936.1742,-1123.6998 1936.1742,-1123.6998 1936.1742,-1117.6998 1942.1742,-1111.6998 1948.1742,-1111.6998 1948.1742,-1111.6998 2407.965,-1111.6998 2407.965,-1111.6998 2413.965,-1111.6998 2419.965,-1117.6998 2419.965,-1123.6998 2419.965,-1123.6998 2419.965,-1186.3002 2419.965,-1186.3002 2419.965,-1192.3002 2413.965,-1198.3002 2407.965,-1198.3002"/>
|
||||
<text text-anchor="middle" x="2178.0696" y="-1147.8" font-family="Monaco" font-size="24.00" fill="#000000">netlib-scalapack@2.2.0%gcc@9.4.0/hkcrbrt</text>
|
||||
</g>
|
||||
<!-- o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="node8" class="node">
|
||||
<title>o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M901.2032,-1039.5002C901.2032,-1039.5002 486.936,-1039.5002 486.936,-1039.5002 480.936,-1039.5002 474.936,-1033.5002 474.936,-1027.5002 474.936,-1027.5002 474.936,-964.8998 474.936,-964.8998 474.936,-958.8998 480.936,-952.8998 486.936,-952.8998 486.936,-952.8998 901.2032,-952.8998 901.2032,-952.8998 907.2032,-952.8998 913.2032,-958.8998 913.2032,-964.8998 913.2032,-964.8998 913.2032,-1027.5002 913.2032,-1027.5002 913.2032,-1033.5002 907.2032,-1039.5002 901.2032,-1039.5002"/>
|
||||
<text text-anchor="middle" x="694.0696" y="-989" font-family="Monaco" font-size="24.00" fill="#000000">openblas@0.3.21%gcc@9.4.0/o524geb</text>
|
||||
</g>
|
||||
<!-- hkcrbrtf2qex6rvzuok5tzdrbam55pdn->o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>hkcrbrtf2qex6rvzuok5tzdrbam55pdn->o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1936.1981,-1113.832C1933.0949,-1113.4088 1930.0059,-1112.9948 1926.9392,-1112.5915 1575.405,-1066.3348 1485.3504,-1074.0879 1131.9752,-1040.5955 1064.2267,-1034.1713 990.6114,-1026.9648 923.4066,-1020.2975"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1936.4684,-1111.8504C1933.3606,-1111.4265 1930.2716,-1111.0125 1927.2,-1110.6085 1575.2335,-1064.3422 1485.1789,-1072.0953 1132.164,-1038.6045 1064.4216,-1032.1808 990.8062,-1024.9744 923.604,-1018.3073"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="923.505,-1015.7853 913.2081,-1018.2801 922.8133,-1022.751 923.505,-1015.7853"/>
|
||||
<text text-anchor="middle" x="1368.79" y="-1067.6346" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=blas,lapack</text>
|
||||
</g>
|
||||
<!-- 2w3nq3n3hcj2tqlvcpewsryamltlu5tw -->
|
||||
<g id="node23" class="node">
|
||||
<title>2w3nq3n3hcj2tqlvcpewsryamltlu5tw</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M2767.3081,-1039.5002C2767.3081,-1039.5002 2166.8311,-1039.5002 2166.8311,-1039.5002 2160.8311,-1039.5002 2154.8311,-1033.5002 2154.8311,-1027.5002 2154.8311,-1027.5002 2154.8311,-964.8998 2154.8311,-964.8998 2154.8311,-958.8998 2160.8311,-952.8998 2166.8311,-952.8998 2166.8311,-952.8998 2767.3081,-952.8998 2767.3081,-952.8998 2773.3081,-952.8998 2779.3081,-958.8998 2779.3081,-964.8998 2779.3081,-964.8998 2779.3081,-1027.5002 2779.3081,-1027.5002 2779.3081,-1033.5002 2773.3081,-1039.5002 2767.3081,-1039.5002"/>
|
||||
<text text-anchor="middle" x="2467.0696" y="-989" font-family="Monaco" font-size="24.00" fill="#000000">intel-parallel-studio@cluster.2020.4%gcc@9.4.0/2w3nq3n</text>
|
||||
</g>
|
||||
<!-- hkcrbrtf2qex6rvzuok5tzdrbam55pdn->2w3nq3n3hcj2tqlvcpewsryamltlu5tw -->
|
||||
<g id="edge29" class="edge">
|
||||
<title>hkcrbrtf2qex6rvzuok5tzdrbam55pdn->2w3nq3n3hcj2tqlvcpewsryamltlu5tw</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2256.5586,-1110.7308C2294.3103,-1089.9869 2339.6329,-1065.083 2378.4976,-1043.7276"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2257.5217,-1112.4836C2295.2735,-1091.7397 2340.5961,-1066.8358 2379.4607,-1045.4804"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2381.116,-1047.4235 2388.1946,-1039.5403 2377.745,-1041.2886 2381.116,-1047.4235"/>
|
||||
<text text-anchor="middle" x="2286.6606" y="-1079.8414" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=mpi</text>
|
||||
</g>
|
||||
<!-- gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="node27" class="node">
|
||||
<title>gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M1539.1928,-1039.5002C1539.1928,-1039.5002 1152.9464,-1039.5002 1152.9464,-1039.5002 1146.9464,-1039.5002 1140.9464,-1033.5002 1140.9464,-1027.5002 1140.9464,-1027.5002 1140.9464,-964.8998 1140.9464,-964.8998 1140.9464,-958.8998 1146.9464,-952.8998 1152.9464,-952.8998 1152.9464,-952.8998 1539.1928,-952.8998 1539.1928,-952.8998 1545.1928,-952.8998 1551.1928,-958.8998 1551.1928,-964.8998 1551.1928,-964.8998 1551.1928,-1027.5002 1551.1928,-1027.5002 1551.1928,-1033.5002 1545.1928,-1039.5002 1539.1928,-1039.5002"/>
|
||||
<text text-anchor="middle" x="1346.0696" y="-989" font-family="Monaco" font-size="24.00" fill="#000000">cmake@3.25.1%gcc@9.4.0/gguve5i</text>
|
||||
</g>
|
||||
<!-- hkcrbrtf2qex6rvzuok5tzdrbam55pdn->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>hkcrbrtf2qex6rvzuok5tzdrbam55pdn->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1950.9968,-1111.6597C1829.5529,-1088.4802 1680.8338,-1060.0949 1561.2457,-1037.2697"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1561.7091,-1033.795 1551.2303,-1035.3581 1560.3967,-1040.6709 1561.7091,-1033.795"/>
|
||||
</g>
|
||||
<!-- i4avrindvhcamhurzbfdaggbj2zgsrrh -->
|
||||
<g id="node2" class="node">
|
||||
<title>i4avrindvhcamhurzbfdaggbj2zgsrrh</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M1536.3649,-86.7002C1536.3649,-86.7002 1155.7743,-86.7002 1155.7743,-86.7002 1149.7743,-86.7002 1143.7743,-80.7002 1143.7743,-74.7002 1143.7743,-74.7002 1143.7743,-12.0998 1143.7743,-12.0998 1143.7743,-6.0998 1149.7743,-.0998 1155.7743,-.0998 1155.7743,-.0998 1536.3649,-.0998 1536.3649,-.0998 1542.3649,-.0998 1548.3649,-6.0998 1548.3649,-12.0998 1548.3649,-12.0998 1548.3649,-74.7002 1548.3649,-74.7002 1548.3649,-80.7002 1542.3649,-86.7002 1536.3649,-86.7002"/>
|
||||
<text text-anchor="middle" x="1346.0696" y="-36.2" font-family="Monaco" font-size="24.00" fill="#000000">pkgconf@1.8.0%gcc@9.4.0/i4avrin</text>
|
||||
</g>
|
||||
<!-- ywrpvv2hgooeepdke33exkqrtdpd5gkl -->
|
||||
<g id="node3" class="node">
|
||||
<title>ywrpvv2hgooeepdke33exkqrtdpd5gkl</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M849.3673,-721.9002C849.3673,-721.9002 480.7719,-721.9002 480.7719,-721.9002 474.7719,-721.9002 468.7719,-715.9002 468.7719,-709.9002 468.7719,-709.9002 468.7719,-647.2998 468.7719,-647.2998 468.7719,-641.2998 474.7719,-635.2998 480.7719,-635.2998 480.7719,-635.2998 849.3673,-635.2998 849.3673,-635.2998 855.3673,-635.2998 861.3673,-641.2998 861.3673,-647.2998 861.3673,-647.2998 861.3673,-709.9002 861.3673,-709.9002 861.3673,-715.9002 855.3673,-721.9002 849.3673,-721.9002"/>
|
||||
<text text-anchor="middle" x="665.0696" y="-671.4" font-family="Monaco" font-size="24.00" fill="#000000">perl@5.36.0%gcc@9.4.0/ywrpvv2</text>
|
||||
</g>
|
||||
<!-- h3ujmb3ts4kxxxv77knh2knuystuerbx -->
|
||||
<g id="node7" class="node">
|
||||
<title>h3ujmb3ts4kxxxv77knh2knuystuerbx</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M392.4016,-563.1002C392.4016,-563.1002 19.7376,-563.1002 19.7376,-563.1002 13.7376,-563.1002 7.7376,-557.1002 7.7376,-551.1002 7.7376,-551.1002 7.7376,-488.4998 7.7376,-488.4998 7.7376,-482.4998 13.7376,-476.4998 19.7376,-476.4998 19.7376,-476.4998 392.4016,-476.4998 392.4016,-476.4998 398.4016,-476.4998 404.4016,-482.4998 404.4016,-488.4998 404.4016,-488.4998 404.4016,-551.1002 404.4016,-551.1002 404.4016,-557.1002 398.4016,-563.1002 392.4016,-563.1002"/>
|
||||
<text text-anchor="middle" x="206.0696" y="-512.6" font-family="Monaco" font-size="24.00" fill="#000000">bzip2@1.0.8%gcc@9.4.0/h3ujmb3</text>
|
||||
</g>
|
||||
<!-- ywrpvv2hgooeepdke33exkqrtdpd5gkl->h3ujmb3ts4kxxxv77knh2knuystuerbx -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>ywrpvv2hgooeepdke33exkqrtdpd5gkl->h3ujmb3ts4kxxxv77knh2knuystuerbx</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M539.3189,-636.1522C477.7157,-614.8394 403.4197,-589.1353 340.5959,-567.4002"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M539.9728,-634.2622C478.3696,-612.9494 404.0736,-587.2452 341.2498,-565.5101"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="341.9365,-563.1023 331.3417,-563.1403 339.6478,-569.7176 341.9365,-563.1023"/>
|
||||
</g>
|
||||
<!-- uabgssx6lsgrevwbttslldnr5nzguprj -->
|
||||
<g id="node19" class="node">
|
||||
<title>uabgssx6lsgrevwbttslldnr5nzguprj</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M1298.2296,-563.1002C1298.2296,-563.1002 937.9096,-563.1002 937.9096,-563.1002 931.9096,-563.1002 925.9096,-557.1002 925.9096,-551.1002 925.9096,-551.1002 925.9096,-488.4998 925.9096,-488.4998 925.9096,-482.4998 931.9096,-476.4998 937.9096,-476.4998 937.9096,-476.4998 1298.2296,-476.4998 1298.2296,-476.4998 1304.2296,-476.4998 1310.2296,-482.4998 1310.2296,-488.4998 1310.2296,-488.4998 1310.2296,-551.1002 1310.2296,-551.1002 1310.2296,-557.1002 1304.2296,-563.1002 1298.2296,-563.1002"/>
|
||||
<text text-anchor="middle" x="1118.0696" y="-512.6" font-family="Monaco" font-size="24.00" fill="#000000">gdbm@1.23%gcc@9.4.0/uabgssx</text>
|
||||
</g>
|
||||
<!-- ywrpvv2hgooeepdke33exkqrtdpd5gkl->uabgssx6lsgrevwbttslldnr5nzguprj -->
|
||||
<g id="edge44" class="edge">
|
||||
<title>ywrpvv2hgooeepdke33exkqrtdpd5gkl->uabgssx6lsgrevwbttslldnr5nzguprj</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M788.523,-634.2635C849.3209,-612.9507 922.6457,-587.2465 984.6483,-565.5114"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M789.1847,-636.1509C849.9825,-614.8381 923.3073,-589.1339 985.3099,-567.3988"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="986.1559,-569.7515 994.435,-563.1403 983.8402,-563.1456 986.1559,-569.7515"/>
|
||||
</g>
|
||||
<!-- gkw4dg2p7rdnhru3m6lcnsjbzyr7g3hb -->
|
||||
<g id="node20" class="node">
|
||||
<title>gkw4dg2p7rdnhru3m6lcnsjbzyr7g3hb</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M896.1744,-563.1002C896.1744,-563.1002 433.9648,-563.1002 433.9648,-563.1002 427.9648,-563.1002 421.9648,-557.1002 421.9648,-551.1002 421.9648,-551.1002 421.9648,-488.4998 421.9648,-488.4998 421.9648,-482.4998 427.9648,-476.4998 433.9648,-476.4998 433.9648,-476.4998 896.1744,-476.4998 896.1744,-476.4998 902.1744,-476.4998 908.1744,-482.4998 908.1744,-488.4998 908.1744,-488.4998 908.1744,-551.1002 908.1744,-551.1002 908.1744,-557.1002 902.1744,-563.1002 896.1744,-563.1002"/>
|
||||
<text text-anchor="middle" x="665.0696" y="-512.6" font-family="Monaco" font-size="24.00" fill="#000000">berkeley-db@18.1.40%gcc@9.4.0/gkw4dg2</text>
|
||||
</g>
|
||||
<!-- ywrpvv2hgooeepdke33exkqrtdpd5gkl->gkw4dg2p7rdnhru3m6lcnsjbzyr7g3hb -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>ywrpvv2hgooeepdke33exkqrtdpd5gkl->gkw4dg2p7rdnhru3m6lcnsjbzyr7g3hb</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M664.0696,-635.2072C664.0696,-616.1263 664.0696,-593.5257 664.0696,-573.4046"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M666.0696,-635.2072C666.0696,-616.1263 666.0696,-593.5257 666.0696,-573.4046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="668.5697,-573.1403 665.0696,-563.1403 661.5697,-573.1404 668.5697,-573.1403"/>
|
||||
</g>
|
||||
<!-- nizxi5u5bbrzhzwfy2qb7hatlhuswlrz -->
|
||||
<g id="node24" class="node">
|
||||
<title>nizxi5u5bbrzhzwfy2qb7hatlhuswlrz</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M2195.2248,-563.1002C2195.2248,-563.1002 1840.9144,-563.1002 1840.9144,-563.1002 1834.9144,-563.1002 1828.9144,-557.1002 1828.9144,-551.1002 1828.9144,-551.1002 1828.9144,-488.4998 1828.9144,-488.4998 1828.9144,-482.4998 1834.9144,-476.4998 1840.9144,-476.4998 1840.9144,-476.4998 2195.2248,-476.4998 2195.2248,-476.4998 2201.2248,-476.4998 2207.2248,-482.4998 2207.2248,-488.4998 2207.2248,-488.4998 2207.2248,-551.1002 2207.2248,-551.1002 2207.2248,-557.1002 2201.2248,-563.1002 2195.2248,-563.1002"/>
|
||||
<text text-anchor="middle" x="2018.0696" y="-512.6" font-family="Monaco" font-size="24.00" fill="#000000">zlib@1.2.13%gcc@9.4.0/nizxi5u</text>
|
||||
</g>
|
||||
<!-- ywrpvv2hgooeepdke33exkqrtdpd5gkl->nizxi5u5bbrzhzwfy2qb7hatlhuswlrz -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>ywrpvv2hgooeepdke33exkqrtdpd5gkl->nizxi5u5bbrzhzwfy2qb7hatlhuswlrz</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M861.3292,-654.5584C1116.9929,-624.5514 1561.4447,-572.3867 1818.5758,-542.2075"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M861.5624,-656.5447C1117.2261,-626.5378 1561.6778,-574.373 1818.8089,-544.1939"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1819.373,-546.6449 1828.8968,-542.003 1818.5569,-539.6926 1819.373,-546.6449"/>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id -->
|
||||
<g id="node4" class="node">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M2383.212,-1674.7002C2383.212,-1674.7002 1972.9272,-1674.7002 1972.9272,-1674.7002 1966.9272,-1674.7002 1960.9272,-1668.7002 1960.9272,-1662.7002 1960.9272,-1662.7002 1960.9272,-1600.0998 1960.9272,-1600.0998 1960.9272,-1594.0998 1966.9272,-1588.0998 1972.9272,-1588.0998 1972.9272,-1588.0998 2383.212,-1588.0998 2383.212,-1588.0998 2389.212,-1588.0998 2395.212,-1594.0998 2395.212,-1600.0998 2395.212,-1600.0998 2395.212,-1662.7002 2395.212,-1662.7002 2395.212,-1668.7002 2389.212,-1674.7002 2383.212,-1674.7002"/>
|
||||
<text text-anchor="middle" x="2178.0696" y="-1624.2" font-family="Monaco" font-size="24.00" fill="#000000">strumpack@7.0.1%gcc@9.4.0/idvshq5</text>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->hkcrbrtf2qex6rvzuok5tzdrbam55pdn -->
|
||||
<g id="edge33" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->hkcrbrtf2qex6rvzuok5tzdrbam55pdn</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2177.0696,-1587.8598C2177.0696,-1500.5185 2177.0696,-1304.1624 2177.0696,-1208.8885"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2179.0696,-1587.8598C2179.0696,-1500.5185 2179.0696,-1304.1624 2179.0696,-1208.8885"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2181.5697,-1208.611 2178.0696,-1198.611 2174.5697,-1208.611 2181.5697,-1208.611"/>
|
||||
<text text-anchor="middle" x="2125.9224" y="-1397.5399" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=scalapack</text>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1960.6199,-1629.1097C1600.5855,-1621.4505 897.1143,-1596.5054 662.748,-1516.9469 459.8544,-1447.9506 281.1117,-1289.236 401.2427,-1111.0377 418.213,-1086.3492 472.759,-1062.01 530.3793,-1041.9698"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1960.6625,-1627.1101C1600.6564,-1619.4517 897.1852,-1594.5067 663.3912,-1515.0531 461.1823,-1446.4551 282.4397,-1287.7405 402.8965,-1112.1623 419.028,-1088.1757 473.574,-1063.8364 531.0362,-1043.8589"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="532.0142,-1046.1665 540.3395,-1039.6137 529.7449,-1039.5445 532.0142,-1046.1665"/>
|
||||
<text text-anchor="middle" x="1175.5163" y="-1600.8866" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=blas,lapack</text>
|
||||
</g>
|
||||
<!-- imopnxjmv7cwzyiecdw2saq42qvpnauh -->
|
||||
<g id="node12" class="node">
|
||||
<title>imopnxjmv7cwzyiecdw2saq42qvpnauh</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M3003.3872,-1357.1002C3003.3872,-1357.1002 2606.752,-1357.1002 2606.752,-1357.1002 2600.752,-1357.1002 2594.752,-1351.1002 2594.752,-1345.1002 2594.752,-1345.1002 2594.752,-1282.4998 2594.752,-1282.4998 2594.752,-1276.4998 2600.752,-1270.4998 2606.752,-1270.4998 2606.752,-1270.4998 3003.3872,-1270.4998 3003.3872,-1270.4998 3009.3872,-1270.4998 3015.3872,-1276.4998 3015.3872,-1282.4998 3015.3872,-1282.4998 3015.3872,-1345.1002 3015.3872,-1345.1002 3015.3872,-1351.1002 3009.3872,-1357.1002 3003.3872,-1357.1002"/>
|
||||
<text text-anchor="middle" x="2805.0696" y="-1306.6" font-family="Monaco" font-size="24.00" fill="#000000">parmetis@4.0.3%gcc@9.4.0/imopnxj</text>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->imopnxjmv7cwzyiecdw2saq42qvpnauh -->
|
||||
<g id="edge51" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->imopnxjmv7cwzyiecdw2saq42qvpnauh</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2393.6993,-1587.0809C2455.3565,-1569.7539 2521.1771,-1546.2699 2577.5864,-1515.1245 2649.1588,-1475.6656 2717.4141,-1409.6691 2759.9512,-1363.9364"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2394.2404,-1589.0062C2456.0286,-1571.6376 2521.8491,-1548.1536 2578.5528,-1516.8755 2650.5491,-1477.1034 2718.8043,-1411.107 2761.4156,-1365.2986"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2763.3454,-1366.8938 2767.5512,-1357.1695 2758.1992,-1362.1485 2763.3454,-1366.8938"/>
|
||||
</g>
|
||||
<!-- ern66gyp6qmhmpod4jaynxx4weoberfm -->
|
||||
<g id="node13" class="node">
|
||||
<title>ern66gyp6qmhmpod4jaynxx4weoberfm</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M2928.3784,-1198.3002C2928.3784,-1198.3002 2563.7608,-1198.3002 2563.7608,-1198.3002 2557.7608,-1198.3002 2551.7608,-1192.3002 2551.7608,-1186.3002 2551.7608,-1186.3002 2551.7608,-1123.6998 2551.7608,-1123.6998 2551.7608,-1117.6998 2557.7608,-1111.6998 2563.7608,-1111.6998 2563.7608,-1111.6998 2928.3784,-1111.6998 2928.3784,-1111.6998 2934.3784,-1111.6998 2940.3784,-1117.6998 2940.3784,-1123.6998 2940.3784,-1123.6998 2940.3784,-1186.3002 2940.3784,-1186.3002 2940.3784,-1192.3002 2934.3784,-1198.3002 2928.3784,-1198.3002"/>
|
||||
<text text-anchor="middle" x="2746.0696" y="-1147.8" font-family="Monaco" font-size="24.00" fill="#000000">metis@5.1.0%gcc@9.4.0/ern66gy</text>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->ern66gyp6qmhmpod4jaynxx4weoberfm -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->ern66gyp6qmhmpod4jaynxx4weoberfm</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2371.6269,-1587.103C2443.5875,-1567.249 2513.691,-1542.0963 2537.3223,-1515.3355 2611.3482,-1433.6645 2525.4748,-1364.8484 2585.2274,-1269.8608 2602.2478,-1243.3473 2627.3929,-1221.1402 2652.8797,-1203.3777"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2372.1589,-1589.0309C2444.2629,-1569.1315 2514.3664,-1543.9788 2538.8169,-1516.6645 2612.5989,-1432.1038 2526.7255,-1363.2878 2586.9118,-1270.9392 2603.5717,-1244.8464 2628.7168,-1222.6393 2654.0229,-1205.0188"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2655.7411,-1206.8749 2662.0621,-1198.3722 2651.8184,-1201.0773 2655.7411,-1206.8749"/>
|
||||
</g>
|
||||
<!-- nqiyrxlid6tikfpvoqdpvsjt5drs2obf -->
|
||||
<g id="node14" class="node">
|
||||
<title>nqiyrxlid6tikfpvoqdpvsjt5drs2obf</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M1964.017,-1357.1002C1964.017,-1357.1002 1532.1222,-1357.1002 1532.1222,-1357.1002 1526.1222,-1357.1002 1520.1222,-1351.1002 1520.1222,-1345.1002 1520.1222,-1345.1002 1520.1222,-1282.4998 1520.1222,-1282.4998 1520.1222,-1276.4998 1526.1222,-1270.4998 1532.1222,-1270.4998 1532.1222,-1270.4998 1964.017,-1270.4998 1964.017,-1270.4998 1970.017,-1270.4998 1976.017,-1276.4998 1976.017,-1282.4998 1976.017,-1282.4998 1976.017,-1345.1002 1976.017,-1345.1002 1976.017,-1351.1002 1970.017,-1357.1002 1964.017,-1357.1002"/>
|
||||
<text text-anchor="middle" x="1748.0696" y="-1306.6" font-family="Monaco" font-size="24.00" fill="#000000">butterflypack@2.2.2%gcc@9.4.0/nqiyrxl</text>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->nqiyrxlid6tikfpvoqdpvsjt5drs2obf -->
|
||||
<g id="edge26" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->nqiyrxlid6tikfpvoqdpvsjt5drs2obf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2118.5874,-1588.7094C2039.1194,-1530.0139 1897.9154,-1425.72 1814.4793,-1364.0937"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2119.7757,-1587.1006C2040.3076,-1528.4052 1899.1036,-1424.1112 1815.6675,-1362.485"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1817.0581,-1360.404 1806.9348,-1357.2781 1812.8992,-1366.0347 1817.0581,-1360.404"/>
|
||||
</g>
|
||||
<!-- 4bu62kyfuh4ikdkuyxfxjxanf7e7qopu -->
|
||||
<g id="node16" class="node">
|
||||
<title>4bu62kyfuh4ikdkuyxfxjxanf7e7qopu</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M1106.2192,-1515.9002C1106.2192,-1515.9002 683.92,-1515.9002 683.92,-1515.9002 677.92,-1515.9002 671.92,-1509.9002 671.92,-1503.9002 671.92,-1503.9002 671.92,-1441.2998 671.92,-1441.2998 671.92,-1435.2998 677.92,-1429.2998 683.92,-1429.2998 683.92,-1429.2998 1106.2192,-1429.2998 1106.2192,-1429.2998 1112.2192,-1429.2998 1118.2192,-1435.2998 1118.2192,-1441.2998 1118.2192,-1441.2998 1118.2192,-1503.9002 1118.2192,-1503.9002 1118.2192,-1509.9002 1112.2192,-1515.9002 1106.2192,-1515.9002"/>
|
||||
<text text-anchor="middle" x="895.0696" y="-1465.4" font-family="Monaco" font-size="24.00" fill="#000000">slate@2022.07.00%gcc@9.4.0/4bu62ky</text>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->4bu62kyfuh4ikdkuyxfxjxanf7e7qopu -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->4bu62kyfuh4ikdkuyxfxjxanf7e7qopu</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1960.6663,-1605.4991C1729.5518,-1576.8935 1365.2868,-1531.8075 1128.237,-1502.4673"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1960.912,-1603.5143C1729.7975,-1574.9086 1365.5325,-1529.8227 1128.4827,-1500.4825"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1128.5789,-1497.9754 1118.2247,-1500.2204 1127.719,-1504.9224 1128.5789,-1497.9754"/>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->2w3nq3n3hcj2tqlvcpewsryamltlu5tw -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->2w3nq3n3hcj2tqlvcpewsryamltlu5tw</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2395.1113,-1591.5061C2621.5772,-1545.7968 2953.3457,-1462.5053 3023.2362,-1356.6473 3049.986,-1316.785 3021.2047,-1131.5143 3003.3326,-1112.2759 2971.8969,-1077.7826 2884.3944,-1052.6467 2789.1441,-1034.9179"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2395.507,-1593.4665C2622.0642,-1547.7366 2953.8327,-1464.4452 3024.903,-1357.7527 3051.9623,-1316.478 3023.181,-1131.2073 3004.8066,-1110.9241 2972.4491,-1075.8603 2884.9466,-1050.7244 2789.5102,-1032.9517"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2789.9449,-1030.4898 2779.4781,-1032.132 2788.6845,-1037.3754 2789.9449,-1030.4898"/>
|
||||
<text text-anchor="middle" x="2611.7445" y="-1537.8321" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=mpi</text>
|
||||
</g>
|
||||
<!-- 7rzbmgoxhmm2jhellkgcjmn62uklf22x -->
|
||||
<g id="node25" class="node">
|
||||
<title>7rzbmgoxhmm2jhellkgcjmn62uklf22x</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M1749.1952,-1515.9002C1749.1952,-1515.9002 1398.944,-1515.9002 1398.944,-1515.9002 1392.944,-1515.9002 1386.944,-1509.9002 1386.944,-1503.9002 1386.944,-1503.9002 1386.944,-1441.2998 1386.944,-1441.2998 1386.944,-1435.2998 1392.944,-1429.2998 1398.944,-1429.2998 1398.944,-1429.2998 1749.1952,-1429.2998 1749.1952,-1429.2998 1755.1952,-1429.2998 1761.1952,-1435.2998 1761.1952,-1441.2998 1761.1952,-1441.2998 1761.1952,-1503.9002 1761.1952,-1503.9002 1761.1952,-1509.9002 1755.1952,-1515.9002 1749.1952,-1515.9002"/>
|
||||
<text text-anchor="middle" x="1574.0696" y="-1465.4" font-family="Monaco" font-size="24.00" fill="#000000">zfp@0.5.5%gcc@9.4.0/7rzbmgo</text>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->7rzbmgoxhmm2jhellkgcjmn62uklf22x -->
|
||||
<g id="edge36" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->7rzbmgoxhmm2jhellkgcjmn62uklf22x</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2012.7697,-1588.9743C1930.7903,-1567.4208 1831.729,-1541.3762 1748.4742,-1519.4874"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2013.2782,-1587.0401C1931.2989,-1565.4866 1832.2376,-1539.442 1748.9827,-1517.5531"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1749.477,-1515.0982 1738.9157,-1515.9403 1747.697,-1521.8681 1749.477,-1515.0982"/>
|
||||
</g>
|
||||
<!-- idvshq5nqmygzd4uo62mdispwgxsw7id->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>idvshq5nqmygzd4uo62mdispwgxsw7id->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2229.2864,-1587.9836C2336.2076,-1492.3172 2562.5717,-1260.0833 2429.0696,-1111.6 2372.2327,-1048.3851 1860.8259,-1017.0375 1561.5401,-1003.9799"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1561.5673,-1000.4779 1551.4253,-1003.5421 1561.2645,-1007.4714 1561.5673,-1000.4779"/>
|
||||
</g>
|
||||
<!-- mujlx42xgttdc6u6rmiftsktpsrcmpbs -->
|
||||
<g id="node5" class="node">
|
||||
<title>mujlx42xgttdc6u6rmiftsktpsrcmpbs</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M912.4048,-1198.3002C912.4048,-1198.3002 475.7344,-1198.3002 475.7344,-1198.3002 469.7344,-1198.3002 463.7344,-1192.3002 463.7344,-1186.3002 463.7344,-1186.3002 463.7344,-1123.6998 463.7344,-1123.6998 463.7344,-1117.6998 469.7344,-1111.6998 475.7344,-1111.6998 475.7344,-1111.6998 912.4048,-1111.6998 912.4048,-1111.6998 918.4048,-1111.6998 924.4048,-1117.6998 924.4048,-1123.6998 924.4048,-1123.6998 924.4048,-1186.3002 924.4048,-1186.3002 924.4048,-1192.3002 918.4048,-1198.3002 912.4048,-1198.3002"/>
|
||||
<text text-anchor="middle" x="694.0696" y="-1147.8" font-family="Monaco" font-size="24.00" fill="#000000">blaspp@2022.07.00%gcc@9.4.0/mujlx42</text>
|
||||
</g>
|
||||
<!-- mujlx42xgttdc6u6rmiftsktpsrcmpbs->o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>mujlx42xgttdc6u6rmiftsktpsrcmpbs->o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M693.0696,-1111.6072C693.0696,-1092.5263 693.0696,-1069.9257 693.0696,-1049.8046"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M695.0696,-1111.6072C695.0696,-1092.5263 695.0696,-1069.9257 695.0696,-1049.8046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="697.5697,-1049.5403 694.0696,-1039.5403 690.5697,-1049.5404 697.5697,-1049.5403"/>
|
||||
<text text-anchor="middle" x="657.8516" y="-1079.8482" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=blas</text>
|
||||
</g>
|
||||
<!-- mujlx42xgttdc6u6rmiftsktpsrcmpbs->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge28" class="edge">
|
||||
<title>mujlx42xgttdc6u6rmiftsktpsrcmpbs->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M872.2315,-1111.6072C960.9952,-1089.988 1068.311,-1063.8504 1158.3512,-1041.9204"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1159.2354,-1045.3074 1168.1232,-1039.5403 1157.5789,-1038.5062 1159.2354,-1045.3074"/>
|
||||
</g>
|
||||
<!-- htzjns66gmq6pjofohp26djmjnpbegho -->
|
||||
<g id="node6" class="node">
|
||||
<title>htzjns66gmq6pjofohp26djmjnpbegho</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M2663.3553,-880.7002C2663.3553,-880.7002 2270.7839,-880.7002 2270.7839,-880.7002 2264.7839,-880.7002 2258.7839,-874.7002 2258.7839,-868.7002 2258.7839,-868.7002 2258.7839,-806.0998 2258.7839,-806.0998 2258.7839,-800.0998 2264.7839,-794.0998 2270.7839,-794.0998 2270.7839,-794.0998 2663.3553,-794.0998 2663.3553,-794.0998 2669.3553,-794.0998 2675.3553,-800.0998 2675.3553,-806.0998 2675.3553,-806.0998 2675.3553,-868.7002 2675.3553,-868.7002 2675.3553,-874.7002 2669.3553,-880.7002 2663.3553,-880.7002"/>
|
||||
<text text-anchor="middle" x="2467.0696" y="-830.2" font-family="Monaco" font-size="24.00" fill="#000000">patchelf@0.16.1%gcc@9.4.0/htzjns6</text>
|
||||
</g>
|
||||
<!-- xm3ldz3y3msfdc3hzshvxpbpg5hnt6o6 -->
|
||||
<g id="node15" class="node">
|
||||
<title>xm3ldz3y3msfdc3hzshvxpbpg5hnt6o6</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M394.2232,-404.3002C394.2232,-404.3002 17.916,-404.3002 17.916,-404.3002 11.916,-404.3002 5.916,-398.3002 5.916,-392.3002 5.916,-392.3002 5.916,-329.6998 5.916,-329.6998 5.916,-323.6998 11.916,-317.6998 17.916,-317.6998 17.916,-317.6998 394.2232,-317.6998 394.2232,-317.6998 400.2232,-317.6998 406.2232,-323.6998 406.2232,-329.6998 406.2232,-329.6998 406.2232,-392.3002 406.2232,-392.3002 406.2232,-398.3002 400.2232,-404.3002 394.2232,-404.3002"/>
|
||||
<text text-anchor="middle" x="206.0696" y="-353.8" font-family="Monaco" font-size="24.00" fill="#000000">diffutils@3.8%gcc@9.4.0/xm3ldz3</text>
|
||||
</g>
|
||||
<!-- h3ujmb3ts4kxxxv77knh2knuystuerbx->xm3ldz3y3msfdc3hzshvxpbpg5hnt6o6 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>h3ujmb3ts4kxxxv77knh2knuystuerbx->xm3ldz3y3msfdc3hzshvxpbpg5hnt6o6</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M206.0696,-476.4072C206.0696,-457.3263 206.0696,-434.7257 206.0696,-414.6046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="209.5697,-414.3403 206.0696,-404.3403 202.5697,-414.3404 209.5697,-414.3403"/>
|
||||
</g>
|
||||
<!-- o524gebsxavobkte3k5fglgwnedfkadf->ywrpvv2hgooeepdke33exkqrtdpd5gkl -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>o524gebsxavobkte3k5fglgwnedfkadf->ywrpvv2hgooeepdke33exkqrtdpd5gkl</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M690.0981,-952.705C684.8522,-895.2533 675.6173,-794.1153 669.9514,-732.0637"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="673.4345,-731.7184 669.0396,-722.0781 666.4635,-732.355 673.4345,-731.7184"/>
|
||||
</g>
|
||||
<!-- 4vsmjofkhntilgzh4zebluqak5mdsu3x -->
|
||||
<g id="node9" class="node">
|
||||
<title>4vsmjofkhntilgzh4zebluqak5mdsu3x</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M1977.9121,-721.9002C1977.9121,-721.9002 1386.2271,-721.9002 1386.2271,-721.9002 1380.2271,-721.9002 1374.2271,-715.9002 1374.2271,-709.9002 1374.2271,-709.9002 1374.2271,-647.2998 1374.2271,-647.2998 1374.2271,-641.2998 1380.2271,-635.2998 1386.2271,-635.2998 1386.2271,-635.2998 1977.9121,-635.2998 1977.9121,-635.2998 1983.9121,-635.2998 1989.9121,-641.2998 1989.9121,-647.2998 1989.9121,-647.2998 1989.9121,-709.9002 1989.9121,-709.9002 1989.9121,-715.9002 1983.9121,-721.9002 1977.9121,-721.9002"/>
|
||||
<text text-anchor="middle" x="1682.0696" y="-671.4" font-family="Monaco" font-size="24.00" fill="#000000">ca-certificates-mozilla@2023-01-10%gcc@9.4.0/4vsmjof</text>
|
||||
</g>
|
||||
<!-- xiro2z6na56qdd4czjhj54eag3ekbiow -->
|
||||
<g id="node10" class="node">
|
||||
<title>xiro2z6na56qdd4czjhj54eag3ekbiow</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M988.1824,-1357.1002C988.1824,-1357.1002 533.9568,-1357.1002 533.9568,-1357.1002 527.9568,-1357.1002 521.9568,-1351.1002 521.9568,-1345.1002 521.9568,-1345.1002 521.9568,-1282.4998 521.9568,-1282.4998 521.9568,-1276.4998 527.9568,-1270.4998 533.9568,-1270.4998 533.9568,-1270.4998 988.1824,-1270.4998 988.1824,-1270.4998 994.1824,-1270.4998 1000.1824,-1276.4998 1000.1824,-1282.4998 1000.1824,-1282.4998 1000.1824,-1345.1002 1000.1824,-1345.1002 1000.1824,-1351.1002 994.1824,-1357.1002 988.1824,-1357.1002"/>
|
||||
<text text-anchor="middle" x="761.0696" y="-1306.6" font-family="Monaco" font-size="24.00" fill="#000000">lapackpp@2022.07.00%gcc@9.4.0/xiro2z6</text>
|
||||
</g>
|
||||
<!-- xiro2z6na56qdd4czjhj54eag3ekbiow->mujlx42xgttdc6u6rmiftsktpsrcmpbs -->
|
||||
<g id="edge37" class="edge">
|
||||
<title>xiro2z6na56qdd4czjhj54eag3ekbiow->mujlx42xgttdc6u6rmiftsktpsrcmpbs</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M741.8402,-1270.7959C733.6789,-1251.4525 723.9915,-1228.4917 715.4149,-1208.1641"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M743.6829,-1270.0185C735.5216,-1250.675 725.8342,-1227.7143 717.2576,-1207.3866"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="719.4676,-1206.1933 712.3555,-1198.3403 713.0181,-1208.9144 719.4676,-1206.1933"/>
|
||||
</g>
|
||||
<!-- xiro2z6na56qdd4czjhj54eag3ekbiow->o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="edge35" class="edge">
|
||||
<title>xiro2z6na56qdd4czjhj54eag3ekbiow->o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M597.2326,-1271.3826C534.1471,-1251.0571 472.8527,-1225.5904 454.2471,-1198.9688 432.1275,-1166.6075 433.5639,-1144.2113 454.2226,-1111.0684 472.6194,-1081.8657 500.3255,-1060.004 530.6572,-1043.4601"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M597.8458,-1269.4789C534.9144,-1249.2102 473.6201,-1223.7435 455.8921,-1197.8312 434.1234,-1166.7355 435.5598,-1144.3393 455.9166,-1112.1316 473.8583,-1083.4358 501.5644,-1061.5741 531.6142,-1045.2163"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="532.9062,-1047.362 540.1422,-1039.6231 529.6595,-1041.1605 532.9062,-1047.362"/>
|
||||
<text text-anchor="middle" x="474.3109" y="-1250.2598" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=blas,lapack</text>
|
||||
</g>
|
||||
<!-- xiro2z6na56qdd4czjhj54eag3ekbiow->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge45" class="edge">
|
||||
<title>xiro2z6na56qdd4czjhj54eag3ekbiow->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M833.5823,-1270.3956C865.3249,-1250.0918 902.2709,-1224.6296 933.0696,-1198.4 973.2414,-1164.1878 969.8532,-1140.395 1014.0696,-1111.6 1058.5051,-1082.6623 1111.0286,-1060.0733 1161.029,-1042.8573"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1162.313,-1046.1177 1170.6621,-1039.5953 1160.0678,-1039.4876 1162.313,-1046.1177"/>
|
||||
</g>
|
||||
<!-- j5rupoqliu7kasm6xndl7ui32wgawkru -->
|
||||
<g id="node11" class="node">
|
||||
<title>j5rupoqliu7kasm6xndl7ui32wgawkru</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M1527.3625,-245.5002C1527.3625,-245.5002 1164.7767,-245.5002 1164.7767,-245.5002 1158.7767,-245.5002 1152.7767,-239.5002 1152.7767,-233.5002 1152.7767,-233.5002 1152.7767,-170.8998 1152.7767,-170.8998 1152.7767,-164.8998 1158.7767,-158.8998 1164.7767,-158.8998 1164.7767,-158.8998 1527.3625,-158.8998 1527.3625,-158.8998 1533.3625,-158.8998 1539.3625,-164.8998 1539.3625,-170.8998 1539.3625,-170.8998 1539.3625,-233.5002 1539.3625,-233.5002 1539.3625,-239.5002 1533.3625,-245.5002 1527.3625,-245.5002"/>
|
||||
<text text-anchor="middle" x="1346.0696" y="-195" font-family="Monaco" font-size="24.00" fill="#000000">ncurses@6.4%gcc@9.4.0/j5rupoq</text>
|
||||
</g>
|
||||
<!-- j5rupoqliu7kasm6xndl7ui32wgawkru->i4avrindvhcamhurzbfdaggbj2zgsrrh -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>j5rupoqliu7kasm6xndl7ui32wgawkru->i4avrindvhcamhurzbfdaggbj2zgsrrh</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1346.0696,-158.8072C1346.0696,-139.7263 1346.0696,-117.1257 1346.0696,-97.0046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1349.5697,-96.7403 1346.0696,-86.7403 1342.5697,-96.7404 1349.5697,-96.7403"/>
|
||||
<text text-anchor="middle" x="1292.7436" y="-127.0482" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=pkgconfig</text>
|
||||
</g>
|
||||
<!-- imopnxjmv7cwzyiecdw2saq42qvpnauh->ern66gyp6qmhmpod4jaynxx4weoberfm -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>imopnxjmv7cwzyiecdw2saq42qvpnauh->ern66gyp6qmhmpod4jaynxx4weoberfm</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2788.0102,-1270.7555C2780.8234,-1251.412 2772.2926,-1228.4513 2764.7402,-1208.1236"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2789.885,-1270.0589C2782.6982,-1250.7155 2774.1674,-1227.7547 2766.615,-1207.4271"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2768.9358,-1206.4953 2762.1721,-1198.3403 2762.3741,-1208.9332 2768.9358,-1206.4953"/>
|
||||
</g>
|
||||
<!-- imopnxjmv7cwzyiecdw2saq42qvpnauh->2w3nq3n3hcj2tqlvcpewsryamltlu5tw -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>imopnxjmv7cwzyiecdw2saq42qvpnauh->2w3nq3n3hcj2tqlvcpewsryamltlu5tw</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2907.2846,-1269.5018C2936.475,-1251.8137 2964.9158,-1228.1116 2981.1904,-1197.9236 2999.477,-1164.2363 3005.2125,-1141.4693 2981.289,-1112.225 2954.5472,-1078.5579 2876.5297,-1053.8974 2789.2983,-1036.3535"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M2908.3216,-1271.2119C2937.7554,-1253.3501 2966.1962,-1229.648 2982.9488,-1198.8764 3001.4164,-1164.7249 3007.1519,-1141.9579 2982.8502,-1110.975 2955.15,-1076.6509 2877.1325,-1051.9904 2789.6927,-1034.3928"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2790.125,-1031.93 2779.6364,-1033.4269 2788.7692,-1038.7974 2790.125,-1031.93"/>
|
||||
<text text-anchor="middle" x="2836.0561" y="-1059.5023" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=mpi</text>
|
||||
</g>
|
||||
<!-- imopnxjmv7cwzyiecdw2saq42qvpnauh->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge49" class="edge">
|
||||
<title>imopnxjmv7cwzyiecdw2saq42qvpnauh->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2883.731,-1270.4691C2909.4451,-1251.9243 2934.9956,-1227.7144 2949.0696,-1198.4 2965.7663,-1163.6227 2975.3506,-1139.841 2949.0696,-1111.6 2925.7161,-1086.5049 1993.0368,-1031.9055 1561.3071,-1007.9103"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1561.3813,-1004.4092 1551.2026,-1007.3492 1560.9931,-1011.3984 1561.3813,-1004.4092"/>
|
||||
</g>
|
||||
<!-- ern66gyp6qmhmpod4jaynxx4weoberfm->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge50" class="edge">
|
||||
<title>ern66gyp6qmhmpod4jaynxx4weoberfm->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2551.6031,-1113.7387C2547.0531,-1112.9948 2542.537,-1112.2802 2538.0696,-1111.6 2198.5338,-1059.8997 1800.8632,-1026.8711 1561.4583,-1009.9443"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1561.4619,-1006.436 1551.2407,-1009.2249 1560.9702,-1013.4187 1561.4619,-1006.436"/>
|
||||
</g>
|
||||
<!-- nqiyrxlid6tikfpvoqdpvsjt5drs2obf->hkcrbrtf2qex6rvzuok5tzdrbam55pdn -->
|
||||
<g id="edge34" class="edge">
|
||||
<title>nqiyrxlid6tikfpvoqdpvsjt5drs2obf->hkcrbrtf2qex6rvzuok5tzdrbam55pdn</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1865.2226,-1269.4691C1922.6966,-1248.2438 1991.964,-1222.6632 2050.6644,-1200.985"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1865.9154,-1271.3453C1923.3894,-1250.12 1992.6569,-1224.5394 2051.3572,-1202.8612"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2052.5441,-1205.088 2060.7123,-1198.3403 2050.119,-1198.5215 2052.5441,-1205.088"/>
|
||||
<text text-anchor="middle" x="1910.9073" y="-1238.6056" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=scalapack</text>
|
||||
</g>
|
||||
<!-- nqiyrxlid6tikfpvoqdpvsjt5drs2obf->o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="edge52" class="edge">
|
||||
<title>nqiyrxlid6tikfpvoqdpvsjt5drs2obf->o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1519.9696,-1290.6844C1394.6018,-1273.3057 1237.6631,-1244.7294 1102.7507,-1199.3478 1021.8138,-1171.8729 1008.1992,-1149.8608 932.6248,-1112.4956 887.1715,-1089.9216 836.578,-1065.4054 793.6914,-1044.8018"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1520.2442,-1288.7034C1394.9601,-1271.3381 1238.0214,-1242.7618 1103.3885,-1197.4522 1023.5148,-1170.8208 1009.9002,-1148.8087 933.5144,-1110.7044 888.0436,-1088.1218 837.4502,-1063.6056 794.5574,-1042.999"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="795.6235,-1040.7377 785.0938,-1039.565 792.5939,-1047.0482 795.6235,-1040.7377"/>
|
||||
<text text-anchor="middle" x="1046.8307" y="-1202.5988" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=blas,lapack</text>
|
||||
</g>
|
||||
<!-- lfh3aovn65e66cs24qiehq3nd2ddojef -->
|
||||
<g id="node21" class="node">
|
||||
<title>lfh3aovn65e66cs24qiehq3nd2ddojef</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M1547.9922,-1198.3002C1547.9922,-1198.3002 1144.147,-1198.3002 1144.147,-1198.3002 1138.147,-1198.3002 1132.147,-1192.3002 1132.147,-1186.3002 1132.147,-1186.3002 1132.147,-1123.6998 1132.147,-1123.6998 1132.147,-1117.6998 1138.147,-1111.6998 1144.147,-1111.6998 1144.147,-1111.6998 1547.9922,-1111.6998 1547.9922,-1111.6998 1553.9922,-1111.6998 1559.9922,-1117.6998 1559.9922,-1123.6998 1559.9922,-1123.6998 1559.9922,-1186.3002 1559.9922,-1186.3002 1559.9922,-1192.3002 1553.9922,-1198.3002 1547.9922,-1198.3002"/>
|
||||
<text text-anchor="middle" x="1346.0696" y="-1147.8" font-family="Monaco" font-size="24.00" fill="#000000">arpack-ng@3.8.0%gcc@9.4.0/lfh3aov</text>
|
||||
</g>
|
||||
<!-- nqiyrxlid6tikfpvoqdpvsjt5drs2obf->lfh3aovn65e66cs24qiehq3nd2ddojef -->
|
||||
<g id="edge46" class="edge">
|
||||
<title>nqiyrxlid6tikfpvoqdpvsjt5drs2obf->lfh3aovn65e66cs24qiehq3nd2ddojef</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1637.8539,-1271.3373C1584.2332,-1250.1557 1519.6324,-1224.6368 1464.827,-1202.9873"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1638.5887,-1269.4771C1584.968,-1248.2956 1520.3672,-1222.7767 1465.5618,-1201.1272"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1466.3716,-1198.7592 1455.785,-1198.3403 1463.7998,-1205.2696 1466.3716,-1198.7592"/>
|
||||
</g>
|
||||
<!-- 57joith2sqq6sehge54vlloyolm36mdu -->
|
||||
<g id="node22" class="node">
|
||||
<title>57joith2sqq6sehge54vlloyolm36mdu</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M1906.2352,-1198.3002C1906.2352,-1198.3002 1589.904,-1198.3002 1589.904,-1198.3002 1583.904,-1198.3002 1577.904,-1192.3002 1577.904,-1186.3002 1577.904,-1186.3002 1577.904,-1123.6998 1577.904,-1123.6998 1577.904,-1117.6998 1583.904,-1111.6998 1589.904,-1111.6998 1589.904,-1111.6998 1906.2352,-1111.6998 1906.2352,-1111.6998 1912.2352,-1111.6998 1918.2352,-1117.6998 1918.2352,-1123.6998 1918.2352,-1123.6998 1918.2352,-1186.3002 1918.2352,-1186.3002 1918.2352,-1192.3002 1912.2352,-1198.3002 1906.2352,-1198.3002"/>
|
||||
<text text-anchor="middle" x="1748.0696" y="-1147.8" font-family="Monaco" font-size="24.00" fill="#000000">sed@4.8%gcc@9.4.0/57joith</text>
|
||||
</g>
|
||||
<!-- nqiyrxlid6tikfpvoqdpvsjt5drs2obf->57joith2sqq6sehge54vlloyolm36mdu -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>nqiyrxlid6tikfpvoqdpvsjt5drs2obf->57joith2sqq6sehge54vlloyolm36mdu</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1748.0696,-1270.4072C1748.0696,-1251.3263 1748.0696,-1228.7257 1748.0696,-1208.6046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1751.5697,-1208.3403 1748.0696,-1198.3403 1744.5697,-1208.3404 1751.5697,-1208.3403"/>
|
||||
</g>
|
||||
<!-- nqiyrxlid6tikfpvoqdpvsjt5drs2obf->2w3nq3n3hcj2tqlvcpewsryamltlu5tw -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>nqiyrxlid6tikfpvoqdpvsjt5drs2obf->2w3nq3n3hcj2tqlvcpewsryamltlu5tw</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1975.9734,-1301.684C2148.2819,-1288.3961 2365.6859,-1259.5384 2428.3689,-1197.6866 2466.9261,-1160.1438 2472.9783,-1095.7153 2471.5152,-1049.9701"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1976.1272,-1303.678C2148.5451,-1290.3788 2365.949,-1261.521 2429.7703,-1199.1134 2468.9173,-1160.3309 2474.9695,-1095.9024 2473.5142,-1049.9065"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2476.0078,-1049.7027 2472.0657,-1039.8686 2469.0147,-1050.0146 2476.0078,-1049.7027"/>
|
||||
<text text-anchor="middle" x="2207.8884" y="-1273.0053" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=mpi</text>
|
||||
</g>
|
||||
<!-- nqiyrxlid6tikfpvoqdpvsjt5drs2obf->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>nqiyrxlid6tikfpvoqdpvsjt5drs2obf->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1520.1614,-1301.6771C1362.9712,-1287.992 1173.582,-1259.0928 1123.0696,-1198.4 1098.3914,-1168.7481 1103.0165,-1144.5563 1123.0696,-1111.6 1140.5998,-1082.79 1167.9002,-1060.8539 1197.4647,-1044.2681"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1199.1408,-1047.3408 1206.2789,-1039.5114 1195.8163,-1041.1806 1199.1408,-1047.3408"/>
|
||||
</g>
|
||||
<!-- ogcucq2eod3xusvvied5ol2iobui4nsb -->
|
||||
<g id="node18" class="node">
|
||||
<title>ogcucq2eod3xusvvied5ol2iobui4nsb</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M400.2088,-245.5002C400.2088,-245.5002 11.9304,-245.5002 11.9304,-245.5002 5.9304,-245.5002 -.0696,-239.5002 -.0696,-233.5002 -.0696,-233.5002 -.0696,-170.8998 -.0696,-170.8998 -.0696,-164.8998 5.9304,-158.8998 11.9304,-158.8998 11.9304,-158.8998 400.2088,-158.8998 400.2088,-158.8998 406.2088,-158.8998 412.2088,-164.8998 412.2088,-170.8998 412.2088,-170.8998 412.2088,-233.5002 412.2088,-233.5002 412.2088,-239.5002 406.2088,-245.5002 400.2088,-245.5002"/>
|
||||
<text text-anchor="middle" x="206.0696" y="-195" font-family="Monaco" font-size="24.00" fill="#000000">libiconv@1.17%gcc@9.4.0/ogcucq2</text>
|
||||
</g>
|
||||
<!-- xm3ldz3y3msfdc3hzshvxpbpg5hnt6o6->ogcucq2eod3xusvvied5ol2iobui4nsb -->
|
||||
<g id="edge47" class="edge">
|
||||
<title>xm3ldz3y3msfdc3hzshvxpbpg5hnt6o6->ogcucq2eod3xusvvied5ol2iobui4nsb</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M205.0696,-317.6072C205.0696,-298.5263 205.0696,-275.9257 205.0696,-255.8046"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M207.0696,-317.6072C207.0696,-298.5263 207.0696,-275.9257 207.0696,-255.8046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="209.5697,-255.5403 206.0696,-245.5403 202.5697,-255.5404 209.5697,-255.5403"/>
|
||||
<text text-anchor="middle" x="165.5739" y="-285.8482" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=iconv</text>
|
||||
</g>
|
||||
<!-- 4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->mujlx42xgttdc6u6rmiftsktpsrcmpbs -->
|
||||
<g id="edge42" class="edge">
|
||||
<title>4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->mujlx42xgttdc6u6rmiftsktpsrcmpbs</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M672.6614,-1430.2151C600.7916,-1411.3548 534.1254,-1386.9583 512.2667,-1357.7962 489.0909,-1326.029 493.54,-1304.0273 512.1928,-1269.9192 527.5256,-1242.0821 552.3382,-1220.1508 578.9347,-1203.0434"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M673.169,-1428.2806C601.4789,-1409.4766 534.8127,-1385.0802 513.8725,-1356.6038 491.0512,-1326.4254 495.5003,-1304.4237 513.9464,-1270.8808 528.8502,-1243.5806 553.6627,-1221.6493 580.016,-1204.7259"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="581.46,-1206.7724 588.1193,-1198.532 577.7747,-1200.8211 581.46,-1206.7724"/>
|
||||
</g>
|
||||
<!-- 4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="edge43" class="edge">
|
||||
<title>4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M680.4783,-1430.2246C600.8632,-1410.3933 522.8724,-1385.2921 493.3877,-1357.9314 411.1392,-1281.1573 374.1678,-1206.1582 435.2305,-1111.0561 454.3431,-1081.6726 482.5021,-1059.8261 513.5088,-1043.3725"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M680.9617,-1428.2839C601.476,-1408.4895 523.4851,-1383.3883 494.7515,-1356.4686 412.9331,-1280.273 375.9616,-1205.2739 436.9087,-1112.1439 455.569,-1083.2528 483.728,-1061.4063 514.4455,-1045.1396"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="515.8631,-1047.2236 523.1893,-1039.5699 512.6893,-1040.9844 515.8631,-1047.2236"/>
|
||||
<text text-anchor="middle" x="453.0969" y="-1356.92" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=blas</text>
|
||||
</g>
|
||||
<!-- 4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->xiro2z6na56qdd4czjhj54eag3ekbiow -->
|
||||
<g id="edge38" class="edge">
|
||||
<title>4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->xiro2z6na56qdd4czjhj54eag3ekbiow</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M857.6892,-1429.8521C840.9235,-1409.9835 820.9375,-1386.2985 803.4466,-1365.5705"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M859.2178,-1428.5623C842.4521,-1408.6937 822.466,-1385.0087 804.9751,-1364.2807"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="806.7654,-1362.5258 797.6414,-1357.1403 801.4156,-1367.0402 806.7654,-1362.5258"/>
|
||||
</g>
|
||||
<!-- 4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->2w3nq3n3hcj2tqlvcpewsryamltlu5tw -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->2w3nq3n3hcj2tqlvcpewsryamltlu5tw</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1118.1783,-1450.5735C1412.4221,-1422.447 1902.6188,-1374.0528 1984.8578,-1356.2227 2203.916,-1308.9943 2329.6342,-1377.1305 2461.2658,-1197.8052 2492.3675,-1156.1664 2488.743,-1094.1171 2480.3694,-1050.0521"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1118.3686,-1452.5644C1412.6186,-1424.4374 1902.8153,-1376.0432 1985.2814,-1358.1773 2202.963,-1310.7526 2328.6812,-1378.8889 2462.8734,-1198.9948 2494.3641,-1156.0498 2490.7395,-1094.0005 2482.3343,-1049.6791"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2484.7438,-1048.9818 2479.3189,-1039.8812 2477.8845,-1050.3784 2484.7438,-1048.9818"/>
|
||||
<text text-anchor="middle" x="1820.4407" y="-1379.7188" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=mpi</text>
|
||||
</g>
|
||||
<!-- 4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge32" class="edge">
|
||||
<title>4bu62kyfuh4ikdkuyxfxjxanf7e7qopu->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M947.2173,-1428.5496C968.7089,-1408.5917 992.2747,-1383.3345 1008.2117,-1356.6861 1067.0588,-1259.8646 1008.3745,-1197.6371 1084.3226,-1110.9351 1110.3076,-1081.7965 1144.7149,-1059.7578 1180.1804,-1043.0531"/>
|
||||
<path fill="none" stroke="#daa520" stroke-width="2" d="M948.5783,-1430.0151C970.1712,-1409.9561 993.737,-1384.6989 1009.9275,-1357.7139 1068.5139,-1258.4924 1009.8295,-1196.2649 1085.8166,-1112.2649 1111.3864,-1083.4807 1145.7936,-1061.442 1181.0322,-1044.8626"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1182.4567,-1046.9607 1190.1008,-1039.6246 1179.5503,-1040.5926 1182.4567,-1046.9607"/>
|
||||
</g>
|
||||
<!-- 5xerf6imlgo4xlubacr4mljacc3edexo -->
|
||||
<g id="node17" class="node">
|
||||
<title>5xerf6imlgo4xlubacr4mljacc3edexo</title>
|
||||
<path fill="#add8e6" stroke="#000000" stroke-width="4" d="M1822.3657,-880.7002C1822.3657,-880.7002 1437.7735,-880.7002 1437.7735,-880.7002 1431.7735,-880.7002 1425.7735,-874.7002 1425.7735,-868.7002 1425.7735,-868.7002 1425.7735,-806.0998 1425.7735,-806.0998 1425.7735,-800.0998 1431.7735,-794.0998 1437.7735,-794.0998 1437.7735,-794.0998 1822.3657,-794.0998 1822.3657,-794.0998 1828.3657,-794.0998 1834.3657,-800.0998 1834.3657,-806.0998 1834.3657,-806.0998 1834.3657,-868.7002 1834.3657,-868.7002 1834.3657,-874.7002 1828.3657,-880.7002 1822.3657,-880.7002"/>
|
||||
<text text-anchor="middle" x="1630.0696" y="-830.2" font-family="Monaco" font-size="24.00" fill="#000000">openssl@1.1.1s%gcc@9.4.0/5xerf6i</text>
|
||||
</g>
|
||||
<!-- 5xerf6imlgo4xlubacr4mljacc3edexo->ywrpvv2hgooeepdke33exkqrtdpd5gkl -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>5xerf6imlgo4xlubacr4mljacc3edexo->ywrpvv2hgooeepdke33exkqrtdpd5gkl</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1425.7129,-803.7711C1262.7545,-776.9548 1035.5151,-739.5603 871.9084,-712.6373"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="872.1525,-709.1305 861.7169,-710.9602 871.0158,-716.0376 872.1525,-709.1305"/>
|
||||
</g>
|
||||
<!-- 5xerf6imlgo4xlubacr4mljacc3edexo->4vsmjofkhntilgzh4zebluqak5mdsu3x -->
|
||||
<g id="edge48" class="edge">
|
||||
<title>5xerf6imlgo4xlubacr4mljacc3edexo->4vsmjofkhntilgzh4zebluqak5mdsu3x</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1644.2788,-794.0072C1650.5843,-774.7513 1658.0636,-751.9107 1664.6976,-731.6514"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1668.0917,-732.533 1667.8776,-721.9403 1661.4393,-730.3546 1668.0917,-732.533"/>
|
||||
</g>
|
||||
<!-- 5xerf6imlgo4xlubacr4mljacc3edexo->nizxi5u5bbrzhzwfy2qb7hatlhuswlrz -->
|
||||
<g id="edge41" class="edge">
|
||||
<title>5xerf6imlgo4xlubacr4mljacc3edexo->nizxi5u5bbrzhzwfy2qb7hatlhuswlrz</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1834.3289,-793.5645C1906.6817,-774.1673 1975.9199,-749.2273 1998.2925,-721.3707 2031.5218,-680.681 2032.1636,-617.9031 2027.044,-573.3921"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1834.8468,-795.4962C1907.3595,-776.0489 1976.5977,-751.1089 1999.8467,-722.6293 2033.5217,-680.7015 2034.1635,-617.9235 2029.0309,-573.1639"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2031.4885,-572.6712 2026.7474,-563.1964 2024.5451,-573.5598 2031.4885,-572.6712"/>
|
||||
</g>
|
||||
<!-- v32wejd4d5lc6uka4qlrogwh5xae2h3r -->
|
||||
<g id="node26" class="node">
|
||||
<title>v32wejd4d5lc6uka4qlrogwh5xae2h3r</title>
|
||||
<path fill="#ff7f50" stroke="#000000" stroke-width="4" d="M1306.1776,-404.3002C1306.1776,-404.3002 929.9616,-404.3002 929.9616,-404.3002 923.9616,-404.3002 917.9616,-398.3002 917.9616,-392.3002 917.9616,-392.3002 917.9616,-329.6998 917.9616,-329.6998 917.9616,-323.6998 923.9616,-317.6998 929.9616,-317.6998 929.9616,-317.6998 1306.1776,-317.6998 1306.1776,-317.6998 1312.1776,-317.6998 1318.1776,-323.6998 1318.1776,-329.6998 1318.1776,-329.6998 1318.1776,-392.3002 1318.1776,-392.3002 1318.1776,-398.3002 1312.1776,-404.3002 1306.1776,-404.3002"/>
|
||||
<text text-anchor="middle" x="1118.0696" y="-353.8" font-family="Monaco" font-size="24.00" fill="#000000">readline@8.2%gcc@9.4.0/v32wejd</text>
|
||||
</g>
|
||||
<!-- uabgssx6lsgrevwbttslldnr5nzguprj->v32wejd4d5lc6uka4qlrogwh5xae2h3r -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>uabgssx6lsgrevwbttslldnr5nzguprj->v32wejd4d5lc6uka4qlrogwh5xae2h3r</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1117.0696,-476.4072C1117.0696,-457.3263 1117.0696,-434.7257 1117.0696,-414.6046"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1119.0696,-476.4072C1119.0696,-457.3263 1119.0696,-434.7257 1119.0696,-414.6046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1121.5697,-414.3403 1118.0696,-404.3403 1114.5697,-414.3404 1121.5697,-414.3403"/>
|
||||
</g>
|
||||
<!-- lfh3aovn65e66cs24qiehq3nd2ddojef->o524gebsxavobkte3k5fglgwnedfkadf -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>lfh3aovn65e66cs24qiehq3nd2ddojef->o524gebsxavobkte3k5fglgwnedfkadf</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1167.6711,-1112.5788C1078.9073,-1090.9596 971.5916,-1064.822 881.5513,-1042.892"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1168.1444,-1110.6356C1079.3806,-1089.0165 972.0649,-1062.8788 882.0246,-1040.9488"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="882.5603,-1038.5062 872.016,-1039.5403 880.9038,-1045.3074 882.5603,-1038.5062"/>
|
||||
<text text-anchor="middle" x="963.904" y="-1079.817" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=blas,lapack</text>
|
||||
</g>
|
||||
<!-- lfh3aovn65e66cs24qiehq3nd2ddojef->2w3nq3n3hcj2tqlvcpewsryamltlu5tw -->
|
||||
<g id="edge31" class="edge">
|
||||
<title>lfh3aovn65e66cs24qiehq3nd2ddojef->2w3nq3n3hcj2tqlvcpewsryamltlu5tw</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1559.7922,-1112.1043C1562.8511,-1111.5975 1565.8904,-1111.1002 1568.9103,-1110.6128 1759.2182,-1079.8992 1973.2397,-1052.1328 2144.6143,-1031.5343"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1560.1191,-1114.0774C1563.1741,-1113.5712 1566.2134,-1113.0739 1569.2289,-1112.5872 1759.4755,-1081.8826 1973.497,-1054.1161 2144.8529,-1033.52"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2145.1529,-1036.002 2154.6648,-1031.3357 2144.3191,-1029.0518 2145.1529,-1036.002"/>
|
||||
<text text-anchor="middle" x="1828.178" y="-1072.4692" font-family="Times,serif" font-size="14.00" fill="#000000">virtuals=mpi</text>
|
||||
</g>
|
||||
<!-- lfh3aovn65e66cs24qiehq3nd2ddojef->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>lfh3aovn65e66cs24qiehq3nd2ddojef->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1346.0696,-1111.6072C1346.0696,-1092.5263 1346.0696,-1069.9257 1346.0696,-1049.8046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1349.5697,-1049.5403 1346.0696,-1039.5403 1342.5697,-1049.5404 1349.5697,-1049.5403"/>
|
||||
</g>
|
||||
<!-- 2w3nq3n3hcj2tqlvcpewsryamltlu5tw->htzjns66gmq6pjofohp26djmjnpbegho -->
|
||||
<g id="edge30" class="edge">
|
||||
<title>2w3nq3n3hcj2tqlvcpewsryamltlu5tw->htzjns66gmq6pjofohp26djmjnpbegho</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M2467.0696,-952.8072C2467.0696,-933.7263 2467.0696,-911.1257 2467.0696,-891.0046"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="2470.5697,-890.7403 2467.0696,-880.7403 2463.5697,-890.7404 2470.5697,-890.7403"/>
|
||||
</g>
|
||||
<!-- 7rzbmgoxhmm2jhellkgcjmn62uklf22x->gguve5icmo5e4cw5o3hvvfsxremc46if -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>7rzbmgoxhmm2jhellkgcjmn62uklf22x->gguve5icmo5e4cw5o3hvvfsxremc46if</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1422.351,-1429.2133C1312.2528,-1388.8872 1171.1589,-1316.8265 1103.0696,-1198.4 1083.8409,-1164.956 1082.4563,-1144.2088 1103.0696,-1111.6 1121.4102,-1082.5864 1149.2483,-1060.7204 1179.6189,-1044.2895"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1181.4205,-1047.2977 1188.6801,-1039.5809 1178.1927,-1041.0863 1181.4205,-1047.2977"/>
|
||||
</g>
|
||||
<!-- v32wejd4d5lc6uka4qlrogwh5xae2h3r->j5rupoqliu7kasm6xndl7ui32wgawkru -->
|
||||
<g id="edge39" class="edge">
|
||||
<title>v32wejd4d5lc6uka4qlrogwh5xae2h3r->j5rupoqliu7kasm6xndl7ui32wgawkru</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1179.8001,-316.7866C1209.2065,-296.3053 1244.4355,-271.7686 1274.8343,-250.5961"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1180.9431,-318.4278C1210.3495,-297.9465 1245.5785,-273.4098 1275.9774,-252.2373"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1277.6375,-254.1277 1283.8429,-245.5403 1273.6367,-248.3836 1277.6375,-254.1277"/>
|
||||
</g>
|
||||
<!-- gguve5icmo5e4cw5o3hvvfsxremc46if->j5rupoqliu7kasm6xndl7ui32wgawkru -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>gguve5icmo5e4cw5o3hvvfsxremc46if->j5rupoqliu7kasm6xndl7ui32wgawkru</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1345.0696,-952.7909C1345.0696,-891.6316 1345.0696,-776.6094 1345.0696,-678.6 1345.0696,-678.6 1345.0696,-678.6 1345.0696,-519.8 1345.0696,-426.9591 1345.0696,-318.8523 1345.0696,-255.7237"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1347.0696,-952.7909C1347.0696,-891.6316 1347.0696,-776.6094 1347.0696,-678.6 1347.0696,-678.6 1347.0696,-678.6 1347.0696,-519.8 1347.0696,-426.9591 1347.0696,-318.8523 1347.0696,-255.7237"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1349.5697,-255.6091 1346.0696,-245.6091 1342.5697,-255.6092 1349.5697,-255.6091"/>
|
||||
</g>
|
||||
<!-- gguve5icmo5e4cw5o3hvvfsxremc46if->5xerf6imlgo4xlubacr4mljacc3edexo -->
|
||||
<g id="edge40" class="edge">
|
||||
<title>gguve5icmo5e4cw5o3hvvfsxremc46if->5xerf6imlgo4xlubacr4mljacc3edexo</title>
|
||||
<path fill="none" stroke="#1e90ff" stroke-width="2" d="M1423.1858,-951.9344C1460.2844,-931.1905 1504.8229,-906.2866 1543.0151,-884.9312"/>
|
||||
<path fill="none" stroke="#dc143c" stroke-width="2" d="M1424.1619,-953.68C1461.2605,-932.9361 1505.799,-908.0322 1543.9912,-886.6769"/>
|
||||
<polygon fill="#1e90ff" stroke="#1e90ff" stroke-width="2" points="1545.5391,-888.6757 1552.5592,-880.7403 1542.1228,-882.5659 1545.5391,-888.6757"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 58 KiB |
@@ -2352,7 +2352,7 @@ the following at the command line of a bash shell:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ for i in {1..12}; do nohup spack install -j 4 mpich@3.3.2 >> mpich_install.txt 2>&1 &; done
|
||||
$ for i in {1..12}; do nohup spack install -j 4 mpich@3.3.2 >> mpich_install.txt 2>&1 & done
|
||||
|
||||
.. note::
|
||||
|
||||
@@ -2688,60 +2688,6 @@ appear in the package file (or in this case, in the list).
|
||||
right version. If two packages depend on ``binutils`` patched *the
|
||||
same* way, they can both use a single installation of ``binutils``.
|
||||
|
||||
.. _setup-dependent-environment:
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Influence how dependents are built or run
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Spack provides a mechanism for dependencies to influence the
|
||||
environment of their dependents by overriding the
|
||||
:meth:`setup_dependent_run_environment <spack.package_base.PackageBase.setup_dependent_run_environment>`
|
||||
or the
|
||||
:meth:`setup_dependent_build_environment <spack.builder.Builder.setup_dependent_build_environment>`
|
||||
methods.
|
||||
The Qt package, for instance, uses this call:
|
||||
|
||||
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/qt/package.py
|
||||
:pyobject: Qt.setup_dependent_build_environment
|
||||
:linenos:
|
||||
|
||||
to set the ``QTDIR`` environment variable so that packages
|
||||
that depend on a particular Qt installation will find it.
|
||||
Another good example of how a dependency can influence
|
||||
the build environment of dependents is the Python package:
|
||||
|
||||
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/python/package.py
|
||||
:pyobject: Python.setup_dependent_build_environment
|
||||
:linenos:
|
||||
|
||||
In the method above it is ensured that any package that depends on Python
|
||||
will have the ``PYTHONPATH``, ``PYTHONHOME`` and ``PATH`` environment
|
||||
variables set appropriately before starting the installation. To make things
|
||||
even simpler the ``python setup.py`` command is also inserted into the module
|
||||
scope of dependents by overriding a third method called
|
||||
:meth:`setup_dependent_package <spack.package_base.PackageBase.setup_dependent_package>`
|
||||
:
|
||||
|
||||
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/python/package.py
|
||||
:pyobject: Python.setup_dependent_package
|
||||
:linenos:
|
||||
|
||||
This allows most python packages to have a very simple install procedure,
|
||||
like the following:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def install(self, spec, prefix):
|
||||
setup_py("install", "--prefix={0}".format(prefix))
|
||||
|
||||
Finally the Python package takes also care of the modifications to ``PYTHONPATH``
|
||||
to allow dependencies to run correctly:
|
||||
|
||||
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/python/package.py
|
||||
:pyobject: Python.setup_dependent_run_environment
|
||||
:linenos:
|
||||
|
||||
|
||||
.. _packaging_conflicts:
|
||||
|
||||
@@ -2886,6 +2832,70 @@ variant(s) are selected. This may be accomplished with conditional
|
||||
extends("python", when="+python")
|
||||
...
|
||||
|
||||
.. _setup-environment:
|
||||
|
||||
--------------------------------------------
|
||||
Runtime and build time environment variables
|
||||
--------------------------------------------
|
||||
|
||||
Spack provides a few methods to help package authors set up the required environment variables for
|
||||
their package. Environment variables typically depend on how the package is used: variables that
|
||||
make sense during the build phase may not be needed at runtime, and vice versa. Further, sometimes
|
||||
it makes sense to let a dependency set the environment variables for its dependents. To allow all
|
||||
this, Spack provides four different methods that can be overridden in a package:
|
||||
|
||||
1. :meth:`setup_build_environment <spack.builder.Builder.setup_build_environment>`
|
||||
2. :meth:`setup_run_environment <spack.package_base.PackageBase.setup_run_environment>`
|
||||
3. :meth:`setup_dependent_build_environment <spack.builder.Builder.setup_dependent_build_environment>`
|
||||
4. :meth:`setup_dependent_run_environment <spack.package_base.PackageBase.setup_dependent_run_environment>`
|
||||
|
||||
The Qt package, for instance, uses this call:
|
||||
|
||||
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/qt/package.py
|
||||
:pyobject: Qt.setup_dependent_build_environment
|
||||
:linenos:
|
||||
|
||||
to set the ``QTDIR`` environment variable so that packages that depend on a particular Qt
|
||||
installation will find it.
|
||||
|
||||
The following diagram will give you an idea when each of these methods is called in a build
|
||||
context:
|
||||
|
||||
.. image:: images/setup_env.png
|
||||
:align: center
|
||||
|
||||
Notice that ``setup_dependent_run_environment`` can be called multiple times, once for each
|
||||
dependent package, whereas ``setup_run_environment`` is called only once for the package itself.
|
||||
This means that the former should only be used if the environment variables depend on the dependent
|
||||
package, whereas the latter should be used if the environment variables depend only on the package
|
||||
itself.
|
||||
|
||||
--------------------------------
|
||||
Setting package module variables
|
||||
--------------------------------
|
||||
|
||||
Apart from modifying environment variables of the dependent package, you can also define Python
|
||||
variables to be used by the dependent. This is done by implementing
|
||||
:meth:`setup_dependent_package <spack.package_base.PackageBase.setup_dependent_package>`. An
|
||||
example of this can be found in the ``Python`` package:
|
||||
|
||||
.. literalinclude:: _spack_root/var/spack/repos/builtin/packages/python/package.py
|
||||
:pyobject: Python.setup_dependent_package
|
||||
:linenos:
|
||||
|
||||
This allows Python packages to directly use these variables:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def install(self, spec, prefix):
|
||||
...
|
||||
install("script.py", python_platlib)
|
||||
|
||||
.. note::
|
||||
|
||||
We recommend using ``setup_dependent_package`` sparingly, as it is not always clear where
|
||||
global variables are coming from when editing a ``package.py`` file.
|
||||
|
||||
-----
|
||||
Views
|
||||
-----
|
||||
@@ -2964,6 +2974,33 @@ The ``provides("mpi")`` call tells Spack that the ``mpich`` package
|
||||
can be used to satisfy the dependency of any package that
|
||||
``depends_on("mpi")``.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Providing multiple virtuals simultaneously
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Packages can provide more than one virtual dependency. Sometimes, due to implementation details,
|
||||
there are subsets of those virtuals that need to be provided together by the same package.
|
||||
|
||||
A well-known example is ``openblas``, which provides both the ``lapack`` and ``blas`` API in a single ``libopenblas``
|
||||
library. A package that needs ``lapack`` and ``blas`` must either use ``openblas`` to provide both, or not use
|
||||
``openblas`` at all. It cannot pick one or the other.
|
||||
|
||||
To express this constraint in a package, the two virtual dependencies must be listed in the same ``provides`` directive:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
provides('blas', 'lapack')
|
||||
|
||||
This makes it impossible to select ``openblas`` as a provider for one of the two
|
||||
virtual dependencies and not for the other. If you try to, Spack will report an error:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack spec netlib-scalapack ^[virtuals=lapack] openblas ^[virtuals=blas] atlas
|
||||
==> Error: concretization failed for the following reasons:
|
||||
|
||||
1. Package 'openblas' needs to provide both 'lapack' and 'blas' together, but provides only 'lapack'
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
Versioned Interfaces
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -3765,7 +3802,7 @@ Similarly, ``spack install example +feature build_system=autotools`` will pick
|
||||
the ``AutotoolsBuilder`` and invoke ``./configure --with-my-feature``.
|
||||
|
||||
Dependencies are always specified in the package class. When some dependencies
|
||||
depend on the choice of the build system, it is possible to use when conditions as
|
||||
depend on the choice of the build system, it is possible to use when conditions as
|
||||
usual:
|
||||
|
||||
.. code-block:: python
|
||||
@@ -3783,7 +3820,7 @@ usual:
|
||||
depends_on("cmake@3.18:", when="@2.0:", type="build")
|
||||
depends_on("cmake@3:", type="build")
|
||||
|
||||
# Specify extra build dependencies used only in the configure script
|
||||
# Specify extra build dependencies used only in the configure script
|
||||
with when("build_system=autotools"):
|
||||
depends_on("perl", type="build")
|
||||
depends_on("pkgconfig", type="build")
|
||||
@@ -6831,25 +6868,58 @@ the adapter role is to "emulate" a method resolution order like the one represen
|
||||
Specifying License Information
|
||||
------------------------------
|
||||
|
||||
A significant portion of software that Spack packages is open source. Most open
|
||||
source software is released under one or more common open source licenses.
|
||||
Specifying the specific license that a package is released under in a project's
|
||||
`package.py` is good practice. To specify a license, find the SPDX identifier for
|
||||
a project and then add it using the license directive:
|
||||
Most of the software in Spack is open source, and most open source software is released
|
||||
under one or more `common open source licenses <https://opensource.org/licenses/>`_.
|
||||
Specifying the license that a package is released under in a project's
|
||||
`package.py` is good practice. To specify a license, find the `SPDX identifier
|
||||
<https://spdx.org/licenses/>`_ for a project and then add it using the license
|
||||
directive:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
license("<SPDX Identifier HERE>")
|
||||
|
||||
For example, the SPDX ID for the Apache Software License, version 2.0 is ``Apache-2.0``,
|
||||
so you'd write:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
license("Apache-2.0")
|
||||
|
||||
Or, for a dual-licensed package like Spack, you would use an `SPDX Expression
|
||||
<https://spdx.github.io/spdx-spec/v2-draft/SPDX-license-expressions/>`_ with both of its
|
||||
licenses:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
license("Apache-2.0 OR MIT")
|
||||
|
||||
Note that specifying a license without a when clause makes it apply to all
|
||||
versions and variants of the package, which might not actually be the case.
|
||||
For example, a project might have switched licenses at some point or have
|
||||
certain build configurations that include files that are licensed differently.
|
||||
To account for this, you can specify when licenses should be applied. For
|
||||
example, to specify that a specific license identifier should only apply
|
||||
to versionup to and including 1.5, you could write the following directive:
|
||||
Spack itself used to be under the ``LGPL-2.1`` license, until it was relicensed
|
||||
in version ``0.12`` in 2018.
|
||||
|
||||
You can specify when a ``license()`` directive applies using with a ``when=``
|
||||
clause, just like other directives. For example, to specify that a specific
|
||||
license identifier should only apply to versions up to ``0.11``, but another
|
||||
license should apply for later versions, you could write:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
license("...", when="@:1.5")
|
||||
license("LGPL-2.1", when="@:0.11")
|
||||
license("Apache-2.0 OR MIT", when="@0.12:")
|
||||
|
||||
Note that unlike for most other directives, the ``when=`` constraints in the
|
||||
``license()`` directive can't intersect. Spack needs to be able to resolve
|
||||
exactly one license identifier expression for any given version. To specify
|
||||
*multiple* licenses, use SPDX expressions and operators as above. The operators
|
||||
you probably care most about are:
|
||||
|
||||
* ``OR``: user chooses one license to adhere to; and
|
||||
* ``AND``: user has to adhere to all the licenses.
|
||||
|
||||
You may also care about `license exceptions
|
||||
<https://spdx.org/licenses/exceptions-index.html>`_ that use the ``WITH`` operator,
|
||||
e.g. ``Apache-2.0 WITH LLVM-exception``.
|
||||
|
||||
@@ -8,6 +8,6 @@ pygments==2.16.1
|
||||
urllib3==2.0.7
|
||||
pytest==7.4.3
|
||||
isort==5.12.0
|
||||
black==23.9.1
|
||||
black==23.10.1
|
||||
flake8==6.1.0
|
||||
mypy==1.6.1
|
||||
|
||||
@@ -211,6 +211,7 @@ def info(message, *args, **kwargs):
|
||||
stream.write(line + "\n")
|
||||
else:
|
||||
stream.write(indent + _output_filter(str(arg)) + "\n")
|
||||
stream.flush()
|
||||
|
||||
|
||||
def verbose(message, *args, **kwargs):
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
import warnings
|
||||
from contextlib import closing, contextmanager
|
||||
from gzip import GzipFile
|
||||
from typing import Dict, List, NamedTuple, Optional, Tuple, Union
|
||||
from typing import Dict, List, NamedTuple, Optional, Set, Tuple
|
||||
from urllib.error import HTTPError, URLError
|
||||
|
||||
import llnl.util.filesystem as fsys
|
||||
@@ -53,6 +53,7 @@
|
||||
import spack.util.crypto
|
||||
import spack.util.file_cache as file_cache
|
||||
import spack.util.gpg
|
||||
import spack.util.path
|
||||
import spack.util.spack_json as sjson
|
||||
import spack.util.spack_yaml as syaml
|
||||
import spack.util.timer as timer
|
||||
@@ -130,25 +131,25 @@ class BinaryCacheIndex:
|
||||
mean we should have paid the price to update the cache earlier?
|
||||
"""
|
||||
|
||||
def __init__(self, cache_root):
|
||||
self._index_cache_root = cache_root
|
||||
def __init__(self, cache_root: Optional[str] = None):
|
||||
self._index_cache_root: str = cache_root or binary_index_location()
|
||||
|
||||
# the key associated with the serialized _local_index_cache
|
||||
self._index_contents_key = "contents.json"
|
||||
|
||||
# a FileCache instance storing copies of remote binary cache indices
|
||||
self._index_file_cache = None
|
||||
self._index_file_cache: Optional[file_cache.FileCache] = None
|
||||
|
||||
# stores a map of mirror URL to index hash and cache key (index path)
|
||||
self._local_index_cache = None
|
||||
self._local_index_cache: Optional[dict] = None
|
||||
|
||||
# hashes of remote indices already ingested into the concrete spec
|
||||
# cache (_mirrors_for_spec)
|
||||
self._specs_already_associated = set()
|
||||
self._specs_already_associated: Set[str] = set()
|
||||
|
||||
# mapping from mirror urls to the time.time() of the last index fetch and a bool indicating
|
||||
# whether the fetch succeeded or not.
|
||||
self._last_fetch_times = {}
|
||||
self._last_fetch_times: Dict[str, float] = {}
|
||||
|
||||
# _mirrors_for_spec is a dictionary mapping DAG hashes to lists of
|
||||
# entries indicating mirrors where that concrete spec can be found.
|
||||
@@ -158,7 +159,7 @@ def __init__(self, cache_root):
|
||||
# - the concrete spec itself, keyed by ``spec`` (including the
|
||||
# full hash, since the dag hash may match but we want to
|
||||
# use the updated source if available)
|
||||
self._mirrors_for_spec = {}
|
||||
self._mirrors_for_spec: Dict[str, dict] = {}
|
||||
|
||||
def _init_local_index_cache(self):
|
||||
if not self._index_file_cache:
|
||||
@@ -529,15 +530,8 @@ def binary_index_location():
|
||||
return spack.util.path.canonicalize_path(cache_root)
|
||||
|
||||
|
||||
def _binary_index():
|
||||
"""Get the singleton store instance."""
|
||||
return BinaryCacheIndex(binary_index_location())
|
||||
|
||||
|
||||
#: Singleton binary_index instance
|
||||
binary_index: Union[BinaryCacheIndex, llnl.util.lang.Singleton] = llnl.util.lang.Singleton(
|
||||
_binary_index
|
||||
)
|
||||
#: Default binary cache index instance
|
||||
BINARY_INDEX: BinaryCacheIndex = llnl.util.lang.Singleton(BinaryCacheIndex) # type: ignore
|
||||
|
||||
|
||||
class NoOverwriteException(spack.error.SpackError):
|
||||
@@ -2255,7 +2249,7 @@ def get_mirrors_for_spec(spec=None, mirrors_to_check=None, index_only=False):
|
||||
tty.debug("No Spack mirrors are currently configured")
|
||||
return {}
|
||||
|
||||
results = binary_index.find_built_spec(spec, mirrors_to_check=mirrors_to_check)
|
||||
results = BINARY_INDEX.find_built_spec(spec, mirrors_to_check=mirrors_to_check)
|
||||
|
||||
# The index may be out-of-date. If we aren't only considering indices, try
|
||||
# to fetch directly since we know where the file should be.
|
||||
@@ -2264,7 +2258,7 @@ def get_mirrors_for_spec(spec=None, mirrors_to_check=None, index_only=False):
|
||||
# We found a spec by the direct fetch approach, we might as well
|
||||
# add it to our mapping.
|
||||
if results:
|
||||
binary_index.update_spec(spec, results)
|
||||
BINARY_INDEX.update_spec(spec, results)
|
||||
|
||||
return results
|
||||
|
||||
@@ -2280,12 +2274,12 @@ def update_cache_and_get_specs():
|
||||
Throws:
|
||||
FetchCacheError
|
||||
"""
|
||||
binary_index.update()
|
||||
return binary_index.get_all_built_specs()
|
||||
BINARY_INDEX.update()
|
||||
return BINARY_INDEX.get_all_built_specs()
|
||||
|
||||
|
||||
def clear_spec_cache():
|
||||
binary_index.clear()
|
||||
BINARY_INDEX.clear()
|
||||
|
||||
|
||||
def get_keys(install=False, trust=False, force=False, mirrors=None):
|
||||
|
||||
@@ -214,7 +214,7 @@ def _install_and_test(
|
||||
with spack.config.override(self.mirror_scope):
|
||||
# This index is currently needed to get the compiler used to build some
|
||||
# specs that we know by dag hash.
|
||||
spack.binary_distribution.binary_index.regenerate_spec_cache()
|
||||
spack.binary_distribution.BINARY_INDEX.regenerate_spec_cache()
|
||||
index = spack.binary_distribution.update_cache_and_get_specs()
|
||||
|
||||
if not index:
|
||||
@@ -291,6 +291,10 @@ def try_import(self, module: str, abstract_spec_str: str) -> bool:
|
||||
with spack_python_interpreter():
|
||||
# Add hint to use frontend operating system on Cray
|
||||
concrete_spec = spack.spec.Spec(abstract_spec_str + " ^" + spec_for_current_python())
|
||||
# This is needed to help the old concretizer taking the `setuptools` dependency
|
||||
# only when bootstrapping from sources on Python 3.12
|
||||
if spec_for_current_python() == "python@3.12":
|
||||
concrete_spec.constrain("+force_setuptools")
|
||||
|
||||
if module == "clingo":
|
||||
# TODO: remove when the old concretizer is deprecated # pylint: disable=fixme
|
||||
|
||||
@@ -752,19 +752,13 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD):
|
||||
target = platform.target(pkg.spec.architecture.target)
|
||||
platform.setup_platform_environment(pkg, env_mods)
|
||||
|
||||
if context == Context.BUILD:
|
||||
tty.debug("setup_package: setup build environment for root")
|
||||
builder = spack.builder.create(pkg)
|
||||
builder.setup_build_environment(env_mods)
|
||||
|
||||
if (not dirty) and (not env_mods.is_unset("CPATH")):
|
||||
tty.debug(
|
||||
"A dependency has updated CPATH, this may lead pkg-"
|
||||
"config to assume that the package is part of the system"
|
||||
" includes and omit it when invoked with '--cflags'."
|
||||
)
|
||||
elif context == Context.TEST:
|
||||
if context == Context.TEST:
|
||||
env_mods.prepend_path("PATH", ".")
|
||||
elif context == Context.BUILD and not dirty and not env_mods.is_unset("CPATH"):
|
||||
tty.debug(
|
||||
"A dependency has updated CPATH, this may lead pkg-config to assume that the package "
|
||||
"is part of the system includes and omit it when invoked with '--cflags'."
|
||||
)
|
||||
|
||||
# First apply the clean environment changes
|
||||
env_base.apply_modifications()
|
||||
@@ -953,8 +947,11 @@ def __init__(self, *specs: spack.spec.Spec, context: Context) -> None:
|
||||
reversed(specs_with_type), lambda t: t[0].external
|
||||
)
|
||||
self.should_be_runnable = UseMode.BUILDTIME_DIRECT | UseMode.RUNTIME_EXECUTABLE
|
||||
self.should_setup_run_env = UseMode.RUNTIME | UseMode.RUNTIME_EXECUTABLE
|
||||
self.should_setup_run_env = (
|
||||
UseMode.BUILDTIME_DIRECT | UseMode.RUNTIME | UseMode.RUNTIME_EXECUTABLE
|
||||
)
|
||||
self.should_setup_dependent_build_env = UseMode.BUILDTIME | UseMode.BUILDTIME_DIRECT
|
||||
self.should_setup_build_env = UseMode.ROOT if context == Context.BUILD else UseMode(0)
|
||||
|
||||
if context == Context.RUN or context == Context.TEST:
|
||||
self.should_be_runnable |= UseMode.ROOT
|
||||
@@ -994,8 +991,9 @@ def get_env_modifications(self) -> EnvironmentModifications:
|
||||
- Updating PATH for packages that are required at runtime
|
||||
- Updating CMAKE_PREFIX_PATH and PKG_CONFIG_PATH so that their respective
|
||||
tools can find Spack-built dependencies (when context=build)
|
||||
- Running custom package environment modifications (setup_run_environment,
|
||||
setup_dependent_build_environment, setup_dependent_run_environment)
|
||||
- Running custom package environment modifications: setup_run_environment,
|
||||
setup_dependent_run_environment, setup_build_environment,
|
||||
setup_dependent_build_environment.
|
||||
|
||||
The (partial) order imposed on the specs is externals first, then topological
|
||||
from leaf to root. That way externals cannot contribute search paths that would shadow
|
||||
@@ -1008,19 +1006,26 @@ def get_env_modifications(self) -> EnvironmentModifications:
|
||||
if self.should_setup_dependent_build_env & flag:
|
||||
self._make_buildtime_detectable(dspec, env)
|
||||
|
||||
for spec in self.specs:
|
||||
builder = spack.builder.create(pkg)
|
||||
builder.setup_dependent_build_environment(env, spec)
|
||||
for root in self.specs: # there is only one root in build context
|
||||
spack.builder.create(pkg).setup_dependent_build_environment(env, root)
|
||||
|
||||
if self.should_setup_build_env & flag:
|
||||
spack.builder.create(pkg).setup_build_environment(env)
|
||||
|
||||
if self.should_be_runnable & flag:
|
||||
self._make_runnable(dspec, env)
|
||||
|
||||
if self.should_setup_run_env & flag:
|
||||
# TODO: remove setup_dependent_run_environment...
|
||||
for spec in dspec.dependents(deptype=dt.RUN):
|
||||
run_env_mods = EnvironmentModifications()
|
||||
for spec in dspec.dependents(deptype=dt.LINK | dt.RUN):
|
||||
if id(spec) in self.nodes_in_subdag:
|
||||
pkg.setup_dependent_run_environment(env, spec)
|
||||
pkg.setup_run_environment(env)
|
||||
pkg.setup_dependent_run_environment(run_env_mods, spec)
|
||||
pkg.setup_run_environment(run_env_mods)
|
||||
run_env_dict = run_env_mods.group_by_name()
|
||||
if self.context == Context.BUILD:
|
||||
run_env_mods.drop("CC", "CXX", "F77", "FC")
|
||||
env.extend(run_env_mods)
|
||||
|
||||
return env
|
||||
|
||||
def _make_buildtime_detectable(self, dep: spack.spec.Spec, env: EnvironmentModifications):
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import stat
|
||||
from typing import Optional
|
||||
|
||||
import archspec
|
||||
@@ -26,7 +25,6 @@
|
||||
from spack.directives import build_system, depends_on, extends, maintainers
|
||||
from spack.error import NoHeadersError, NoLibrariesError
|
||||
from spack.install_test import test_part
|
||||
from spack.util.executable import Executable
|
||||
|
||||
from ._checks import BaseBuilder, execute_install_time_tests
|
||||
|
||||
@@ -369,51 +367,6 @@ def libs(self):
|
||||
raise NoLibrariesError(msg.format(self.spec.name, root))
|
||||
|
||||
|
||||
def fixup_shebangs(path: str, old_interpreter: bytes, new_interpreter: bytes):
|
||||
# Recurse into the install prefix and fixup shebangs
|
||||
exe = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
|
||||
dirs = [path]
|
||||
hardlinks = set()
|
||||
|
||||
while dirs:
|
||||
with os.scandir(dirs.pop()) as entries:
|
||||
for entry in entries:
|
||||
if entry.is_dir(follow_symlinks=False):
|
||||
dirs.append(entry.path)
|
||||
continue
|
||||
|
||||
# Only consider files, not symlinks
|
||||
if not entry.is_file(follow_symlinks=False):
|
||||
continue
|
||||
|
||||
lstat = entry.stat(follow_symlinks=False)
|
||||
|
||||
# Skip over files that are not executable
|
||||
if not (lstat.st_mode & exe):
|
||||
continue
|
||||
|
||||
# Don't modify hardlinks more than once
|
||||
if lstat.st_nlink > 1:
|
||||
key = (lstat.st_ino, lstat.st_dev)
|
||||
if key in hardlinks:
|
||||
continue
|
||||
hardlinks.add(key)
|
||||
|
||||
# Finally replace shebangs if any.
|
||||
with open(entry.path, "rb+") as f:
|
||||
contents = f.read(2)
|
||||
if contents != b"#!":
|
||||
continue
|
||||
contents += f.read()
|
||||
|
||||
if old_interpreter not in contents:
|
||||
continue
|
||||
|
||||
f.seek(0)
|
||||
f.write(contents.replace(old_interpreter, new_interpreter))
|
||||
f.truncate()
|
||||
|
||||
|
||||
@spack.builder.builder("python_pip")
|
||||
class PythonPipBuilder(BaseBuilder):
|
||||
phases = ("install",)
|
||||
@@ -511,36 +464,8 @@ def global_options(self, spec, prefix):
|
||||
"""
|
||||
return []
|
||||
|
||||
@property
|
||||
def _build_venv_path(self):
|
||||
"""Return the path to the virtual environment used for building when
|
||||
python is external."""
|
||||
return os.path.join(self.spec.package.stage.path, "build_env")
|
||||
|
||||
@property
|
||||
def _build_venv_python(self) -> Executable:
|
||||
"""Return the Python executable in the build virtual environment when
|
||||
python is external."""
|
||||
return Executable(os.path.join(self._build_venv_path, "bin", "python"))
|
||||
|
||||
def install(self, pkg, spec, prefix):
|
||||
"""Install everything from build directory."""
|
||||
python: Executable = spec["python"].command
|
||||
# Since we invoke pip with --no-build-isolation, we have to make sure that pip cannot
|
||||
# execute hooks from user and system site-packages.
|
||||
if spec["python"].external:
|
||||
# There are no environment variables to disable the system site-packages, so we use a
|
||||
# virtual environment instead. The downside of this approach is that pip produces
|
||||
# incorrect shebangs that refer to the virtual environment, which we have to fix up.
|
||||
python("-m", "venv", "--without-pip", self._build_venv_path)
|
||||
pip = self._build_venv_python
|
||||
else:
|
||||
# For a Spack managed Python, system site-packages is empty/unused by design, so it
|
||||
# suffices to disable user site-packages, for which there is an environment variable.
|
||||
pip = python
|
||||
pip.add_default_env("PYTHONNOUSERSITE", "1")
|
||||
pip.add_default_arg("-m")
|
||||
pip.add_default_arg("pip")
|
||||
|
||||
args = PythonPipBuilder.std_args(pkg) + [f"--prefix={prefix}"]
|
||||
|
||||
@@ -556,31 +481,15 @@ def install(self, pkg, spec, prefix):
|
||||
else:
|
||||
args.append(".")
|
||||
|
||||
pip = spec["python"].command
|
||||
# Hide user packages, since we don't have build isolation. This is
|
||||
# necessary because pip / setuptools may run hooks from arbitrary
|
||||
# packages during the build. There is no equivalent variable to hide
|
||||
# system packages, so this is not reliable for external Python.
|
||||
pip.add_default_env("PYTHONNOUSERSITE", "1")
|
||||
pip.add_default_arg("-m")
|
||||
pip.add_default_arg("pip")
|
||||
with fs.working_dir(self.build_directory):
|
||||
pip(*args)
|
||||
|
||||
@spack.builder.run_after("install")
|
||||
def fixup_shebangs_pointing_to_build(self):
|
||||
"""When installing a package using an external python, we use a temporary virtual
|
||||
environment which improves build isolation. The downside is that pip produces shebangs
|
||||
that point to the temporary virtual environment. This method fixes them up to point to the
|
||||
underlying Python."""
|
||||
# No need to fixup shebangs if no build venv was used. (this post install function also
|
||||
# runs when install was overridden in another package, so check existence of the venv path)
|
||||
if not os.path.exists(self._build_venv_path):
|
||||
return
|
||||
|
||||
# Use sys.executable, since that's what pip uses.
|
||||
interpreter = (
|
||||
lambda python: python("-c", "import sys; print(sys.executable)", output=str)
|
||||
.strip()
|
||||
.encode("utf-8")
|
||||
)
|
||||
|
||||
fixup_shebangs(
|
||||
path=self.spec.prefix,
|
||||
old_interpreter=interpreter(self._build_venv_python),
|
||||
new_interpreter=interpreter(self.spec["python"].command),
|
||||
)
|
||||
|
||||
spack.builder.run_after("install")(execute_install_time_tests)
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
import llnl.util.filesystem as fs
|
||||
import llnl.util.tty as tty
|
||||
from llnl.util.lang import memoized
|
||||
from llnl.util.tty.color import cescape, colorize
|
||||
|
||||
import spack
|
||||
import spack.binary_distribution as bindist
|
||||
@@ -97,15 +98,6 @@ def _remove_reserved_tags(tags):
|
||||
return [tag for tag in tags if tag not in SPACK_RESERVED_TAGS]
|
||||
|
||||
|
||||
def _get_spec_string(spec):
|
||||
format_elements = ["{name}{@version}", "{%compiler}"]
|
||||
|
||||
if spec.architecture:
|
||||
format_elements.append(" {arch=architecture}")
|
||||
|
||||
return spec.format("".join(format_elements))
|
||||
|
||||
|
||||
def _spec_deps_key(s):
|
||||
return "{0}/{1}".format(s.name, s.dag_hash(7))
|
||||
|
||||
@@ -210,22 +202,22 @@ def _print_staging_summary(spec_labels, stages, mirrors_to_check, rebuild_decisi
|
||||
|
||||
tty.msg("Staging summary ([x] means a job needs rebuilding):")
|
||||
for stage_index, stage in enumerate(stages):
|
||||
tty.msg(" stage {0} ({1} jobs):".format(stage_index, len(stage)))
|
||||
tty.msg(f" stage {stage_index} ({len(stage)} jobs):")
|
||||
|
||||
for job in sorted(stage):
|
||||
for job in sorted(stage, key=lambda j: (not rebuild_decisions[j].rebuild, j)):
|
||||
s = spec_labels[job]
|
||||
rebuild = rebuild_decisions[job].rebuild
|
||||
reason = rebuild_decisions[job].reason
|
||||
reason_msg = " ({0})".format(reason) if reason else ""
|
||||
tty.msg(
|
||||
" [{1}] {0} -> {2}{3}".format(
|
||||
job, "x" if rebuild else " ", _get_spec_string(s), reason_msg
|
||||
)
|
||||
)
|
||||
if rebuild_decisions[job].mirrors:
|
||||
tty.msg(" found on the following mirrors:")
|
||||
for murl in rebuild_decisions[job].mirrors:
|
||||
tty.msg(" {0}".format(murl))
|
||||
reason_msg = f" ({reason})" if reason else ""
|
||||
spec_fmt = "{name}{@version}{%compiler}{/hash:7}"
|
||||
if rebuild_decisions[job].rebuild:
|
||||
status = colorize("@*g{[x]} ")
|
||||
msg = f" {status}{s.cformat(spec_fmt)}{reason_msg}"
|
||||
else:
|
||||
msg = f"{s.format(spec_fmt)}{reason_msg}"
|
||||
if rebuild_decisions[job].mirrors:
|
||||
msg += f" [{', '.join(rebuild_decisions[job].mirrors)}]"
|
||||
msg = colorize(f" @K - {cescape(msg)}@.")
|
||||
tty.msg(msg)
|
||||
|
||||
|
||||
def _compute_spec_deps(spec_list):
|
||||
@@ -932,7 +924,7 @@ def generate_gitlab_ci_yaml(
|
||||
|
||||
# Speed up staging by first fetching binary indices from all mirrors
|
||||
try:
|
||||
bindist.binary_index.update()
|
||||
bindist.BINARY_INDEX.update()
|
||||
except bindist.FetchCacheError as e:
|
||||
tty.warn(e)
|
||||
|
||||
@@ -2258,13 +2250,13 @@ def build_name(self):
|
||||
spec.architecture,
|
||||
self.build_group,
|
||||
)
|
||||
tty.verbose(
|
||||
tty.debug(
|
||||
"Generated CDash build name ({0}) from the {1}".format(build_name, spec.name)
|
||||
)
|
||||
return build_name
|
||||
|
||||
build_name = os.environ.get("SPACK_CDASH_BUILD_NAME")
|
||||
tty.verbose("Using CDash build name ({0}) from the environment".format(build_name))
|
||||
tty.debug("Using CDash build name ({0}) from the environment".format(build_name))
|
||||
return build_name
|
||||
|
||||
@property # type: ignore
|
||||
@@ -2278,11 +2270,11 @@ def build_stamp(self):
|
||||
Returns: (str) current CDash build stamp"""
|
||||
build_stamp = os.environ.get("SPACK_CDASH_BUILD_STAMP")
|
||||
if build_stamp:
|
||||
tty.verbose("Using build stamp ({0}) from the environment".format(build_stamp))
|
||||
tty.debug("Using build stamp ({0}) from the environment".format(build_stamp))
|
||||
return build_stamp
|
||||
|
||||
build_stamp = cdash_build_stamp(self.build_group, time.time())
|
||||
tty.verbose("Generated new build stamp ({0})".format(build_stamp))
|
||||
tty.debug("Generated new build stamp ({0})".format(build_stamp))
|
||||
return build_stamp
|
||||
|
||||
@property # type: ignore
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
|
||||
@@ -67,11 +66,18 @@ def setup_parser(subparser):
|
||||
modes_parser.add_argument(
|
||||
"--verify", action="store_true", default=False, help="verify known package checksums"
|
||||
)
|
||||
subparser.add_argument("package", help="package or spec. for example cmake or cmake@3.18")
|
||||
subparser.add_argument("package", help="name or spec (e.g. `cmake` or `cmake@3.18`)")
|
||||
subparser.add_argument(
|
||||
"versions", nargs=argparse.REMAINDER, help="versions to generate checksums for"
|
||||
"versions",
|
||||
nargs="*",
|
||||
help="checksum these specific versions (if omitted, Spack searches for remote versions)",
|
||||
)
|
||||
arguments.add_common_arguments(subparser, ["jobs"])
|
||||
subparser.epilog = (
|
||||
"examples:\n"
|
||||
" `spack checksum zlib@1.2` autodetects versions 1.2.0 to 1.2.13 from the remote\n"
|
||||
" `spack checksum zlib 1.2.13` checksums exact version 1.2.13 directly without search\n"
|
||||
)
|
||||
|
||||
|
||||
def checksum(parser, args):
|
||||
|
||||
@@ -64,6 +64,7 @@ class {class_name}({base_class_name}):
|
||||
# maintainers("github_user1", "github_user2")
|
||||
|
||||
# FIXME: Add the SPDX identifier of the project's license below.
|
||||
# See https://spdx.org/licenses/ for a list.
|
||||
license("UNKNOWN")
|
||||
|
||||
{versions}
|
||||
|
||||
@@ -380,28 +380,33 @@ def env_remove(args):
|
||||
and manifests embedded in repositories should be removed manually.
|
||||
"""
|
||||
read_envs = []
|
||||
bad_envs = []
|
||||
for env_name in args.rm_env:
|
||||
env = ev.read(env_name)
|
||||
read_envs.append(env)
|
||||
try:
|
||||
env = ev.read(env_name)
|
||||
read_envs.append(env)
|
||||
except spack.config.ConfigFormatError:
|
||||
bad_envs.append(env_name)
|
||||
|
||||
if not args.yes_to_all:
|
||||
answer = tty.get_yes_or_no(
|
||||
"Really remove %s %s?"
|
||||
% (
|
||||
string.plural(len(args.rm_env), "environment", show_n=False),
|
||||
string.comma_and(args.rm_env),
|
||||
),
|
||||
default=False,
|
||||
)
|
||||
environments = string.plural(len(args.rm_env), "environment", show_n=False)
|
||||
envs = string.comma_and(args.rm_env)
|
||||
answer = tty.get_yes_or_no(f"Really remove {environments} {envs}?", default=False)
|
||||
if not answer:
|
||||
tty.die("Will not remove any environments")
|
||||
|
||||
for env in read_envs:
|
||||
name = env.name
|
||||
if env.active:
|
||||
tty.die("Environment %s can't be removed while activated." % env.name)
|
||||
|
||||
tty.die(f"Environment {name} can't be removed while activated.")
|
||||
env.destroy()
|
||||
tty.msg("Successfully removed environment '%s'" % env.name)
|
||||
tty.msg(f"Successfully removed environment '{name}'")
|
||||
|
||||
for bad_env_name in bad_envs:
|
||||
shutil.rmtree(
|
||||
spack.environment.environment.environment_dir_from_name(bad_env_name, exists_ok=True)
|
||||
)
|
||||
tty.msg(f"Successfully removed environment '{bad_env_name}'")
|
||||
|
||||
|
||||
#
|
||||
@@ -667,18 +672,31 @@ def env_depfile(args):
|
||||
# Currently only make is supported.
|
||||
spack.cmd.require_active_env(cmd_name="env depfile")
|
||||
|
||||
env = ev.active_environment()
|
||||
|
||||
# What things do we build when running make? By default, we build the
|
||||
# root specs. If specific specs are provided as input, we build those.
|
||||
filter_specs = spack.cmd.parse_specs(args.specs) if args.specs else None
|
||||
template = spack.tengine.make_environment().get_template(os.path.join("depfile", "Makefile"))
|
||||
model = depfile.MakefileModel.from_env(
|
||||
ev.active_environment(),
|
||||
env,
|
||||
filter_specs=filter_specs,
|
||||
pkg_buildcache=depfile.UseBuildCache.from_string(args.use_buildcache[0]),
|
||||
dep_buildcache=depfile.UseBuildCache.from_string(args.use_buildcache[1]),
|
||||
make_prefix=args.make_prefix,
|
||||
jobserver=args.jobserver,
|
||||
)
|
||||
|
||||
# Warn in case we're generating a depfile for an empty environment. We don't automatically
|
||||
# concretize; the user should do that explicitly. Could be changed in the future if requested.
|
||||
if model.empty:
|
||||
if not env.user_specs:
|
||||
tty.warn("no specs in the environment")
|
||||
elif filter_specs is not None:
|
||||
tty.warn("no concrete matching specs found in environment")
|
||||
else:
|
||||
tty.warn("environment is not concretized. Run `spack concretize` first")
|
||||
|
||||
makefile = template.render(model.to_dict())
|
||||
|
||||
# Finally write to stdout/file.
|
||||
|
||||
@@ -15,9 +15,12 @@
|
||||
from typing import Dict, List, Optional, Set, Tuple
|
||||
|
||||
import llnl.util.filesystem
|
||||
import llnl.util.lang
|
||||
import llnl.util.tty
|
||||
|
||||
import spack.util.elf as elf_utils
|
||||
import spack.util.environment
|
||||
import spack.util.environment as environment
|
||||
import spack.util.ld_so_conf
|
||||
|
||||
from .common import (
|
||||
@@ -57,6 +60,11 @@ def common_windows_package_paths(pkg_cls=None) -> List[str]:
|
||||
return paths
|
||||
|
||||
|
||||
def file_identifier(path):
|
||||
s = os.stat(path)
|
||||
return (s.st_dev, s.st_ino)
|
||||
|
||||
|
||||
def executables_in_path(path_hints: List[str]) -> Dict[str, str]:
|
||||
"""Get the paths of all executables available from the current PATH.
|
||||
|
||||
@@ -75,12 +83,40 @@ def executables_in_path(path_hints: List[str]) -> Dict[str, str]:
|
||||
return path_to_dict(search_paths)
|
||||
|
||||
|
||||
def get_elf_compat(path):
|
||||
"""For ELF files, get a triplet (EI_CLASS, EI_DATA, e_machine) and see if
|
||||
it is host-compatible."""
|
||||
# On ELF platforms supporting, we try to be a bit smarter when it comes to shared
|
||||
# libraries, by dropping those that are not host compatible.
|
||||
with open(path, "rb") as f:
|
||||
elf = elf_utils.parse_elf(f, only_header=True)
|
||||
return (elf.is_64_bit, elf.is_little_endian, elf.elf_hdr.e_machine)
|
||||
|
||||
|
||||
def accept_elf(path, host_compat):
|
||||
"""Accept an ELF file if the header matches the given compat triplet,
|
||||
obtained with :py:func:`get_elf_compat`. In case it's not an ELF (e.g.
|
||||
static library, or some arbitrary file, fall back to is_readable_file)."""
|
||||
# Fast path: assume libraries at least have .so in their basename.
|
||||
# Note: don't replace with splitext, because of libsmth.so.1.2.3 file names.
|
||||
if ".so" not in os.path.basename(path):
|
||||
return llnl.util.filesystem.is_readable_file(path)
|
||||
try:
|
||||
return host_compat == get_elf_compat(path)
|
||||
except (OSError, elf_utils.ElfParsingError):
|
||||
return llnl.util.filesystem.is_readable_file(path)
|
||||
|
||||
|
||||
def libraries_in_ld_and_system_library_path(
|
||||
path_hints: Optional[List[str]] = None,
|
||||
) -> Dict[str, str]:
|
||||
"""Get the paths of all libraries available from LD_LIBRARY_PATH,
|
||||
LIBRARY_PATH, DYLD_LIBRARY_PATH, DYLD_FALLBACK_LIBRARY_PATH, and
|
||||
standard system library paths.
|
||||
"""Get the paths of all libraries available from ``path_hints`` or the
|
||||
following defaults:
|
||||
|
||||
- Environment variables (Linux: ``LD_LIBRARY_PATH``, Darwin: ``DYLD_LIBRARY_PATH``,
|
||||
and ``DYLD_FALLBACK_LIBRARY_PATH``)
|
||||
- Dynamic linker default paths (glibc: ld.so.conf, musl: ld-musl-<arch>.path)
|
||||
- Default system library paths.
|
||||
|
||||
For convenience, this is constructed as a dictionary where the keys are
|
||||
the library paths and the values are the names of the libraries
|
||||
@@ -94,17 +130,45 @@ def libraries_in_ld_and_system_library_path(
|
||||
constructed based on the set of LD_LIBRARY_PATH, LIBRARY_PATH,
|
||||
DYLD_LIBRARY_PATH, and DYLD_FALLBACK_LIBRARY_PATH environment
|
||||
variables as well as the standard system library paths.
|
||||
path_hints (list): list of paths to be searched. If ``None``, the default
|
||||
system paths are used.
|
||||
"""
|
||||
default_lib_search_paths = (
|
||||
spack.util.environment.get_path("LD_LIBRARY_PATH")
|
||||
+ spack.util.environment.get_path("DYLD_LIBRARY_PATH")
|
||||
+ spack.util.environment.get_path("DYLD_FALLBACK_LIBRARY_PATH")
|
||||
+ spack.util.ld_so_conf.host_dynamic_linker_search_paths()
|
||||
)
|
||||
path_hints = path_hints if path_hints is not None else default_lib_search_paths
|
||||
if path_hints:
|
||||
search_paths = llnl.util.filesystem.search_paths_for_libraries(*path_hints)
|
||||
else:
|
||||
search_paths = []
|
||||
|
||||
search_paths = llnl.util.filesystem.search_paths_for_libraries(*path_hints)
|
||||
return path_to_dict(search_paths)
|
||||
# Environment variables
|
||||
if sys.platform == "darwin":
|
||||
search_paths.extend(environment.get_path("DYLD_LIBRARY_PATH"))
|
||||
search_paths.extend(environment.get_path("DYLD_FALLBACK_LIBRARY_PATH"))
|
||||
elif sys.platform.startswith("linux"):
|
||||
search_paths.extend(environment.get_path("LD_LIBRARY_PATH"))
|
||||
|
||||
# Dynamic linker paths
|
||||
search_paths.extend(spack.util.ld_so_conf.host_dynamic_linker_search_paths())
|
||||
|
||||
# Drop redundant paths
|
||||
search_paths = list(filter(os.path.isdir, search_paths))
|
||||
|
||||
# Make use we don't doubly list /usr/lib and /lib etc
|
||||
search_paths = list(llnl.util.lang.dedupe(search_paths, key=file_identifier))
|
||||
|
||||
try:
|
||||
host_compat = get_elf_compat(sys.executable)
|
||||
accept = lambda path: accept_elf(path, host_compat)
|
||||
except (OSError, elf_utils.ElfParsingError):
|
||||
accept = llnl.util.filesystem.is_readable_file
|
||||
|
||||
path_to_lib = {}
|
||||
# Reverse order of search directories so that a lib in the first
|
||||
# search path entry overrides later entries
|
||||
for search_path in reversed(search_paths):
|
||||
for lib in os.listdir(search_path):
|
||||
lib_path = os.path.join(search_path, lib)
|
||||
if accept(lib_path):
|
||||
path_to_lib[lib_path] = lib
|
||||
return path_to_lib
|
||||
|
||||
|
||||
def libraries_in_windows_paths(path_hints: Optional[List[str]] = None) -> Dict[str, str]:
|
||||
|
||||
@@ -573,17 +573,21 @@ def _execute_extends(pkg):
|
||||
return _execute_extends
|
||||
|
||||
|
||||
@directive("provided")
|
||||
def provides(*specs, **kwargs):
|
||||
"""Allows packages to provide a virtual dependency. If a package provides
|
||||
'mpi', other packages can declare that they depend on "mpi", and spack
|
||||
can use the providing package to satisfy the dependency.
|
||||
@directive(dicts=("provided", "provided_together"))
|
||||
def provides(*specs, when: Optional[str] = None):
|
||||
"""Allows packages to provide a virtual dependency.
|
||||
|
||||
If a package provides "mpi", other packages can declare that they depend on "mpi",
|
||||
and spack can use the providing package to satisfy the dependency.
|
||||
|
||||
Args:
|
||||
*specs: virtual specs provided by this package
|
||||
when: condition when this provides clause needs to be considered
|
||||
"""
|
||||
|
||||
def _execute_provides(pkg):
|
||||
import spack.parser # Avoid circular dependency
|
||||
|
||||
when = kwargs.get("when")
|
||||
when_spec = make_when_spec(when)
|
||||
if not when_spec:
|
||||
return
|
||||
@@ -591,15 +595,18 @@ def _execute_provides(pkg):
|
||||
# ``when`` specs for ``provides()`` need a name, as they are used
|
||||
# to build the ProviderIndex.
|
||||
when_spec.name = pkg.name
|
||||
spec_objs = [spack.spec.Spec(x) for x in specs]
|
||||
spec_names = [x.name for x in spec_objs]
|
||||
if len(spec_names) > 1:
|
||||
pkg.provided_together.setdefault(when_spec, []).append(set(spec_names))
|
||||
|
||||
for string in specs:
|
||||
for provided_spec in spack.parser.parse(string):
|
||||
if pkg.name == provided_spec.name:
|
||||
raise CircularReferenceError("Package '%s' cannot provide itself." % pkg.name)
|
||||
for provided_spec in spec_objs:
|
||||
if pkg.name == provided_spec.name:
|
||||
raise CircularReferenceError("Package '%s' cannot provide itself." % pkg.name)
|
||||
|
||||
if provided_spec not in pkg.provided:
|
||||
pkg.provided[provided_spec] = set()
|
||||
pkg.provided[provided_spec].add(when_spec)
|
||||
if provided_spec not in pkg.provided:
|
||||
pkg.provided[provided_spec] = set()
|
||||
pkg.provided[provided_spec].add(when_spec)
|
||||
|
||||
return _execute_provides
|
||||
|
||||
|
||||
@@ -232,6 +232,10 @@ def to_dict(self):
|
||||
"pkg_ids": " ".join(self.all_pkg_identifiers),
|
||||
}
|
||||
|
||||
@property
|
||||
def empty(self):
|
||||
return len(self.roots) == 0
|
||||
|
||||
@staticmethod
|
||||
def from_env(
|
||||
env: ev.Environment,
|
||||
@@ -254,15 +258,10 @@ def from_env(
|
||||
jobserver: when enabled, make will invoke Spack with jobserver support. For
|
||||
dry-run this should be disabled.
|
||||
"""
|
||||
# If no specs are provided as a filter, build all the specs in the environment.
|
||||
if filter_specs:
|
||||
entrypoints = [env.matching_spec(s) for s in filter_specs]
|
||||
else:
|
||||
entrypoints = [s for _, s in env.concretized_specs()]
|
||||
|
||||
roots = env.all_matching_specs(*filter_specs) if filter_specs else env.concrete_roots()
|
||||
visitor = DepfileSpecVisitor(pkg_buildcache, dep_buildcache)
|
||||
traverse.traverse_breadth_first_with_visitor(
|
||||
entrypoints, traverse.CoverNodesVisitor(visitor, key=lambda s: s.dag_hash())
|
||||
roots, traverse.CoverNodesVisitor(visitor, key=lambda s: s.dag_hash())
|
||||
)
|
||||
|
||||
return MakefileModel(env, entrypoints, visitor.adjacency_list, make_prefix, jobserver)
|
||||
return MakefileModel(env, roots, visitor.adjacency_list, make_prefix, jobserver)
|
||||
|
||||
@@ -330,16 +330,21 @@ def create_in_dir(
|
||||
if with_view is None and keep_relative:
|
||||
return Environment(manifest_dir)
|
||||
|
||||
manifest = EnvironmentManifestFile(manifest_dir)
|
||||
try:
|
||||
manifest = EnvironmentManifestFile(manifest_dir)
|
||||
|
||||
if with_view is not None:
|
||||
manifest.set_default_view(with_view)
|
||||
if with_view is not None:
|
||||
manifest.set_default_view(with_view)
|
||||
|
||||
if not keep_relative and init_file is not None and str(init_file).endswith(manifest_name):
|
||||
init_file = pathlib.Path(init_file)
|
||||
manifest.absolutify_dev_paths(init_file.parent)
|
||||
if not keep_relative and init_file is not None and str(init_file).endswith(manifest_name):
|
||||
init_file = pathlib.Path(init_file)
|
||||
manifest.absolutify_dev_paths(init_file.parent)
|
||||
|
||||
manifest.flush()
|
||||
manifest.flush()
|
||||
|
||||
except spack.config.ConfigFormatError as e:
|
||||
shutil.rmtree(manifest_dir)
|
||||
raise e
|
||||
|
||||
return Environment(manifest_dir)
|
||||
|
||||
@@ -1484,7 +1489,7 @@ def _concretize_separately(self, tests=False):
|
||||
for uspec, uspec_constraints in zip(self.user_specs, self.user_specs.specs_as_constraints):
|
||||
if uspec not in old_concretized_user_specs:
|
||||
root_specs.append(uspec)
|
||||
args.append((i, uspec_constraints, tests))
|
||||
args.append((i, [str(x) for x in uspec_constraints], tests))
|
||||
i += 1
|
||||
|
||||
# Ensure we don't try to bootstrap clingo in parallel
|
||||
@@ -1525,7 +1530,10 @@ def _concretize_separately(self, tests=False):
|
||||
):
|
||||
batch.append((i, concrete))
|
||||
percentage = (j + 1) / len(args) * 100
|
||||
tty.verbose(f"{duration:6.1f}s [{percentage:3.0f}%] {root_specs[i]}")
|
||||
tty.verbose(
|
||||
f"{duration:6.1f}s [{percentage:3.0f}%] {concrete.cformat('{hash:7}')} "
|
||||
f"{root_specs[i].colored_str}"
|
||||
)
|
||||
sys.stdout.flush()
|
||||
|
||||
# Add specs in original order
|
||||
@@ -2400,6 +2408,7 @@ def _concretize_from_constraints(spec_constraints, tests=False):
|
||||
|
||||
def _concretize_task(packed_arguments) -> Tuple[int, Spec, float]:
|
||||
index, spec_constraints, tests = packed_arguments
|
||||
spec_constraints = [Spec(x) for x in spec_constraints]
|
||||
with tty.SuppressOutput(msg_enabled=False):
|
||||
start = time.time()
|
||||
spec = _concretize_from_constraints(spec_constraints, tests)
|
||||
|
||||
@@ -773,8 +773,7 @@ def git(self):
|
||||
# Disable advice for a quieter fetch
|
||||
# https://github.com/git/git/blob/master/Documentation/RelNotes/1.7.2.txt
|
||||
if self.git_version >= spack.version.Version("1.7.2"):
|
||||
self._git.add_default_arg("-c")
|
||||
self._git.add_default_arg("advice.detachedHead=false")
|
||||
self._git.add_default_arg("-c", "advice.detachedHead=false")
|
||||
|
||||
# If the user asked for insecure fetching, make that work
|
||||
# with git as well.
|
||||
|
||||
@@ -528,10 +528,15 @@ def node_entry(self, node):
|
||||
|
||||
def edge_entry(self, edge):
|
||||
colormap = {"build": "dodgerblue", "link": "crimson", "run": "goldenrod"}
|
||||
label = ""
|
||||
if edge.virtuals:
|
||||
label = f" xlabel=\"virtuals={','.join(edge.virtuals)}\""
|
||||
return (
|
||||
edge.parent.dag_hash(),
|
||||
edge.spec.dag_hash(),
|
||||
f"[color=\"{':'.join(colormap[x] for x in dt.flag_to_tuple(edge.depflag))}\"]",
|
||||
f"[color=\"{':'.join(colormap[x] for x in dt.flag_to_tuple(edge.depflag))}\""
|
||||
+ label
|
||||
+ "]",
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -9,8 +9,10 @@
|
||||
|
||||
import spack.spec
|
||||
|
||||
# all the building blocks
|
||||
alphanumeric = r"[a-z0-9]+"
|
||||
# notice: Docker is more strict (no uppercase allowed). We parse image names *with* uppercase
|
||||
# and normalize, so: example.com/Organization/Name -> example.com/organization/name. Tags are
|
||||
# case sensitive though.
|
||||
alphanumeric_with_uppercase = r"[a-zA-Z0-9]+"
|
||||
separator = r"(?:[._]|__|[-]+)"
|
||||
localhost = r"localhost"
|
||||
domainNameComponent = r"(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])"
|
||||
@@ -25,7 +27,7 @@
|
||||
domainAndPort = rf"{host}{optionalPort}"
|
||||
|
||||
# image name
|
||||
pathComponent = rf"{alphanumeric}(?:{separator}{alphanumeric})*"
|
||||
pathComponent = rf"{alphanumeric_with_uppercase}(?:{separator}{alphanumeric_with_uppercase})*"
|
||||
remoteName = rf"{pathComponent}(?:\/{pathComponent})*"
|
||||
namePat = rf"(?:{domainAndPort}\/)?{remoteName}"
|
||||
|
||||
@@ -130,6 +132,11 @@ def from_string(cls, string) -> "ImageReference":
|
||||
name = f"{domain}/{name}"
|
||||
domain = "index.docker.io"
|
||||
|
||||
# Lowercase the image name. This is enforced by Docker, although the OCI spec isn't clear?
|
||||
# We do this anyways, cause for example in Github Actions the <organization>/<repository>
|
||||
# part can have uppercase, and may be interpolated when specifying the relevant OCI image.
|
||||
name = name.lower()
|
||||
|
||||
if not tag:
|
||||
tag = "latest"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
Here is the EBNF grammar for a spec::
|
||||
|
||||
spec = [name] [node_options] { ^ node } |
|
||||
spec = [name] [node_options] { ^[edge_properties] node } |
|
||||
[name] [node_options] hash |
|
||||
filename
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
[name] [node_options] hash |
|
||||
filename
|
||||
|
||||
node_options = [@(version_list|version_pair)] [%compiler] { variant }
|
||||
node_options = [@(version_list|version_pair)] [%compiler] { variant }
|
||||
edge_properties = [ { bool_variant | key_value } ]
|
||||
|
||||
hash = / id
|
||||
filename = (.|/|[a-zA-Z0-9-_]*/)([a-zA-Z0-9-_./]*)(.json|.yaml)
|
||||
@@ -64,6 +65,7 @@
|
||||
|
||||
from llnl.util.tty import color
|
||||
|
||||
import spack.deptypes
|
||||
import spack.error
|
||||
import spack.spec
|
||||
import spack.version
|
||||
@@ -96,9 +98,9 @@
|
||||
VALUE = r"(?:[a-zA-Z_0-9\-+\*.,:=\~\/\\]+)"
|
||||
QUOTED_VALUE = r"[\"']+(?:[a-zA-Z_0-9\-+\*.,:=\~\/\\\s]+)[\"']+"
|
||||
|
||||
VERSION = r"=?([a-zA-Z0-9_][a-zA-Z_0-9\-\.]*\b)"
|
||||
VERSION_RANGE = rf"({VERSION}\s*:\s*{VERSION}(?!\s*=)|:\s*{VERSION}(?!\s*=)|{VERSION}\s*:|:)"
|
||||
VERSION_LIST = rf"({VERSION_RANGE}|{VERSION})(\s*[,]\s*({VERSION_RANGE}|{VERSION}))*"
|
||||
VERSION = r"=?(?:[a-zA-Z0-9_][a-zA-Z_0-9\-\.]*\b)"
|
||||
VERSION_RANGE = rf"(?:(?:{VERSION})?:(?:{VERSION}(?!\s*=))?)"
|
||||
VERSION_LIST = rf"(?:{VERSION_RANGE}|{VERSION})(?:\s*,\s*(?:{VERSION_RANGE}|{VERSION}))*"
|
||||
|
||||
|
||||
class TokenBase(enum.Enum):
|
||||
@@ -126,6 +128,8 @@ class TokenType(TokenBase):
|
||||
"""
|
||||
|
||||
# Dependency
|
||||
START_EDGE_PROPERTIES = r"(?:\^\[)"
|
||||
END_EDGE_PROPERTIES = r"(?:\])"
|
||||
DEPENDENCY = r"(?:\^)"
|
||||
# Version
|
||||
VERSION_HASH_PAIR = rf"(?:@(?:{GIT_VERSION_PATTERN})=(?:{VERSION}))"
|
||||
@@ -280,16 +284,15 @@ def next_spec(
|
||||
initial_spec = initial_spec or spack.spec.Spec()
|
||||
root_spec = SpecNodeParser(self.ctx).parse(initial_spec)
|
||||
while True:
|
||||
if self.ctx.accept(TokenType.DEPENDENCY):
|
||||
dependency = SpecNodeParser(self.ctx).parse()
|
||||
|
||||
if dependency is None:
|
||||
msg = (
|
||||
"this dependency sigil needs to be followed by a package name "
|
||||
"or a node attribute (version, variant, etc.)"
|
||||
)
|
||||
raise SpecParsingError(msg, self.ctx.current_token, self.literal_str)
|
||||
if self.ctx.accept(TokenType.START_EDGE_PROPERTIES):
|
||||
edge_properties = EdgeAttributeParser(self.ctx, self.literal_str).parse()
|
||||
edge_properties.setdefault("depflag", 0)
|
||||
edge_properties.setdefault("virtuals", ())
|
||||
dependency = self._parse_node(root_spec)
|
||||
root_spec._add_dependency(dependency, **edge_properties)
|
||||
|
||||
elif self.ctx.accept(TokenType.DEPENDENCY):
|
||||
dependency = self._parse_node(root_spec)
|
||||
root_spec._add_dependency(dependency, depflag=0, virtuals=())
|
||||
|
||||
else:
|
||||
@@ -297,6 +300,18 @@ def next_spec(
|
||||
|
||||
return root_spec
|
||||
|
||||
def _parse_node(self, root_spec):
|
||||
dependency = SpecNodeParser(self.ctx).parse()
|
||||
if dependency is None:
|
||||
msg = (
|
||||
"the dependency sigil and any optional edge attributes must be followed by a "
|
||||
"package name or a node attribute (version, variant, etc.)"
|
||||
)
|
||||
raise SpecParsingError(msg, self.ctx.current_token, self.literal_str)
|
||||
if root_spec.concrete:
|
||||
raise spack.spec.RedundantSpecError(root_spec, "^" + str(dependency))
|
||||
return dependency
|
||||
|
||||
def all_specs(self) -> List["spack.spec.Spec"]:
|
||||
"""Return all the specs that remain to be parsed"""
|
||||
return list(iter(self.next_spec, None))
|
||||
@@ -438,6 +453,41 @@ def parse(self, initial_spec: "spack.spec.Spec") -> "spack.spec.Spec":
|
||||
return initial_spec
|
||||
|
||||
|
||||
class EdgeAttributeParser:
|
||||
__slots__ = "ctx", "literal_str"
|
||||
|
||||
def __init__(self, ctx, literal_str):
|
||||
self.ctx = ctx
|
||||
self.literal_str = literal_str
|
||||
|
||||
def parse(self):
|
||||
attributes = {}
|
||||
while True:
|
||||
if self.ctx.accept(TokenType.KEY_VALUE_PAIR):
|
||||
name, value = self.ctx.current_token.value.split("=", maxsplit=1)
|
||||
name = name.strip("'\" ")
|
||||
value = value.strip("'\" ").split(",")
|
||||
attributes[name] = value
|
||||
if name not in ("deptypes", "virtuals"):
|
||||
msg = (
|
||||
"the only edge attributes that are currently accepted "
|
||||
'are "deptypes" and "virtuals"'
|
||||
)
|
||||
raise SpecParsingError(msg, self.ctx.current_token, self.literal_str)
|
||||
# TODO: Add code to accept bool variants here as soon as use variants are implemented
|
||||
elif self.ctx.accept(TokenType.END_EDGE_PROPERTIES):
|
||||
break
|
||||
else:
|
||||
msg = "unexpected token in edge attributes"
|
||||
raise SpecParsingError(msg, self.ctx.next_token, self.literal_str)
|
||||
|
||||
# Turn deptypes=... to depflag representation
|
||||
if "deptypes" in attributes:
|
||||
deptype_string = attributes.pop("deptypes")
|
||||
attributes["depflag"] = spack.deptypes.canonicalize(deptype_string)
|
||||
return attributes
|
||||
|
||||
|
||||
def parse(text: str) -> List["spack.spec.Spec"]:
|
||||
"""Parse text into a list of strings
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
"""Classes and functions to manage providers of virtual dependencies"""
|
||||
import itertools
|
||||
from typing import Dict, List, Optional, Set
|
||||
|
||||
import spack.error
|
||||
@@ -11,33 +10,6 @@
|
||||
import spack.util.spack_json as sjson
|
||||
|
||||
|
||||
def _cross_provider_maps(lmap, rmap):
|
||||
"""Return a dictionary that combines constraint requests from both input.
|
||||
|
||||
Args:
|
||||
lmap: main provider map
|
||||
rmap: provider map with additional constraints
|
||||
"""
|
||||
# TODO: this is pretty darned nasty, and inefficient, but there
|
||||
# TODO: are not that many vdeps in most specs.
|
||||
result = {}
|
||||
for lspec, rspec in itertools.product(lmap, rmap):
|
||||
try:
|
||||
constrained = lspec.constrained(rspec)
|
||||
except spack.error.UnsatisfiableSpecError:
|
||||
continue
|
||||
|
||||
# lp and rp are left and right provider specs.
|
||||
for lp_spec, rp_spec in itertools.product(lmap[lspec], rmap[rspec]):
|
||||
if lp_spec.name == rp_spec.name:
|
||||
try:
|
||||
const = lp_spec.constrained(rp_spec, deps=False)
|
||||
result.setdefault(constrained, set()).add(const)
|
||||
except spack.error.UnsatisfiableSpecError:
|
||||
continue
|
||||
return result
|
||||
|
||||
|
||||
class _IndexBase:
|
||||
#: This is a dict of dicts used for finding providers of particular
|
||||
#: virtual dependencies. The dict of dicts looks like:
|
||||
@@ -81,29 +53,6 @@ def providers_for(self, virtual_spec):
|
||||
def __contains__(self, name):
|
||||
return name in self.providers
|
||||
|
||||
def satisfies(self, other):
|
||||
"""Determine if the providers of virtual specs are compatible.
|
||||
|
||||
Args:
|
||||
other: another provider index
|
||||
|
||||
Returns:
|
||||
True if the providers are compatible, False otherwise.
|
||||
"""
|
||||
common = set(self.providers) & set(other.providers)
|
||||
if not common:
|
||||
return True
|
||||
|
||||
# This ensures that some provider in other COULD satisfy the
|
||||
# vpkg constraints on self.
|
||||
result = {}
|
||||
for name in common:
|
||||
crossed = _cross_provider_maps(self.providers[name], other.providers[name])
|
||||
if crossed:
|
||||
result[name] = crossed
|
||||
|
||||
return all(c in result for c in common)
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.providers == other.providers
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
import enum
|
||||
import itertools
|
||||
import os
|
||||
import pathlib
|
||||
import pprint
|
||||
import re
|
||||
import types
|
||||
@@ -889,14 +888,6 @@ def on_model(model):
|
||||
|
||||
timer.start("solve")
|
||||
solve_result = self.control.solve(**solve_kwargs)
|
||||
|
||||
if solve_result.satisfiable and self._model_has_cycles(models):
|
||||
tty.debug(f"cycles detected, falling back to slower algorithm [specs={specs}]")
|
||||
self.control.load(os.path.join(parent_dir, "cycle_detection.lp"))
|
||||
self.control.ground([("no_cycle", [])])
|
||||
models.clear()
|
||||
solve_result = self.control.solve(**solve_kwargs)
|
||||
|
||||
timer.stop("solve")
|
||||
|
||||
# once done, construct the solve result
|
||||
@@ -950,26 +941,6 @@ def on_model(model):
|
||||
|
||||
return result, timer, self.control.statistics
|
||||
|
||||
def _model_has_cycles(self, models):
|
||||
"""Returns true if the best model has cycles in it"""
|
||||
cycle_detection = clingo.Control()
|
||||
parent_dir = pathlib.Path(__file__).parent
|
||||
lp_file = parent_dir / "cycle_detection.lp"
|
||||
|
||||
min_cost, best_model = min(models)
|
||||
with cycle_detection.backend() as backend:
|
||||
for atom in best_model:
|
||||
if atom.name == "attr" and str(atom.arguments[0]) == '"depends_on"':
|
||||
symbol = fn.depends_on(atom.arguments[1], atom.arguments[2])
|
||||
atom_id = backend.add_atom(symbol.symbol())
|
||||
backend.add_rule([atom_id], [], choice=False)
|
||||
|
||||
cycle_detection.load(str(lp_file))
|
||||
cycle_detection.ground([("base", []), ("no_cycle", [])])
|
||||
cycle_result = cycle_detection.solve()
|
||||
|
||||
return cycle_result.unsatisfiable
|
||||
|
||||
|
||||
class ConcreteSpecsByHash(collections.abc.Mapping):
|
||||
"""Mapping containing concrete specs keyed by DAG hash.
|
||||
@@ -1530,6 +1501,17 @@ def package_provider_rules(self, pkg):
|
||||
)
|
||||
self.gen.newline()
|
||||
|
||||
for when, sets_of_virtuals in pkg.provided_together.items():
|
||||
condition_id = self.condition(
|
||||
when, name=pkg.name, msg="Virtuals are provided together"
|
||||
)
|
||||
for set_id, virtuals_together in enumerate(sets_of_virtuals):
|
||||
for name in virtuals_together:
|
||||
self.gen.fact(
|
||||
fn.pkg_fact(pkg.name, fn.provided_together(condition_id, set_id, name))
|
||||
)
|
||||
self.gen.newline()
|
||||
|
||||
def package_dependencies_rules(self, pkg):
|
||||
"""Translate 'depends_on' directives into ASP logic."""
|
||||
for _, conditions in sorted(pkg.dependencies.items()):
|
||||
@@ -1931,6 +1913,15 @@ class Body:
|
||||
clauses.append(fn.attr("package_hash", spec.name, spec._package_hash))
|
||||
clauses.append(fn.attr("hash", spec.name, spec.dag_hash()))
|
||||
|
||||
edges = spec.edges_from_dependents()
|
||||
virtuals = [x for x in itertools.chain.from_iterable([edge.virtuals for edge in edges])]
|
||||
if not body:
|
||||
for virtual in virtuals:
|
||||
clauses.append(fn.attr("provider_set", spec.name, virtual))
|
||||
else:
|
||||
for virtual in virtuals:
|
||||
clauses.append(fn.attr("virtual_on_incoming_edges", spec.name, virtual))
|
||||
|
||||
# add all clauses from dependencies
|
||||
if transitive:
|
||||
# TODO: Eventually distinguish 2 deps on the same pkg (build and link)
|
||||
@@ -3153,10 +3144,11 @@ def __init__(self, provided, conflicts):
|
||||
msg = (
|
||||
"Spack concretizer internal error. Please submit a bug report and include the "
|
||||
"command, environment if applicable and the following error message."
|
||||
f"\n {provided} is unsatisfiable, errors are:"
|
||||
f"\n {provided} is unsatisfiable"
|
||||
)
|
||||
|
||||
msg += "".join([f"\n {conflict}" for conflict in conflicts])
|
||||
if conflicts:
|
||||
msg += ", errors are:" + "".join([f"\n {conflict}" for conflict in conflicts])
|
||||
|
||||
super(spack.error.UnsatisfiableSpecError, self).__init__(msg)
|
||||
|
||||
|
||||
@@ -113,10 +113,11 @@ unification_set(SetID, VirtualNode)
|
||||
multiple_nodes_attribute("node_flag_source").
|
||||
multiple_nodes_attribute("depends_on").
|
||||
multiple_nodes_attribute("virtual_on_edge").
|
||||
multiple_nodes_attribute("provider_set").
|
||||
|
||||
% Map constraint on the literal ID to facts on the node
|
||||
attr(Name, node(min_dupe_id, A1)) :- literal(LiteralID, Name, A1), solve_literal(LiteralID).
|
||||
attr(Name, node(min_dupe_id, A1), A2) :- literal(LiteralID, Name, A1, A2), solve_literal(LiteralID).
|
||||
attr(Name, node(min_dupe_id, A1), A2) :- literal(LiteralID, Name, A1, A2), solve_literal(LiteralID), not multiple_nodes_attribute(Name).
|
||||
attr(Name, node(min_dupe_id, A1), A2, A3) :- literal(LiteralID, Name, A1, A2, A3), solve_literal(LiteralID), not multiple_nodes_attribute(Name).
|
||||
attr(Name, node(min_dupe_id, A1), A2, A3, A4) :- literal(LiteralID, Name, A1, A2, A3, A4), solve_literal(LiteralID).
|
||||
|
||||
@@ -124,6 +125,10 @@ attr(Name, node(min_dupe_id, A1), A2, A3, A4) :- literal(LiteralID, Name, A1, A2
|
||||
attr("node_flag_source", node(min_dupe_id, A1), A2, node(min_dupe_id, A3)) :- literal(LiteralID, "node_flag_source", A1, A2, A3), solve_literal(LiteralID).
|
||||
attr("depends_on", node(min_dupe_id, A1), node(min_dupe_id, A2), A3) :- literal(LiteralID, "depends_on", A1, A2, A3), solve_literal(LiteralID).
|
||||
|
||||
attr("virtual_node", node(min_dupe_id, Virtual)) :- literal(LiteralID, "provider_set", _, Virtual), solve_literal(LiteralID).
|
||||
attr("provider_set", node(min_dupe_id, Provider), node(min_dupe_id, Virtual)) :- literal(LiteralID, "provider_set", Provider, Virtual), solve_literal(LiteralID).
|
||||
provider(node(min_dupe_id, Provider), node(min_dupe_id, Virtual)) :- literal(LiteralID, "provider_set", Provider, Virtual), solve_literal(LiteralID).
|
||||
|
||||
% Discriminate between "roots" that have been explicitly requested, and roots that are deduced from "virtual roots"
|
||||
explicitly_requested_root(node(min_dupe_id, A1)) :- literal(LiteralID, "root", A1), solve_literal(LiteralID).
|
||||
|
||||
@@ -476,6 +481,21 @@ error(1, Msg)
|
||||
% Virtual dependencies
|
||||
%-----------------------------------------------------------------------------
|
||||
|
||||
% If the provider is set from the command line, its weight is 0
|
||||
possible_provider_weight(ProviderNode, VirtualNode, 0, "Set on the command line")
|
||||
:- attr("provider_set", ProviderNode, VirtualNode).
|
||||
|
||||
% Enforces all virtuals to be provided, if multiple of them are provided together
|
||||
error(100, "Package '{0}' needs to provide both '{1}' and '{2}' together, but provides only '{1}'", Package, Virtual1, Virtual2)
|
||||
:- condition_holds(ID, node(X, Package)),
|
||||
pkg_fact(Package, provided_together(ID, SetID, Virtual1)),
|
||||
pkg_fact(Package, provided_together(ID, SetID, Virtual2)),
|
||||
Virtual1 != Virtual2,
|
||||
attr("virtual_on_incoming_edges", node(X, Package), Virtual1),
|
||||
not attr("virtual_on_incoming_edges", node(X, Package), Virtual2),
|
||||
attr("virtual_node", node(_, Virtual1)),
|
||||
attr("virtual_node", node(_, Virtual2)).
|
||||
|
||||
% if a package depends on a virtual, it's not external and we have a
|
||||
% provider for that virtual then it depends on the provider
|
||||
node_depends_on_virtual(PackageNode, Virtual, Type)
|
||||
@@ -494,6 +514,9 @@ attr("virtual_on_edge", PackageNode, ProviderNode, Virtual)
|
||||
provider(ProviderNode, node(_, Virtual)),
|
||||
not external(PackageNode).
|
||||
|
||||
attr("virtual_on_incoming_edges", ProviderNode, Virtual)
|
||||
:- attr("virtual_on_edge", _, ProviderNode, Virtual).
|
||||
|
||||
% dependencies on virtuals also imply that the virtual is a virtual node
|
||||
1 { attr("virtual_node", node(0..X-1, Virtual)) : max_dupes(Virtual, X) }
|
||||
:- node_depends_on_virtual(PackageNode, Virtual).
|
||||
@@ -501,6 +524,10 @@ attr("virtual_on_edge", PackageNode, ProviderNode, Virtual)
|
||||
% If there's a virtual node, we must select one and only one provider.
|
||||
% The provider must be selected among the possible providers.
|
||||
|
||||
error(100, "'{0}' cannot be a provider for the '{1}' virtual", Package, Virtual)
|
||||
:- attr("provider_set", node(min_dupe_id, Package), node(min_dupe_id, Virtual)),
|
||||
not virtual_condition_holds( node(min_dupe_id, Package), Virtual).
|
||||
|
||||
error(100, "Cannot find valid provider for virtual {0}", Virtual)
|
||||
:- attr("virtual_node", node(X, Virtual)),
|
||||
not provider(_, node(X, Virtual)).
|
||||
@@ -521,20 +548,6 @@ attr("root", PackageNode) :- attr("virtual_root", VirtualNode), provider(Package
|
||||
attr("node", PackageNode), virtual_condition_holds(PackageNode, Virtual) } 1
|
||||
:- attr("virtual_node", node(X, Virtual)).
|
||||
|
||||
% If a spec is selected as a provider, it is for all the virtual it could provide
|
||||
:- provider(PackageNode, node(X, Virtual1)),
|
||||
virtual_condition_holds(PackageNode, Virtual2),
|
||||
Virtual2 != Virtual1,
|
||||
unification_set(SetID, PackageNode),
|
||||
unification_set(SetID, node(X, Virtual2)),
|
||||
not provider(PackageNode, node(X, Virtual2)).
|
||||
|
||||
% If a spec is a dependency, and could provide a needed virtual, it must be a provider
|
||||
:- node_depends_on_virtual(PackageNode, Virtual),
|
||||
depends_on(PackageNode, PossibleProviderNode),
|
||||
virtual_condition_holds(PossibleProviderNode, Virtual),
|
||||
not attr("virtual_on_edge", PackageNode, PossibleProviderNode, Virtual).
|
||||
|
||||
% The provider provides the virtual if some provider condition holds.
|
||||
virtual_condition_holds(node(ProviderID, Provider), Virtual) :- virtual_condition_holds(ID, node(ProviderID, Provider), Virtual).
|
||||
virtual_condition_holds(ID, node(ProviderID, Provider), Virtual) :-
|
||||
@@ -561,6 +574,8 @@ do_not_impose(EffectID, node(X, Package))
|
||||
not virtual_condition_holds(PackageNode, Virtual),
|
||||
internal_error("Virtual when provides not respected").
|
||||
|
||||
#defined provided_together/4.
|
||||
|
||||
%-----------------------------------------------------------------------------
|
||||
% Virtual dependency weights
|
||||
%-----------------------------------------------------------------------------
|
||||
@@ -696,15 +711,18 @@ requirement_group_satisfied(node(ID, Package), X) :-
|
||||
% flags if their only source is from a requirement. This is overly-specific
|
||||
% and should use a more-generic approach like in https://github.com/spack/spack/pull/37180
|
||||
|
||||
{ attr("node_flag", node(ID, A1), A2, A3) } :-
|
||||
requirement_group_member(Y, Package, X),
|
||||
activate_requirement(node(ID, Package), X),
|
||||
imposed_constraint(Y,"node_flag_set", A1, A2, A3).
|
||||
{ attr("node_flag", node(ID, Package), FlagType, FlagValue) } :-
|
||||
requirement_group_member(ConditionID, Package, RequirementID),
|
||||
activate_requirement(node(ID, Package), RequirementID),
|
||||
pkg_fact(Package, condition_effect(ConditionID, EffectID)),
|
||||
imposed_constraint(EffectID, "node_flag_set", Package, FlagType, FlagValue).
|
||||
|
||||
{ attr("node_flag_source", node(ID, A1), A2, node(ID, A3)) } :-
|
||||
requirement_group_member(Y, Package, X),
|
||||
activate_requirement(node(ID, Package), X),
|
||||
imposed_constraint(Y,"node_flag_source", A1, A2, A3).
|
||||
{ attr("node_flag_source", node(NodeID1, Package1), FlagType, node(NodeID2, Package2)) } :-
|
||||
requirement_group_member(ConditionID, Package1, RequirementID),
|
||||
activate_requirement(node(NodeID1, Package1), RequirementID),
|
||||
pkg_fact(Package1, condition_effect(ConditionID, EffectID)),
|
||||
imposed_constraint(EffectID, "node_flag_source", Package1, FlagType, Package2),
|
||||
imposed_nodes(EffectID, node(NodeID2, Package2), node(NodeID1, Package1)).
|
||||
|
||||
requirement_weight(node(ID, Package), Group, W) :-
|
||||
W = #min {
|
||||
@@ -863,6 +881,7 @@ variant_default_not_used(node(ID, Package), Variant, Value)
|
||||
:- variant_default_value(Package, Variant, Value),
|
||||
node_has_variant(node(ID, Package), Variant),
|
||||
not attr("variant_value", node(ID, Package), Variant, Value),
|
||||
not attr("variant_propagate", node(ID, Package), Variant, _, _),
|
||||
attr("node", node(ID, Package)).
|
||||
|
||||
% The variant is set in an external spec
|
||||
@@ -1325,6 +1344,10 @@ build_priority(PackageNode, 0) :- not build(PackageNode), attr("node", Package
|
||||
|
||||
#defined installed_hash/2.
|
||||
|
||||
% This statement, which is a hidden feature of clingo, let us avoid cycles in the DAG
|
||||
#edge (A, B) : depends_on(A, B).
|
||||
|
||||
|
||||
%-----------------------------------------------------------------
|
||||
% Optimization to avoid errors
|
||||
%-----------------------------------------------------------------
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
% Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
||||
% Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
%
|
||||
% SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
%=============================================================================
|
||||
% Avoid cycles in the DAG
|
||||
%
|
||||
% Some combinations of conditional dependencies can result in cycles;
|
||||
% this ensures that we solve around them. Note that these rules are quite
|
||||
% demanding on both grounding and solving, since they need to compute and
|
||||
% consider all possible paths between pair of nodes.
|
||||
%=============================================================================
|
||||
|
||||
|
||||
#program no_cycle.
|
||||
path(Parent, Child) :- depends_on(Parent, Child).
|
||||
path(Parent, Descendant) :- path(Parent, A), depends_on(A, Descendant).
|
||||
:- path(A, A).
|
||||
|
||||
#defined depends_on/2.
|
||||
@@ -59,7 +59,7 @@
|
||||
import re
|
||||
import socket
|
||||
import warnings
|
||||
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
||||
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union
|
||||
|
||||
import llnl.path
|
||||
import llnl.string
|
||||
@@ -1464,6 +1464,26 @@ def edges_to_dependencies(self, name=None, depflag: dt.DepFlag = dt.ALL):
|
||||
"""
|
||||
return [d for d in self._dependencies.select(child=name, depflag=depflag)]
|
||||
|
||||
@property
|
||||
def edge_attributes(self) -> str:
|
||||
"""Helper method to print edge attributes in spec literals"""
|
||||
edges = self.edges_from_dependents()
|
||||
if not edges:
|
||||
return ""
|
||||
|
||||
union = DependencySpec(parent=Spec(), spec=self, depflag=0, virtuals=())
|
||||
for edge in edges:
|
||||
union.update_deptypes(edge.depflag)
|
||||
union.update_virtuals(edge.virtuals)
|
||||
deptypes_str = (
|
||||
f"deptypes={','.join(dt.flag_to_tuple(union.depflag))}" if union.depflag else ""
|
||||
)
|
||||
virtuals_str = f"virtuals={','.join(union.virtuals)}" if union.virtuals else ""
|
||||
if not deptypes_str and not virtuals_str:
|
||||
return ""
|
||||
result = f"{deptypes_str} {virtuals_str}".strip()
|
||||
return f"[{result}]"
|
||||
|
||||
def dependencies(self, name=None, deptype: Union[dt.DepTypes, dt.DepFlag] = dt.ALL):
|
||||
"""Return a list of direct dependencies (nodes in the DAG).
|
||||
|
||||
@@ -3688,8 +3708,15 @@ def intersects(self, other: Union[str, "Spec"], deps: bool = True) -> bool:
|
||||
if other.concrete and self.concrete:
|
||||
return self.dag_hash() == other.dag_hash()
|
||||
|
||||
self_hash = self.dag_hash() if self.concrete else self.abstract_hash
|
||||
other_hash = other.dag_hash() if other.concrete else other.abstract_hash
|
||||
elif self.concrete:
|
||||
return self.satisfies(other)
|
||||
|
||||
elif other.concrete:
|
||||
return other.satisfies(self)
|
||||
|
||||
# From here we know both self and other are not concrete
|
||||
self_hash = self.abstract_hash
|
||||
other_hash = other.abstract_hash
|
||||
|
||||
if (
|
||||
self_hash
|
||||
@@ -3778,10 +3805,6 @@ def _intersects_dependencies(self, other):
|
||||
repository=spack.repo.PATH, specs=other.traverse(), restrict=True
|
||||
)
|
||||
|
||||
# This handles cases where there are already providers for both vpkgs
|
||||
if not self_index.satisfies(other_index):
|
||||
return False
|
||||
|
||||
# These two loops handle cases where there is an overly restrictive
|
||||
# vpkg in one spec for a provider in the other (e.g., mpi@3: is not
|
||||
# compatible with mpich2)
|
||||
@@ -3879,7 +3902,46 @@ def satisfies(self, other: Union[str, "Spec"], deps: bool = True) -> bool:
|
||||
return False
|
||||
|
||||
# If we arrived here, then rhs is abstract. At the moment we don't care about the edge
|
||||
# structure of an abstract DAG - hence the deps=False parameter.
|
||||
# structure of an abstract DAG, so we check if any edge could satisfy the properties
|
||||
# we ask for.
|
||||
lhs_edges: Dict[str, Set[DependencySpec]] = collections.defaultdict(set)
|
||||
for rhs_edge in other.traverse_edges(root=False, cover="edges"):
|
||||
# If we are checking for ^mpi we need to verify if there is any edge
|
||||
if rhs_edge.spec.virtual:
|
||||
rhs_edge.update_virtuals(virtuals=(rhs_edge.spec.name,))
|
||||
|
||||
if not rhs_edge.virtuals:
|
||||
continue
|
||||
|
||||
if not lhs_edges:
|
||||
# Construct a map of the link/run subDAG + direct "build" edges,
|
||||
# keyed by dependency name
|
||||
for lhs_edge in self.traverse_edges(
|
||||
root=False, cover="edges", deptype=("link", "run")
|
||||
):
|
||||
lhs_edges[lhs_edge.spec.name].add(lhs_edge)
|
||||
for virtual_name in lhs_edge.virtuals:
|
||||
lhs_edges[virtual_name].add(lhs_edge)
|
||||
|
||||
build_edges = self.edges_to_dependencies(depflag=dt.BUILD)
|
||||
for lhs_edge in build_edges:
|
||||
lhs_edges[lhs_edge.spec.name].add(lhs_edge)
|
||||
for virtual_name in lhs_edge.virtuals:
|
||||
lhs_edges[virtual_name].add(lhs_edge)
|
||||
|
||||
# We don't have edges to this dependency
|
||||
current_dependency_name = rhs_edge.spec.name
|
||||
if current_dependency_name not in lhs_edges:
|
||||
return False
|
||||
|
||||
for virtual in rhs_edge.virtuals:
|
||||
has_virtual = any(
|
||||
virtual in edge.virtuals for edge in lhs_edges[current_dependency_name]
|
||||
)
|
||||
if not has_virtual:
|
||||
return False
|
||||
|
||||
# Edges have been checked above already, hence deps=False
|
||||
return all(
|
||||
any(lhs.satisfies(rhs, deps=False) for lhs in self.traverse(root=False))
|
||||
for rhs in other.traverse(root=False)
|
||||
@@ -4081,9 +4143,7 @@ def __getitem__(self, name):
|
||||
"""
|
||||
query_parameters = name.split(":")
|
||||
if len(query_parameters) > 2:
|
||||
msg = "key has more than one ':' symbol."
|
||||
msg += " At most one is admitted."
|
||||
raise KeyError(msg)
|
||||
raise KeyError("key has more than one ':' symbol. At most one is admitted.")
|
||||
|
||||
name, query_parameters = query_parameters[0], query_parameters[1:]
|
||||
if query_parameters:
|
||||
@@ -4108,11 +4168,17 @@ def __getitem__(self, name):
|
||||
itertools.chain(
|
||||
# Regular specs
|
||||
(x for x in order() if x.name == name),
|
||||
(
|
||||
x
|
||||
for x in order()
|
||||
if (not x.virtual)
|
||||
and any(name in edge.virtuals for edge in x.edges_from_dependents())
|
||||
),
|
||||
(x for x in order() if (not x.virtual) and x.package.provides(name)),
|
||||
)
|
||||
)
|
||||
except StopIteration:
|
||||
raise KeyError("No spec with name %s in %s" % (name, self))
|
||||
raise KeyError(f"No spec with name {name} in {self}")
|
||||
|
||||
if self._concrete:
|
||||
return SpecBuildInterface(value, name, query_parameters)
|
||||
@@ -4490,10 +4556,26 @@ def format_path(
|
||||
return str(path_ctor(*output_path_components))
|
||||
|
||||
def __str__(self):
|
||||
sorted_nodes = [self] + sorted(
|
||||
self.traverse(root=False), key=lambda x: x.name or x.abstract_hash
|
||||
root_str = [self.format()]
|
||||
sorted_dependencies = sorted(
|
||||
self.traverse(root=False), key=lambda x: (x.name, x.abstract_hash)
|
||||
)
|
||||
spec_str = " ^".join(d.format() for d in sorted_nodes)
|
||||
sorted_dependencies = [
|
||||
d.format("{edge_attributes} " + DEFAULT_FORMAT) for d in sorted_dependencies
|
||||
]
|
||||
spec_str = " ^".join(root_str + sorted_dependencies)
|
||||
return spec_str.strip()
|
||||
|
||||
@property
|
||||
def colored_str(self):
|
||||
root_str = [self.cformat()]
|
||||
sorted_dependencies = sorted(
|
||||
self.traverse(root=False), key=lambda x: (x.name, x.abstract_hash)
|
||||
)
|
||||
sorted_dependencies = [
|
||||
d.cformat("{edge_attributes} " + DISPLAY_FORMAT) for d in sorted_dependencies
|
||||
]
|
||||
spec_str = " ^".join(root_str + sorted_dependencies)
|
||||
return spec_str.strip()
|
||||
|
||||
def install_status(self):
|
||||
|
||||
@@ -893,9 +893,9 @@ def interactive_version_filter(
|
||||
"""
|
||||
# Find length of longest string in the list for padding
|
||||
version_filter = initial_verion_filter or VersionList([":"])
|
||||
max_len = max(len(str(v)) for v in url_dict) if url_dict else 0
|
||||
sorted_and_filtered = [v for v in url_dict if v.satisfies(version_filter)]
|
||||
sorted_and_filtered.sort(reverse=True)
|
||||
max_len = max(len(str(v)) for v in sorted_and_filtered)
|
||||
orig_url_dict = url_dict # only copy when using editor to modify
|
||||
print_header = True
|
||||
VERSION_COLOR = spack.spec.VERSION_COLOR
|
||||
@@ -903,21 +903,20 @@ def interactive_version_filter(
|
||||
if print_header:
|
||||
has_filter = version_filter != VersionList([":"])
|
||||
header = []
|
||||
if not sorted_and_filtered:
|
||||
header.append("No versions selected")
|
||||
elif len(sorted_and_filtered) == len(orig_url_dict):
|
||||
if len(orig_url_dict) > 0 and len(sorted_and_filtered) == len(orig_url_dict):
|
||||
header.append(
|
||||
f"Selected {llnl.string.plural(len(sorted_and_filtered), 'version')}"
|
||||
)
|
||||
else:
|
||||
header.append(
|
||||
f"Selected {len(sorted_and_filtered)} of {len(orig_url_dict)} versions"
|
||||
f"Selected {len(sorted_and_filtered)} of "
|
||||
f"{llnl.string.plural(len(orig_url_dict), 'version')}"
|
||||
)
|
||||
if sorted_and_filtered and known_versions:
|
||||
num_new = sum(1 for v in sorted_and_filtered if v not in known_versions)
|
||||
header.append(f"{llnl.string.plural(num_new, 'new version')}")
|
||||
if has_filter:
|
||||
header.append(colorize(f"Filtered by {VERSION_COLOR}{version_filter}@."))
|
||||
header.append(colorize(f"Filtered by {VERSION_COLOR}@@{version_filter}@."))
|
||||
|
||||
version_with_url = [
|
||||
colorize(
|
||||
|
||||
@@ -642,3 +642,13 @@ def test_effective_deptype_run_environment(default_mock_concretization):
|
||||
for spec, effective_type in spack.build_environment.effective_deptypes(s, context=Context.RUN):
|
||||
assert effective_type & expected_flags.pop(spec.name) == effective_type
|
||||
assert not expected_flags, f"Missing {expected_flags.keys()} from effective_deptypes"
|
||||
|
||||
|
||||
def test_monkey_patching_works_across_virtual(default_mock_concretization):
|
||||
"""Assert that a monkeypatched attribute is found regardless we access through the
|
||||
real name or the virtual name.
|
||||
"""
|
||||
s = default_mock_concretization("mpileaks ^mpich")
|
||||
s["mpich"].foo = "foo"
|
||||
assert s["mpich"].foo == "foo"
|
||||
assert s["mpi"].foo == "foo"
|
||||
|
||||
@@ -14,7 +14,14 @@
|
||||
|
||||
dependencies = SpackCommand("dependencies")
|
||||
|
||||
mpis = ["low-priority-provider", "mpich", "mpich2", "multi-provider-mpi", "zmpi"]
|
||||
mpis = [
|
||||
"intel-parallel-studio",
|
||||
"low-priority-provider",
|
||||
"mpich",
|
||||
"mpich2",
|
||||
"multi-provider-mpi",
|
||||
"zmpi",
|
||||
]
|
||||
mpi_deps = ["fake"]
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
import llnl.util.filesystem as fs
|
||||
import llnl.util.link_tree
|
||||
import llnl.util.tty as tty
|
||||
|
||||
import spack.cmd.env
|
||||
import spack.config
|
||||
@@ -977,10 +978,9 @@ def test_included_config_precedence(environment_from_manifest):
|
||||
assert any([x.satisfies("libelf@0.8.10") for x in e._get_environment_specs()])
|
||||
|
||||
|
||||
def test_bad_env_yaml_format(tmpdir):
|
||||
filename = str(tmpdir.join("spack.yaml"))
|
||||
with open(filename, "w") as f:
|
||||
f.write(
|
||||
def test_bad_env_yaml_format(environment_from_manifest):
|
||||
with pytest.raises(spack.config.ConfigFormatError) as e:
|
||||
environment_from_manifest(
|
||||
"""\
|
||||
spack:
|
||||
spacks:
|
||||
@@ -988,12 +988,59 @@ def test_bad_env_yaml_format(tmpdir):
|
||||
"""
|
||||
)
|
||||
|
||||
with tmpdir.as_cwd():
|
||||
with pytest.raises(spack.config.ConfigFormatError) as e:
|
||||
env("create", "test", "./spack.yaml")
|
||||
assert "spack.yaml:2" in str(e)
|
||||
assert "'spacks' was unexpected" in str(e)
|
||||
|
||||
assert "test" not in env("list")
|
||||
|
||||
|
||||
def test_bad_env_yaml_format_remove(mutable_mock_env_path):
|
||||
badenv = "badenv"
|
||||
env("create", badenv)
|
||||
filename = mutable_mock_env_path / "spack.yaml"
|
||||
with open(filename, "w") as f:
|
||||
f.write(
|
||||
"""\
|
||||
- mpileaks
|
||||
"""
|
||||
)
|
||||
|
||||
assert badenv in env("list")
|
||||
env("remove", "-y", badenv)
|
||||
assert badenv not in env("list")
|
||||
|
||||
|
||||
@pytest.mark.parametrize("answer", ["-y", ""])
|
||||
def test_multi_env_remove(mutable_mock_env_path, monkeypatch, answer):
|
||||
"""Test removal (or not) of a valid and invalid environment"""
|
||||
remove_environment = answer == "-y"
|
||||
monkeypatch.setattr(tty, "get_yes_or_no", lambda prompt, default: remove_environment)
|
||||
|
||||
environments = ["goodenv", "badenv"]
|
||||
for e in environments:
|
||||
env("create", e)
|
||||
|
||||
# Ensure the bad environment contains invalid yaml
|
||||
filename = mutable_mock_env_path / environments[1] / "spack.yaml"
|
||||
filename.write_text(
|
||||
"""\
|
||||
- libdwarf
|
||||
"""
|
||||
)
|
||||
|
||||
assert all(e in env("list") for e in environments)
|
||||
|
||||
args = [answer] if answer else []
|
||||
args.extend(environments)
|
||||
output = env("remove", *args, fail_on_error=False)
|
||||
|
||||
if remove_environment is True:
|
||||
# Successfully removed (and reported removal) of *both* environments
|
||||
assert not all(e in env("list") for e in environments)
|
||||
assert output.count("Successfully removed") == 2
|
||||
else:
|
||||
# Not removing any of the environments
|
||||
assert all(e in env("list") for e in environments)
|
||||
|
||||
|
||||
def test_env_loads(install_mockery, mock_fetch):
|
||||
env("create", "test")
|
||||
@@ -2443,8 +2490,12 @@ def test_concretize_user_specs_together():
|
||||
e.remove("mpich")
|
||||
e.add("mpich2")
|
||||
|
||||
exc_cls = spack.error.SpackError
|
||||
if spack.config.get("config:concretizer") == "clingo":
|
||||
exc_cls = spack.error.UnsatisfiableSpecError
|
||||
|
||||
# Concretizing without invalidating the concrete spec for mpileaks fails
|
||||
with pytest.raises(spack.error.UnsatisfiableSpecError):
|
||||
with pytest.raises(exc_cls):
|
||||
e.concretize()
|
||||
e.concretize(force=True)
|
||||
|
||||
@@ -2476,9 +2527,12 @@ def test_duplicate_packages_raise_when_concretizing_together():
|
||||
e.add("mpileaks~opt")
|
||||
e.add("mpich")
|
||||
|
||||
with pytest.raises(
|
||||
spack.error.UnsatisfiableSpecError, match=r"You could consider setting `concretizer:unify`"
|
||||
):
|
||||
exc_cls, match = spack.error.SpackError, None
|
||||
if spack.config.get("config:concretizer") == "clingo":
|
||||
exc_cls = spack.error.UnsatisfiableSpecError
|
||||
match = r"You could consider setting `concretizer:unify`"
|
||||
|
||||
with pytest.raises(exc_cls, match=match):
|
||||
e.concretize()
|
||||
|
||||
|
||||
@@ -3328,6 +3382,20 @@ def test_spack_package_ids_variable(tmpdir, mock_packages):
|
||||
assert "post-install: {}".format(s.dag_hash()) in out
|
||||
|
||||
|
||||
def test_depfile_empty_does_not_error(tmp_path):
|
||||
# For empty environments Spack should create a depfile that does nothing
|
||||
make = Executable("make")
|
||||
makefile = str(tmp_path / "Makefile")
|
||||
|
||||
env("create", "test")
|
||||
with ev.read("test"):
|
||||
env("depfile", "-o", makefile)
|
||||
|
||||
make("-f", makefile)
|
||||
|
||||
assert make.returncode == 0
|
||||
|
||||
|
||||
def test_unify_when_possible_works_around_conflicts():
|
||||
e = ev.create("coconcretization")
|
||||
e.unify = "when_possible"
|
||||
|
||||
@@ -472,6 +472,18 @@ def test_concretize_propagated_variant_is_not_passed_to_dependent(self):
|
||||
|
||||
assert spec.satisfies("^openblas+shared")
|
||||
|
||||
@pytest.mark.only_clingo("Original concretizer is allowed to forego variant propagation")
|
||||
def test_concretize_propagate_multivalue_variant(self):
|
||||
"""Test that multivalue variants are propagating the specified value(s)
|
||||
to their dependecies. The dependencies should not have the default value"""
|
||||
spec = Spec("multivalue-variant foo==baz,fee")
|
||||
spec.concretize()
|
||||
|
||||
assert spec.satisfies("^a foo=baz,fee")
|
||||
assert spec.satisfies("^b foo=baz,fee")
|
||||
assert not spec.satisfies("^a foo=bar")
|
||||
assert not spec.satisfies("^b foo=bar")
|
||||
|
||||
def test_no_matching_compiler_specs(self, mock_low_high_config):
|
||||
# only relevant when not building compilers as needed
|
||||
with spack.concretize.enable_compiler_existence_check():
|
||||
@@ -1838,7 +1850,8 @@ def test_installed_specs_disregard_conflicts(self, mutable_database, monkeypatch
|
||||
# If we concretize with --reuse it is not, since "mpich~debug" was already installed
|
||||
with spack.config.override("concretizer:reuse", True):
|
||||
s = Spec("mpich").concretized()
|
||||
assert s.satisfies("~debug")
|
||||
assert s.installed
|
||||
assert s.satisfies("~debug"), s
|
||||
|
||||
@pytest.mark.regression("32471")
|
||||
@pytest.mark.only_clingo("Use case not supported by the original concretizer")
|
||||
@@ -2132,14 +2145,16 @@ def test_reuse_python_from_cli_and_extension_from_db(self, mutable_database):
|
||||
|
||||
@pytest.fixture()
|
||||
def duplicates_test_repository():
|
||||
builder_test_path = os.path.join(spack.paths.repos_path, "duplicates.test")
|
||||
with spack.repo.use_repositories(builder_test_path) as mock_repo:
|
||||
repository_path = os.path.join(spack.paths.repos_path, "duplicates.test")
|
||||
with spack.repo.use_repositories(repository_path) as mock_repo:
|
||||
yield mock_repo
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("mutable_config", "duplicates_test_repository")
|
||||
@pytest.mark.only_clingo("Not supported by the original concretizer")
|
||||
class TestConcretizeSeparately:
|
||||
"""Collects test on separate concretization"""
|
||||
|
||||
@pytest.mark.parametrize("strategy", ["minimal", "full"])
|
||||
def test_two_gmake(self, strategy):
|
||||
"""Tests that we can concretize a spec with nodes using the same build
|
||||
@@ -2320,3 +2335,53 @@ def test_adding_specs(self, input_specs, default_mock_concretization):
|
||||
assert node == container[node.dag_hash()]
|
||||
assert node.dag_hash() in container
|
||||
assert node is not container[node.dag_hash()]
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def edges_test_repository():
|
||||
repository_path = os.path.join(spack.paths.repos_path, "edges.test")
|
||||
with spack.repo.use_repositories(repository_path) as mock_repo:
|
||||
yield mock_repo
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("mutable_config", "edges_test_repository")
|
||||
@pytest.mark.only_clingo("Edge properties not supported by the original concretizer")
|
||||
class TestConcretizeEdges:
|
||||
"""Collects tests on edge properties"""
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"spec_str,expected_satisfies,expected_not_satisfies",
|
||||
[
|
||||
("conditional-edge", ["^zlib@2.0"], ["^zlib-api"]),
|
||||
("conditional-edge~foo", ["^zlib@2.0"], ["^zlib-api"]),
|
||||
(
|
||||
"conditional-edge+foo",
|
||||
["^zlib@1.0", "^zlib-api", "^[virtuals=zlib-api] zlib"],
|
||||
["^[virtuals=mpi] zlib"],
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_condition_triggered_by_edge_property(
|
||||
self, spec_str, expected_satisfies, expected_not_satisfies
|
||||
):
|
||||
"""Tests that we can enforce constraints based on edge attributes"""
|
||||
s = Spec(spec_str).concretized()
|
||||
|
||||
for expected in expected_satisfies:
|
||||
assert s.satisfies(expected), str(expected)
|
||||
|
||||
for not_expected in expected_not_satisfies:
|
||||
assert not s.satisfies(not_expected), str(not_expected)
|
||||
|
||||
def test_virtuals_provided_together_but_only_one_required_in_dag(self):
|
||||
"""Tests that we can use a provider that provides more than one virtual together,
|
||||
and is providing only one, iff the others are not needed in the DAG.
|
||||
|
||||
o blas-only-client
|
||||
| [virtual=blas]
|
||||
o openblas (provides blas and lapack together)
|
||||
|
||||
"""
|
||||
s = Spec("blas-only-client ^openblas").concretized()
|
||||
assert s.satisfies("^[virtuals=blas] openblas")
|
||||
assert not s.satisfies("^[virtuals=blas,lapack] openblas")
|
||||
|
||||
@@ -469,16 +469,22 @@ def test_one_package_multiple_oneof_groups(concretize_scope, test_repo):
|
||||
|
||||
|
||||
@pytest.mark.regression("34241")
|
||||
def test_require_cflags(concretize_scope, test_repo):
|
||||
def test_require_cflags(concretize_scope, mock_packages):
|
||||
"""Ensures that flags can be required from configuration."""
|
||||
conf_str = """\
|
||||
packages:
|
||||
y:
|
||||
mpich2:
|
||||
require: cflags="-g"
|
||||
mpi:
|
||||
require: mpich cflags="-O1"
|
||||
"""
|
||||
update_packages_config(conf_str)
|
||||
spec = Spec("y").concretized()
|
||||
assert spec.satisfies("cflags=-g")
|
||||
|
||||
spec_mpich2 = Spec("mpich2").concretized()
|
||||
assert spec_mpich2.satisfies("cflags=-g")
|
||||
|
||||
spec_mpi = Spec("mpi").concretized()
|
||||
assert spec_mpi.satisfies("mpich cflags=-O1")
|
||||
|
||||
|
||||
def test_requirements_for_package_that_is_not_needed(concretize_scope, test_repo):
|
||||
|
||||
@@ -495,7 +495,7 @@ def mock_binary_index(monkeypatch, tmpdir_factory):
|
||||
tmpdir = tmpdir_factory.mktemp("mock_binary_index")
|
||||
index_path = tmpdir.join("binary_index").strpath
|
||||
mock_index = spack.binary_distribution.BinaryCacheIndex(index_path)
|
||||
monkeypatch.setattr(spack.binary_distribution, "binary_index", mock_index)
|
||||
monkeypatch.setattr(spack.binary_distribution, "BINARY_INDEX", mock_index)
|
||||
yield
|
||||
|
||||
|
||||
@@ -1710,8 +1710,8 @@ def inode_cache():
|
||||
@pytest.fixture(autouse=True)
|
||||
def brand_new_binary_cache():
|
||||
yield
|
||||
spack.binary_distribution.binary_index = llnl.util.lang.Singleton(
|
||||
spack.binary_distribution._binary_index
|
||||
spack.binary_distribution.BINARY_INDEX = llnl.util.lang.Singleton(
|
||||
spack.binary_distribution.BinaryCacheIndex
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -690,3 +690,29 @@ def test_removing_spec_from_manifest_with_exact_duplicates(
|
||||
assert "zlib" in manifest.read_text()
|
||||
with ev.Environment(tmp_path) as env:
|
||||
assert len(env.user_specs) == 1
|
||||
|
||||
|
||||
@pytest.mark.regression("35298")
|
||||
@pytest.mark.only_clingo("Propagation not supported in the original concretizer")
|
||||
def test_variant_propagation_with_unify_false(tmp_path, mock_packages):
|
||||
"""Spack distributes concretizations to different processes, when unify:false is selected and
|
||||
the number of roots is 2 or more. When that happens, the specs to be concretized need to be
|
||||
properly reconstructed on the worker process, if variant propagation was requested.
|
||||
"""
|
||||
manifest = tmp_path / "spack.yaml"
|
||||
manifest.write_text(
|
||||
"""
|
||||
spack:
|
||||
specs:
|
||||
- parent-foo ++foo
|
||||
- c
|
||||
concretizer:
|
||||
unify: false
|
||||
"""
|
||||
)
|
||||
with ev.Environment(tmp_path) as env:
|
||||
env.concretize()
|
||||
|
||||
root = env.matching_spec("parent-foo")
|
||||
for node in root.traverse():
|
||||
assert node.satisfies("+foo")
|
||||
|
||||
@@ -34,6 +34,10 @@
|
||||
("myname:1234/myimage:abc", ("myname:1234", "myimage", "abc", None)),
|
||||
("localhost/myimage:abc", ("localhost", "myimage", "abc", None)),
|
||||
("localhost:1234/myimage:abc", ("localhost:1234", "myimage", "abc", None)),
|
||||
(
|
||||
"example.com/UPPERCASE/lowercase:AbC",
|
||||
("example.com", "uppercase/lowercase", "AbC", None),
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_name_parsing(image_ref, expected):
|
||||
|
||||
@@ -37,6 +37,7 @@ def mpileaks_possible_deps(mock_packages, mpi_names):
|
||||
"low-priority-provider": set(),
|
||||
"dyninst": set(["libdwarf", "libelf"]),
|
||||
"fake": set(),
|
||||
"intel-parallel-studio": set(),
|
||||
"libdwarf": set(["libelf"]),
|
||||
"libelf": set(),
|
||||
"mpich": set(),
|
||||
|
||||
@@ -532,6 +532,7 @@ def test_normalize_mpileaks(self):
|
||||
assert not spec.eq_dag(expected_normalized, deptypes=True)
|
||||
assert not spec.eq_dag(non_unique_nodes, deptypes=True)
|
||||
|
||||
@pytest.mark.xfail(reason="String representation changed")
|
||||
def test_normalize_with_virtual_package(self):
|
||||
spec = Spec("mpileaks ^mpi ^libelf@1.8.11 ^libdwarf")
|
||||
spec.normalize()
|
||||
|
||||
@@ -294,13 +294,10 @@ def test_concrete_specs_which_satisfies_abstract(self, lhs, rhs, default_mock_co
|
||||
("foo@4.0%pgi@4.5", "@1:3%pgi@4.4:4.6"),
|
||||
("builtin.mock.mpich", "builtin.mpich"),
|
||||
("mpileaks ^builtin.mock.mpich", "^builtin.mpich"),
|
||||
("mpileaks^mpich", "^zmpi"),
|
||||
("mpileaks^zmpi", "^mpich"),
|
||||
("mpileaks^mpich@1.2", "^mpich@2.0"),
|
||||
("mpileaks^mpich@4.0^callpath@1.5", "^mpich@1:3^callpath@1.4:1.6"),
|
||||
("mpileaks^mpich@2.0^callpath@1.7", "^mpich@1:3^callpath@1.4:1.6"),
|
||||
("mpileaks^mpich@4.0^callpath@1.7", "^mpich@1:3^callpath@1.4:1.6"),
|
||||
("mpileaks^mpich", "^zmpi"),
|
||||
("mpileaks^mpi@3", "^mpi@1.2:1.6"),
|
||||
("mpileaks^mpi@3:", "^mpich2@1.4"),
|
||||
("mpileaks^mpi@3:", "^mpich2"),
|
||||
@@ -338,30 +335,30 @@ def test_constraining_abstract_specs_with_empty_intersection(self, lhs, rhs):
|
||||
rhs.constrain(lhs)
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"lhs,rhs,intersection_expected",
|
||||
"lhs,rhs",
|
||||
[
|
||||
("mpich", "mpich +foo", True),
|
||||
("mpich", "mpich~foo", True),
|
||||
("mpich", "mpich foo=1", True),
|
||||
("mpich", "mpich++foo", True),
|
||||
("mpich", "mpich~~foo", True),
|
||||
("mpich", "mpich foo==1", True),
|
||||
("mpich", "mpich +foo"),
|
||||
("mpich", "mpich~foo"),
|
||||
("mpich", "mpich foo=1"),
|
||||
("mpich", "mpich++foo"),
|
||||
("mpich", "mpich~~foo"),
|
||||
("mpich", "mpich foo==1"),
|
||||
# Flags semantics is currently different from other variant
|
||||
("mpich", 'mpich cflags="-O3"', True),
|
||||
("mpich cflags=-O3", 'mpich cflags="-O3 -Ofast"', False),
|
||||
("mpich cflags=-O2", 'mpich cflags="-O3"', False),
|
||||
("multivalue-variant foo=bar", "multivalue-variant +foo", False),
|
||||
("multivalue-variant foo=bar", "multivalue-variant ~foo", False),
|
||||
("multivalue-variant fee=bar", "multivalue-variant fee=baz", False),
|
||||
("mpich", 'mpich cflags="-O3"'),
|
||||
("mpich cflags=-O3", 'mpich cflags="-O3 -Ofast"'),
|
||||
("mpich cflags=-O2", 'mpich cflags="-O3"'),
|
||||
("multivalue-variant foo=bar", "multivalue-variant +foo"),
|
||||
("multivalue-variant foo=bar", "multivalue-variant ~foo"),
|
||||
("multivalue-variant fee=bar", "multivalue-variant fee=baz"),
|
||||
],
|
||||
)
|
||||
def test_concrete_specs_which_do_not_satisfy_abstract(
|
||||
self, lhs, rhs, intersection_expected, default_mock_concretization
|
||||
self, lhs, rhs, default_mock_concretization
|
||||
):
|
||||
lhs, rhs = default_mock_concretization(lhs), Spec(rhs)
|
||||
|
||||
assert lhs.intersects(rhs) is intersection_expected
|
||||
assert rhs.intersects(lhs) is intersection_expected
|
||||
assert lhs.intersects(rhs) is False
|
||||
assert rhs.intersects(lhs) is False
|
||||
assert not lhs.satisfies(rhs)
|
||||
assert not rhs.satisfies(lhs)
|
||||
|
||||
@@ -483,10 +480,14 @@ def test_intersects_virtual(self):
|
||||
assert Spec("mpich2").intersects(Spec("mpi"))
|
||||
assert Spec("zmpi").intersects(Spec("mpi"))
|
||||
|
||||
def test_intersects_virtual_dep_with_virtual_constraint(self):
|
||||
def test_intersects_virtual_providers(self):
|
||||
"""Tests that we can always intersect virtual providers from abstract specs.
|
||||
Concretization will give meaning to virtuals, and eventually forbid certain
|
||||
configurations.
|
||||
"""
|
||||
assert Spec("netlib-lapack ^openblas").intersects("netlib-lapack ^openblas")
|
||||
assert not Spec("netlib-lapack ^netlib-blas").intersects("netlib-lapack ^openblas")
|
||||
assert not Spec("netlib-lapack ^openblas").intersects("netlib-lapack ^netlib-blas")
|
||||
assert Spec("netlib-lapack ^netlib-blas").intersects("netlib-lapack ^openblas")
|
||||
assert Spec("netlib-lapack ^openblas").intersects("netlib-lapack ^netlib-blas")
|
||||
assert Spec("netlib-lapack ^netlib-blas").intersects("netlib-lapack ^netlib-blas")
|
||||
|
||||
def test_intersectable_concrete_specs_must_have_the_same_hash(self):
|
||||
@@ -1006,6 +1007,103 @@ def test_spec_override(self):
|
||||
assert new_spec.compiler_flags["cflags"] == ["-O2"]
|
||||
assert new_spec.compiler_flags["cxxflags"] == ["-O1"]
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"spec_str,specs_in_dag",
|
||||
[
|
||||
("hdf5 ^[virtuals=mpi] mpich", [("mpich", "mpich"), ("mpi", "mpich")]),
|
||||
# Try different combinations with packages that provides a
|
||||
# disjoint set of virtual dependencies
|
||||
(
|
||||
"netlib-scalapack ^mpich ^openblas-with-lapack",
|
||||
[
|
||||
("mpi", "mpich"),
|
||||
("lapack", "openblas-with-lapack"),
|
||||
("blas", "openblas-with-lapack"),
|
||||
],
|
||||
),
|
||||
(
|
||||
"netlib-scalapack ^[virtuals=mpi] mpich ^openblas-with-lapack",
|
||||
[
|
||||
("mpi", "mpich"),
|
||||
("lapack", "openblas-with-lapack"),
|
||||
("blas", "openblas-with-lapack"),
|
||||
],
|
||||
),
|
||||
(
|
||||
"netlib-scalapack ^mpich ^[virtuals=lapack] openblas-with-lapack",
|
||||
[
|
||||
("mpi", "mpich"),
|
||||
("lapack", "openblas-with-lapack"),
|
||||
("blas", "openblas-with-lapack"),
|
||||
],
|
||||
),
|
||||
(
|
||||
"netlib-scalapack ^[virtuals=mpi] mpich ^[virtuals=lapack] openblas-with-lapack",
|
||||
[
|
||||
("mpi", "mpich"),
|
||||
("lapack", "openblas-with-lapack"),
|
||||
("blas", "openblas-with-lapack"),
|
||||
],
|
||||
),
|
||||
# Test that we can mix dependencies that provide an overlapping
|
||||
# sets of virtual dependencies
|
||||
(
|
||||
"netlib-scalapack ^[virtuals=mpi] intel-parallel-studio "
|
||||
"^[virtuals=lapack] openblas-with-lapack",
|
||||
[
|
||||
("mpi", "intel-parallel-studio"),
|
||||
("lapack", "openblas-with-lapack"),
|
||||
("blas", "openblas-with-lapack"),
|
||||
],
|
||||
),
|
||||
(
|
||||
"netlib-scalapack ^[virtuals=mpi] intel-parallel-studio ^openblas-with-lapack",
|
||||
[
|
||||
("mpi", "intel-parallel-studio"),
|
||||
("lapack", "openblas-with-lapack"),
|
||||
("blas", "openblas-with-lapack"),
|
||||
],
|
||||
),
|
||||
(
|
||||
"netlib-scalapack ^intel-parallel-studio ^[virtuals=lapack] openblas-with-lapack",
|
||||
[
|
||||
("mpi", "intel-parallel-studio"),
|
||||
("lapack", "openblas-with-lapack"),
|
||||
("blas", "openblas-with-lapack"),
|
||||
],
|
||||
),
|
||||
# Test that we can bind more than one virtual to the same provider
|
||||
(
|
||||
"netlib-scalapack ^[virtuals=lapack,blas] openblas-with-lapack",
|
||||
[("lapack", "openblas-with-lapack"), ("blas", "openblas-with-lapack")],
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_virtual_deps_bindings(self, default_mock_concretization, spec_str, specs_in_dag):
|
||||
if spack.config.get("config:concretizer") == "original":
|
||||
pytest.skip("Use case not supported by the original concretizer")
|
||||
|
||||
s = default_mock_concretization(spec_str)
|
||||
for label, expected in specs_in_dag:
|
||||
assert label in s
|
||||
assert s[label].satisfies(expected), label
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"spec_str",
|
||||
[
|
||||
# openblas-with-lapack needs to provide blas and lapack together
|
||||
"netlib-scalapack ^[virtuals=blas] intel-parallel-studio ^openblas-with-lapack",
|
||||
# intel-* provides blas and lapack together, openblas can provide blas only
|
||||
"netlib-scalapack ^[virtuals=lapack] intel-parallel-studio ^openblas",
|
||||
],
|
||||
)
|
||||
def test_unsatisfiable_virtual_deps_bindings(self, spec_str):
|
||||
if spack.config.get("config:concretizer") == "original":
|
||||
pytest.skip("Use case not supported by the original concretizer")
|
||||
|
||||
with pytest.raises(spack.solver.asp.UnsatisfiableSpecError):
|
||||
Spec(spec_str).concretized()
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"spec_str,format_str,expected",
|
||||
|
||||
@@ -472,33 +472,46 @@ def _specfile_for(spec_str, filename):
|
||||
[Token(TokenType.PROPAGATED_KEY_VALUE_PAIR, value='cflags=="-O3 -g"')],
|
||||
'cflags=="-O3 -g"',
|
||||
),
|
||||
# Way too many spaces
|
||||
# Whitespace is allowed in version lists
|
||||
("@1.2:1.4 , 1.6 ", [Token(TokenType.VERSION, value="@1.2:1.4 , 1.6")], "@1.2:1.4,1.6"),
|
||||
# But not in ranges. `a@1:` and `b` are separate specs, not a single `a@1:b`.
|
||||
(
|
||||
"@1.2 : 1.4 , 1.6 ",
|
||||
[Token(TokenType.VERSION, value="@1.2 : 1.4 , 1.6")],
|
||||
"@1.2:1.4,1.6",
|
||||
),
|
||||
("@1.2 : develop", [Token(TokenType.VERSION, value="@1.2 : develop")], "@1.2:develop"),
|
||||
(
|
||||
"@1.2 : develop = foo",
|
||||
"a@1: b",
|
||||
[
|
||||
Token(TokenType.VERSION, value="@1.2 :"),
|
||||
Token(TokenType.UNQUALIFIED_PACKAGE_NAME, value="a"),
|
||||
Token(TokenType.VERSION, value="@1:"),
|
||||
Token(TokenType.UNQUALIFIED_PACKAGE_NAME, value="b"),
|
||||
],
|
||||
"a@1:",
|
||||
),
|
||||
(
|
||||
"@1.2: develop = foo",
|
||||
[
|
||||
Token(TokenType.VERSION, value="@1.2:"),
|
||||
Token(TokenType.KEY_VALUE_PAIR, value="develop = foo"),
|
||||
],
|
||||
"@1.2: develop=foo",
|
||||
),
|
||||
(
|
||||
"% intel @ 12.1 : 12.6 + debug",
|
||||
"@1.2:develop = foo",
|
||||
[
|
||||
Token(TokenType.COMPILER_AND_VERSION, value="% intel @ 12.1 : 12.6"),
|
||||
Token(TokenType.VERSION, value="@1.2:"),
|
||||
Token(TokenType.KEY_VALUE_PAIR, value="develop = foo"),
|
||||
],
|
||||
"@1.2: develop=foo",
|
||||
),
|
||||
(
|
||||
"% intel @ 12.1:12.6 + debug",
|
||||
[
|
||||
Token(TokenType.COMPILER_AND_VERSION, value="% intel @ 12.1:12.6"),
|
||||
Token(TokenType.BOOL_VARIANT, value="+ debug"),
|
||||
],
|
||||
"%intel@12.1:12.6+debug",
|
||||
),
|
||||
(
|
||||
"@ 12.1 : 12.6 + debug - qt_4",
|
||||
"@ 12.1:12.6 + debug - qt_4",
|
||||
[
|
||||
Token(TokenType.VERSION, value="@ 12.1 : 12.6"),
|
||||
Token(TokenType.VERSION, value="@ 12.1:12.6"),
|
||||
Token(TokenType.BOOL_VARIANT, value="+ debug"),
|
||||
Token(TokenType.BOOL_VARIANT, value="- qt_4"),
|
||||
],
|
||||
@@ -517,6 +530,26 @@ def _specfile_for(spec_str, filename):
|
||||
[Token(TokenType.VERSION, value="@:0.4"), Token(TokenType.COMPILER, value="% nvhpc")],
|
||||
"@:0.4%nvhpc",
|
||||
),
|
||||
(
|
||||
"^[virtuals=mpi] openmpi",
|
||||
[
|
||||
Token(TokenType.START_EDGE_PROPERTIES, value="^["),
|
||||
Token(TokenType.KEY_VALUE_PAIR, value="virtuals=mpi"),
|
||||
Token(TokenType.END_EDGE_PROPERTIES, value="]"),
|
||||
Token(TokenType.UNQUALIFIED_PACKAGE_NAME, value="openmpi"),
|
||||
],
|
||||
"^[virtuals=mpi] openmpi",
|
||||
),
|
||||
(
|
||||
"^[deptypes=link,build] zlib",
|
||||
[
|
||||
Token(TokenType.START_EDGE_PROPERTIES, value="^["),
|
||||
Token(TokenType.KEY_VALUE_PAIR, value="deptypes=link,build"),
|
||||
Token(TokenType.END_EDGE_PROPERTIES, value="]"),
|
||||
Token(TokenType.UNQUALIFIED_PACKAGE_NAME, value="zlib"),
|
||||
],
|
||||
"^[deptypes=build,link] zlib",
|
||||
),
|
||||
(
|
||||
"zlib@git.foo/bar",
|
||||
[
|
||||
@@ -525,6 +558,31 @@ def _specfile_for(spec_str, filename):
|
||||
],
|
||||
"zlib@git.foo/bar",
|
||||
),
|
||||
# Variant propagation
|
||||
(
|
||||
"zlib ++foo",
|
||||
[
|
||||
Token(TokenType.UNQUALIFIED_PACKAGE_NAME, "zlib"),
|
||||
Token(TokenType.PROPAGATED_BOOL_VARIANT, "++foo"),
|
||||
],
|
||||
"zlib++foo",
|
||||
),
|
||||
(
|
||||
"zlib ~~foo",
|
||||
[
|
||||
Token(TokenType.UNQUALIFIED_PACKAGE_NAME, "zlib"),
|
||||
Token(TokenType.PROPAGATED_BOOL_VARIANT, "~~foo"),
|
||||
],
|
||||
"zlib~~foo",
|
||||
),
|
||||
(
|
||||
"zlib foo==bar",
|
||||
[
|
||||
Token(TokenType.UNQUALIFIED_PACKAGE_NAME, "zlib"),
|
||||
Token(TokenType.PROPAGATED_KEY_VALUE_PAIR, "foo==bar"),
|
||||
],
|
||||
"zlib foo==bar",
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_parse_single_spec(spec_str, tokens, expected_roundtrip):
|
||||
@@ -885,6 +943,9 @@ def test_disambiguate_hash_by_spec(spec1, spec2, constraint, mock_packages, monk
|
||||
("x platform=test platform=test", spack.spec.DuplicateArchitectureError),
|
||||
("x os=fe platform=test target=fe os=fe", spack.spec.DuplicateArchitectureError),
|
||||
("x target=be platform=test os=be os=fe", spack.spec.DuplicateArchitectureError),
|
||||
("^[@foo] zlib", spack.parser.SpecParsingError),
|
||||
# TODO: Remove this as soon as use variants are added and we can parse custom attributes
|
||||
("^[foo=bar] zlib", spack.parser.SpecParsingError),
|
||||
],
|
||||
)
|
||||
def test_error_conditions(text, exc_cls):
|
||||
|
||||
@@ -120,6 +120,21 @@ def test_parser_doesnt_deal_with_nonzero_offset():
|
||||
elf.parse_elf(elf_at_offset_one)
|
||||
|
||||
|
||||
def test_only_header():
|
||||
# When passing only_header=True parsing a file that is literally just a header
|
||||
# without any sections/segments should not error.
|
||||
|
||||
# 32 bit
|
||||
elf_32 = elf.parse_elf(io.BytesIO(b"\x7fELF\x01\x01" + b"\x00" * 46), only_header=True)
|
||||
assert not elf_32.is_64_bit
|
||||
assert elf_32.is_little_endian
|
||||
|
||||
# 64 bit
|
||||
elf_64 = elf.parse_elf(io.BytesIO(b"\x7fELF\x02\x01" + b"\x00" * 58), only_header=True)
|
||||
assert elf_64.is_64_bit
|
||||
assert elf_64.is_little_endian
|
||||
|
||||
|
||||
@pytest.mark.requires_executables("gcc")
|
||||
@skip_unless_linux
|
||||
def test_elf_get_and_replace_rpaths(binary_with_rpaths):
|
||||
|
||||
@@ -377,7 +377,7 @@ def parse_header(f, elf):
|
||||
elf.elf_hdr = ElfHeader._make(unpack(elf_header_fmt, data))
|
||||
|
||||
|
||||
def _do_parse_elf(f, interpreter=True, dynamic_section=True):
|
||||
def _do_parse_elf(f, interpreter=True, dynamic_section=True, only_header=False):
|
||||
# We don't (yet?) allow parsing ELF files at a nonzero offset, we just
|
||||
# jump to absolute offsets as they are specified in the ELF file.
|
||||
if f.tell() != 0:
|
||||
@@ -386,6 +386,9 @@ def _do_parse_elf(f, interpreter=True, dynamic_section=True):
|
||||
elf = ElfFile()
|
||||
parse_header(f, elf)
|
||||
|
||||
if only_header:
|
||||
return elf
|
||||
|
||||
# We don't handle anything but executables and shared libraries now.
|
||||
if elf.elf_hdr.e_type not in (ELF_CONSTANTS.ET_EXEC, ELF_CONSTANTS.ET_DYN):
|
||||
raise ElfParsingError("Not an ET_DYN or ET_EXEC type")
|
||||
@@ -403,11 +406,11 @@ def _do_parse_elf(f, interpreter=True, dynamic_section=True):
|
||||
return elf
|
||||
|
||||
|
||||
def parse_elf(f, interpreter=False, dynamic_section=False):
|
||||
def parse_elf(f, interpreter=False, dynamic_section=False, only_header=False):
|
||||
"""Given a file handle f for an ELF file opened in binary mode, return an ElfFile
|
||||
object that is stores data about rpaths"""
|
||||
try:
|
||||
return _do_parse_elf(f, interpreter, dynamic_section)
|
||||
return _do_parse_elf(f, interpreter, dynamic_section, only_header)
|
||||
except (DeprecationWarning, struct.error):
|
||||
# According to the docs old versions of Python can throw DeprecationWarning
|
||||
# instead of struct.error.
|
||||
|
||||
@@ -596,6 +596,14 @@ def group_by_name(self) -> Dict[str, ModificationList]:
|
||||
modifications[item.name].append(item)
|
||||
return modifications
|
||||
|
||||
def drop(self, *name) -> bool:
|
||||
"""Drop all modifications to the variable with the given name."""
|
||||
old_mods = self.env_modifications
|
||||
new_mods = [x for x in self.env_modifications if x.name not in name]
|
||||
self.env_modifications = new_mods
|
||||
|
||||
return len(old_mods) != len(new_mods)
|
||||
|
||||
def is_unset(self, variable_name: str) -> bool:
|
||||
"""Returns True if the last modification to a variable is to unset it, False otherwise."""
|
||||
modifications = self.group_by_name()
|
||||
|
||||
@@ -35,9 +35,9 @@ def __init__(self, name):
|
||||
if not self.exe:
|
||||
raise ProcessError("Cannot construct executable for '%s'" % name)
|
||||
|
||||
def add_default_arg(self, arg):
|
||||
"""Add a default argument to the command."""
|
||||
self.exe.append(arg)
|
||||
def add_default_arg(self, *args):
|
||||
"""Add default argument(s) to the command."""
|
||||
self.exe.extend(args)
|
||||
|
||||
def add_default_env(self, key, value):
|
||||
"""Set an environment variable when the command is run.
|
||||
|
||||
@@ -24,7 +24,6 @@ def git(required: bool = False):
|
||||
# If we're running under pytest, add this to ignore the fix for CVE-2022-39253 in
|
||||
# git 2.38.1+. Do this in one place; we need git to do this in all parts of Spack.
|
||||
if git and "pytest" in sys.modules:
|
||||
git.add_default_arg("-c")
|
||||
git.add_default_arg("protocol.file.allow=always")
|
||||
git.add_default_arg("-c", "protocol.file.allow=always")
|
||||
|
||||
return git
|
||||
|
||||
@@ -150,7 +150,7 @@ default:
|
||||
- spack python -c "import os,sys; print(os.path.expandvars(sys.stdin.read()))"
|
||||
< "${SPACK_CI_CONFIG_ROOT}/${PIPELINE_MIRROR_TEMPLATE}" > "${SPACK_CI_CONFIG_ROOT}/mirrors.yaml"
|
||||
- spack config add -f "${SPACK_CI_CONFIG_ROOT}/mirrors.yaml"
|
||||
- spack -v
|
||||
- spack -v --color=always
|
||||
--config-scope "${SPACK_CI_CONFIG_ROOT}"
|
||||
--config-scope "${SPACK_CI_CONFIG_ROOT}/${SPACK_TARGET_PLATFORM}"
|
||||
--config-scope "${SPACK_CI_CONFIG_ROOT}/${SPACK_TARGET_PLATFORM}/${SPACK_TARGET_ARCH}"
|
||||
@@ -203,7 +203,7 @@ default:
|
||||
- spack --version
|
||||
- cd share/spack/gitlab/cloud_pipelines/stacks/${SPACK_CI_STACK_NAME}
|
||||
- spack env activate --without-view .
|
||||
- spack -v
|
||||
- spack -v --color=always
|
||||
ci generate --check-index-only
|
||||
--buildcache-destination "${PUSH_BUILDCACHE_DEPRECATED}"
|
||||
--artifacts-root "${CI_PROJECT_DIR}/jobs_scratch_dir"
|
||||
@@ -621,7 +621,7 @@ aws-isc-aarch64-build:
|
||||
|
||||
tutorial-generate:
|
||||
extends: [ ".tutorial", ".generate-x86_64"]
|
||||
image: ghcr.io/spack/tutorial-ubuntu-22.04:v2023-05-07
|
||||
image: ghcr.io/spack/tutorial-ubuntu-22.04:v2023-10-30
|
||||
|
||||
tutorial-build:
|
||||
extends: [ ".tutorial", ".build" ]
|
||||
|
||||
@@ -150,7 +150,7 @@ spack:
|
||||
- swig@4.0.2-fortran
|
||||
- sz3
|
||||
- tasmanian
|
||||
- tau +mpi +python
|
||||
- tau +mpi +python +syscall
|
||||
- trilinos +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext +ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu +nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos +teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long
|
||||
- turbine
|
||||
- umap
|
||||
@@ -186,7 +186,7 @@ spack:
|
||||
- flux-core +cuda
|
||||
- hpctoolkit +cuda
|
||||
- papi +cuda
|
||||
- tau +mpi +cuda
|
||||
- tau +mpi +cuda +syscall
|
||||
# --
|
||||
# - bricks +cuda # not respecting target=aarch64?
|
||||
# - legion +cuda # legion: needs NVIDIA driver
|
||||
|
||||
@@ -153,7 +153,7 @@ spack:
|
||||
- superlu-dist
|
||||
- sz3
|
||||
- tasmanian
|
||||
- tau +mpi +python
|
||||
- tau +mpi +python +syscall
|
||||
- trilinos +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext +ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu +nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos +teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long
|
||||
- turbine
|
||||
- umap
|
||||
@@ -200,7 +200,7 @@ spack:
|
||||
- kokkos +sycl +openmp cxxstd=17 +tests +examples
|
||||
- kokkos-kernels build_type=Release %oneapi ^kokkos +sycl +openmp cxxstd=17 +tests +examples
|
||||
- slate +sycl
|
||||
- tau +mpi +opencl +level_zero ~pdt # tau: requires libdrm.so to be installed
|
||||
- tau +mpi +opencl +level_zero ~pdt +syscall # tau: requires libdrm.so to be installed
|
||||
# --
|
||||
# - ginkgo +oneapi # InstallError: Ginkgo's oneAPI backend requires theDPC++ compiler as main CXX compiler.
|
||||
# - hpctoolkit +level_zero # dyninst@12.3.0%gcc: /usr/bin/ld: libiberty/./d-demangle.c:142: undefined reference to `_intel_fast_memcpy'; can't mix intel-tbb@%oneapi with dyninst%gcc
|
||||
|
||||
@@ -150,7 +150,7 @@ spack:
|
||||
- swig@4.0.2-fortran
|
||||
- sz3
|
||||
- tasmanian
|
||||
- tau +mpi +python # tau: has issue with `spack env depfile` build
|
||||
- tau +mpi +python # +syscall fails: https://github.com/spack/spack/pull/40830#issuecomment-1790799772; tau: has issue with `spack env depfile` build
|
||||
- trilinos +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext +ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu +nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos +teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long
|
||||
- turbine
|
||||
- umap
|
||||
|
||||
@@ -240,7 +240,7 @@ spack:
|
||||
specs:
|
||||
# ROCM NOARCH
|
||||
- hpctoolkit +rocm
|
||||
- tau +mpi +rocm # tau: has issue with `spack env depfile` build
|
||||
- tau +mpi +rocm +syscall # tau: has issue with `spack env depfile` build
|
||||
|
||||
# ROCM 908
|
||||
- adios2 +kokkos +rocm amdgpu_target=gfx908
|
||||
|
||||
@@ -157,7 +157,7 @@ spack:
|
||||
- swig@4.0.2-fortran
|
||||
- sz3
|
||||
- tasmanian
|
||||
- tau +mpi +python
|
||||
- tau +mpi +python +syscall
|
||||
- trilinos +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext +ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu +nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos +teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long
|
||||
- turbine
|
||||
- umap
|
||||
@@ -192,7 +192,7 @@ spack:
|
||||
- flux-core +cuda
|
||||
- hpctoolkit +cuda
|
||||
- papi +cuda
|
||||
- tau +mpi +cuda
|
||||
- tau +mpi +cuda +syscall
|
||||
# --
|
||||
# - legion +cuda # legion: needs NVIDIA driver
|
||||
|
||||
@@ -289,7 +289,7 @@ spack:
|
||||
|
||||
# ROCM NOARCH
|
||||
- hpctoolkit +rocm
|
||||
- tau +mpi +rocm # tau: has issue with `spack env depfile` build
|
||||
- tau +mpi +rocm +syscall # tau: has issue with `spack env depfile` build
|
||||
|
||||
# ROCM 908
|
||||
- adios2 +kokkos +rocm amdgpu_target=gfx908
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
spack:
|
||||
config:
|
||||
# allow deprecated versions in concretizations
|
||||
# required for zlib
|
||||
deprecated: true
|
||||
|
||||
view: false
|
||||
packages:
|
||||
all:
|
||||
@@ -13,36 +8,36 @@ spack:
|
||||
definitions:
|
||||
- gcc_system_packages:
|
||||
- matrix:
|
||||
- - zlib
|
||||
- zlib@1.2.8
|
||||
- zlib@1.2.8 cflags=-O3
|
||||
- - gmake
|
||||
- gmake@4.3
|
||||
- gmake@4.3 cflags=-O3
|
||||
- tcl
|
||||
- tcl ^zlib@1.2.8 cflags=-O3
|
||||
- tcl ^gmake@4.3 cflags=-O3
|
||||
- hdf5
|
||||
- hdf5~mpi
|
||||
- hdf5+hl+mpi ^mpich
|
||||
- trilinos
|
||||
- trilinos +hdf5 ^hdf5+hl+mpi ^mpich
|
||||
- gcc@12.1.0
|
||||
- gcc@12
|
||||
- mpileaks
|
||||
- lmod
|
||||
- macsio@1.1+scr^scr@2.0.0~fortran^silo~fortran^hdf5~fortran
|
||||
- ['%gcc@11.3.0']
|
||||
- macsio@1.1+scr ^scr@2.0.0~fortran ^silo~fortran ^hdf5~fortran
|
||||
- ['%gcc@11']
|
||||
- gcc_old_packages:
|
||||
- zlib%gcc@10.4.0
|
||||
- gmake%gcc@10
|
||||
- clang_packages:
|
||||
- matrix:
|
||||
- [zlib, tcl ^zlib@1.2.8]
|
||||
- ['%clang@14.0.0']
|
||||
- [gmake, tcl ^gmake@4.3]
|
||||
- ['%clang@14']
|
||||
- gcc_spack_built_packages:
|
||||
- matrix:
|
||||
- [netlib-scalapack]
|
||||
- [^mpich, ^openmpi]
|
||||
- [^openblas, ^netlib-lapack]
|
||||
- ['%gcc@12.1.0']
|
||||
- ['%gcc@12']
|
||||
- matrix:
|
||||
- [py-scipy^openblas, armadillo^openblas, netlib-lapack, openmpi, mpich, elpa^mpich]
|
||||
- ['%gcc@12.1.0']
|
||||
- [py-scipy ^openblas, armadillo ^openblas, netlib-lapack, openmpi, mpich, elpa ^mpich]
|
||||
- ['%gcc@12']
|
||||
specs:
|
||||
- $gcc_system_packages
|
||||
- $gcc_old_packages
|
||||
@@ -53,7 +48,7 @@ spack:
|
||||
pipeline-gen:
|
||||
- build-job:
|
||||
image:
|
||||
name: ghcr.io/spack/tutorial-ubuntu-22.04:v2023-05-07
|
||||
name: ghcr.io/spack/tutorial-ubuntu-22.04:v2023-10-30
|
||||
entrypoint: ['']
|
||||
cdash:
|
||||
build-group: Spack Tutorial
|
||||
|
||||
@@ -98,7 +98,7 @@ _spack_shell_wrapper() {
|
||||
if [ "$_sp_arg" = "-h" ] || [ "$_sp_arg" = "--help" ]; then
|
||||
command spack cd -h
|
||||
else
|
||||
LOC="$(spack location $_sp_arg "$@")"
|
||||
LOC="$(SPACK_COLOR="${SPACK_COLOR:-always}" spack location $_sp_arg "$@")"
|
||||
if [ -d "$LOC" ] ; then
|
||||
cd "$LOC"
|
||||
else
|
||||
@@ -136,7 +136,7 @@ _spack_shell_wrapper() {
|
||||
command spack env activate "$@"
|
||||
else
|
||||
# Actual call to activate: source the output.
|
||||
stdout="$(command spack $_sp_flags env activate --sh "$@")" || return
|
||||
stdout="$(SPACK_COLOR="${SPACK_COLOR:-always}" command spack $_sp_flags env activate --sh "$@")" || return
|
||||
eval "$stdout"
|
||||
fi
|
||||
;;
|
||||
@@ -158,7 +158,7 @@ _spack_shell_wrapper() {
|
||||
command spack env deactivate -h
|
||||
else
|
||||
# No args: source the output of the command.
|
||||
stdout="$(command spack $_sp_flags env deactivate --sh)" || return
|
||||
stdout="$(SPACK_COLOR="${SPACK_COLOR:-always}" command spack $_sp_flags env deactivate --sh)" || return
|
||||
eval "$stdout"
|
||||
fi
|
||||
;;
|
||||
@@ -186,7 +186,7 @@ _spack_shell_wrapper() {
|
||||
# Args contain --sh, --csh, or -h/--help: just execute.
|
||||
command spack $_sp_flags $_sp_subcommand "$@"
|
||||
else
|
||||
stdout="$(command spack $_sp_flags $_sp_subcommand --sh "$@")" || return
|
||||
stdout="$(SPACK_COLOR="${SPACK_COLOR:-always}" command spack $_sp_flags $_sp_subcommand --sh "$@")" || return
|
||||
eval "$stdout"
|
||||
fi
|
||||
;;
|
||||
|
||||
@@ -8,7 +8,7 @@ SPACK_INSTALL_FLAGS ?=
|
||||
|
||||
{{ all_target }}: {{ env_target }}
|
||||
|
||||
{{ env_target }}: {{ root_install_targets }}
|
||||
{{ env_target }}: {{ root_install_targets }} | {{ dirs_target }}
|
||||
@touch $@
|
||||
|
||||
{{ dirs_target }}:
|
||||
|
||||
@@ -15,4 +15,8 @@ class B(Package):
|
||||
version("1.0", md5="0123456789abcdef0123456789abcdef")
|
||||
version("0.9", md5="abcd456789abcdef0123456789abcdef")
|
||||
|
||||
variant(
|
||||
"foo", description="", values=any_combination_of("bar", "baz", "fee").with_default("bar")
|
||||
)
|
||||
|
||||
depends_on("test-dependency", type="test")
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
class ClientNotFoo(Package):
|
||||
"""This package has a variant "foo", which is False by default."""
|
||||
|
||||
homepage = "http://www.example.com"
|
||||
url = "http://www.example.com/c-1.0.tar.gz"
|
||||
|
||||
version("1.0", md5="0123456789abcdef0123456789abcdef")
|
||||
|
||||
variant("foo", default=False, description="")
|
||||
@@ -0,0 +1,19 @@
|
||||
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
class IntelParallelStudio(Package):
|
||||
"""Intel Parallel Studio."""
|
||||
|
||||
homepage = "https://software.intel.com/en-us/intel-parallel-studio-xe"
|
||||
url = "http://tec/16225/parallel_studio_xe_2020_cluster_edition.tgz"
|
||||
|
||||
version("cluster.2020.0", sha256="b1d3e3e425b2e44a06760ff173104bdf")
|
||||
|
||||
provides("mpi@:3")
|
||||
provides("scalapack")
|
||||
provides("blas", "lapack")
|
||||
@@ -14,5 +14,5 @@ class LowPriorityProvider(Package):
|
||||
|
||||
version("1.0", md5="0123456789abcdef0123456789abcdef")
|
||||
|
||||
provides("lapack")
|
||||
provides("mpi")
|
||||
# A low priority provider that provides both these specs together
|
||||
provides("mpi", "lapack")
|
||||
|
||||
@@ -19,4 +19,4 @@ class ManyVirtualConsumer(Package):
|
||||
# This directive is an example of imposing a constraint on a
|
||||
# dependency is that dependency is in the DAG. This pattern
|
||||
# is mainly used with virtual providers.
|
||||
depends_on("low-priority-provider@1.0", when="^low-priority-provider")
|
||||
depends_on("low-priority-provider@1.0", when="^[virtuals=mpi,lapack] low-priority-provider")
|
||||
|
||||
@@ -19,7 +19,7 @@ class MultivalueVariant(Package):
|
||||
variant(
|
||||
"foo",
|
||||
description="Multi-valued variant",
|
||||
values=any_combination_of("bar", "baz", "barbaz"),
|
||||
values=any_combination_of("bar", "baz", "barbaz", "fee"),
|
||||
)
|
||||
|
||||
variant(
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
class NetlibScalapack(Package):
|
||||
homepage = "http://www.netlib.org/scalapack/"
|
||||
url = "http://www.netlib.org/scalapack/scalapack-2.1.0.tgz"
|
||||
|
||||
version("2.1.0", "b1d3e3e425b2e44a06760ff173104bdf")
|
||||
|
||||
provides("scalapack")
|
||||
|
||||
depends_on("mpi")
|
||||
depends_on("lapack")
|
||||
depends_on("blas")
|
||||
@@ -14,5 +14,4 @@ class OpenblasWithLapack(Package):
|
||||
|
||||
version("0.2.15", md5="b1190f3d3471685f17cfd1ec1d252ac9")
|
||||
|
||||
provides("lapack")
|
||||
provides("blas")
|
||||
provides("lapack", "blas")
|
||||
|
||||
21
var/spack/repos/builtin.mock/packages/parent-foo/package.py
Normal file
21
var/spack/repos/builtin.mock/packages/parent-foo/package.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
class ParentFoo(Package):
|
||||
"""This package has a variant "foo", which is True by default, and depends on another
|
||||
package which has the same variant defaulting to False.
|
||||
"""
|
||||
|
||||
homepage = "http://www.example.com"
|
||||
url = "http://www.example.com/c-1.0.tar.gz"
|
||||
|
||||
version("1.0", md5="0123456789abcdef0123456789abcdef")
|
||||
|
||||
variant("foo", default=True, description="")
|
||||
|
||||
depends_on("client-not-foo")
|
||||
@@ -40,6 +40,18 @@ class Acts(CMakePackage, CudaPackage):
|
||||
# Supported Acts versions
|
||||
version("main", branch="main")
|
||||
version("master", branch="main", deprecated=True) # For compatibility
|
||||
version("30.3.2", commit="76826f208f5929d8326798c87263f2563d0ae7e9", submodules=True)
|
||||
version("30.3.1", commit="bbee459dd93855417d5717d53cbbb2bace7de2bb", submodules=True)
|
||||
version("30.3.0", commit="311acb9ab41c2d79a4b90b193e5b25297182d670", submodules=True)
|
||||
version("30.2.0", commit="264b0a3214cbf8ca013623fc196e2d90d647c58f", submodules=True)
|
||||
version("30.1.1", commit="3d43492b2775e62051e9ad31f06b91d6e2357ab9", submodules=True)
|
||||
version("30.1.0", commit="60d9eec916f6c81373858c8d99d821861d7efeb8", submodules=True)
|
||||
version("30.0.0", commit="00fa3fabac86a1e65198d4b94dd263b1c731a84c", submodules=True)
|
||||
version("29.2.0", commit="b2d65308399d8f653fa8bdd73a2a203c58608358", submodules=True)
|
||||
version("29.1.0", commit="4681c3b142db469b00ca03e92e6b237f7c89d141", submodules=True)
|
||||
version("29.0.0", commit="9c6e4597af39f826e17d46850fdb407a48817ba6", submodules=True)
|
||||
version("28.2.0", commit="c612e7c625f961330e383fb7856cc7398dd82881", submodules=True)
|
||||
version("28.1.0", commit="08e51b5f93c0d09f2d1e7e4f062e715072ec3e9b", submodules=True)
|
||||
version("28.0.0", commit="0d8aa418c00e8f79bab2cf88234f3433670b447c", submodules=True)
|
||||
version("27.1.0", commit="219480220738318fbedb943cac85415687d75b66", submodules=True)
|
||||
version("27.0.0", commit="4d7029bd4e9285fcda2770aef6d78a7f833cb14f", submodules=True)
|
||||
@@ -214,6 +226,7 @@ class Acts(CMakePackage, CudaPackage):
|
||||
variant("mlpack", default=False, description="Build MLpack plugin", when="@25:")
|
||||
variant("onnx", default=False, description="Build ONNX plugin")
|
||||
variant("odd", default=False, description="Build the Open Data Detector", when="@19.1:")
|
||||
variant("podio", default=False, description="Build Podio plugin", when="@30.3:")
|
||||
variant(
|
||||
"profilecpu",
|
||||
default=False,
|
||||
@@ -230,6 +243,9 @@ class Acts(CMakePackage, CudaPackage):
|
||||
variant("tgeo", default=False, description="Build the TGeo plugin", when="+identification")
|
||||
|
||||
# Variants that only affect Acts examples for now
|
||||
variant(
|
||||
"binaries", default=False, description="Build the examples binaries", when="@23: +examples"
|
||||
)
|
||||
variant(
|
||||
"edm4hep",
|
||||
default=False,
|
||||
@@ -300,6 +316,8 @@ class Acts(CMakePackage, CudaPackage):
|
||||
depends_on("mlpack@3.1.1:", when="+mlpack")
|
||||
depends_on("nlohmann-json @3.9.1:", when="@0.14: +json")
|
||||
depends_on("podio @0.6:", when="@25: +edm4hep")
|
||||
depends_on("podio @0.16:", when="@30.3: +edm4hep")
|
||||
depends_on("podio @0.16:", when="+podio")
|
||||
depends_on("pythia8", when="+pythia8")
|
||||
depends_on("python", when="+python")
|
||||
depends_on("python@3.8:", when="+python @19.11:19")
|
||||
@@ -369,6 +387,7 @@ def plugin_cmake_variant(plugin_name, spack_variant):
|
||||
cmake_variant("ANALYSIS_APPS", "analysis"),
|
||||
plugin_cmake_variant("AUTODIFF", "autodiff"),
|
||||
cmake_variant("BENCHMARKS", "benchmarks"),
|
||||
example_cmake_variant("BINARIES", "binaries"),
|
||||
plugin_cmake_variant("CUDA", "cuda"),
|
||||
plugin_cmake_variant("DD4HEP", "dd4hep"),
|
||||
example_cmake_variant("DD4HEP", "dd4hep"),
|
||||
@@ -390,6 +409,7 @@ def plugin_cmake_variant(plugin_name, spack_variant):
|
||||
plugin_cmake_variant("ONNX", "onnx"),
|
||||
enable_cmake_variant("CPU_PROFILING", "profilecpu"),
|
||||
enable_cmake_variant("MEMORY_PROFILING", "profilemem"),
|
||||
plugin_cmake_variant("PODIO", "podio"),
|
||||
example_cmake_variant("PYTHIA8", "pythia8"),
|
||||
example_cmake_variant("PYTHON_BINDINGS", "python"),
|
||||
plugin_cmake_variant("ACTSVG", "svg"),
|
||||
|
||||
@@ -15,7 +15,8 @@ class Alquimia(CMakePackage):
|
||||
|
||||
maintainers("smolins", "balay")
|
||||
|
||||
version("develop")
|
||||
version("master")
|
||||
version("1.1.0", commit="211931c3e76b1ae7cdb48c46885b248412d6fe3d") # tag v1.1.0
|
||||
version("1.0.10", commit="b2c11b6cde321f4a495ef9fcf267cb4c7a9858a0") # tag v.1.0.10
|
||||
version("1.0.9", commit="2ee3bcfacc63f685864bcac2b6868b48ad235225") # tag v.1.0.9
|
||||
version("xsdk-0.6.0", commit="9a0aedd3a927d4d5e837f8fd18b74ad5a78c3821")
|
||||
@@ -25,6 +26,7 @@ class Alquimia(CMakePackage):
|
||||
|
||||
depends_on("mpi")
|
||||
depends_on("hdf5")
|
||||
depends_on("pflotran@5.0.0", when="@1.1.0")
|
||||
depends_on("pflotran@4.0.1", when="@1.0.10")
|
||||
depends_on("pflotran@3.0.2", when="@1.0.9")
|
||||
depends_on("pflotran@xsdk-0.6.0", when="@xsdk-0.6.0")
|
||||
|
||||
@@ -119,12 +119,14 @@ class Aluminum(CMakePackage, CudaPackage, ROCmPackage):
|
||||
"ofi_libfabric_plugin",
|
||||
default=spack.platforms.cray.slingshot_network(),
|
||||
when="+rccl",
|
||||
sticky=True,
|
||||
description="Builds with support for OFI libfabric enhanced RCCL/NCCL communication lib",
|
||||
)
|
||||
variant(
|
||||
"ofi_libfabric_plugin",
|
||||
default=spack.platforms.cray.slingshot_network(),
|
||||
when="+nccl",
|
||||
sticky=True,
|
||||
description="Builds with support for OFI libfabric enhanced RCCL/NCCL communication lib",
|
||||
)
|
||||
|
||||
|
||||
49
var/spack/repos/builtin/packages/amdsmi/package.py
Normal file
49
var/spack/repos/builtin/packages/amdsmi/package.py
Normal file
@@ -0,0 +1,49 @@
|
||||
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
class Amdsmi(CMakePackage):
|
||||
"""The AMD System Management Interface Library, or AMD SMI library,
|
||||
is a C library for Linux that provides a user space interface for
|
||||
applications to monitor and control AMD device."""
|
||||
|
||||
homepage = "https://github.com/RadeonOpenCompute/amdsmi"
|
||||
url = "https://github.com/RadeonOpenCompute/amdsmi/archive/refs/tags/rocm-5.6.0.tar.gz"
|
||||
|
||||
tags = ["rocm"]
|
||||
maintainers("srekolam", "renjithravindrankannath")
|
||||
libraries = ["libamd_smi"]
|
||||
|
||||
version("5.6.0", sha256="595c9d6d79d9071290b2f19ab4ef9222c8d2983b4322b3143fcd9d0b1ce0f6d8")
|
||||
version("5.5.1", sha256="b794c7fd562fd92f2c9f2bbdc2d5dded7486101fcd4598f2e8c3484c9a939281")
|
||||
version("5.5.0", sha256="dcfbd96e93afcf86b1261464e008e9ef7e521670871a1885e6eaffc7cdc8f555")
|
||||
|
||||
depends_on("cmake@3.11:", type="build")
|
||||
depends_on("python@3.6:", type="run")
|
||||
depends_on("py-virtualenv", type="build")
|
||||
depends_on("llvm@14:", type="build")
|
||||
depends_on("pkgconfig", type="build")
|
||||
depends_on("libdrm", type="build")
|
||||
depends_on("py-pyyaml", type="build")
|
||||
|
||||
@classmethod
|
||||
def determine_version(cls, lib):
|
||||
match = re.search(r"lib\S*\.so\.\d+\.\d+\.(\d)(\d\d)(\d\d)", lib)
|
||||
if match:
|
||||
ver = "{0}.{1}.{2}".format(
|
||||
int(match.group(1)), int(match.group(2)), int(match.group(3))
|
||||
)
|
||||
else:
|
||||
ver = None
|
||||
return ver
|
||||
|
||||
def cmake_args(self):
|
||||
args = []
|
||||
args.append(self.define("BUILD_TESTS", "ON"))
|
||||
args.append("-DCMAKE_INSTALL_LIBDIR=lib")
|
||||
return args
|
||||
@@ -24,6 +24,7 @@ class Amrex(CMakePackage, CudaPackage, ROCmPackage):
|
||||
maintainers("WeiqunZhang", "asalmgren", "etpalmer63")
|
||||
|
||||
version("develop", branch="development")
|
||||
version("23.11", sha256="49b9fea10cd2a2b6cb0fedf7eac8f7889eacc68a05ae5ac7c5702bc0eb1b3848")
|
||||
version("23.10", sha256="3c85aa0ad5f96303e797960a6e0aa37c427f6483f39cdd61dbc2f7ca16357714")
|
||||
version("23.09", sha256="1a539c2628041b17ad910afd9270332060251c8e346b1482764fdb87a4f25053")
|
||||
version("23.08", sha256="a83b7249d65ad8b6ac1881377e5f814b6db8ed8410ea5562b8ae9d4ed1f37c29")
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
import platform
|
||||
from os.path import split
|
||||
|
||||
from spack.package import *
|
||||
@@ -22,172 +23,199 @@ class Anaconda3(Package):
|
||||
|
||||
maintainers("ajkotobi")
|
||||
|
||||
version(
|
||||
"2022.10",
|
||||
sha256="e7ecbccbc197ebd7e1f211c59df2e37bc6959d081f2235d387e08c9026666acd",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2022.05",
|
||||
sha256="a7c0afe862f6ea19a596801fc138bde0463abcbce1b753e8d5c474b506a2db2d",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2021.11",
|
||||
sha256="fedf9e340039557f7b5e8a8a86affa9d299f5e9820144bd7b92ae9f7ee08ac60",
|
||||
expand=False,
|
||||
)
|
||||
if platform.machine() == "ppc64le":
|
||||
version(
|
||||
"2023.09-0",
|
||||
sha256="5ea1ed9808af95eb2655fe6a4ffdb66bea66ecd1d053fc2ee69eacc7685ef665",
|
||||
expand=False,
|
||||
)
|
||||
elif platform.machine() == "aarch64":
|
||||
version(
|
||||
"2023.09-0",
|
||||
sha256="69ee26361c1ec974199bce5c0369e3e9a71541de7979d2b9cfa4af556d1ae0ea",
|
||||
expand=False,
|
||||
)
|
||||
elif platform.machine() == "x86_64":
|
||||
version(
|
||||
"2023.09-0",
|
||||
sha256="6c8a4abb36fbb711dc055b7049a23bbfd61d356de9468b41c5140f8a11abd851",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2023.07-2",
|
||||
sha256="589fb34fe73bc303379abbceba50f3131254e85ce4e7cd819ba4276ba29cad16",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2022.10",
|
||||
sha256="e7ecbccbc197ebd7e1f211c59df2e37bc6959d081f2235d387e08c9026666acd",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2022.05",
|
||||
sha256="a7c0afe862f6ea19a596801fc138bde0463abcbce1b753e8d5c474b506a2db2d",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2021.11",
|
||||
sha256="fedf9e340039557f7b5e8a8a86affa9d299f5e9820144bd7b92ae9f7ee08ac60",
|
||||
expand=False,
|
||||
)
|
||||
|
||||
version(
|
||||
"2021.05",
|
||||
sha256="2751ab3d678ff0277ae80f9e8a74f218cfc70fe9a9cdc7bb1c137d7e47e33d53",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2020.11",
|
||||
sha256="cf2ff493f11eaad5d09ce2b4feaa5ea90db5174303d5b3fe030e16d29aeef7de",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2020.07",
|
||||
sha256="38ce717758b95b3bd0b1797cc6ccfb76f29a90c25bdfa50ee45f11e583edfdbf",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2020.02",
|
||||
sha256="2b9f088b2022edb474915d9f69a803d6449d5fdb4c303041f60ac4aefcc208bb",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2019.10",
|
||||
sha256="46d762284d252e51cd58a8ca6c8adc9da2eadc82c342927b2f66ed011d1d8b53",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2019.07",
|
||||
sha256="69581cf739365ec7fb95608eef694ba959d7d33b36eb961953f2b82cb25bdf5a",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2019.03",
|
||||
sha256="45c851b7497cc14d5ca060064394569f724b67d9b5f98a926ed49b834a6bb73a",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2018.12",
|
||||
sha256="1019d0857e5865f8a6861eaf15bfe535b87e92b72ce4f531000dc672be7fce00",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.3.1",
|
||||
sha256="d4c4256a8f46173b675dd6a62d12f566ed3487f932bab6bb7058f06c124bcc27",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.3.0",
|
||||
sha256="cfbf5fe70dd1b797ec677e63c61f8efc92dad930fd1c94d60390bb07fdc09959",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.2.0",
|
||||
sha256="09f53738b0cd3bb96f5b1bac488e5528df9906be2480fe61df40e0e0d19e3d48",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.1.0",
|
||||
sha256="7e6785caad25e33930bc03fac4994a434a21bc8401817b7efa28f53619fa9c29",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.0.1",
|
||||
sha256="55e4db1919f49c92d5abbf27a4be5986ae157f074bf9f8238963cd4582a4068a",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.0.0.1",
|
||||
sha256="092c92427f44687d789a41922ce8426fbdc3c529cc9d6d4ee6de5b62954b93b2",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.0.0",
|
||||
sha256="67f5c20232a3e493ea3f19a8e273e0618ab678fa14b03b59b1783613062143e9",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.4.0",
|
||||
sha256="3301b37e402f3ff3df216fe0458f1e6a4ccbb7e67b4d626eae9651de5ea3ab63",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.3.1",
|
||||
sha256="4447b93d2c779201e5fb50cfc45de0ec96c3804e7ad0fe201ab6b99f73e90302",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.3.0",
|
||||
sha256="e9169c3a5029aa820393ac92704eb9ee0701778a085ca7bdc3c57b388ac1beb6",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.2.0",
|
||||
sha256="73b51715a12b6382dd4df3dd1905b531bd6792d4aa7273b2377a0436d45f0e78",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.1.1",
|
||||
sha256="4f5c95feb0e7efeadd3d348dcef117d7787c799f24b0429e45017008f3534e55",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.1.0",
|
||||
sha256="11d32cf4026603d3b327dc4299863be6b815905ff51a80329085e1bb9f96c8bd",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.0.0",
|
||||
sha256="36a558a1109868661a5735f5f32607643f6dc05cf581fefb1c10fb8abbe22f39",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.5.0",
|
||||
sha256="addadcb927f15cb0b5b6e36890563d3352a8ff6a901ea753d389047d274a29a9",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.4.1",
|
||||
sha256="0735e69199fc37135930ea2fd4fb6ad0adef215a2a7ba9fd6b0a0a4daaadb1cf",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.4.0",
|
||||
sha256="fb4e480059e991f2fa632b5a9bcdd284c7f0677814cd719c11d524453f96a40d",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.3.0",
|
||||
sha256="3be5410b2d9db45882c7de07c554cf4f1034becc274ec9074b23fd37a5c87a6f",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.2.0",
|
||||
sha256="4aac68743e7706adb93f042f970373a6e7e087dbf4b02ac467c94ca4ce33d2d1",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.1.0",
|
||||
sha256="af3225ccbe8df0ffb918939e009aa57740e35058ebf9dfcf5fec794a77556c3c",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.0.1",
|
||||
sha256="3c3b834793e461f3316ad1d9a9178c67859a9d74aaf7bcade076f04134dd1e26",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.0.0",
|
||||
sha256="57ce4f97e300cf94c5724f72d992e9eecef708fdaa13bc672ae9779773056540",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2021.05",
|
||||
sha256="2751ab3d678ff0277ae80f9e8a74f218cfc70fe9a9cdc7bb1c137d7e47e33d53",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2020.11",
|
||||
sha256="cf2ff493f11eaad5d09ce2b4feaa5ea90db5174303d5b3fe030e16d29aeef7de",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2020.07",
|
||||
sha256="38ce717758b95b3bd0b1797cc6ccfb76f29a90c25bdfa50ee45f11e583edfdbf",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2020.02",
|
||||
sha256="2b9f088b2022edb474915d9f69a803d6449d5fdb4c303041f60ac4aefcc208bb",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2019.10",
|
||||
sha256="46d762284d252e51cd58a8ca6c8adc9da2eadc82c342927b2f66ed011d1d8b53",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2019.07",
|
||||
sha256="69581cf739365ec7fb95608eef694ba959d7d33b36eb961953f2b82cb25bdf5a",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2019.03",
|
||||
sha256="45c851b7497cc14d5ca060064394569f724b67d9b5f98a926ed49b834a6bb73a",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2018.12",
|
||||
sha256="1019d0857e5865f8a6861eaf15bfe535b87e92b72ce4f531000dc672be7fce00",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.3.1",
|
||||
sha256="d4c4256a8f46173b675dd6a62d12f566ed3487f932bab6bb7058f06c124bcc27",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.3.0",
|
||||
sha256="cfbf5fe70dd1b797ec677e63c61f8efc92dad930fd1c94d60390bb07fdc09959",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.2.0",
|
||||
sha256="09f53738b0cd3bb96f5b1bac488e5528df9906be2480fe61df40e0e0d19e3d48",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.1.0",
|
||||
sha256="7e6785caad25e33930bc03fac4994a434a21bc8401817b7efa28f53619fa9c29",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.0.1",
|
||||
sha256="55e4db1919f49c92d5abbf27a4be5986ae157f074bf9f8238963cd4582a4068a",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.0.0.1",
|
||||
sha256="092c92427f44687d789a41922ce8426fbdc3c529cc9d6d4ee6de5b62954b93b2",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"5.0.0",
|
||||
sha256="67f5c20232a3e493ea3f19a8e273e0618ab678fa14b03b59b1783613062143e9",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.4.0",
|
||||
sha256="3301b37e402f3ff3df216fe0458f1e6a4ccbb7e67b4d626eae9651de5ea3ab63",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.3.1",
|
||||
sha256="4447b93d2c779201e5fb50cfc45de0ec96c3804e7ad0fe201ab6b99f73e90302",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.3.0",
|
||||
sha256="e9169c3a5029aa820393ac92704eb9ee0701778a085ca7bdc3c57b388ac1beb6",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.2.0",
|
||||
sha256="73b51715a12b6382dd4df3dd1905b531bd6792d4aa7273b2377a0436d45f0e78",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.1.1",
|
||||
sha256="4f5c95feb0e7efeadd3d348dcef117d7787c799f24b0429e45017008f3534e55",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.1.0",
|
||||
sha256="11d32cf4026603d3b327dc4299863be6b815905ff51a80329085e1bb9f96c8bd",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"4.0.0",
|
||||
sha256="36a558a1109868661a5735f5f32607643f6dc05cf581fefb1c10fb8abbe22f39",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.5.0",
|
||||
sha256="addadcb927f15cb0b5b6e36890563d3352a8ff6a901ea753d389047d274a29a9",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.4.1",
|
||||
sha256="0735e69199fc37135930ea2fd4fb6ad0adef215a2a7ba9fd6b0a0a4daaadb1cf",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.4.0",
|
||||
sha256="fb4e480059e991f2fa632b5a9bcdd284c7f0677814cd719c11d524453f96a40d",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.3.0",
|
||||
sha256="3be5410b2d9db45882c7de07c554cf4f1034becc274ec9074b23fd37a5c87a6f",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.2.0",
|
||||
sha256="4aac68743e7706adb93f042f970373a6e7e087dbf4b02ac467c94ca4ce33d2d1",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.1.0",
|
||||
sha256="af3225ccbe8df0ffb918939e009aa57740e35058ebf9dfcf5fec794a77556c3c",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.0.1",
|
||||
sha256="3c3b834793e461f3316ad1d9a9178c67859a9d74aaf7bcade076f04134dd1e26",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2.0.0",
|
||||
sha256="57ce4f97e300cf94c5724f72d992e9eecef708fdaa13bc672ae9779773056540",
|
||||
expand=False,
|
||||
)
|
||||
|
||||
def url_for_version(self, version):
|
||||
url = "https://repo.anaconda.com/archive/Anaconda3-{0}-Linux-{1}.sh"
|
||||
return url.format(version, platform.machine())
|
||||
|
||||
def install(self, spec, prefix):
|
||||
dir, anaconda_script = split(self.stage.archive_file)
|
||||
|
||||
@@ -14,8 +14,7 @@ class Beatnik(CMakePackage, CudaPackage, ROCmPackage):
|
||||
|
||||
maintainers("patrickb314", "JStewart28")
|
||||
|
||||
# Add proper versions and checksums here. Will add 1.0 when a proper SHA is available
|
||||
# version("1.0", sha256="XXX")
|
||||
version("1.0", commit="ae31ef9cb44678d5ace77994b45b0778defa3d2f")
|
||||
version("develop", branch="develop")
|
||||
version("main", branch="main")
|
||||
|
||||
@@ -55,6 +54,7 @@ class Beatnik(CMakePackage, CudaPackage, ROCmPackage):
|
||||
conflicts("mpich ~rocm", when="+rocm")
|
||||
conflicts("openmpi ~cuda", when="+cuda")
|
||||
conflicts("^intel-mpi") # Heffte won't build with intel MPI because of needed C++ MPI support
|
||||
conflicts("^spectrum-mpi", when="^cuda@11.3:") # cuda-aware spectrum is broken with cuda 11.3:
|
||||
|
||||
# Propagate CUDA and AMD GPU targets to cabana
|
||||
for cuda_arch in CudaPackage.cuda_arch_values:
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from platform import machine
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
@@ -26,6 +28,7 @@ class Butterflypack(CMakePackage):
|
||||
maintainers("liuyangzhuan")
|
||||
|
||||
version("master", branch="master")
|
||||
version("2.4.0", sha256="12d04e7101b2c8292b5c62d9f42b5cd1e8a3c5af639d2665596e3e4255fd0804")
|
||||
version("2.2.2", sha256="73f67073e4291877f1eee19483a8a7b3c761eaf79a75805d52105ceedead85ea")
|
||||
version("2.2.1", sha256="4cedc2896a6b368773ce4f9003aa2c0230baf56a4464a6b899a155e01406a232")
|
||||
version("2.2.0", sha256="1ce5b8461b3c4f488cee6396419e8a6f0a1bcf95254f24d7c27bfa53b391c30b")
|
||||
@@ -74,7 +77,7 @@ def cmake_args(self):
|
||||
args.append("-Denable_openmp=%s" % ("ON" if "+openmp" in spec else "OFF"))
|
||||
if "%cce" in spec:
|
||||
# Assume the proper Cray CCE module (cce) is loaded:
|
||||
craylibs_path = env["CRAYLIBS_" + env["MACHTYPE"].capitalize()]
|
||||
craylibs_path = env["CRAYLIBS_" + machine().upper()]
|
||||
env.setdefault("LDFLAGS", "")
|
||||
env["LDFLAGS"] += " -Wl,-rpath," + craylibs_path
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ class CeresSolver(CMakePackage):
|
||||
homepage = "http://ceres-solver.org"
|
||||
url = "http://ceres-solver.org/ceres-solver-1.12.0.tar.gz"
|
||||
|
||||
version("2.2.0", sha256="48b2302a7986ece172898477c3bcd6deb8fb5cf19b3327bc49969aad4cede82d")
|
||||
version("2.0.0", sha256="10298a1d75ca884aa0507d1abb0e0f04800a92871cd400d4c361b56a777a7603")
|
||||
version("1.14.0", sha256="4744005fc3b902fed886ea418df70690caa8e2ff6b5a90f3dd88a3d291ef8e8e")
|
||||
version("1.12.0", sha256="745bfed55111e086954126b748eb9efe20e30be5b825c6dec3c525cf20afc895")
|
||||
@@ -25,12 +26,26 @@ class CeresSolver(CMakePackage):
|
||||
variant("shared", default=True, description="Build shared libraries")
|
||||
variant("examples", default=False, description="Build examples")
|
||||
|
||||
depends_on("cmake@2.8.0:", type="build", when="@1.12.0:1.14.0")
|
||||
depends_on("cmake@3.5:", type="build", when="@2.0.0")
|
||||
depends_on("cmake@3.16:3.27", type="build", when="@2.2.0")
|
||||
depends_on("eigen@3:")
|
||||
depends_on("eigen@3.3:", when="@2.0.0:")
|
||||
depends_on("lapack")
|
||||
depends_on("glog")
|
||||
depends_on("glog@0.3.5:")
|
||||
depends_on("suite-sparse", when="+suitesparse")
|
||||
|
||||
def cmake_args(self):
|
||||
args = ["-DCXSPARSE=OFF", "-DEIGENSPARSE=ON", "-DLAPACK=ON", "-DSCHUR_SPECIALIZATIONS=OFF"]
|
||||
args = []
|
||||
if self.spec.satisfies("@:2.0.0"):
|
||||
args.extend(
|
||||
[
|
||||
"-DCXSPARSE=OFF",
|
||||
"-DEIGENSPARSE=ON",
|
||||
"-DLAPACK=ON",
|
||||
"-DSCHUR_SPECIALIZATIONS=OFF",
|
||||
]
|
||||
)
|
||||
|
||||
if "+suitesparse" in self.spec:
|
||||
args.append("-DSUITESPARSE=ON")
|
||||
|
||||
@@ -17,7 +17,12 @@ class Charliecloud(AutotoolsPackage):
|
||||
tags = ["e4s"]
|
||||
|
||||
version("master", branch="master")
|
||||
version("0.34", sha256="034080c162949f4344ae1011cda026d4bb3ecd5cdb53135ac06d236f87e3b27d")
|
||||
version("0.35", sha256="042f5be5ed8eda95f45230b4647510780142a50adb4e748be57e8dd8926b310e")
|
||||
version(
|
||||
"0.34",
|
||||
deprecated=True,
|
||||
sha256="034080c162949f4344ae1011cda026d4bb3ecd5cdb53135ac06d236f87e3b27d",
|
||||
)
|
||||
version(
|
||||
"0.33",
|
||||
deprecated=True,
|
||||
|
||||
@@ -32,6 +32,13 @@ class ClingoBootstrap(Clingo):
|
||||
description="Enable a series of Spack-specific optimizations (PGO, LTO, mimalloc)",
|
||||
)
|
||||
|
||||
variant(
|
||||
"force_setuptools",
|
||||
default=False,
|
||||
description="Force a dependency on setuptools to help the old concretizer",
|
||||
)
|
||||
depends_on("py-setuptools", type="build", when="+force_setuptools")
|
||||
|
||||
# Enable LTO
|
||||
conflicts("~ipo", when="+optimized")
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ class Clingo(CMakePackage):
|
||||
# TODO: Simplify this after Spack 0.21 release. The old concretizer has problems with
|
||||
# py-setuptools ^python@3.6, so we only apply the distutils -> setuptools patch for Python 3.12
|
||||
with when("@:5.6.1 ^python@3.12:"):
|
||||
patch("setuptools.patch")
|
||||
patch("setuptools-2.patch")
|
||||
depends_on("py-setuptools", type="build")
|
||||
|
||||
def patch(self):
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
diff --git a/cmake/python-site.py b/cmake/python-site.py
|
||||
--- a/cmake/python-site.py
|
||||
+++ b/cmake/python-site.py
|
||||
@@ -1,3 +1,4 @@
|
||||
+import setuptools # makes import distutils work
|
||||
from distutils.sysconfig import get_python_lib, get_config_vars
|
||||
import sys
|
||||
if sys.argv[1] == "prefix":
|
||||
@@ -1,14 +0,0 @@
|
||||
diff --git a/cmake/python-site.py b/cmake/python-site.py
|
||||
index 1e7fc8ce..95ef827f 100644
|
||||
--- a/cmake/python-site.py
|
||||
+++ b/cmake/python-site.py
|
||||
@@ -1,4 +1,7 @@
|
||||
-from distutils.sysconfig import get_python_lib, get_config_vars
|
||||
+try:
|
||||
+ from setuptools.sysconfig import get_python_lib, get_config_vars
|
||||
+except ImportError:
|
||||
+ from distutils.sysconfig import get_python_lib, get_config_vars
|
||||
import sys
|
||||
if sys.argv[1] == "prefix":
|
||||
print(get_python_lib(True, False, sys.argv[2] if len(sys.argv) > 2 else None))
|
||||
|
||||
@@ -18,6 +18,7 @@ class Collier(CMakePackage):
|
||||
|
||||
maintainers("vvolkl")
|
||||
|
||||
version("1.2.8", sha256="5cb24ce24ba1f62b7a96c655b31e9fddccc603eff31e60f9033b16354a6afd89")
|
||||
version("1.2.7", sha256="fde4b144a17c1bf5aa2ceaa86c71c79da10c9de8fec7bd33c8bffb4198acd5ca")
|
||||
version("1.2.6", sha256="b0d517868c71d2d1b8b6d3e0c370a43c9eb18ea8393a6e80070a5a2206f7de36")
|
||||
version("1.2.5", sha256="3ec58a975ff0c3b1ca870bc38973476c923ff78fd3dd5850e296037852b94a8b")
|
||||
|
||||
@@ -29,6 +29,7 @@ class Dbus(AutotoolsPackage):
|
||||
version("1.8.2", sha256="5689f7411165adc953f37974e276a3028db94447c76e8dd92efe910c6d3bae08")
|
||||
|
||||
variant("xml_docs", default=False, description="Build XML documentation")
|
||||
variant("system-socket", default="default", description="Location for the DBus system socket")
|
||||
|
||||
depends_on("pkgconfig", type="build")
|
||||
depends_on("docbook-xml", type="build")
|
||||
@@ -41,6 +42,9 @@ class Dbus(AutotoolsPackage):
|
||||
def configure_args(self):
|
||||
args = ["--disable-systemd", "--disable-launchd"]
|
||||
args += self.enable_or_disable("xml-docs", variant="xml_docs")
|
||||
socket = self.spec.variants["system-socket"].value
|
||||
if socket != "default":
|
||||
args += ["--with-system-socket={0}".format(socket)]
|
||||
return args
|
||||
|
||||
@run_after("install")
|
||||
|
||||
@@ -24,6 +24,7 @@ class Dd4hep(CMakePackage):
|
||||
tags = ["hep"]
|
||||
|
||||
version("master", branch="master")
|
||||
version("1.27", sha256="51fbd0f91f2511261d9b01e4b3528c658bea1ea1b5d67b25b6812615e782a902")
|
||||
version("1.26", sha256="de2cc8d8e99217e23fdf0a55b879d3fd3a864690d6660e7808f1ff99eb47f384")
|
||||
version("1.25.1", sha256="6267e76c74fbb346aa881bc44de84434ebe788573f2997a189996252fc5b271b")
|
||||
version("1.25", sha256="102a049166a95c2f24fc1c03395a819fc4501c175bf7915d69ccc660468d094d")
|
||||
|
||||
@@ -81,17 +81,9 @@ class Eccodes(CMakePackage):
|
||||
variant("shared", default=True, description="Build shared versions of the libraries")
|
||||
|
||||
variant(
|
||||
"definitions",
|
||||
values=disjoint_sets(("auto",), ("default",) + tuple(_definitions.keys())).with_default(
|
||||
"auto"
|
||||
),
|
||||
description="List of definitions to install",
|
||||
)
|
||||
|
||||
variant(
|
||||
"samples",
|
||||
values=disjoint_sets(("auto",), ("default",)).with_default("auto"),
|
||||
description="List of samples to install",
|
||||
"extra_definitions",
|
||||
values=any_combination_of(*_definitions.keys()),
|
||||
description="List of extra definitions to install",
|
||||
)
|
||||
|
||||
depends_on("netcdf-c", when="+netcdf")
|
||||
@@ -132,7 +124,7 @@ class Eccodes(CMakePackage):
|
||||
for center, definitions in _definitions.items():
|
||||
kwargs = definitions.get("conflicts", None)
|
||||
if kwargs:
|
||||
conflicts("definitions={0}".format(center), **kwargs)
|
||||
conflicts("extra_definitions={0}".format(center), **kwargs)
|
||||
for kwargs in definitions.get("resources", []):
|
||||
resource(
|
||||
name=center,
|
||||
@@ -357,25 +349,12 @@ def cmake_args(self):
|
||||
if "+memfs" in self.spec:
|
||||
args.append(self.define("PYTHON_EXECUTABLE", python.path))
|
||||
|
||||
definitions = self.spec.variants["definitions"].value
|
||||
|
||||
if "auto" not in definitions:
|
||||
args.append(
|
||||
self.define("ENABLE_INSTALL_ECCODES_DEFINITIONS", "default" in definitions)
|
||||
)
|
||||
|
||||
samples = self.spec.variants["samples"].value
|
||||
|
||||
if "auto" not in samples:
|
||||
args.append(self.define("ENABLE_INSTALL_ECCODES_SAMPLES", "default" in samples))
|
||||
|
||||
return args
|
||||
|
||||
@run_after("install")
|
||||
def install_extra_definitions(self):
|
||||
noop = set(["auto", "none", "default"])
|
||||
for center in self.spec.variants["definitions"].value:
|
||||
if center not in noop:
|
||||
for center in self.spec.variants["extra_definitions"].value:
|
||||
if center != "none":
|
||||
center_dir = "definitions.{0}".format(center)
|
||||
install_tree(
|
||||
join_path(self.stage.source_path, "spack-definitions", center_dir),
|
||||
|
||||
@@ -14,11 +14,12 @@ class Edm4hep(CMakePackage):
|
||||
url = "https://github.com/key4hep/EDM4hep/archive/v00-01.tar.gz"
|
||||
git = "https://github.com/key4hep/EDM4hep.git"
|
||||
|
||||
maintainers("vvolkl", "jmcarcell")
|
||||
maintainers("vvolkl", "jmcarcell", "tmadlener")
|
||||
|
||||
tags = ["hep", "key4hep"]
|
||||
|
||||
version("master", branch="master")
|
||||
version("0.10.1", sha256="28a3bd4df899309b14ec0d441f8b6ed0065206a08a0018113bb490e9d008caed")
|
||||
version("0.10", sha256="a95c917c19793cfad6b0959854a653c5ce698c965598cabd649d544da07712c0")
|
||||
version(
|
||||
"0.9",
|
||||
|
||||
@@ -62,10 +62,14 @@ class Exago(CMakePackage, CudaPackage, ROCmPackage):
|
||||
variant("raja", default=False, description="Enable/Disable RAJA")
|
||||
variant("python", default=True, when="@1.4:", description="Enable/Disable Python bindings")
|
||||
variant("logging", default=True, description="Enable/Disable spdlog based logging")
|
||||
|
||||
conflicts(
|
||||
"+python", when="+ipopt+rocm", msg="Python bindings require -fPIC with Ipopt for rocm."
|
||||
)
|
||||
|
||||
# Adds ExaGO's python wrapper to PYTHONPATH
|
||||
extends("python", when="+python")
|
||||
|
||||
# Solver options
|
||||
variant("hiop", default=False, description="Enable/Disable HiOp")
|
||||
variant("ipopt", default=False, description="Enable/Disable IPOPT")
|
||||
@@ -153,9 +157,10 @@ class Exago(CMakePackage, CudaPackage, ROCmPackage):
|
||||
# This is no longer a requirement in RAJA > 0.14
|
||||
depends_on("umpire+cuda~shared", when="+raja+cuda ^raja@:0.14")
|
||||
|
||||
depends_on("petsc@3.13:3.14", when="@:1.2.99")
|
||||
depends_on("petsc@3.16.0:3.16", when="@1.3.0:1.4")
|
||||
depends_on("petsc@3.18.0:3.19", when="@1.5.0:")
|
||||
depends_on("petsc@3.13:3.14", when="@:1.2")
|
||||
depends_on("petsc@3.16", when="@1.3:1.4")
|
||||
depends_on("petsc@3.18:3.19", when="@1.5")
|
||||
depends_on("petsc@3.20:", when="@1.6:")
|
||||
|
||||
depends_on("petsc~mpi", when="~mpi")
|
||||
|
||||
|
||||
@@ -6,11 +6,13 @@
|
||||
import os
|
||||
|
||||
import spack.util.executable
|
||||
from spack.build_systems.autotools import AutotoolsBuilder
|
||||
from spack.build_systems.cmake import CMakeBuilder
|
||||
from spack.package import *
|
||||
|
||||
|
||||
class FluxSched(AutotoolsPackage):
|
||||
"""A scheduler for flux-core (pre-alpha)"""
|
||||
class FluxSched(CMakePackage, AutotoolsPackage):
|
||||
"""A scheduler for flux-core"""
|
||||
|
||||
homepage = "https://github.com/flux-framework/flux-sched"
|
||||
url = "https://github.com/flux-framework/flux-sched/releases/download/v0.5.0/flux-sched-0.5.0.tar.gz"
|
||||
@@ -20,6 +22,7 @@ class FluxSched(AutotoolsPackage):
|
||||
maintainers("grondo")
|
||||
|
||||
version("master", branch="master")
|
||||
version("0.29.0", sha256="b93b18788e677535aa8ef945cdbeeced6d1408a4d16cb4a816ead53f31dd78d2")
|
||||
version("0.28.0", sha256="9431c671bed5d76fd95b4a4a7f36224d4bf76f416a2a1a5c4908f3ca790d434d")
|
||||
version("0.27.0", sha256="1e131924440c904fa0c925b7aa14c47b97f4e67b43af7efd2ebc0ef7ce90eb7c")
|
||||
version("0.26.0", sha256="184faec800cf45952ef79bda113f710bf91a05be584034d36a3234627d4a54c7")
|
||||
@@ -81,6 +84,18 @@ class FluxSched(AutotoolsPackage):
|
||||
depends_on("automake", type="build", when="@master")
|
||||
depends_on("libtool", type="build", when="@master")
|
||||
|
||||
# Set default to cmake so master (and branches) use it
|
||||
build_system(
|
||||
conditional("cmake", when="@0.29.0:"),
|
||||
conditional("autotools", when="@:0.28.0"),
|
||||
default="cmake",
|
||||
)
|
||||
|
||||
# Required dependencies
|
||||
with when("build_system=cmake"):
|
||||
generator("ninja")
|
||||
depends_on("cmake@3.18:", type="build")
|
||||
|
||||
# Disable t5000-valgrind.t by default due to false positives not yet
|
||||
# in the suppressions file. (This patch will be in v0.21.0)
|
||||
patch("no-valgrind.patch", when="@:0.20.0")
|
||||
@@ -136,19 +151,6 @@ def patch(self):
|
||||
filter_file("NULL", "nullptr", "resource/schema/sched_data.hpp")
|
||||
filter_file("size_t", "std::size_t", "resource/planner/planner.h")
|
||||
|
||||
def configure_args(self):
|
||||
args = []
|
||||
if self.spec.satisfies("@0.9.0:"):
|
||||
args.append("CXXFLAGS=-Wno-uninitialized")
|
||||
if self.spec.satisfies("%clang@12:"):
|
||||
args.append("CXXFLAGS=-Wno-defaulted-function-deleted")
|
||||
if self.spec.satisfies("%oneapi"):
|
||||
args.append("CXXFLAGS=-Wno-tautological-constant-compare")
|
||||
# flux-sched's ax_boost is sometimes weird about non-system locations
|
||||
# explicitly setting the path guarantees success
|
||||
args.append("--with-boost={0}".format(self.spec["boost"].prefix))
|
||||
return args
|
||||
|
||||
@property
|
||||
def lua_version(self):
|
||||
return self.spec["lua"].version.up_to(2)
|
||||
@@ -173,3 +175,23 @@ def setup_run_environment(self, env):
|
||||
env.prepend_path("FLUX_MODULE_PATH", self.prefix.lib.flux.modules.sched)
|
||||
env.prepend_path("FLUX_EXEC_PATH", self.prefix.libexec.flux.cmd)
|
||||
env.prepend_path("FLUX_RC_EXTRA", self.prefix.etc.flux)
|
||||
|
||||
|
||||
class CMakeBuilder(CMakeBuilder):
|
||||
def cmake_args(self):
|
||||
return []
|
||||
|
||||
|
||||
class AutotoolsBuilder(AutotoolsBuilder):
|
||||
def configure_args(self):
|
||||
args = []
|
||||
if self.spec.satisfies("@0.9.0:"):
|
||||
args.append("CXXFLAGS=-Wno-uninitialized")
|
||||
if self.spec.satisfies("%clang@12:"):
|
||||
args.append("CXXFLAGS=-Wno-defaulted-function-deleted")
|
||||
if self.spec.satisfies("%oneapi"):
|
||||
args.append("CXXFLAGS=-Wno-tautological-constant-compare")
|
||||
# flux-sched's ax_boost is sometimes weird about non-system locations
|
||||
# explicitly setting the path guarantees success
|
||||
args.append("--with-boost={0}".format(self.spec["boost"].prefix))
|
||||
return args
|
||||
|
||||
@@ -14,7 +14,7 @@ class Fp16(CMakePackage):
|
||||
git = "https://github.com/Maratyszcza/FP16.git"
|
||||
|
||||
version("master", branch="master")
|
||||
version("2020-05-14", commit="4dfe081cf6bcd15db339cf2680b9281b8451eeb3") # py-torch@1.5:1.9
|
||||
version("2020-05-14", commit="4dfe081cf6bcd15db339cf2680b9281b8451eeb3") # py-torch@1.5:
|
||||
version("2018-11-28", commit="febbb1c163726b5db24bed55cc9dc42529068997") # py-torch@1.1:1.4
|
||||
version("2018-10-10", commit="34d4bf01bbf7376f2baa71b8fa148b18524d45cf") # py-torch@1.0
|
||||
version("2018-02-25", commit="43d6d17df48ebf622587e7ed9472ea76573799b9") # py-torch@:0.4
|
||||
@@ -29,31 +29,11 @@ class Fp16(CMakePackage):
|
||||
destination="deps",
|
||||
placement="psimd",
|
||||
)
|
||||
resource(
|
||||
name="googletest",
|
||||
url="https://github.com/google/googletest/archive/release-1.8.0.zip",
|
||||
sha256="f3ed3b58511efd272eb074a3a6d6fb79d7c2e6a0e374323d1e6bcbcc1ef141bf",
|
||||
destination="deps",
|
||||
placement="googletest",
|
||||
)
|
||||
resource(
|
||||
name="googlebenchmark",
|
||||
url="https://github.com/google/benchmark/archive/v1.2.0.zip",
|
||||
sha256="cc463b28cb3701a35c0855fbcefb75b29068443f1952b64dd5f4f669272e95ea",
|
||||
destination="deps",
|
||||
placement="googlebenchmark",
|
||||
)
|
||||
|
||||
def cmake_args(self):
|
||||
return [
|
||||
self.define("PSIMD_SOURCE_DIR", join_path(self.stage.source_path, "deps", "psimd")),
|
||||
self.define(
|
||||
"GOOGLETEST_SOURCE_DIR", join_path(self.stage.source_path, "deps", "googletest")
|
||||
),
|
||||
self.define(
|
||||
"GOOGLEBENCHMARK_SOURCE_DIR",
|
||||
join_path(self.stage.source_path, "deps", "googlebenchmark"),
|
||||
),
|
||||
self.define("FP16_BUILD_TESTS", self.run_tests),
|
||||
self.define("FP16_BUILD_BENCHMARKS", self.run_tests),
|
||||
self.define("FP16_BUILD_TESTS", False),
|
||||
# https://github.com/Maratyszcza/FP16/issues/21
|
||||
self.define("FP16_BUILD_BENCHMARKS", False),
|
||||
]
|
||||
|
||||
@@ -3,7 +3,11 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
import glob
|
||||
import os
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class Freesurfer(Package):
|
||||
@@ -14,11 +18,11 @@ class Freesurfer(Package):
|
||||
|
||||
# A license is required, but is free to obtain.
|
||||
license_required = True
|
||||
license_files = ["./license.txt"]
|
||||
license_files = [".license"]
|
||||
|
||||
maintainers("robgics")
|
||||
|
||||
version("7.4.1", sha256="eb6545d1ffdee17a90abd2e7dc444aa1091a6138e257f6f956a7ff214635b092")
|
||||
version("7.4.1", sha256="313a96caeb246c5985f483633b5cf43f86ed8f7ccc6d6acfac8eedb638443010")
|
||||
version("7.4.0", sha256="6b65c2edf3b88973ced0324269a88966c541f221b799337c6570c38c2f884431")
|
||||
version("7.3.2", sha256="58518d3ee5abd2e05109208aed2eef145c4e3b994164df8c4e0033c1343b9e56")
|
||||
version("7.2.0", sha256="4cca78602f898bf633428b9d82cbb9b07e3ab97a86c620122050803779c86d62")
|
||||
@@ -27,6 +31,9 @@ class Freesurfer(Package):
|
||||
|
||||
depends_on("mesa-glu")
|
||||
depends_on("qt")
|
||||
depends_on("tcsh")
|
||||
depends_on("bc")
|
||||
depends_on("perl")
|
||||
|
||||
def url_for_version(self, version):
|
||||
return "https://surfer.nmr.mgh.harvard.edu/pub/dist/freesurfer/{0}/freesurfer-linux-centos7_x86_64-{1}.tar.gz".format(
|
||||
@@ -34,10 +41,24 @@ def url_for_version(self, version):
|
||||
)
|
||||
|
||||
def setup_run_environment(self, env):
|
||||
source_file = join_path(self.prefix, "SetUpFreeSurfer.sh")
|
||||
env.prepend_path("PATH", self.prefix.bin)
|
||||
env.set("FREESURFER_HOME", self.prefix)
|
||||
env.set("SUBJECTS_DIR", join_path(self.prefix, "subjects"))
|
||||
env.set("FUNCTIONALS_DIR", join_path(self.prefix, "sessions"))
|
||||
env.append_path("PERL5LIB", join_path(self.prefix, "mni/share/perl5"))
|
||||
env.append_path("PATH", join_path(self.prefix, "mni/bin"))
|
||||
env.extend(EnvironmentModifications.from_sourcing_file(source_file))
|
||||
|
||||
def install(self, spec, prefix):
|
||||
scripts = ["sources.csh", "SetUpFreeSurfer.csh"]
|
||||
scripts.extend(glob.glob("bin/*"))
|
||||
scripts.extend(glob.glob("subjects/**/*", recursive=True))
|
||||
scripts.extend(glob.glob("fsfast/bin/*", recursive=True))
|
||||
scripts.extend(glob.glob("mni/bin/*", recursive=True))
|
||||
for s in scripts:
|
||||
if os.path.isfile(s):
|
||||
filter_file(r"(\/usr)?(\/local?)\/bin\/tcsh", "/usr/bin/env -S tcsh", s)
|
||||
filter_file(r"(\/usr)?(\/local?)\/bin\/csh", "/usr/bin/env -S csh", s)
|
||||
filter_file(r"(\/usr)?(\/local)?\/bin\/perl", "/usr/bin/env -S perl", s)
|
||||
install_tree(".", prefix)
|
||||
|
||||
@@ -17,6 +17,8 @@ class Gaudi(CMakePackage):
|
||||
tags = ["hep"]
|
||||
|
||||
version("master", branch="master")
|
||||
version("37.1", sha256="1d7038fd5dfb5f2517ce57623cf8090549ffe2ea8f0171d534e5c1ca20bd009a")
|
||||
version("37.0", sha256="823f3821a4f498ddd2dd123fbb8a3787b361ddfd818f4ab13572076fc9afdfe4")
|
||||
version("36.14", sha256="b11e0afcb797d61a305856dfe8079d48d74c6b6867ceccc0a83aab5978c9ba5f")
|
||||
version("36.13", sha256="41e711c83428663996c825044b268ce515bef85dad74b4a9453f2207b4b1be7b")
|
||||
version("36.12", sha256="dfce9156cedfa0a7234f880a3c395e592a5f3dc79070d5d196fdb94b83ae203e")
|
||||
@@ -72,7 +74,8 @@ class Gaudi(CMakePackage):
|
||||
depends_on("cppgsl")
|
||||
depends_on("fmt", when="@33.2:")
|
||||
depends_on("fmt@:8", when="@:36.9")
|
||||
depends_on("intel-tbb@:2020.3")
|
||||
depends_on("intel-tbb@:2020.3", when="@:37.0")
|
||||
depends_on("tbb", when="@37.1:")
|
||||
depends_on("uuid")
|
||||
depends_on("nlohmann-json", when="@35.0:")
|
||||
depends_on("python", type=("build", "run"))
|
||||
|
||||
@@ -13,7 +13,10 @@ class Gloo(CMakePackage, CudaPackage):
|
||||
git = "https://github.com/facebookincubator/gloo.git"
|
||||
|
||||
version("master", branch="master")
|
||||
version("2021-05-21", commit="c22a5cfba94edf8ea4f53a174d38aa0c629d070f") # py-torch@1.10:
|
||||
version("2023-05-19", commit="597accfd79f5b0f9d57b228dec088ca996686475") # py-torch@2.1:
|
||||
version("2023-01-17", commit="10909297fedab0a680799211a299203e53515032") # py-torch@2.0
|
||||
version("2022-05-18", commit="5b143513263133af2b95547e97c07cebeb72bf72") # py-torch@1.13
|
||||
version("2021-05-21", commit="c22a5cfba94edf8ea4f53a174d38aa0c629d070f") # py-torch@1.10:1.12
|
||||
version("2021-05-04", commit="6f7095f6e9860ce4fd682a7894042e6eba0996f1") # py-torch@1.9
|
||||
version("2020-09-18", commit="3dc0328fe6a9d47bd47c0c6ca145a0d8a21845c6") # py-torch@1.7:1.8
|
||||
version("2020-03-17", commit="113bde13035594cafdca247be953610b53026553") # py-torch@1.5:1.6
|
||||
|
||||
@@ -59,7 +59,7 @@ class GoBootstrap(Package):
|
||||
|
||||
# determine system os and architecture/target
|
||||
os = platform.system().lower()
|
||||
target = go_targets[platform.machine().lower()]
|
||||
target = go_targets.get(platform.machine().lower(), platform.machine().lower())
|
||||
|
||||
# construct releases for current system configuration
|
||||
for release in go_releases:
|
||||
|
||||
@@ -20,7 +20,7 @@ class Hdf5(CMakePackage):
|
||||
"""
|
||||
|
||||
homepage = "https://portal.hdfgroup.org"
|
||||
url = "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.8/src/hdf5-1.10.8.tar.gz"
|
||||
url = "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14/hdf5-1.14.3/src/hdf5-1.14.3.tar.gz"
|
||||
list_url = "https://support.hdfgroup.org/ftp/HDF5/releases"
|
||||
list_depth = 3
|
||||
git = "https://github.com/HDFGroup/hdf5.git"
|
||||
@@ -41,6 +41,11 @@ class Hdf5(CMakePackage):
|
||||
|
||||
# Odd versions are considered experimental releases
|
||||
# Even versions are maintenance versions
|
||||
version(
|
||||
"1.14.3",
|
||||
sha256="09cdb287aa7a89148c1638dd20891fdbae08102cf433ef128fd345338aa237c7",
|
||||
preferred=True,
|
||||
)
|
||||
version(
|
||||
"1.14.2",
|
||||
sha256="1c342e634008284a8c2794c8e7608e2eaf26d01d445fb3dfd7f33cb2fb51ac53",
|
||||
@@ -71,6 +76,11 @@ class Hdf5(CMakePackage):
|
||||
sha256="a62dcb276658cb78e6795dd29bf926ed7a9bc4edf6e77025cd2c689a8f97c17a",
|
||||
preferred=True,
|
||||
)
|
||||
version(
|
||||
"1.10.11",
|
||||
sha256="341684c5c0976b8c7e6951735a400275a90693604464cac73e9f323c696fc79c",
|
||||
preferred=True,
|
||||
)
|
||||
version(
|
||||
"1.10.10",
|
||||
sha256="a6877ab7bd5d769d2d68618fdb54beb50263dcc2a8c157fe7e2186925cdb02db",
|
||||
@@ -657,7 +667,7 @@ def ensure_parallel_compiler_wrappers(self):
|
||||
# 1.10.6 and 1.12.0. The current develop versions do not produce 'h5pfc'
|
||||
# at all. Here, we make sure that 'h5pfc' is available when Fortran and
|
||||
# MPI support are enabled (only for versions that generate 'h5fc').
|
||||
if self.spec.satisfies("@1.8.22:1.8," "1.10.6:1.10," "1.12.0:1.12" "+fortran+mpi"):
|
||||
if self.spec.satisfies("@1.8.22:1.8," "1.10.6:1.10.9," "1.12.0:1.12" "+fortran+mpi"):
|
||||
with working_dir(self.prefix.bin):
|
||||
# No try/except here, fix the condition above instead:
|
||||
symlink("h5fc", "h5pfc")
|
||||
|
||||
@@ -10,7 +10,7 @@ class Heffte(CMakePackage, CudaPackage, ROCmPackage):
|
||||
"""Highly Efficient FFT for Exascale"""
|
||||
|
||||
homepage = "https://github.com/icl-utk-edu/heffte/"
|
||||
url = "https://github.com/icl-utk-edu/heffte/archive/refs/tags/v2.3.0.tar.gz"
|
||||
url = "https://github.com/icl-utk-edu/heffte/archive/refs/tags/v2.4.0.tar.gz"
|
||||
git = "https://github.com/icl-utk-edu/heffte/"
|
||||
|
||||
maintainers("mkstoyanov", "G-Ragghianti")
|
||||
@@ -19,6 +19,7 @@ class Heffte(CMakePackage, CudaPackage, ROCmPackage):
|
||||
test_requires_compiler = True
|
||||
|
||||
version("develop", branch="master")
|
||||
version("2.4.0", sha256="02310fb4f9688df02f7181667e61c3adb7e38baf79611d80919d47452ff7881d")
|
||||
version("2.3.0", sha256="63db8c9a8822211d23e29f7adf5aa88bb462c91d7a18c296c3ef3a06be8d6171")
|
||||
version("2.2.0", sha256="332346d5c1d1032288d09839134c79e4a9704e213a2d53051e96c3c414c74df0")
|
||||
version("2.1.0", sha256="63b8ea45a220afc4fa0b14769c0dd291e614a2fe9d5a91c50d28f16ee29b3f1c")
|
||||
@@ -27,29 +28,13 @@ class Heffte(CMakePackage, CudaPackage, ROCmPackage):
|
||||
sha256="b575fafe19a635265904ca302d48e778341b1567c055ea7f2939c8c6718f7212",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"1.0",
|
||||
sha256="00e66cdff664ba90eeb26b4824f2a7341ba791b1d7220ece8180aba7623d36d5",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"0.2",
|
||||
sha256="6e606aa9de91912925ec49f463de4369459e509e0e21a97ca72dfa07651056e5",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"0.1",
|
||||
sha256="bcdc940c4cb254b178446d16c969b85ea6b5c69fdf4b6332bb3c8fbce00bccdf",
|
||||
deprecated=True,
|
||||
)
|
||||
|
||||
patch("threads10.patch", when="@1.0")
|
||||
patch("fortran200.patch", when="@2.0.0")
|
||||
patch("cmake-magma-v230.patch", when="@2.3.0")
|
||||
patch("fortran200.patch", when="@2.0.0")
|
||||
|
||||
depends_on("cmake@3.10:", type=("build", "run"))
|
||||
depends_on("cmake@3.19:", when="@develop", type=("build", "run"))
|
||||
depends_on("cmake@3.21:", when="@develop+rocm", type=("build", "run"))
|
||||
depends_on("cmake@3.10:", when="@:2.3.0", type=("build", "run"))
|
||||
depends_on("cmake@3.19:", when="@2.4.0:", type=("build", "run"))
|
||||
depends_on("cmake@3.21:", when="@2.4.0:+rocm", type=("build", "run"))
|
||||
|
||||
variant("shared", default=True, description="Builds with shared libraries")
|
||||
variant("fftw", default=False, description="Builds with support for FFTW backend")
|
||||
@@ -64,14 +49,9 @@ class Heffte(CMakePackage, CudaPackage, ROCmPackage):
|
||||
depends_on("py-numba", when="+python+cuda", type=("build", "run"))
|
||||
extends("python", when="+python", type=("build", "run"))
|
||||
|
||||
conflicts("~fftw", when="@:2.1.0~mkl~cuda") # requires at least one backend
|
||||
conflicts("+fftw", when="+mkl@:1.0") # old API supports at most one CPU backend
|
||||
conflicts("^openmpi~cuda", when="+cuda") # +cuda requires CUDA enabled OpenMPI
|
||||
conflicts("~cuda~rocm", when="+magma") # magma requires CUDA or HIP
|
||||
conflicts("+rocm", when="@:2.1.0") # heffte+rocm is in in development in spack
|
||||
conflicts("+python", when="@:1.0") # python support was added post v1.0
|
||||
conflicts("+fortran", when="@:1.0") # fortran support was added post v1.0
|
||||
conflicts("+magma", when="@:1.0") # magma support was added post v1.0
|
||||
|
||||
depends_on("mpi", type=("build", "run"))
|
||||
|
||||
@@ -80,8 +60,8 @@ class Heffte(CMakePackage, CudaPackage, ROCmPackage):
|
||||
depends_on("cuda@8.0:", when="+cuda", type=("build", "run"))
|
||||
depends_on("hip@3.8.0:", when="+rocm", type=("build", "run"))
|
||||
depends_on("rocfft@3.8.0:", when="+rocm", type=("build", "run"))
|
||||
depends_on("hip@5.2.3:", when="@develop+rocm", type=("build", "run"))
|
||||
depends_on("rocfft@5.2.3:", when="@develop+rocm", type=("build", "run"))
|
||||
depends_on("hip@5.2.3:", when="@2.4.0:+rocm", type=("build", "run"))
|
||||
depends_on("rocfft@5.2.3:", when="@2.4.0:+rocm", type=("build", "run"))
|
||||
depends_on("magma@2.5.3:", when="+cuda+magma", type=("build", "run"))
|
||||
depends_on("magma+rocm@2.6.1:", when="+magma+rocm @2.1:", type=("build", "run"))
|
||||
depends_on("rocblas@3.8:", when="+magma+rocm", type=("build", "run"))
|
||||
@@ -94,6 +74,7 @@ class Heffte(CMakePackage, CudaPackage, ROCmPackage):
|
||||
def cmake_args(self):
|
||||
args = [
|
||||
"-DHeffte_SEQUENTIAL_TESTING=ON",
|
||||
"-DHeffte_ENABLE_TESTING=ON",
|
||||
self.define_from_variant("BUILD_SHARED_LIBS", "shared"),
|
||||
self.define_from_variant("Heffte_ENABLE_CUDA", "cuda"),
|
||||
self.define_from_variant("Heffte_ENABLE_ROCM", "rocm"),
|
||||
@@ -146,22 +127,26 @@ def test_make_test(self):
|
||||
cmake_dir = self.test_suite.current_test_cache_dir.testing
|
||||
|
||||
options = [cmake_dir]
|
||||
options.append(self.define("Heffte_DIR", self.spec.prefix.lib.cmake.Heffte))
|
||||
if "+rocm" in self.spec:
|
||||
# path name is 'hsa-runtime64' but python cannot have '-' in variable name
|
||||
hsa_runtime = join_path(self.spec["hsa-rocr-dev"].prefix.lib.cmake, "hsa-runtime64")
|
||||
options.extend(
|
||||
[
|
||||
f"-Dhip_DIR={self.spec['hip'].prefix.lib.cmake.hip}",
|
||||
"-DAMDDeviceLibs_DIR="
|
||||
+ f"{self.spec['llvm-amdgpu'].prefix.lib.cmake.AMDDeviceLibs}",
|
||||
f"-Damd_comgr_DIR={self.spec['comgr'].prefix.lib.cmake.amd_comgr}",
|
||||
"-Dhsa-runtime64_DIR="
|
||||
+ f"{self.spec['hsa-rocr-dev'].prefix.lib.cmake.hsa-runtime64}",
|
||||
"-DHSA_HEADER={self.spec['hsa-rocr-dev'].prefix.include}",
|
||||
"-Drocfft_DIR={self.spec['rocfft'].prefix.lib.cmake.rocfft}",
|
||||
self.define("hip_DIR", self.spec["hip"].prefix.lib.cmake.hip),
|
||||
self.define(
|
||||
"AMDDeviceLibs_DIR",
|
||||
self.spec["llvm-amdgpu"].prefix.lib.cmake.AMDDeviceLibs,
|
||||
),
|
||||
self.define("amd_comgr_DIR", self.spec["comgr"].prefix.lib.cmake.amd_comgr),
|
||||
self.define("hsa-runtime64_DIR", hsa_runtime),
|
||||
self.define("HSA_HEADER", self.spec["hsa-rocr-dev"].prefix.include),
|
||||
self.define("rocfft_DIR", self.spec["rocfft"].prefix.lib.cmake.rocfft),
|
||||
]
|
||||
)
|
||||
|
||||
# Provide the root directory of the MPI installation.
|
||||
options.append(f"-DMPI_HOME={self.spec['mpi'].prefix}")
|
||||
options.append(self.define("MPI_HOME", self.spec["mpi"].prefix))
|
||||
|
||||
cmake = which(self.spec["cmake"].prefix.bin.cmake)
|
||||
cmake(*options)
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
diff --git a/cmake/HeffteConfig.cmake b/cmake/HeffteConfig.cmake
|
||||
index bd67de9..ca06086 100644
|
||||
--- a/cmake/HeffteConfig.cmake
|
||||
+++ b/cmake/HeffteConfig.cmake
|
||||
@@ -19,6 +19,8 @@ if (NOT TARGET MPI::MPI_CXX)
|
||||
find_package(MPI REQUIRED)
|
||||
endif()
|
||||
|
||||
+find_package(Threads)
|
||||
+
|
||||
if ("@BUILD_SHARED_LIBS@")
|
||||
set(Heffte_SHARED_FOUND "ON")
|
||||
else()
|
||||
@@ -17,6 +17,7 @@ class Highfive(CMakePackage):
|
||||
maintainers("alkino")
|
||||
|
||||
version("develop", branch="master")
|
||||
version("2.8.0", sha256="cd2502cae61bfb00e32dd18c9dc75289e09ad1db5c2a46d3b0eefd32e0df983b")
|
||||
version("2.7.1", sha256="25b4c51a94d1e670dc93b9b73f51e79b65d8ff49bcd6e5d5582d5ecd2789a249")
|
||||
version("2.7.0", sha256="8e05672ddf81a59ce014b1d065bd9a8c5034dbd91a5c2578e805ef880afa5907")
|
||||
version("2.6.2", sha256="ab51b9fbb49e877dd1aa7b53b4b26875f41e4e0b8ee0fc2f1d735e0d1e43d708")
|
||||
|
||||
@@ -22,33 +22,43 @@ class Hiop(CMakePackage, CudaPackage, ROCmPackage):
|
||||
maintainers("ryandanehy", "cameronrutherford", "pelesh")
|
||||
|
||||
# Most recent tagged snapshot is the preferred version when profiling.
|
||||
version("1.0.1", commit="c5e156c6f27d046f590dc35114980e3f9c573ca6", submodules=True)
|
||||
version("1.0.0", commit="10b7d3ee0a15cb4949ccee8c905d447b9528794f", submodules=True)
|
||||
version("0.7.2", commit="d0f57c880d4202a72c62dd1f5c92e3bc8acb9788", submodules=True)
|
||||
version("0.7.1", commit="8064ef6b2249ad2feca92a9d1e90060bad3eebc7", submodules=True)
|
||||
version("0.7.0", commit="5f42ab34b419b7cf64d0fffb29d443b009dbfd75", submodules=True)
|
||||
version("0.6.2", commit="55652fbe923ab9107d002d0d070865bd22375b28")
|
||||
version("0.6.1", commit="a9e2697b00aa13ecf0ae4783dd8a41dee11dc50e")
|
||||
version("0.6.0", commit="21af7eb0d6427be73546cf303abc84e834a5a55d")
|
||||
version("0.5.4", commit="a37a7a677884e95d1c0ad37936aef3778fc91c3e")
|
||||
version("0.5.3", commit="698e8d0fdc0ff9975d8714339ff8c782b70d85f9")
|
||||
version("0.5.2", commit="662ad76dee1f501f648a8bec9a490cb5881789e9")
|
||||
version("0.5.1", commit="6789bbb55824e68e428c2df1009d647af81f9cf1")
|
||||
version("0.5.0", commit="a39da8025037c7c8ae2eb31234eb80cc73bec2af")
|
||||
version("0.4.6", commit="b72d163d52c9225c3196ceb2baebdc7cf09a69de")
|
||||
version("0.4.5", commit="c353580456c4776c50811b97cf8ff802dc27b90c")
|
||||
version("0.4.4", commit="e858eefa6b914f5c87c3717bbce811931ea69386")
|
||||
version("0.4.3", commit="c0394af4d84ebb84b7d2b95283ad65ffd84e0d45")
|
||||
version("0.4.2", commit="3fcb788d223eec24c0241680070c4a9a5ec71ef3")
|
||||
version("0.4.1", commit="3f269560f76d5a89bcbd1d3c4f9f0e5acaa6fd64")
|
||||
version("0.4", commit="91d21085a1149eacdb27cd738d4a74a7e412fcff")
|
||||
version("0.3.99.3", commit="bed1dbef260e53a9d139ccfb77d2e83a98aab216")
|
||||
version("0.3.99.2", commit="9eb026768bc5e0a2c1293d0487cc39913001ae19")
|
||||
version("0.3.99.1", commit="220e32c0f318665d6d394ca3cd0735b9d26a65eb")
|
||||
version("0.3.99.0", commit="589b9c76781447108fa55788d5fa1b83ff71a3d1")
|
||||
version("0.3", commit="7e8adae9db757aed48e5c2bc448316307598258f")
|
||||
version("0.2", commit="c52a6f6b9baaaa2d7f233a749aa98f901349723f")
|
||||
version("0.1", commit="5f60e11b79d532115fb41694378b54c9c707aad9")
|
||||
version(
|
||||
"1.0.1", tag="v1.0.1", commit="c5e156c6f27d046f590dc35114980e3f9c573ca6", submodules=True
|
||||
)
|
||||
version(
|
||||
"1.0.0", tag="v1.0.0", commit="10b7d3ee0a15cb4949ccee8c905d447b9528794f", submodules=True
|
||||
)
|
||||
version(
|
||||
"0.7.2", tag="v0.7.2", commit="d0f57c880d4202a72c62dd1f5c92e3bc8acb9788", submodules=True
|
||||
)
|
||||
version(
|
||||
"0.7.1", tag="v0.7.1", commit="8064ef6b2249ad2feca92a9d1e90060bad3eebc7", submodules=True
|
||||
)
|
||||
version(
|
||||
"0.7.0", tag="v0.7.0", commit="5f42ab34b419b7cf64d0fffb29d443b009dbfd75", submodules=True
|
||||
)
|
||||
version("0.6.2", tag="v0.6.2", commit="55652fbe923ab9107d002d0d070865bd22375b28")
|
||||
version("0.6.1", tag="v0.6.1", commit="a9e2697b00aa13ecf0ae4783dd8a41dee11dc50e")
|
||||
version("0.6.0", tag="v0.6.0", commit="21af7eb0d6427be73546cf303abc84e834a5a55d")
|
||||
version("0.5.4", tag="v0.5.4", commit="a37a7a677884e95d1c0ad37936aef3778fc91c3e")
|
||||
version("0.5.3", tag="v0.5.3", commit="698e8d0fdc0ff9975d8714339ff8c782b70d85f9")
|
||||
version("0.5.2", tag="v0.5.2", commit="662ad76dee1f501f648a8bec9a490cb5881789e9")
|
||||
version("0.5.1", tag="v0.5.1", commit="6789bbb55824e68e428c2df1009d647af81f9cf1")
|
||||
version("0.5.0", tag="v0.5.0", commit="a39da8025037c7c8ae2eb31234eb80cc73bec2af")
|
||||
version("0.4.6", tag="v0.4.6", commit="b72d163d52c9225c3196ceb2baebdc7cf09a69de")
|
||||
version("0.4.5", tag="v0.4.5", commit="c353580456c4776c50811b97cf8ff802dc27b90c")
|
||||
version("0.4.4", tag="v0.4.4", commit="e858eefa6b914f5c87c3717bbce811931ea69386")
|
||||
version("0.4.3", tag="v0.4.3", commit="c0394af4d84ebb84b7d2b95283ad65ffd84e0d45")
|
||||
version("0.4.2", tag="v0.4.2", commit="3fcb788d223eec24c0241680070c4a9a5ec71ef3")
|
||||
version("0.4.1", tag="v0.4.1", commit="3f269560f76d5a89bcbd1d3c4f9f0e5acaa6fd64")
|
||||
version("0.4", tag="v0.4", commit="91d21085a1149eacdb27cd738d4a74a7e412fcff")
|
||||
version("0.3.99.3", tag="v0.3.99.3", commit="bed1dbef260e53a9d139ccfb77d2e83a98aab216")
|
||||
version("0.3.99.2", tag="v0.3.99.2", commit="9eb026768bc5e0a2c1293d0487cc39913001ae19")
|
||||
version("0.3.99.1", tag="v0.3.99.1", commit="220e32c0f318665d6d394ca3cd0735b9d26a65eb")
|
||||
version("0.3.99.0", tag="v0.3.99.0", commit="589b9c76781447108fa55788d5fa1b83ff71a3d1")
|
||||
version("0.3", tag="v0.3", commit="7e8adae9db757aed48e5c2bc448316307598258f")
|
||||
version("0.2", tag="v0.2", commit="c52a6f6b9baaaa2d7f233a749aa98f901349723f")
|
||||
version("0.1", tag="v0.1", commit="5f60e11b79d532115fb41694378b54c9c707aad9")
|
||||
|
||||
# Development branches
|
||||
version("master", branch="master")
|
||||
@@ -103,9 +113,12 @@ class Hiop(CMakePackage, CudaPackage, ROCmPackage):
|
||||
depends_on("magma@{0}:".format(magma_v), when="@{0}:+cuda".format(hiop_v))
|
||||
depends_on("magma@{0}:".format(magma_v), when="@{0}:+rocm".format(hiop_v))
|
||||
|
||||
# https://github.com/spack/spack/issues/40678
|
||||
depends_on("cuda@11:11.9", when="@develop:+cuda")
|
||||
depends_on("cuda@:11.9", when="+cuda")
|
||||
# 1.0.2 fixes bug with cuda 12 compatibility
|
||||
# hiop@0.6.0 requires cusolver API in cuda@11
|
||||
depends_on("cuda@11:11.9", when="@0.6.0:1.0.1")
|
||||
depends_on("cuda@11:", when="@develop:+cuda")
|
||||
# Before hiop@0.6.0 only cuda requirement was magma
|
||||
depends_on("cuda", when="@:0.5.4+cuda")
|
||||
|
||||
depends_on("raja", when="+raja")
|
||||
depends_on("umpire", when="+raja")
|
||||
|
||||
@@ -132,6 +132,7 @@ def install_targets(self):
|
||||
else:
|
||||
return ["install"]
|
||||
|
||||
def cmake_args(self):
|
||||
args = []
|
||||
if self.spec.satisfies("@:5.4.3"):
|
||||
args.append(self.define_from_variant("BUILD_SHARED_LIBS", "shared"))
|
||||
|
||||
@@ -226,8 +226,7 @@ def install(self, spec, prefix):
|
||||
def inject_rpaths(self):
|
||||
# Sets rpath so the compilers can work without setting LD_LIBRARY_PATH.
|
||||
patchelf = which("patchelf")
|
||||
patchelf.add_default_arg("--set-rpath")
|
||||
patchelf.add_default_arg(":".join(self._ld_library_path()))
|
||||
patchelf.add_default_arg("--set-rpath", ":".join(self._ld_library_path()))
|
||||
for pd in ["bin", "lib", join_path("compiler", "lib", "intel64_lin")]:
|
||||
for file in find(self.component_prefix.linux.join(pd), "*", recursive=False):
|
||||
# Try to patch all files, patchelf will do nothing and fail if file
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user