Compare commits
2111 Commits
v0.17.1
...
features/r
Author | SHA1 | Date | |
---|---|---|---|
![]() |
771c4e4017 | ||
![]() |
9633145374 | ||
![]() |
29d96633ee | ||
![]() |
267da78559 | ||
![]() |
013a0a04a4 | ||
![]() |
a6a7c3ce88 | ||
![]() |
960b48b613 | ||
![]() |
84bb8e316d | ||
![]() |
010068c50a | ||
![]() |
a7ebdd2d10 | ||
![]() |
62553e7521 | ||
![]() |
f961a11187 | ||
![]() |
b00983439f | ||
![]() |
5fe4ac2b05 | ||
![]() |
c60ded8ccc | ||
![]() |
ce7c8b44d5 | ||
![]() |
4817e4c80c | ||
![]() |
111aeeb0ae | ||
![]() |
3a70df9f64 | ||
![]() |
616a8eebcd | ||
![]() |
ac9bd3d72d | ||
![]() |
7118602251 | ||
![]() |
7ebce6191a | ||
![]() |
03832a0b0f | ||
![]() |
b2534171be | ||
![]() |
4905a71d6d | ||
![]() |
0abc4564ae | ||
![]() |
13d05848ad | ||
![]() |
6f2f9653c5 | ||
![]() |
8556f83238 | ||
![]() |
a717c5df40 | ||
![]() |
3552cfac1a | ||
![]() |
b792e08c15 | ||
![]() |
d1d86d68f1 | ||
![]() |
974beb4ffc | ||
![]() |
b7f8899d45 | ||
![]() |
e47ec07ffc | ||
![]() |
778eee1579 | ||
![]() |
a43a633b2a | ||
![]() |
5e00dffe7f | ||
![]() |
7aa1fef506 | ||
![]() |
2d94624d0a | ||
![]() |
cc6cc4c7e5 | ||
![]() |
943d463a2d | ||
![]() |
53eb044b28 | ||
![]() |
4f3553ae7c | ||
![]() |
e59d7fcb9b | ||
![]() |
056ea79d2c | ||
![]() |
83533fc31f | ||
![]() |
0420c829c6 | ||
![]() |
c664a31f7b | ||
![]() |
a710a2425a | ||
![]() |
5e014be8b7 | ||
![]() |
abc162cf3b | ||
![]() |
dc3cf5c6b0 | ||
![]() |
75638c1e88 | ||
![]() |
fb5b78335b | ||
![]() |
63600c0d0d | ||
![]() |
beaf1c7fcc | ||
![]() |
2da7f40cbc | ||
![]() |
4c446d54b1 | ||
![]() |
4067a28182 | ||
![]() |
f0ceeac0a8 | ||
![]() |
2965a7a7e9 | ||
![]() |
3273928ddc | ||
![]() |
a4f32dbf8d | ||
![]() |
823b982ee1 | ||
![]() |
afbbbf9921 | ||
![]() |
68d32f7fdc | ||
![]() |
e13655b584 | ||
![]() |
78facf0761 | ||
![]() |
17c264b30a | ||
![]() |
634d51cec2 | ||
![]() |
bf1ef4bc37 | ||
![]() |
6b62a15ab6 | ||
![]() |
9a05a7a714 | ||
![]() |
1c13b3707c | ||
![]() |
bad6ebc910 | ||
![]() |
48122affbd | ||
![]() |
e72afede17 | ||
![]() |
0d2044c659 | ||
![]() |
a37dd23403 | ||
![]() |
d6483fe483 | ||
![]() |
be12fea11e | ||
![]() |
65cf6b0d5c | ||
![]() |
21ef70d807 | ||
![]() |
82a6d6f5d8 | ||
![]() |
a4bead73b1 | ||
![]() |
d4b68995c3 | ||
![]() |
0ce88521ce | ||
![]() |
aac7176924 | ||
![]() |
bc347f1f1c | ||
![]() |
6eac7acb93 | ||
![]() |
08ea458814 | ||
![]() |
b6c1143f3f | ||
![]() |
1cba551fe6 | ||
![]() |
326fa2392b | ||
![]() |
0c4a866c2e | ||
![]() |
54e9b6b8fb | ||
![]() |
a3a61241fc | ||
![]() |
7133838fa5 | ||
![]() |
8de726336f | ||
![]() |
3835ac0c41 | ||
![]() |
a405a6efe3 | ||
![]() |
b0c8affbd9 | ||
![]() |
03a7643816 | ||
![]() |
1ada151d80 | ||
![]() |
840858c215 | ||
![]() |
0f80a5a9d5 | ||
![]() |
c8f85ebea3 | ||
![]() |
3b8256ef6a | ||
![]() |
33d791bd1c | ||
![]() |
374ebe5840 | ||
![]() |
cf21fd837f | ||
![]() |
01609b3111 | ||
![]() |
fdc9a29a9b | ||
![]() |
0e0c438dd6 | ||
![]() |
015046cb97 | ||
![]() |
388d5fada3 | ||
![]() |
2d3a613128 | ||
![]() |
ce0346abd9 | ||
![]() |
00313f9e20 | ||
![]() |
6c03e1efb6 | ||
![]() |
b1de8a5680 | ||
![]() |
02a1f6f0f1 | ||
![]() |
79be21c8e4 | ||
![]() |
bb70e6ffcd | ||
![]() |
b09fb467f1 | ||
![]() |
dec3e31e60 | ||
![]() |
f5520de4bd | ||
![]() |
be99a72d57 | ||
![]() |
6f1a5c8fee | ||
![]() |
a482970a35 | ||
![]() |
bbb3f724af | ||
![]() |
89f6db21f1 | ||
![]() |
b28b24ccf8 | ||
![]() |
3dfa64edab | ||
![]() |
2046ca7722 | ||
![]() |
4f5d5bb2ef | ||
![]() |
34d9d58924 | ||
![]() |
0804637228 | ||
![]() |
a837008ff7 | ||
![]() |
1ffad2073d | ||
![]() |
c846b5149d | ||
![]() |
4c1250854a | ||
![]() |
fbd94b9ad2 | ||
![]() |
10a3822728 | ||
![]() |
586df30f9a | ||
![]() |
803900ddc5 | ||
![]() |
0480afe29d | ||
![]() |
cb56e9b745 | ||
![]() |
6a8aa59717 | ||
![]() |
110ade1804 | ||
![]() |
5db279f986 | ||
![]() |
67a90a644f | ||
![]() |
fef84f2265 | ||
![]() |
b0e35dffa3 | ||
![]() |
a3520d14bd | ||
![]() |
7d534f38d6 | ||
![]() |
2aec5b65f3 | ||
![]() |
17e2fb0ef6 | ||
![]() |
ce09b42cdd | ||
![]() |
433d404a93 | ||
![]() |
8d56728984 | ||
![]() |
39b58abd9c | ||
![]() |
d7a6cb3e53 | ||
![]() |
fd724fb38d | ||
![]() |
2bb9eeac28 | ||
![]() |
b7ce6a5ec1 | ||
![]() |
1999135cab | ||
![]() |
a708844e87 | ||
![]() |
4dd5bcb3ef | ||
![]() |
dc44642bfb | ||
![]() |
a9b4f33f23 | ||
![]() |
6e5cba7b82 | ||
![]() |
b45e734b59 | ||
![]() |
624077e629 | ||
![]() |
da0a7836f3 | ||
![]() |
271f0c024a | ||
![]() |
8deb50fea5 | ||
![]() |
b71661eaa6 | ||
![]() |
f110d0848a | ||
![]() |
b033dbbbd0 | ||
![]() |
1a999d6e2d | ||
![]() |
9740c3b300 | ||
![]() |
b9d12df7a9 | ||
![]() |
a9a7ac71fa | ||
![]() |
c8f37797a4 | ||
![]() |
6bdd9db594 | ||
![]() |
92531ca773 | ||
![]() |
495dd61218 | ||
![]() |
d0ad644ea6 | ||
![]() |
c2f470f4a6 | ||
![]() |
831346a3fb | ||
![]() |
ae76834f3d | ||
![]() |
714573cdbc | ||
![]() |
7d67577156 | ||
![]() |
7dc569ceeb | ||
![]() |
7475eba798 | ||
![]() |
25ae8c526b | ||
![]() |
c364a04a42 | ||
![]() |
f229f746db | ||
![]() |
7385ea5f01 | ||
![]() |
8e177a45d2 | ||
![]() |
b1b9ed298d | ||
![]() |
70f6496f08 | ||
![]() |
9bc5b0cad5 | ||
![]() |
1ea05cd456 | ||
![]() |
65763d18fb | ||
![]() |
796ce7fe84 | ||
![]() |
4564aa4549 | ||
![]() |
646a4bb26c | ||
![]() |
7893be7712 | ||
![]() |
3ad3e53ff8 | ||
![]() |
f6795ae46d | ||
![]() |
23e85f4086 | ||
![]() |
dfff935f17 | ||
![]() |
b662a5968b | ||
![]() |
99083f1706 | ||
![]() |
13f3bd533d | ||
![]() |
8c0b695f13 | ||
![]() |
79ba0c50c1 | ||
![]() |
b667be470e | ||
![]() |
99425e273b | ||
![]() |
dbf947599f | ||
![]() |
bc34bcfbc2 | ||
![]() |
08c73e456c | ||
![]() |
3a6ff4dd92 | ||
![]() |
012889bc40 | ||
![]() |
8ab6af9ed9 | ||
![]() |
170613ff6b | ||
![]() |
ff04d1bfc1 | ||
![]() |
48b222c36b | ||
![]() |
6058d52746 | ||
![]() |
5f996edde9 | ||
![]() |
ea8c9ae6b7 | ||
![]() |
b92a6d106b | ||
![]() |
2474609395 | ||
![]() |
dd6f4e680a | ||
![]() |
e73cf5df44 | ||
![]() |
544486538c | ||
![]() |
f5b1d513e1 | ||
![]() |
fa6f1336c1 | ||
![]() |
b2eda32e55 | ||
![]() |
ff33978b0d | ||
![]() |
43577beb9c | ||
![]() |
656074a96d | ||
![]() |
cd0b6b9088 | ||
![]() |
57f5c92a39 | ||
![]() |
7477161a05 | ||
![]() |
5283ca5781 | ||
![]() |
beff697cc0 | ||
![]() |
0dc3c85a90 | ||
![]() |
558f7f007e | ||
![]() |
a717ba9b87 | ||
![]() |
419c2ecb95 | ||
![]() |
532182db52 | ||
![]() |
bd3e86ee28 | ||
![]() |
7613b8a3bc | ||
![]() |
49f9a2136d | ||
![]() |
57e2ea1ac4 | ||
![]() |
2816d28e90 | ||
![]() |
da6d9a33c1 | ||
![]() |
c8728a1526 | ||
![]() |
24800c3de5 | ||
![]() |
e520d77760 | ||
![]() |
90c4b43274 | ||
![]() |
2d6ba6663a | ||
![]() |
764a97d428 | ||
![]() |
69b3a88fa3 | ||
![]() |
6a3c0825e3 | ||
![]() |
935faeb0c0 | ||
![]() |
16c5091026 | ||
![]() |
b2717a8abf | ||
![]() |
4b3f6cede8 | ||
![]() |
f2fc4ee9af | ||
![]() |
d64de54ebe | ||
![]() |
b7eb4af98f | ||
![]() |
075457db00 | ||
![]() |
88d8ca9b65 | ||
![]() |
8ddaa08ed2 | ||
![]() |
6d42a1e0f0 | ||
![]() |
36c0a1eec3 | ||
![]() |
d7aac3af24 | ||
![]() |
5680c90c7d | ||
![]() |
b9cdc7ed55 | ||
![]() |
fbf50fbfa8 | ||
![]() |
a3de8eb8bb | ||
![]() |
a3c3f9f98b | ||
![]() |
a24306dad7 | ||
![]() |
fc00119e52 | ||
![]() |
1e437bbc66 | ||
![]() |
d04f6e47ff | ||
![]() |
ee505e6c69 | ||
![]() |
d61e54b4c7 | ||
![]() |
443db0b8c3 | ||
![]() |
105b42c15f | ||
![]() |
9cc45f66b7 | ||
![]() |
28a9da9130 | ||
![]() |
21cb859b4f | ||
![]() |
dc7fbafdb2 | ||
![]() |
d5a78d49fe | ||
![]() |
8ef299ed16 | ||
![]() |
79bc2949ce | ||
![]() |
542f46065a | ||
![]() |
c7b9354810 | ||
![]() |
a94e47743f | ||
![]() |
bfb846a513 | ||
![]() |
14c5d26c48 | ||
![]() |
dfc6c2a437 | ||
![]() |
5874d1fbd8 | ||
![]() |
a53ffbd621 | ||
![]() |
54491a5d96 | ||
![]() |
f12c3fcd55 | ||
![]() |
29da99427e | ||
![]() |
a58fa289b9 | ||
![]() |
ea61a657ae | ||
![]() |
56695bb09c | ||
![]() |
6237d54936 | ||
![]() |
a7b91321e5 | ||
![]() |
9dac0dea25 | ||
![]() |
9a977cb694 | ||
![]() |
88b1bf751d | ||
![]() |
90da5dc909 | ||
![]() |
44263b7226 | ||
![]() |
1ecb19894c | ||
![]() |
81e9e47337 | ||
![]() |
cbba0ffc0c | ||
![]() |
f20db5fc61 | ||
![]() |
40154d83ae | ||
![]() |
5c5da19b0c | ||
![]() |
75d692eed3 | ||
![]() |
f6f89677a7 | ||
![]() |
26bcbc521e | ||
![]() |
c99b3c31db | ||
![]() |
768c35dd23 | ||
![]() |
c9054a66af | ||
![]() |
5d47347d8c | ||
![]() |
f136f62407 | ||
![]() |
63b981dba4 | ||
![]() |
685e3d7ae9 | ||
![]() |
f97be99f2a | ||
![]() |
1eb61dd9f3 | ||
![]() |
4571f4c994 | ||
![]() |
20000493f3 | ||
![]() |
36fcf461d9 | ||
![]() |
58a32b04d9 | ||
![]() |
d13c1cfa9f | ||
![]() |
a77ce04005 | ||
![]() |
cd6e70f539 | ||
![]() |
1b067ee3e6 | ||
![]() |
cd2b2898a1 | ||
![]() |
4c437a8683 | ||
![]() |
4898759eab | ||
![]() |
295507129b | ||
![]() |
eba0997521 | ||
![]() |
acb982f7fa | ||
![]() |
ef1e96def4 | ||
![]() |
fdab17a4d4 | ||
![]() |
8806f9f826 | ||
![]() |
54d738ff9c | ||
![]() |
e58ac0705d | ||
![]() |
0182e39d44 | ||
![]() |
7cfe626e21 | ||
![]() |
0367b73ed5 | ||
![]() |
f66e7aea94 | ||
![]() |
ef23c3b122 | ||
![]() |
078ee48c4b | ||
![]() |
9516fa9447 | ||
![]() |
c0b400c422 | ||
![]() |
134debc518 | ||
![]() |
ed1a48f50a | ||
![]() |
02cbb8ffaa | ||
![]() |
fd055d4678 | ||
![]() |
40fad1472a | ||
![]() |
00469d84e7 | ||
![]() |
1c2fff2cb7 | ||
![]() |
5424e4bdc1 | ||
![]() |
5fe20b462c | ||
![]() |
2856b29740 | ||
![]() |
a7e365536b | ||
![]() |
6aedbb32da | ||
![]() |
9e169ae243 | ||
![]() |
1dbab78db1 | ||
![]() |
8228ac7d62 | ||
![]() |
3f41f8d093 | ||
![]() |
1ac7f2b02b | ||
![]() |
26f94b24e8 | ||
![]() |
c75fb4da20 | ||
![]() |
cd00eba9d6 | ||
![]() |
073330e893 | ||
![]() |
bb9ac2be9c | ||
![]() |
b1f38f6fa2 | ||
![]() |
8e4e69e91d | ||
![]() |
a785eeb896 | ||
![]() |
1b41e7408d | ||
![]() |
15bdc6b3e1 | ||
![]() |
56717e8b85 | ||
![]() |
048a0de35b | ||
![]() |
4702b49094 | ||
![]() |
0168047429 | ||
![]() |
0a3d496db1 | ||
![]() |
e22fbdb6b8 | ||
![]() |
f8201f4acc | ||
![]() |
27e57c444e | ||
![]() |
1b55057f36 | ||
![]() |
f8224f284c | ||
![]() |
1a728c98ff | ||
![]() |
59e522e815 | ||
![]() |
011a8b3f3e | ||
![]() |
20255b6161 | ||
![]() |
34732c57b3 | ||
![]() |
c300b92047 | ||
![]() |
f41c3a0fe9 | ||
![]() |
773da7ceba | ||
![]() |
487b1c3690 | ||
![]() |
5afdccba06 | ||
![]() |
49498af9ec | ||
![]() |
5df10c04cd | ||
![]() |
8f89932aad | ||
![]() |
b936168224 | ||
![]() |
80195bd1ed | ||
![]() |
eda5b854a5 | ||
![]() |
6760175289 | ||
![]() |
a14901f792 | ||
![]() |
9177f223c3 | ||
![]() |
ad6d28d9ad | ||
![]() |
26ff44388f | ||
![]() |
075c76128a | ||
![]() |
226004b960 | ||
![]() |
3448a4642a | ||
![]() |
dae656405f | ||
![]() |
3c0e422509 | ||
![]() |
b08f147cf3 | ||
![]() |
15dbc86177 | ||
![]() |
2f3a31cef6 | ||
![]() |
fa554d763e | ||
![]() |
b4b8aaf3bc | ||
![]() |
c4b3b9ed9a | ||
![]() |
674030ce62 | ||
![]() |
0b7eca36d1 | ||
![]() |
3c1f87099b | ||
![]() |
6d0b59b7ea | ||
![]() |
dba7a03daa | ||
![]() |
560abdc46d | ||
![]() |
9c2465173e | ||
![]() |
06a9496a39 | ||
![]() |
8fcfde62df | ||
![]() |
b65054881f | ||
![]() |
6b6f67e90f | ||
![]() |
e485d16c62 | ||
![]() |
18f71aef1e | ||
![]() |
ef0bc71035 | ||
![]() |
b4ab4ddc27 | ||
![]() |
f2b123760c | ||
![]() |
db5bd7134a | ||
![]() |
26a62a3258 | ||
![]() |
732f1dd14d | ||
![]() |
e05f453531 | ||
![]() |
d69e8dbace | ||
![]() |
3ec27332ec | ||
![]() |
311dc67536 | ||
![]() |
1b849aaa2c | ||
![]() |
b67c7e593b | ||
![]() |
daaac3e2f0 | ||
![]() |
c7f9431e1b | ||
![]() |
b0a712097a | ||
![]() |
558e99ecca | ||
![]() |
12ed453707 | ||
![]() |
8fdc2ff462 | ||
![]() |
cf3cfab86c | ||
![]() |
8f5b9a89fb | ||
![]() |
6d1da528f7 | ||
![]() |
6611f0bf4b | ||
![]() |
3d6156d3b2 | ||
![]() |
c6b69a8244 | ||
![]() |
d349677dcb | ||
![]() |
b5dc0c63ea | ||
![]() |
048b5ad2d0 | ||
![]() |
9b0d5cbabf | ||
![]() |
26552533be | ||
![]() |
4b0cddb674 | ||
![]() |
c3a1dd0bdb | ||
![]() |
bfb6873ce3 | ||
![]() |
71c9334e30 | ||
![]() |
8c508b530b | ||
![]() |
7f3a63aaa6 | ||
![]() |
38cce0355c | ||
![]() |
892aa0fd16 | ||
![]() |
a627684115 | ||
![]() |
9c780ac413 | ||
![]() |
8537634283 | ||
![]() |
3ffe9a27b2 | ||
![]() |
9e01e17dc6 | ||
![]() |
531b1c5c3d | ||
![]() |
be0d611dc1 | ||
![]() |
e0e3443f3a | ||
![]() |
56ba61c52f | ||
![]() |
dd67f46c6b | ||
![]() |
62fcf407e2 | ||
![]() |
2fa495154e | ||
![]() |
0ce8b9d398 | ||
![]() |
f8f4aafe81 | ||
![]() |
ea13122f3c | ||
![]() |
282a366fc4 | ||
![]() |
5a72204d38 | ||
![]() |
27f608c800 | ||
![]() |
5a85b181d3 | ||
![]() |
99c1f9b987 | ||
![]() |
4aee27816e | ||
![]() |
e63b4f752a | ||
![]() |
cf1349ba35 | ||
![]() |
e4d4a5193f | ||
![]() |
df4129d395 | ||
![]() |
06aef626cb | ||
![]() |
31daf0f2b6 | ||
![]() |
3a994032f8 | ||
![]() |
90c773488c | ||
![]() |
e65d3d14b4 | ||
![]() |
4a73bfc3b9 | ||
![]() |
f8782c46d7 | ||
![]() |
15ef85e161 | ||
![]() |
012758c179 | ||
![]() |
a7101db39d | ||
![]() |
f587a9ce68 | ||
![]() |
a0164793cb | ||
![]() |
d4d101f57e | ||
![]() |
fb0e91c534 | ||
![]() |
a7de2fa380 | ||
![]() |
b60a0eea01 | ||
![]() |
81bc00d61f | ||
![]() |
b26b3bebb4 | ||
![]() |
e174623edf | ||
![]() |
55544950e2 | ||
![]() |
3544b0274f | ||
![]() |
9ba41449a9 | ||
![]() |
5fd05a8cbe | ||
![]() |
5f3ab83e2d | ||
![]() |
fa9894ae16 | ||
![]() |
3648adc2a7 | ||
![]() |
4ef534b19b | ||
![]() |
73287df7c5 | ||
![]() |
993ce4c095 | ||
![]() |
4b9f216c11 | ||
![]() |
508e3e03b9 | ||
![]() |
9b0c2cb954 | ||
![]() |
ea93b1a03b | ||
![]() |
d3131cd2da | ||
![]() |
3a5ae0fb66 | ||
![]() |
94794d061a | ||
![]() |
1250fac467 | ||
![]() |
8c59736ff9 | ||
![]() |
825fed2ffa | ||
![]() |
be58d354ac | ||
![]() |
4176ce5c07 | ||
![]() |
8409443b1f | ||
![]() |
aee763015e | ||
![]() |
50b5b314b3 | ||
![]() |
8a754ad502 | ||
![]() |
7f03724db2 | ||
![]() |
ed359cb00b | ||
![]() |
f5a2d87eb2 | ||
![]() |
c3b6b3036d | ||
![]() |
f1bdbefd46 | ||
![]() |
f14840fcf2 | ||
![]() |
2e3bea8e17 | ||
![]() |
474493713b | ||
![]() |
ccfaec7b1c | ||
![]() |
4635c813e0 | ||
![]() |
a4f9d4fa4a | ||
![]() |
32281ee40e | ||
![]() |
8ab3b56e00 | ||
![]() |
f93107fff3 | ||
![]() |
a6eed4a7c7 | ||
![]() |
406939f485 | ||
![]() |
a649ee9b69 | ||
![]() |
0a9e41770b | ||
![]() |
717ac6ca0a | ||
![]() |
2c11d5f2a8 | ||
![]() |
8adc6b7e8e | ||
![]() |
7ad8937d7a | ||
![]() |
abab284996 | ||
![]() |
1caa3107b3 | ||
![]() |
5590f7385a | ||
![]() |
037c73c387 | ||
![]() |
ca3354bdea | ||
![]() |
da7419c035 | ||
![]() |
88fbba3e1e | ||
![]() |
2cd5c00923 | ||
![]() |
3d624d204f | ||
![]() |
428c63087a | ||
![]() |
9ab21024e2 | ||
![]() |
a4703b1220 | ||
![]() |
9493da2536 | ||
![]() |
dc78f4c58a | ||
![]() |
bedc9fe665 | ||
![]() |
ff7230c0cf | ||
![]() |
033647c8b1 | ||
![]() |
43c768f4b7 | ||
![]() |
3270aa106b | ||
![]() |
2dd9414bbb | ||
![]() |
30a9bfe38f | ||
![]() |
3370d3f57e | ||
![]() |
3df90e3e33 | ||
![]() |
89e2ee70e2 | ||
![]() |
2111cf8044 | ||
![]() |
811abf5d00 | ||
![]() |
37e14ee1ac | ||
![]() |
68f0973339 | ||
![]() |
9d1d52d51f | ||
![]() |
27e3b34d6d | ||
![]() |
c523e22575 | ||
![]() |
5064ad6cad | ||
![]() |
990a620d52 | ||
![]() |
a9996db35c | ||
![]() |
ddc5b4422d | ||
![]() |
b2a02861bb | ||
![]() |
1df9c3437f | ||
![]() |
9cc6bc26a2 | ||
![]() |
94ce7f5040 | ||
![]() |
5bea24526f | ||
![]() |
57b27023a4 | ||
![]() |
ceb260927b | ||
![]() |
1c362ccb11 | ||
![]() |
2c2eb911e1 | ||
![]() |
d1e0266952 | ||
![]() |
8986c21d73 | ||
![]() |
64532902f9 | ||
![]() |
568a535e3f | ||
![]() |
cd5e7579be | ||
![]() |
b559b99c8f | ||
![]() |
a39a6c4ea7 | ||
![]() |
4b5e071141 | ||
![]() |
2a64c6a402 | ||
![]() |
aea10bf876 | ||
![]() |
2088d407a2 | ||
![]() |
cc14384818 | ||
![]() |
3d29e0d641 | ||
![]() |
ad2b493171 | ||
![]() |
5bbcb43ad3 | ||
![]() |
fe8548853d | ||
![]() |
4a17099cc3 | ||
![]() |
822b763222 | ||
![]() |
28aa1a64d4 | ||
![]() |
e3ab326228 | ||
![]() |
6934703ffb | ||
![]() |
53fb5963eb | ||
![]() |
022aa496a5 | ||
![]() |
d424d0e54e | ||
![]() |
762893d4a6 | ||
![]() |
addf6f2686 | ||
![]() |
ce4b812b52 | ||
![]() |
afaaf04fa9 | ||
![]() |
9f49461183 | ||
![]() |
4081597731 | ||
![]() |
d42e5421dc | ||
![]() |
80a6eab2db | ||
![]() |
916da02326 | ||
![]() |
9199800bbd | ||
![]() |
838a0086cf | ||
![]() |
ab74738609 | ||
![]() |
90c28783a0 | ||
![]() |
35406a8984 | ||
![]() |
6a1b0331a9 | ||
![]() |
258600eede | ||
![]() |
b7794cdac8 | ||
![]() |
a6580d4704 | ||
![]() |
4d0ee4e169 | ||
![]() |
6bc2e660e8 | ||
![]() |
8665ccb661 | ||
![]() |
6610c50414 | ||
![]() |
b0c63a6554 | ||
![]() |
77d2b9a87a | ||
![]() |
f931067bf2 | ||
![]() |
7d66779c06 | ||
![]() |
6cfcf59781 | ||
![]() |
544258f16a | ||
![]() |
b48bdc9e19 | ||
![]() |
cf4f281f54 | ||
![]() |
673faf6044 | ||
![]() |
e86cdbbf23 | ||
![]() |
0c4b56d885 | ||
![]() |
ebdba2c6a7 | ||
![]() |
7d68d4564c | ||
![]() |
06fd0f892e | ||
![]() |
b13629062a | ||
![]() |
a284c3e76d | ||
![]() |
efcdd64893 | ||
![]() |
e2b87ade06 | ||
![]() |
96c1fb7b0b | ||
![]() |
4d5eff11b4 | ||
![]() |
8db12b72ec | ||
![]() |
9900d348d7 | ||
![]() |
85c454bdb0 | ||
![]() |
2ac11812ba | ||
![]() |
f6ea56276f | ||
![]() |
cfae035a7b | ||
![]() |
9dfaa3d8fd | ||
![]() |
858c780e1f | ||
![]() |
afc397be3a | ||
![]() |
cd2cb4aef5 | ||
![]() |
ebf92b428e | ||
![]() |
1834ab971d | ||
![]() |
ed6274a0bf | ||
![]() |
450bbdd854 | ||
![]() |
49069e4f58 | ||
![]() |
20471b8420 | ||
![]() |
5cd1e08e8a | ||
![]() |
c72735229f | ||
![]() |
79c0f631de | ||
![]() |
01c1e6860f | ||
![]() |
cbfe0d7492 | ||
![]() |
a6aff211d2 | ||
![]() |
dfdb11bc71 | ||
![]() |
2c331a1d7f | ||
![]() |
916c94fd65 | ||
![]() |
1599d841c0 | ||
![]() |
e6dcd382ee | ||
![]() |
a94f11a2b2 | ||
![]() |
a1f32cdaff | ||
![]() |
8d118104c7 | ||
![]() |
a43e3f3ffb | ||
![]() |
bab331ff34 | ||
![]() |
d9113eb5ec | ||
![]() |
4831daa2dc | ||
![]() |
d5dd6471fc | ||
![]() |
277f578707 | ||
![]() |
3478b06262 | ||
![]() |
7268ab75f4 | ||
![]() |
f2c5092588 | ||
![]() |
d05560ee32 | ||
![]() |
71f081366b | ||
![]() |
327fcf7a54 | ||
![]() |
8cefe38b0e | ||
![]() |
88eb437d94 | ||
![]() |
a155975b8b | ||
![]() |
b20df12d09 | ||
![]() |
f60c6ca485 | ||
![]() |
a3947381c7 | ||
![]() |
6eef12cd10 | ||
![]() |
2bd016895d | ||
![]() |
10f3113b3c | ||
![]() |
9b298fd7e4 | ||
![]() |
8f4e029e3a | ||
![]() |
d29253bd7a | ||
![]() |
8eefab4033 | ||
![]() |
abfd300eef | ||
![]() |
dd5943bc6f | ||
![]() |
00ed99dc16 | ||
![]() |
db2340007a | ||
![]() |
2610423e78 | ||
![]() |
888eb11565 | ||
![]() |
1cc5391443 | ||
![]() |
b082c33c85 | ||
![]() |
d62b8f0bf3 | ||
![]() |
c17f8d938e | ||
![]() |
c6556b7a06 | ||
![]() |
31c8567007 | ||
![]() |
8c1e54180e | ||
![]() |
dc01f9597e | ||
![]() |
8f372fc88f | ||
![]() |
6cc2e7bcd4 | ||
![]() |
d7b9ad6456 | ||
![]() |
ceea479b56 | ||
![]() |
8bd9527a71 | ||
![]() |
205e9f7d73 | ||
![]() |
a8b1fbde41 | ||
![]() |
3243731c1c | ||
![]() |
0ed94f9529 | ||
![]() |
96236f229f | ||
![]() |
dccc58c0ad | ||
![]() |
2e0cf6f9ee | ||
![]() |
b2a0b6d6c3 | ||
![]() |
fddc58387c | ||
![]() |
0b4f40ab79 | ||
![]() |
b21d30d640 | ||
![]() |
b1f223d224 | ||
![]() |
9fef13ce95 | ||
![]() |
e4ba7bb044 | ||
![]() |
ab1e9d717e | ||
![]() |
8e4ccf91e4 | ||
![]() |
125e4e00b4 | ||
![]() |
1ddad522a4 | ||
![]() |
1cb82dc542 | ||
![]() |
17c065a750 | ||
![]() |
a9ba40164a | ||
![]() |
535262844b | ||
![]() |
ed447e1ac7 | ||
![]() |
d840c3a069 | ||
![]() |
6a259ecd85 | ||
![]() |
36b0730fac | ||
![]() |
800933bbdf | ||
![]() |
2516885615 | ||
![]() |
2446771b63 | ||
![]() |
f9843367ed | ||
![]() |
b08ed91309 | ||
![]() |
0d3ecff903 | ||
![]() |
aca6b73a6c | ||
![]() |
92970c2006 | ||
![]() |
f47e24381d | ||
![]() |
2941afe9e0 | ||
![]() |
e6521e7379 | ||
![]() |
37f021ef3c | ||
![]() |
2ab1ace5f4 | ||
![]() |
8daee48231 | ||
![]() |
8485474140 | ||
![]() |
51488dbff5 | ||
![]() |
1953d986ae | ||
![]() |
fef58db792 | ||
![]() |
36c64c8012 | ||
![]() |
8cd95b9f35 | ||
![]() |
7912a8e90b | ||
![]() |
2210f84a91 | ||
![]() |
b8d042273a | ||
![]() |
9173fd7c61 | ||
![]() |
275608e2f2 | ||
![]() |
f744640289 | ||
![]() |
b9d26caab8 | ||
![]() |
0dd5d493d5 | ||
![]() |
e7894b4863 | ||
![]() |
94d75d0327 | ||
![]() |
96fceb6e38 | ||
![]() |
fc8c3ada56 | ||
![]() |
60fe21ddd7 | ||
![]() |
0ffce33447 | ||
![]() |
043794362a | ||
![]() |
f36a6f3fc0 | ||
![]() |
7995b7eac4 | ||
![]() |
509f1cc00a | ||
![]() |
7459aa6c95 | ||
![]() |
2852126196 | ||
![]() |
9e2d78cffc | ||
![]() |
e19f29da66 | ||
![]() |
39fcafaf45 | ||
![]() |
22d07b328e | ||
![]() |
f37855f5bb | ||
![]() |
f33770553f | ||
![]() |
e886a61a6c | ||
![]() |
bbb81d5d68 | ||
![]() |
99707beae7 | ||
![]() |
be53b5db96 | ||
![]() |
45f3b2fc52 | ||
![]() |
e5f6914bd2 | ||
![]() |
7fd94fc4bc | ||
![]() |
2ed52d32c7 | ||
![]() |
31e538795e | ||
![]() |
0ad3319243 | ||
![]() |
4efd47d0c3 | ||
![]() |
43016d0ff4 | ||
![]() |
5796de8bcb | ||
![]() |
60e9af6e0f | ||
![]() |
ae84ce535b | ||
![]() |
5bdc72e2ed | ||
![]() |
7a1364fcb2 | ||
![]() |
6c61c2695a | ||
![]() |
b768fb85c6 | ||
![]() |
b3f5f55f95 | ||
![]() |
00f0d11b8f | ||
![]() |
e6142e8183 | ||
![]() |
98fa2c6f10 | ||
![]() |
38643dcd7e | ||
![]() |
e7e6a16064 | ||
![]() |
fefe65a35b | ||
![]() |
4d669bfdf4 | ||
![]() |
d93f9b82ac | ||
![]() |
fa132614e0 | ||
![]() |
a0bd6c8817 | ||
![]() |
dcdf5022ad | ||
![]() |
b021cf39aa | ||
![]() |
8f5fcc6e95 | ||
![]() |
e8c5f195a7 | ||
![]() |
36020d69d7 | ||
![]() |
b1ff9c05bc | ||
![]() |
d33973df6c | ||
![]() |
a2b8e0c3e9 | ||
![]() |
f155de7462 | ||
![]() |
800ed16e7a | ||
![]() |
1903e45eec | ||
![]() |
87a3b72ef0 | ||
![]() |
884da5e326 | ||
![]() |
9fc9386944 | ||
![]() |
e84a2db23d | ||
![]() |
5c1edbe00a | ||
![]() |
5272e72344 | ||
![]() |
3c1b2c0fc9 | ||
![]() |
e6ea4c788a | ||
![]() |
5cd8fc37ba | ||
![]() |
3e69449ecd | ||
![]() |
ef921e4107 | ||
![]() |
6d6641f706 | ||
![]() |
8f19bf2f31 | ||
![]() |
fe5cb90f83 | ||
![]() |
b0dc83afff | ||
![]() |
4c8582dfc8 | ||
![]() |
8654cc93ef | ||
![]() |
5d58b94322 | ||
![]() |
924be97a9b | ||
![]() |
dfd83e60ac | ||
![]() |
0f9f636f38 | ||
![]() |
2fa892daa2 | ||
![]() |
c433a35fdb | ||
![]() |
23ddfba16d | ||
![]() |
52d4e209e2 | ||
![]() |
5b34b947a8 | ||
![]() |
dea9766336 | ||
![]() |
939e94790f | ||
![]() |
9da8f18e3a | ||
![]() |
f707987275 | ||
![]() |
39c4af5f79 | ||
![]() |
9cd311c82d | ||
![]() |
53ca65b103 | ||
![]() |
c987d06a19 | ||
![]() |
79f22423b8 | ||
![]() |
cebe4fdf1d | ||
![]() |
d61c1f623c | ||
![]() |
55996d3ad4 | ||
![]() |
3640c258dc | ||
![]() |
a8d440d3ab | ||
![]() |
7fc9c16f9e | ||
![]() |
6864b28fd8 | ||
![]() |
cf0c9affff | ||
![]() |
09a8656f1f | ||
![]() |
9f1c6c0c29 | ||
![]() |
fdec3b47cc | ||
![]() |
c313a72e76 | ||
![]() |
28caa0225f | ||
![]() |
30fafa63e0 | ||
![]() |
08cad7d0ee | ||
![]() |
9165e3fb86 | ||
![]() |
d54a5d9dd8 | ||
![]() |
76489eb213 | ||
![]() |
64dd6378d4 | ||
![]() |
67ea14098d | ||
![]() |
5b80c4ab6c | ||
![]() |
1377c02e26 | ||
![]() |
13013d0291 | ||
![]() |
fe35ce1843 | ||
![]() |
5353032eef | ||
![]() |
dc57f987a7 | ||
![]() |
aa6e725633 | ||
![]() |
9649246764 | ||
![]() |
b0658b8b03 | ||
![]() |
e0a0f41ff9 | ||
![]() |
3a4ab5f96f | ||
![]() |
2c56cbd2bc | ||
![]() |
bece9fd823 | ||
![]() |
97e4b43ddc | ||
![]() |
cab0e4cb24 | ||
![]() |
8c943261a2 | ||
![]() |
9f1db4e3a5 | ||
![]() |
0a25370e78 | ||
![]() |
b840557d64 | ||
![]() |
fc7b7cfeab | ||
![]() |
af4d555c20 | ||
![]() |
dc949a5bda | ||
![]() |
7ec9958b48 | ||
![]() |
853200c42d | ||
![]() |
ef030ed0ee | ||
![]() |
e365b05821 | ||
![]() |
61528c0b0a | ||
![]() |
e8838109d8 | ||
![]() |
389b24c4dc | ||
![]() |
6c47aa06fc | ||
![]() |
7c9e015c25 | ||
![]() |
d0e2462908 | ||
![]() |
2d223fb275 | ||
![]() |
ba1b203848 | ||
![]() |
94826a3f1d | ||
![]() |
73463f61d7 | ||
![]() |
dff770667e | ||
![]() |
bb3a1dc7a5 | ||
![]() |
a783f92fba | ||
![]() |
b11767de48 | ||
![]() |
1e494eec2f | ||
![]() |
5b71839127 | ||
![]() |
a45c7c185b | ||
![]() |
c16ce9408e | ||
![]() |
4c396d2cee | ||
![]() |
c80c92aa39 | ||
![]() |
cba918c081 | ||
![]() |
37728900e6 | ||
![]() |
b547819c40 | ||
![]() |
e9b50324cf | ||
![]() |
8d8822f749 | ||
![]() |
2fa6cd6d23 | ||
![]() |
e502a264b5 | ||
![]() |
93e7efdc42 | ||
![]() |
16d1746fc3 | ||
![]() |
4437ff1fc3 | ||
![]() |
e6e109cbc5 | ||
![]() |
81a6d17f4c | ||
![]() |
1e4c08f3a5 | ||
![]() |
8b39aa1b50 | ||
![]() |
5206bca19b | ||
![]() |
92b26257f4 | ||
![]() |
fa38af285c | ||
![]() |
130354b867 | ||
![]() |
36ef59bc67 | ||
![]() |
634cba930e | ||
![]() |
549c785227 | ||
![]() |
a582670e15 | ||
![]() |
7f1759b52e | ||
![]() |
d4ca803fc5 | ||
![]() |
ffa58a20c6 | ||
![]() |
500e05ee50 | ||
![]() |
c1b51d6e99 | ||
![]() |
e97bffc3e8 | ||
![]() |
457fe842f0 | ||
![]() |
1809a122ef | ||
![]() |
8430e28a52 | ||
![]() |
c791ddc742 | ||
![]() |
9a194dd0a9 | ||
![]() |
0ce71b38b0 | ||
![]() |
14902a5821 | ||
![]() |
efc35c2ffc | ||
![]() |
37ae4c0fdb | ||
![]() |
f3139555b1 | ||
![]() |
aa5e1a0723 | ||
![]() |
6e36c71d68 | ||
![]() |
d82dcd35b3 | ||
![]() |
797c061743 | ||
![]() |
c29e6dbd20 | ||
![]() |
cccd1ce376 | ||
![]() |
73077f3a67 | ||
![]() |
5881a03408 | ||
![]() |
d668dea97d | ||
![]() |
45a285a751 | ||
![]() |
7af48f4570 | ||
![]() |
d0019d7049 | ||
![]() |
caa1a5cec7 | ||
![]() |
172ec0e3a1 | ||
![]() |
4c04a0c0b7 | ||
![]() |
9ca4c10b34 | ||
![]() |
fda89b3b4c | ||
![]() |
1ba6e27830 | ||
![]() |
9c686a12c1 | ||
![]() |
c7def4121a | ||
![]() |
bdf37db9e4 | ||
![]() |
f503b3770b | ||
![]() |
4a308d0d4b | ||
![]() |
48b2cf54cf | ||
![]() |
5208fcf1ea | ||
![]() |
98fe047671 | ||
![]() |
95f77dacd6 | ||
![]() |
4134b318ac | ||
![]() |
932408ac2b | ||
![]() |
5a640f9063 | ||
![]() |
7c5db7678a | ||
![]() |
cdf17fdfe5 | ||
![]() |
2ada0fa5a2 | ||
![]() |
18b83c3833 | ||
![]() |
22b7d9cf67 | ||
![]() |
fa8c9e4939 | ||
![]() |
3576e5f3d6 | ||
![]() |
cd04109e17 | ||
![]() |
dd7acecf3d | ||
![]() |
d3bfdcb566 | ||
![]() |
e1ec08b749 | ||
![]() |
3b5afef842 | ||
![]() |
b9bb303063 | ||
![]() |
7144af9c3a | ||
![]() |
50c6075509 | ||
![]() |
b93b64ca67 | ||
![]() |
7c31d4d279 | ||
![]() |
4a29512113 | ||
![]() |
9cf20b9d32 | ||
![]() |
165f686400 | ||
![]() |
427d281d15 | ||
![]() |
0a595d488b | ||
![]() |
099a16ed8f | ||
![]() |
eb7bc7fc4b | ||
![]() |
bdfcf7c92b | ||
![]() |
3f6d045c53 | ||
![]() |
b300a9d7a5 | ||
![]() |
218b1c153c | ||
![]() |
c3bad2a935 | ||
![]() |
dedf4a1470 | ||
![]() |
0e28356aba | ||
![]() |
80a3f01bbb | ||
![]() |
f5a70dece8 | ||
![]() |
d7e7542486 | ||
![]() |
a3f0c3ca93 | ||
![]() |
ab2187780b | ||
![]() |
7ac66547da | ||
![]() |
4b52f0e4d7 | ||
![]() |
d8dcb91297 | ||
![]() |
5e8ef57a82 | ||
![]() |
c9e135729c | ||
![]() |
8ccc4df6ff | ||
![]() |
545a429646 | ||
![]() |
bff5d253cf | ||
![]() |
3456a355ce | ||
![]() |
aedb106c5f | ||
![]() |
a4a23ff713 | ||
![]() |
728ac61bd8 | ||
![]() |
21524f5149 | ||
![]() |
6e99f328b6 | ||
![]() |
d6d29f7c09 | ||
![]() |
a5d0687115 | ||
![]() |
a909f2d910 | ||
![]() |
3b64ca30c7 | ||
![]() |
68cf57d0d0 | ||
![]() |
f080e593cb | ||
![]() |
fff9a29401 | ||
![]() |
1679274ac2 | ||
![]() |
c78a754e5d | ||
![]() |
813a0d9b19 | ||
![]() |
aece700e14 | ||
![]() |
a98a261b74 | ||
![]() |
6f3670d1eb | ||
![]() |
f189e5eb1c | ||
![]() |
bc06c1206d | ||
![]() |
4bd761d1d5 | ||
![]() |
02b48f5206 | ||
![]() |
cce8f3faf5 | ||
![]() |
5519289f1d | ||
![]() |
d80241a203 | ||
![]() |
1e1e3ae80a | ||
![]() |
a3755e5c76 | ||
![]() |
4c3bc0d3dc | ||
![]() |
46b9911289 | ||
![]() |
e06319a3dc | ||
![]() |
bf80a9f83a | ||
![]() |
f7f7a168e9 | ||
![]() |
80f92cfdde | ||
![]() |
693f0958b5 | ||
![]() |
2fd26be988 | ||
![]() |
405adce5ae | ||
![]() |
a2170c9e04 | ||
![]() |
bae2a2660e | ||
![]() |
08fb190264 | ||
![]() |
b9b1665cb2 | ||
![]() |
ec9748eaf3 | ||
![]() |
28ea1bab68 | ||
![]() |
61ea456f5d | ||
![]() |
71c8375862 | ||
![]() |
8106983ddb | ||
![]() |
28bda22e52 | ||
![]() |
991438a242 | ||
![]() |
92abffa2d4 | ||
![]() |
3cf5df7e3b | ||
![]() |
b700335be7 | ||
![]() |
b7bb687d17 | ||
![]() |
e3d62b2f7b | ||
![]() |
5300cbbb2e | ||
![]() |
38a1036c46 | ||
![]() |
75db515af2 | ||
![]() |
2ace2a750b | ||
![]() |
7134cab8c4 | ||
![]() |
4c57503e7e | ||
![]() |
1f3f1100b3 | ||
![]() |
edb99a2b05 | ||
![]() |
fe76d6563a | ||
![]() |
4af334fb7e | ||
![]() |
bed3a69498 | ||
![]() |
b36920283d | ||
![]() |
5cfaead675 | ||
![]() |
79d28db558 | ||
![]() |
5cb10f7362 | ||
![]() |
13eee02b41 | ||
![]() |
9fd870388c | ||
![]() |
a40d064030 | ||
![]() |
520b80fd5d | ||
![]() |
ebedf3f83b | ||
![]() |
947c270446 | ||
![]() |
1c12e964ac | ||
![]() |
471fa04c4b | ||
![]() |
68c23549b0 | ||
![]() |
20f2ee99bc | ||
![]() |
03ba35920d | ||
![]() |
8c85f72322 | ||
![]() |
ecfc57ea3e | ||
![]() |
7e5afd1e73 | ||
![]() |
03e93345b1 | ||
![]() |
065e445e4d | ||
![]() |
b526eafa45 | ||
![]() |
551c44f0fd | ||
![]() |
3893b90cb9 | ||
![]() |
5ff72ca079 | ||
![]() |
4d70e4f281 | ||
![]() |
ffb3f3a20d | ||
![]() |
c38d34223a | ||
![]() |
0c2de252f1 | ||
![]() |
796f5a3cbc | ||
![]() |
417227e1eb | ||
![]() |
9ac207c901 | ||
![]() |
bd43467cbf | ||
![]() |
9b803a00b3 | ||
![]() |
645b40b249 | ||
![]() |
282fd57114 | ||
![]() |
76b7095445 | ||
![]() |
5719b40ded | ||
![]() |
de7de9778f | ||
![]() |
9a23fbbcf0 | ||
![]() |
1a5add3021 | ||
![]() |
5e699d5354 | ||
![]() |
c11ce3bd1f | ||
![]() |
d5297b29be | ||
![]() |
5e351ffff4 | ||
![]() |
192f5cf66d | ||
![]() |
22426f17d1 | ||
![]() |
cb95a30be7 | ||
![]() |
5688252a1f | ||
![]() |
cdac2cd4f2 | ||
![]() |
d12bc3121a | ||
![]() |
3b2c7633eb | ||
![]() |
abe77ec8ab | ||
![]() |
d6c841f67c | ||
![]() |
e6ba8eb060 | ||
![]() |
d25e4889ba | ||
![]() |
7fb11ea84f | ||
![]() |
d853e2db57 | ||
![]() |
017c6786da | ||
![]() |
9723d918bb | ||
![]() |
93ebc4f47b | ||
![]() |
4918b7d007 | ||
![]() |
7ae2d2e387 | ||
![]() |
8da204de61 | ||
![]() |
3dccb913a9 | ||
![]() |
97376f4694 | ||
![]() |
10a0ce8c49 | ||
![]() |
95fe66cb18 | ||
![]() |
05df2c3371 | ||
![]() |
c5b1fcf5f9 | ||
![]() |
68c0bdb698 | ||
![]() |
e7b4a9bfd7 | ||
![]() |
24d9d4544e | ||
![]() |
cac86345e5 | ||
![]() |
b5bb06cc36 | ||
![]() |
4d10df3003 | ||
![]() |
e72f87ec64 | ||
![]() |
612430859e | ||
![]() |
bd987d9278 | ||
![]() |
58c598ffe6 | ||
![]() |
2f7a32a74d | ||
![]() |
7ae8a5d55b | ||
![]() |
64913af04a | ||
![]() |
d642a396af | ||
![]() |
5ca6ba6c8b | ||
![]() |
f88b40308d | ||
![]() |
f238835b65 | ||
![]() |
7e3677db6f | ||
![]() |
b2f92a1307 | ||
![]() |
e17434b9e2 | ||
![]() |
6add69d658 | ||
![]() |
20796b2045 | ||
![]() |
53801f3ebb | ||
![]() |
0f3637e332 | ||
![]() |
6c4e765f40 | ||
![]() |
e7c9f05cd9 | ||
![]() |
5d56a3b306 | ||
![]() |
58fd0d859a | ||
![]() |
f5a2f693dc | ||
![]() |
905c6973c9 | ||
![]() |
350d2da8b9 | ||
![]() |
20bccc3843 | ||
![]() |
624b3a00ff | ||
![]() |
b93ff6fdff | ||
![]() |
5c4a250bf9 | ||
![]() |
5e595586a7 | ||
![]() |
dbb36ef8b1 | ||
![]() |
425995db3e | ||
![]() |
e093187266 | ||
![]() |
a817538870 | ||
![]() |
b8d159c62d | ||
![]() |
415d662ec0 | ||
![]() |
30b3cd3b44 | ||
![]() |
1dd9238021 | ||
![]() |
a5c0a4dca4 | ||
![]() |
ebdf1cb73e | ||
![]() |
9e87a6a4b7 | ||
![]() |
3f903c49e4 | ||
![]() |
93377942d1 | ||
![]() |
e3527983ac | ||
![]() |
1422bde25a | ||
![]() |
ed105fcc76 | ||
![]() |
39f19bcc16 | ||
![]() |
a2181e9d25 | ||
![]() |
6235184522 | ||
![]() |
9ed32a3c65 | ||
![]() |
2917aad6f9 | ||
![]() |
3540f8200a | ||
![]() |
0b2507053e | ||
![]() |
e0f044561e | ||
![]() |
2e238307c7 | ||
![]() |
b7accb6a9d | ||
![]() |
eda565f3b1 | ||
![]() |
1ea4497802 | ||
![]() |
7d3a696d27 | ||
![]() |
d74396ad21 | ||
![]() |
91fc4cf28f | ||
![]() |
38fee7e0da | ||
![]() |
b3043cae8f | ||
![]() |
6c9b781e6e | ||
![]() |
04b9d87fca | ||
![]() |
868eaeb70e | ||
![]() |
0e1e705e15 | ||
![]() |
faaf38ca7d | ||
![]() |
54d741ba54 | ||
![]() |
101f080138 | ||
![]() |
4d7226832d | ||
![]() |
0370324f1f | ||
![]() |
ec16c2d7c2 | ||
![]() |
e9612696fd | ||
![]() |
a18a0e7a47 | ||
![]() |
106ae7abe6 | ||
![]() |
39afe946a0 | ||
![]() |
0776c3b4d6 | ||
![]() |
ff5e73d6eb | ||
![]() |
b6dde510bd | ||
![]() |
800229a448 | ||
![]() |
93a6c51d88 | ||
![]() |
8880a00862 | ||
![]() |
572fbf4f49 | ||
![]() |
396c37d82f | ||
![]() |
afb358313a | ||
![]() |
5847eb1e65 | ||
![]() |
2badd6500e | ||
![]() |
b324fe5d95 | ||
![]() |
a38cdddd37 | ||
![]() |
2cf22ad5f2 | ||
![]() |
c8e01752a1 | ||
![]() |
640a4f7dcd | ||
![]() |
435a241869 | ||
![]() |
a5ff3206f9 | ||
![]() |
5bb5bf3efb | ||
![]() |
55a62a1ee5 | ||
![]() |
7fa81a66af | ||
![]() |
4e0372b9b7 | ||
![]() |
5476e5d035 | ||
![]() |
363a565ce3 | ||
![]() |
d4a468c160 | ||
![]() |
6690bb7411 | ||
![]() |
2ab871dd17 | ||
![]() |
2ea8abef34 | ||
![]() |
67d9abb5f1 | ||
![]() |
f611eb0283 | ||
![]() |
78debc1143 | ||
![]() |
7b76e3982f | ||
![]() |
675210bd8b | ||
![]() |
0236e88af4 | ||
![]() |
c939af8185 | ||
![]() |
33d8e8f31c | ||
![]() |
f678d5818f | ||
![]() |
4ef8e15ed3 | ||
![]() |
09ca7c4d9c | ||
![]() |
76d9adae8c | ||
![]() |
9f7fb6d01a | ||
![]() |
cc32b08205 | ||
![]() |
5958306466 | ||
![]() |
464d294b63 | ||
![]() |
b7f4a421e4 | ||
![]() |
fe64afb479 | ||
![]() |
0277067e5f | ||
![]() |
334102addd | ||
![]() |
52d475e89b | ||
![]() |
2bb844ee0e | ||
![]() |
897616f073 | ||
![]() |
34f0222fdd | ||
![]() |
d125bdfaa0 | ||
![]() |
6a60201e80 | ||
![]() |
a3f5b712d3 | ||
![]() |
b2336402a7 | ||
![]() |
5091dc2124 | ||
![]() |
7bed76786d | ||
![]() |
0e45ad2d7f | ||
![]() |
43e064880e | ||
![]() |
04a95e3425 | ||
![]() |
496b28bb58 | ||
![]() |
94bd667ba6 | ||
![]() |
186730a284 | ||
![]() |
6e31094d77 | ||
![]() |
27cbf46dd6 | ||
![]() |
83a98c3807 | ||
![]() |
2262bd1797 | ||
![]() |
f0b70b7c8e | ||
![]() |
f8d4b4746c | ||
![]() |
f33f67ebd3 | ||
![]() |
cc866f3c02 | ||
![]() |
a43ed9286f | ||
![]() |
071778b919 | ||
![]() |
a4f0fbafbb | ||
![]() |
52cfd17917 | ||
![]() |
f34598214b | ||
![]() |
f064c5ee4f | ||
![]() |
3e992aa283 | ||
![]() |
c226835aa5 | ||
![]() |
9e616ca7b7 | ||
![]() |
b23bd81cd9 | ||
![]() |
39a346bde0 | ||
![]() |
89d3590300 | ||
![]() |
0f74b7ec44 | ||
![]() |
422ae20a45 | ||
![]() |
efc5d0a3b4 | ||
![]() |
431473ea9b | ||
![]() |
cbe47f2066 | ||
![]() |
e43795de28 | ||
![]() |
dc1b6aa8c6 | ||
![]() |
b924a5db14 | ||
![]() |
0264bb8343 | ||
![]() |
c24bb64792 | ||
![]() |
cdb04931ab | ||
![]() |
dce4f161d4 | ||
![]() |
ffc3272a2b | ||
![]() |
8d19db8628 | ||
![]() |
1250b77607 | ||
![]() |
1b5eaf62de | ||
![]() |
dd03a1a91e | ||
![]() |
7cd8bae799 | ||
![]() |
ae2509339d | ||
![]() |
7a8862e316 | ||
![]() |
20780ec61c | ||
![]() |
98dfe7e7e0 | ||
![]() |
94f5d0a3f4 | ||
![]() |
997dba8ffd | ||
![]() |
6f95296972 | ||
![]() |
c85c725b08 | ||
![]() |
a06d93f6cb | ||
![]() |
8daaee3ed6 | ||
![]() |
e40eceba4c | ||
![]() |
c220abb011 | ||
![]() |
71cb9fd9fd | ||
![]() |
8fdb6e2b61 | ||
![]() |
676d321b28 | ||
![]() |
d6d1d33e88 | ||
![]() |
89830c2117 | ||
![]() |
4e16948a1f | ||
![]() |
c530672f0e | ||
![]() |
38af2c6c9b | ||
![]() |
a99d485016 | ||
![]() |
fc9bfe5317 | ||
![]() |
4e80b18851 | ||
![]() |
fee855030d | ||
![]() |
c06aaebefd | ||
![]() |
c2e1a12cdf | ||
![]() |
27202b2240 | ||
![]() |
c2015f6a9c | ||
![]() |
e09ab1a01c | ||
![]() |
2018606c32 | ||
![]() |
eba3e1a20c | ||
![]() |
95f2b10b4f | ||
![]() |
04f298a34f | ||
![]() |
bcf497a5fa | ||
![]() |
e0d8964453 | ||
![]() |
ae15c87bf0 | ||
![]() |
cd19782943 | ||
![]() |
9d5ce4962d | ||
![]() |
b5b54dbd02 | ||
![]() |
3cd599d6f6 | ||
![]() |
2f5c8ee699 | ||
![]() |
e028ee0d59 | ||
![]() |
7fa31911fe | ||
![]() |
f181b6fef6 | ||
![]() |
e2bda65947 | ||
![]() |
50a3e3bfd3 | ||
![]() |
eda8151fa0 | ||
![]() |
edd55bc73d | ||
![]() |
0863148c4f | ||
![]() |
d098f92c4a | ||
![]() |
6ed282bb2d | ||
![]() |
e945d3763b | ||
![]() |
262c680997 | ||
![]() |
054149698b | ||
![]() |
a294acfb73 | ||
![]() |
9602d0a03c | ||
![]() |
a3048438c3 | ||
![]() |
6331778552 | ||
![]() |
1513e57eee | ||
![]() |
d52e55d8de | ||
![]() |
9c8a75ff9c | ||
![]() |
f3035f98e1 | ||
![]() |
15951f0e6b | ||
![]() |
1c3881b48a | ||
![]() |
704c81eda4 | ||
![]() |
60a5b2a85e | ||
![]() |
4381cb5957 | ||
![]() |
74d64fd61a | ||
![]() |
82bdda9a89 | ||
![]() |
afd65a4cd0 | ||
![]() |
b6da473800 | ||
![]() |
eee0f2b9d5 | ||
![]() |
cb5d53e5a9 | ||
![]() |
b5ba20ada4 | ||
![]() |
d236b9438d | ||
![]() |
b7b6542804 | ||
![]() |
34873f5fe7 | ||
![]() |
522a7c8ee0 | ||
![]() |
433f743074 | ||
![]() |
38196894db | ||
![]() |
db69a291d4 | ||
![]() |
389beaef97 | ||
![]() |
8ebad6963b | ||
![]() |
43042c14e0 | ||
![]() |
6b91d3700b | ||
![]() |
7aa2bdca44 | ||
![]() |
5005e9a856 | ||
![]() |
0a43dd1019 | ||
![]() |
a6d89853d4 | ||
![]() |
116deb0386 | ||
![]() |
6647b2a4ca | ||
![]() |
6c62fa461e | ||
![]() |
e9edb5c96b | ||
![]() |
9869a2d0da | ||
![]() |
024c2b690a | ||
![]() |
cd211acd80 | ||
![]() |
494f0053ae | ||
![]() |
d45280369f | ||
![]() |
c68652c88c | ||
![]() |
a94b4eef79 | ||
![]() |
94dd9685cc | ||
![]() |
a0f175f327 | ||
![]() |
ea692ca6f7 | ||
![]() |
02aab770db | ||
![]() |
cdc5c44bb1 | ||
![]() |
da9e152ed1 | ||
![]() |
ece1e3905e | ||
![]() |
bfc69f0e4b | ||
![]() |
7703043195 | ||
![]() |
f83e0fb81a | ||
![]() |
90592b3cbe | ||
![]() |
04536db387 | ||
![]() |
e470131a77 | ||
![]() |
1e35d06bf0 | ||
![]() |
1a576e732e | ||
![]() |
30244c2c40 | ||
![]() |
9ace418371 | ||
![]() |
87978f7989 | ||
![]() |
e96b91dd37 | ||
![]() |
541ccd6669 | ||
![]() |
140e8085dd | ||
![]() |
2597fff76b | ||
![]() |
225595235c | ||
![]() |
d9c4b91af3 | ||
![]() |
ee2974869c | ||
![]() |
c940e9fc7e | ||
![]() |
c3a929fdfc | ||
![]() |
6313d84d38 | ||
![]() |
10ccbc9a2c | ||
![]() |
bbe69aa725 | ||
![]() |
8b3858081d | ||
![]() |
809d0523d9 | ||
![]() |
e1f6a2e6b5 | ||
![]() |
956bb91cfe | ||
![]() |
23cb7d761e | ||
![]() |
1813a809ff | ||
![]() |
e3f0be41d4 | ||
![]() |
618fd04729 | ||
![]() |
04bed42831 | ||
![]() |
661fd7bb67 | ||
![]() |
18615b1485 | ||
![]() |
f754ed9788 | ||
![]() |
6443086222 | ||
![]() |
556565ca0d | ||
![]() |
40886599ce | ||
![]() |
2310da0070 | ||
![]() |
e76de4138e | ||
![]() |
43aeb4e48e | ||
![]() |
305f1d68d6 | ||
![]() |
1b273ed5c9 | ||
![]() |
bb1d0d1900 | ||
![]() |
f262693983 | ||
![]() |
8c81469f94 | ||
![]() |
6c250640c4 | ||
![]() |
fb93979b94 | ||
![]() |
6357de4e61 | ||
![]() |
96535cc4f9 | ||
![]() |
bd0ffa8a3c | ||
![]() |
ac49ce8b3b | ||
![]() |
9240614928 | ||
![]() |
89044ff5d5 | ||
![]() |
315f01fc96 | ||
![]() |
e99aff93e1 | ||
![]() |
42677ded8e | ||
![]() |
d375a7ea0a | ||
![]() |
3b4c622661 | ||
![]() |
ba87593afd | ||
![]() |
af1ec6275d | ||
![]() |
3ff2fb43cf | ||
![]() |
a148e37c4c | ||
![]() |
4d876bac0c | ||
![]() |
114b35144e | ||
![]() |
69184dc390 | ||
![]() |
70aea4cd82 | ||
![]() |
e091eacde0 | ||
![]() |
9447ec9600 | ||
![]() |
351a1d8d37 | ||
![]() |
b0f996c8ef | ||
![]() |
4de197f778 | ||
![]() |
bd7d3faa10 | ||
![]() |
bc152da68b | ||
![]() |
72ca7d6ee5 | ||
![]() |
acc688b5e1 | ||
![]() |
0cf3176462 | ||
![]() |
116e1bb6cb | ||
![]() |
9c1be2a510 | ||
![]() |
5319b6e3b1 | ||
![]() |
ce94a786ae | ||
![]() |
25c29d277f | ||
![]() |
e51337fcd9 | ||
![]() |
3139894794 | ||
![]() |
5bbb63ed93 | ||
![]() |
bc618c2c6c | ||
![]() |
97a1d48512 | ||
![]() |
9ec638c7bb | ||
![]() |
c1d51593d1 | ||
![]() |
948bc98fa6 | ||
![]() |
28d31316b7 | ||
![]() |
f876813531 | ||
![]() |
ec8ef9d292 | ||
![]() |
7836b60825 | ||
![]() |
17367a702e | ||
![]() |
1bd2c40228 | ||
![]() |
71e71c0b60 | ||
![]() |
f920976fa6 | ||
![]() |
26dcb0ffc4 | ||
![]() |
f6802b733a | ||
![]() |
7b9ce3a940 | ||
![]() |
dc88538e80 | ||
![]() |
9875a0e228 | ||
![]() |
ee46a1077c | ||
![]() |
5d11bc9a77 | ||
![]() |
a9b2a18880 | ||
![]() |
27ba835236 | ||
![]() |
e4da7db567 | ||
![]() |
2f35b0487b | ||
![]() |
81bb380916 | ||
![]() |
08573b4cb8 | ||
![]() |
b9717ca261 | ||
![]() |
5d6a9a70c8 | ||
![]() |
f3b5704663 | ||
![]() |
d5773ac5bf | ||
![]() |
363a263114 | ||
![]() |
140a2721e6 | ||
![]() |
8b6bb245db | ||
![]() |
059bc53760 | ||
![]() |
0960c0810c | ||
![]() |
dc87157e80 | ||
![]() |
d17511a806 | ||
![]() |
e199d7ef6b | ||
![]() |
b286c62feb | ||
![]() |
32c442afdb | ||
![]() |
75154318af | ||
![]() |
74f4c73c24 | ||
![]() |
9445b931ec | ||
![]() |
621760a8b8 | ||
![]() |
065f349813 | ||
![]() |
48b1531966 | ||
![]() |
262d5e6791 | ||
![]() |
361a2ccdf6 | ||
![]() |
c930f871f3 | ||
![]() |
b9a2e71a8b | ||
![]() |
01d077d4bc | ||
![]() |
79a04605d3 | ||
![]() |
a873c7f456 | ||
![]() |
5881ec5389 | ||
![]() |
50cb742377 | ||
![]() |
4ccfe5108c | ||
![]() |
39e6f987bb | ||
![]() |
d458e82286 | ||
![]() |
1314273a42 | ||
![]() |
0337bb50d9 | ||
![]() |
4227a546a1 | ||
![]() |
5f4af3ac8a | ||
![]() |
4a53536464 | ||
![]() |
3b491ccbbd | ||
![]() |
3d1b9e4dbc | ||
![]() |
f81d84dfc6 | ||
![]() |
7254d0fe94 | ||
![]() |
3160ab66db | ||
![]() |
941e6505d0 | ||
![]() |
687bc7d40e | ||
![]() |
949923c03f | ||
![]() |
1d8575cd83 | ||
![]() |
3949cd567d | ||
![]() |
4ece86c64a | ||
![]() |
1a2d522eaa | ||
![]() |
c18e91d771 | ||
![]() |
451a4f2cfa | ||
![]() |
88175417bb | ||
![]() |
4de7c6a901 | ||
![]() |
0d5eb2657a | ||
![]() |
9b3ac00c2d | ||
![]() |
b4f47cbdec | ||
![]() |
ccda43673a | ||
![]() |
3b8a34240e | ||
![]() |
d0fffa9212 | ||
![]() |
0106e6ec9c | ||
![]() |
37a4c0ff59 | ||
![]() |
30007f7897 | ||
![]() |
caba5c4692 | ||
![]() |
bc3a3d9249 | ||
![]() |
599b8c3533 | ||
![]() |
e6432d2380 | ||
![]() |
39ebf9c5a7 | ||
![]() |
a332c26780 | ||
![]() |
a8a226b748 | ||
![]() |
9b1b38d2de | ||
![]() |
2bb075c850 | ||
![]() |
235edd0742 | ||
![]() |
252cd48b9c | ||
![]() |
c2def5c2f4 | ||
![]() |
25a9888102 | ||
![]() |
1eec99ce1d | ||
![]() |
c0dab7617f | ||
![]() |
041973d1d5 | ||
![]() |
203ccdd976 | ||
![]() |
6f9dc1c926 | ||
![]() |
324e046f06 | ||
![]() |
21d1e03e37 | ||
![]() |
34c1d196a4 | ||
![]() |
bd2b5cc7aa | ||
![]() |
cfb8d6f8ac | ||
![]() |
0a656de60b | ||
![]() |
23bd0f3178 | ||
![]() |
0e7220b2f2 | ||
![]() |
53eb24af9b | ||
![]() |
86b17193de | ||
![]() |
96a50db344 | ||
![]() |
4c922ec572 | ||
![]() |
b80b085575 | ||
![]() |
fbd67feead | ||
![]() |
edb971a10e | ||
![]() |
693a15ea00 | ||
![]() |
4d1a6cd362 | ||
![]() |
9e1e7fa1d7 | ||
![]() |
07ab4623e6 | ||
![]() |
66c5199362 | ||
![]() |
ca32b08825 | ||
![]() |
1cdb764422 | ||
![]() |
d0beab8012 | ||
![]() |
04519d261d | ||
![]() |
e590ec6f3f | ||
![]() |
08b00f8804 | ||
![]() |
326acea29d | ||
![]() |
97126cac4b | ||
![]() |
2ddc522864 | ||
![]() |
d7b21fc40b | ||
![]() |
041f91b176 | ||
![]() |
ab85e79a91 | ||
![]() |
faa04a03c0 | ||
![]() |
820d49b84e | ||
![]() |
81bdf1a386 | ||
![]() |
5a9bc4bfb2 | ||
![]() |
67c8a63a0a | ||
![]() |
4859649229 | ||
![]() |
6e90a853f4 | ||
![]() |
aacbc64a23 | ||
![]() |
658f42ef0f | ||
![]() |
787cc535e9 | ||
![]() |
452a693aab | ||
![]() |
23206fa4b5 | ||
![]() |
bcaa87574d | ||
![]() |
d57bcc0b85 | ||
![]() |
c96a6f990e | ||
![]() |
88cf4ce865 | ||
![]() |
5e193618cb | ||
![]() |
0e83c0e792 | ||
![]() |
645a7dc14c | ||
![]() |
5044df88ab | ||
![]() |
ab2bc933b8 | ||
![]() |
b13778c2c6 | ||
![]() |
54df6d0a56 | ||
![]() |
44746dfbd6 | ||
![]() |
a86d574208 | ||
![]() |
cb71308d22 | ||
![]() |
02b4a65086 | ||
![]() |
838294b10d | ||
![]() |
22eebff261 | ||
![]() |
a98e8ad4b5 | ||
![]() |
2d34082b0c | ||
![]() |
1f1da6806c | ||
![]() |
647a26bc9e | ||
![]() |
561b0ca029 | ||
![]() |
3c5295ee8a | ||
![]() |
914cf5ff87 | ||
![]() |
ecb588740a | ||
![]() |
4858a26400 | ||
![]() |
995a29d2f3 | ||
![]() |
fcd5f960f8 | ||
![]() |
54d88f1a1c | ||
![]() |
fee8ac9721 | ||
![]() |
1326e9d538 | ||
![]() |
bd0960cda8 | ||
![]() |
cfd2ea0cff | ||
![]() |
e5e9dc2d92 | ||
![]() |
f8d03b1060 | ||
![]() |
037ece674b | ||
![]() |
87cf38a427 | ||
![]() |
0d10408a25 | ||
![]() |
48d98b4c9e | ||
![]() |
64c4fbd220 | ||
![]() |
af0ba4e3ef | ||
![]() |
5dce4d79bd | ||
![]() |
c0edb17b93 | ||
![]() |
bdde70c9d3 | ||
![]() |
8ff81d4362 | ||
![]() |
1b71ceb384 | ||
![]() |
0ab5828d0d | ||
![]() |
d5b243de14 | ||
![]() |
1d8d975721 | ||
![]() |
96ce0e393d | ||
![]() |
cf3762369c | ||
![]() |
8138ebaa32 | ||
![]() |
eb42514124 | ||
![]() |
4d6891162d | ||
![]() |
978f091822 | ||
![]() |
a96f2f603b | ||
![]() |
2cdc758860 | ||
![]() |
9904159356 | ||
![]() |
6e095a9741 | ||
![]() |
90b4f55001 | ||
![]() |
60e683f5d3 | ||
![]() |
a9a6e00d14 | ||
![]() |
6fa0feb7de | ||
![]() |
0db93a5dea | ||
![]() |
270ba10962 | ||
![]() |
f8025d4f88 | ||
![]() |
83f97e8eba | ||
![]() |
d6b0c838dd | ||
![]() |
94bcd21ccd | ||
![]() |
d8ac578ce1 | ||
![]() |
f9bae91dea | ||
![]() |
6147b47719 | ||
![]() |
191de76ccb | ||
![]() |
b500d40a25 | ||
![]() |
43c663c5cf | ||
![]() |
3fdab96728 | ||
![]() |
fcd51d81d9 | ||
![]() |
83a2014ede | ||
![]() |
1c38810e11 | ||
![]() |
10ca5f1cd2 | ||
![]() |
e7eaebebd4 | ||
![]() |
76ad803f25 | ||
![]() |
dbf67d912c | ||
![]() |
5c3dfacdc5 | ||
![]() |
635984f077 | ||
![]() |
70d5d234db | ||
![]() |
12da0a9a69 | ||
![]() |
97ebcb99b4 | ||
![]() |
a5bd6acd90 | ||
![]() |
d6d78b8457 | ||
![]() |
c263b64d2e | ||
![]() |
dfc95cdf1c | ||
![]() |
0f1c04ed7e | ||
![]() |
cced832cac | ||
![]() |
2d20e557df | ||
![]() |
14607b352c | ||
![]() |
fa7189b480 | ||
![]() |
812663de62 | ||
![]() |
f96e3371a0 | ||
![]() |
8476a2e4a1 | ||
![]() |
2104f1273a | ||
![]() |
feb66cba01 | ||
![]() |
b961491ad2 | ||
![]() |
411b3ecc37 | ||
![]() |
3e63bc08ee | ||
![]() |
e90d5ad6cf | ||
![]() |
abec10fcd5 | ||
![]() |
6f8fd5b7a7 | ||
![]() |
5eba5dc271 | ||
![]() |
5f10562ad1 | ||
![]() |
596f2e7c4d | ||
![]() |
1a95b979d8 | ||
![]() |
0024e5cc9b | ||
![]() |
cda9d6d981 | ||
![]() |
d3b35c4063 | ||
![]() |
3bfd78e6b8 | ||
![]() |
c167b7d532 | ||
![]() |
6d30d87d7e | ||
![]() |
e7b97c9473 | ||
![]() |
8d1e66a627 | ||
![]() |
7c14c86ffd | ||
![]() |
49b0952371 | ||
![]() |
e47fa05eb8 | ||
![]() |
2c5fc14bf9 | ||
![]() |
fd0f0e564d | ||
![]() |
aa934d00e3 | ||
![]() |
f26d25e24b | ||
![]() |
99f954f1c1 | ||
![]() |
d759612523 | ||
![]() |
a5c50220db | ||
![]() |
cdc5b32240 | ||
![]() |
efe635a3f8 | ||
![]() |
0288ef8733 | ||
![]() |
e08ebff139 | ||
![]() |
af1b61569f | ||
![]() |
7784ff55d6 | ||
![]() |
7be632b558 | ||
![]() |
047062eedf | ||
![]() |
f472716e96 | ||
![]() |
347da5f7b3 | ||
![]() |
4a18957093 | ||
![]() |
3fcc6c669f | ||
![]() |
33b380937a | ||
![]() |
eb515b87d7 | ||
![]() |
c5aee4d9b4 | ||
![]() |
3db918b1cd | ||
![]() |
eefff81289 | ||
![]() |
3375db12a5 | ||
![]() |
4d059ead8c | ||
![]() |
4cf71b2c7f | ||
![]() |
57d3b02800 | ||
![]() |
4d1f09c752 | ||
![]() |
c183111a61 | ||
![]() |
0b6ce17dc4 | ||
![]() |
e3cd91af53 | ||
![]() |
d0c4aeb0c0 | ||
![]() |
f981682bdc | ||
![]() |
8f7640dbef | ||
![]() |
7ee736a158 | ||
![]() |
b260efd9c4 | ||
![]() |
b4fcb4d43c | ||
![]() |
301a506aa2 | ||
![]() |
40a6ac62d3 | ||
![]() |
d24d13559b | ||
![]() |
367c3d8a83 | ||
![]() |
684d9cef23 | ||
![]() |
c459adbf6a | ||
![]() |
d9a39d6128 | ||
![]() |
26c5001ec4 | ||
![]() |
c05746eac2 | ||
![]() |
d900abe7e1 | ||
![]() |
2765861705 | ||
![]() |
ac8993ac38 | ||
![]() |
cc62689504 | ||
![]() |
9260c38408 | ||
![]() |
b4ac385d70 | ||
![]() |
85a98fc758 | ||
![]() |
0221639e8a | ||
![]() |
7ad9fc7fdb | ||
![]() |
67cba372e8 | ||
![]() |
b194b957ce | ||
![]() |
df5892ac89 | ||
![]() |
a432d971b1 | ||
![]() |
85cf8af026 | ||
![]() |
a867320021 | ||
![]() |
a70d917da6 | ||
![]() |
b9314fd887 | ||
![]() |
de916bd27b | ||
![]() |
9f6dd08e1c | ||
![]() |
db307f9946 | ||
![]() |
7c3b146789 | ||
![]() |
54fc26bf34 | ||
![]() |
a780f96a25 | ||
![]() |
bb54e9a4be | ||
![]() |
ada598668b | ||
![]() |
8c7fdadeba | ||
![]() |
5a8271d0c6 | ||
![]() |
35bf91012f | ||
![]() |
beddcd6a6d | ||
![]() |
6ce4a5ce8c | ||
![]() |
4a71704ae4 | ||
![]() |
ce9ae3c70d | ||
![]() |
55e853c160 | ||
![]() |
90a92c4efc | ||
![]() |
fbfc27d707 | ||
![]() |
aac505d4ff | ||
![]() |
e5a0986433 | ||
![]() |
2ea1037369 | ||
![]() |
faeea04712 | ||
![]() |
cdcde36f51 | ||
![]() |
85a33bd2f1 | ||
![]() |
19493e4932 | ||
![]() |
557556bbfd | ||
![]() |
d01129e9c8 | ||
![]() |
972ae2393a | ||
![]() |
21308eb5cc | ||
![]() |
4c0f5f85c0 | ||
![]() |
9573eb5315 | ||
![]() |
d1df044b42 | ||
![]() |
9171d56146 | ||
![]() |
8dc8282651 | ||
![]() |
6e646e42a5 | ||
![]() |
91b8a87fc7 | ||
![]() |
5aaee953c5 | ||
![]() |
9d9fc522c8 | ||
![]() |
5e8368d0c9 | ||
![]() |
c91b2b42a8 | ||
![]() |
4cc42789db | ||
![]() |
f281b59394 | ||
![]() |
4bd6a11c25 | ||
![]() |
7b4c08db21 | ||
![]() |
100b212538 | ||
![]() |
9877c21c50 | ||
![]() |
54cc7d0f30 | ||
![]() |
ee8f46e826 | ||
![]() |
d9a687af45 | ||
![]() |
3706fef9af | ||
![]() |
76fed9c04d | ||
![]() |
7a00cef055 | ||
![]() |
9fb9399487 | ||
![]() |
94eb175e07 | ||
![]() |
8e9ef0f6f6 | ||
![]() |
02355d32bd | ||
![]() |
e3389e9017 | ||
![]() |
984715e859 | ||
![]() |
31fec1f730 | ||
![]() |
446e4ff54b | ||
![]() |
203a5a0f71 | ||
![]() |
98fbfa2739 | ||
![]() |
c4b52098f3 | ||
![]() |
3f4d0943d7 | ||
![]() |
67f4e2674f | ||
![]() |
441a76b646 | ||
![]() |
4b16c6fb0c | ||
![]() |
8d06abb8ed | ||
![]() |
77203c940c | ||
![]() |
f9c4cb5f8a | ||
![]() |
1d166a2151 | ||
![]() |
79e520957b | ||
![]() |
9c386b181a | ||
![]() |
c9e96018be | ||
![]() |
a04cc4470e | ||
![]() |
407f68a67b | ||
![]() |
c5dd3265ed | ||
![]() |
9637ed05f5 | ||
![]() |
11f6aac1e3 | ||
![]() |
dbad9fd58a | ||
![]() |
62b1c3411c | ||
![]() |
f5e107e046 | ||
![]() |
c91074514a | ||
![]() |
c8fdce28e6 | ||
![]() |
38592b9e4f | ||
![]() |
f777cc079d | ||
![]() |
17025f5354 | ||
![]() |
7858a2f05c | ||
![]() |
a35d3b895b | ||
![]() |
1d8c2498ee | ||
![]() |
f548243e9e | ||
![]() |
eb9a520adb | ||
![]() |
89a59b98e7 | ||
![]() |
e3645d666e | ||
![]() |
dcef7b066c | ||
![]() |
c9ed4bce66 | ||
![]() |
44b5c1e41a | ||
![]() |
0d06bf6027 | ||
![]() |
a2eadbbcdf | ||
![]() |
347ad11b68 | ||
![]() |
f2920cbf62 | ||
![]() |
7513a644b9 | ||
![]() |
f097a24253 | ||
![]() |
53168d4e57 | ||
![]() |
72f41a6591 | ||
![]() |
00c84aa54f | ||
![]() |
e32dd27eb7 | ||
![]() |
9ce0abf34f | ||
![]() |
569a9a9dcc | ||
![]() |
945594fa98 | ||
![]() |
770bbba676 | ||
![]() |
8d021a2915 | ||
![]() |
8411cc934d | ||
![]() |
5e0208a710 | ||
![]() |
335bcdc206 | ||
![]() |
89d98a780d | ||
![]() |
b5e0ac35c8 | ||
![]() |
a31f2be91a | ||
![]() |
4633f19971 | ||
![]() |
0e5cc0d79b | ||
![]() |
ceabb96c89 | ||
![]() |
723f2f465b | ||
![]() |
376e5ffd6e | ||
![]() |
b16bfe4f5f | ||
![]() |
0ab5d42bd5 | ||
![]() |
0322431c5c | ||
![]() |
81a0f7222c | ||
![]() |
d8f4339c18 | ||
![]() |
41d4473df4 | ||
![]() |
31c932eec9 | ||
![]() |
86c8c3306b | ||
![]() |
6e9c0a8155 | ||
![]() |
8a836213f7 | ||
![]() |
6e6847d9c7 | ||
![]() |
321604b4e5 | ||
![]() |
a7363af47e | ||
![]() |
560abc9c14 | ||
![]() |
65b0588e80 | ||
![]() |
a193e6a204 | ||
![]() |
7763c7a1cc | ||
![]() |
e272e5039d | ||
![]() |
8f88f34973 | ||
![]() |
b4a2fd1fcd | ||
![]() |
752aa7adde | ||
![]() |
2153ac5863 | ||
![]() |
808375429d | ||
![]() |
2b990b400e | ||
![]() |
34be8d0670 | ||
![]() |
eae2027db7 | ||
![]() |
65aadf0332 | ||
![]() |
44bf54edee | ||
![]() |
daa8a2fe87 | ||
![]() |
b8d6351f80 | ||
![]() |
7cb3e9bf43 | ||
![]() |
8ce37d9153 | ||
![]() |
a9c6881bbc | ||
![]() |
7c118ee22b | ||
![]() |
a3dd0e7861 | ||
![]() |
abdd206f65 | ||
![]() |
1d09474975 | ||
![]() |
3484434fe2 | ||
![]() |
f164bae4a3 | ||
![]() |
db504db9aa | ||
![]() |
bff894900e | ||
![]() |
71f8460357 | ||
![]() |
f9d0007546 | ||
![]() |
14232b40d9 | ||
![]() |
18d506c7fb | ||
![]() |
c384ac88a0 | ||
![]() |
8f59707f04 | ||
![]() |
62f0c70a8c | ||
![]() |
1fc753af66 | ||
![]() |
f02dec2bbb |
18
.github/ISSUE_TEMPLATE/build_error.yml
vendored
18
.github/ISSUE_TEMPLATE/build_error.yml
vendored
@@ -16,19 +16,29 @@ body:
|
||||
attributes:
|
||||
label: Steps to reproduce the issue
|
||||
description: |
|
||||
Fill in the exact spec you are trying to build and the relevant part of the error message
|
||||
placeholder: |
|
||||
Fill in the console output from the exact spec you are trying to build.
|
||||
value: |
|
||||
```console
|
||||
$ spack install <spec>
|
||||
$ spack spec -I <spec>
|
||||
...
|
||||
```
|
||||
- type: textarea
|
||||
id: error
|
||||
attributes:
|
||||
label: Error message
|
||||
description: |
|
||||
Please post the error message from spack inside the `<details>` tag below:
|
||||
value: |
|
||||
<details><summary>Error message</summary><pre>
|
||||
...
|
||||
</pre></details>
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: information
|
||||
attributes:
|
||||
label: Information on your system
|
||||
description: Please include the output of `spack debug report`
|
||||
description: Please include the output of `spack debug report`.
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
|
105
.github/workflows/bootstrap.yml
vendored
105
.github/workflows/bootstrap.yml
vendored
@@ -1,6 +1,8 @@
|
||||
name: Bootstrapping
|
||||
|
||||
on:
|
||||
# This Workflow can be triggered manually
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
branches:
|
||||
- develop
|
||||
@@ -29,7 +31,7 @@ jobs:
|
||||
bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \
|
||||
make patch unzip which xz python3 python3-devel tree \
|
||||
cmake bison bison-devel libstdc++-static
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- name: Setup repo and non-root user
|
||||
run: |
|
||||
git --version
|
||||
@@ -41,7 +43,7 @@ jobs:
|
||||
shell: runuser -u spack-test -- bash {0}
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
spack bootstrap untrust github-actions
|
||||
spack bootstrap untrust github-actions-v0.2
|
||||
spack external find cmake bison
|
||||
spack -d solve zlib
|
||||
tree ~/.spack/bootstrap/store/
|
||||
@@ -59,7 +61,15 @@ jobs:
|
||||
bzip2 curl file g++ gcc gfortran git gnupg2 gzip \
|
||||
make patch unzip xz-utils python3 python3-dev tree \
|
||||
cmake bison
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- name: Work around CVE-2022-24765
|
||||
run: |
|
||||
# Apparently Ubuntu patched git v2.25.1 with a security patch that introduces
|
||||
# a breaking behavior. See:
|
||||
# - https://github.blog/2022-04-12-git-security-vulnerability-announced/
|
||||
# - https://github.com/actions/checkout/issues/760
|
||||
# - http://changelogs.ubuntu.com/changelogs/pool/main/g/git/git_2.25.1-1ubuntu3.3/changelog
|
||||
git config --global --add safe.directory /__w/spack/spack
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- name: Setup repo and non-root user
|
||||
run: |
|
||||
git --version
|
||||
@@ -71,23 +81,60 @@ jobs:
|
||||
shell: runuser -u spack-test -- bash {0}
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
spack bootstrap untrust github-actions
|
||||
spack bootstrap untrust github-actions-v0.2
|
||||
spack external find cmake bison
|
||||
spack -d solve zlib
|
||||
tree ~/.spack/bootstrap/store/
|
||||
|
||||
ubuntu-clingo-binaries-and-patchelf:
|
||||
runs-on: ubuntu-latest
|
||||
container: "ubuntu:latest"
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
run: |
|
||||
apt-get update -y && apt-get upgrade -y
|
||||
apt-get install -y \
|
||||
bzip2 curl file g++ gcc gfortran git gnupg2 gzip \
|
||||
make patch unzip xz-utils python3 python3-dev tree
|
||||
- name: Work around CVE-2022-24765
|
||||
run: |
|
||||
# Apparently Ubuntu patched git v2.25.1 with a security patch that introduces
|
||||
# a breaking behavior. See:
|
||||
# - https://github.blog/2022-04-12-git-security-vulnerability-announced/
|
||||
# - https://github.com/actions/checkout/issues/760
|
||||
# - http://changelogs.ubuntu.com/changelogs/pool/main/g/git/git_2.25.1-1ubuntu3.3/changelog
|
||||
git config --global --add safe.directory /__w/spack/spack
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- name: Setup repo and non-root user
|
||||
run: |
|
||||
git --version
|
||||
git fetch --unshallow
|
||||
. .github/workflows/setup_git.sh
|
||||
useradd -m spack-test
|
||||
chown -R spack-test .
|
||||
- name: Bootstrap clingo
|
||||
shell: runuser -u spack-test -- bash {0}
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
spack -d solve zlib
|
||||
tree ~/.spack/bootstrap/store/
|
||||
|
||||
|
||||
opensuse-clingo-sources:
|
||||
runs-on: ubuntu-latest
|
||||
container: "opensuse/leap:latest"
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
zypper update -y
|
||||
# Harden CI by applying the workaround described here: https://www.suse.com/support/kb/doc/?id=000019505
|
||||
zypper update -y || zypper update -y
|
||||
zypper install -y \
|
||||
bzip2 curl file gcc-c++ gcc gcc-fortran tar git gpg2 gzip \
|
||||
make patch unzip which xz python3 python3-devel tree \
|
||||
cmake bison
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- name: Setup repo and non-root user
|
||||
run: |
|
||||
git --version
|
||||
@@ -96,7 +143,7 @@ jobs:
|
||||
- name: Bootstrap clingo
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
spack bootstrap untrust github-actions
|
||||
spack bootstrap untrust github-actions-v0.2
|
||||
spack external find cmake bison
|
||||
spack -d solve zlib
|
||||
tree ~/.spack/bootstrap/store/
|
||||
@@ -107,12 +154,12 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install cmake bison@2.7 tree
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- name: Bootstrap clingo
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
export PATH=/usr/local/opt/bison@2.7/bin:$PATH
|
||||
spack bootstrap untrust github-actions
|
||||
spack bootstrap untrust github-actions-v0.2
|
||||
spack external find --not-buildable cmake bison
|
||||
spack -d solve zlib
|
||||
tree ~/.spack/bootstrap/store/
|
||||
@@ -121,13 +168,13 @@ jobs:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ['3.5', '3.6', '3.7', '3.8', '3.9']
|
||||
python-version: ['3.5', '3.6', '3.7', '3.8', '3.9', '3.10']
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install tree
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Bootstrap clingo
|
||||
@@ -141,10 +188,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ['2.7', '3.5', '3.6', '3.7', '3.8', '3.9']
|
||||
python-version: ['2.7', '3.5', '3.6', '3.7', '3.8', '3.9', '3.10']
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Setup repo and non-root user
|
||||
@@ -171,7 +218,15 @@ jobs:
|
||||
apt-get install -y \
|
||||
bzip2 curl file g++ gcc patchelf gfortran git gzip \
|
||||
make patch unzip xz-utils python3 python3-dev tree
|
||||
- uses: actions/checkout@v2
|
||||
- name: Work around CVE-2022-24765
|
||||
run: |
|
||||
# Apparently Ubuntu patched git v2.25.1 with a security patch that introduces
|
||||
# a breaking behavior. See:
|
||||
# - https://github.blog/2022-04-12-git-security-vulnerability-announced/
|
||||
# - https://github.com/actions/checkout/issues/760
|
||||
# - http://changelogs.ubuntu.com/changelogs/pool/main/g/git/git_2.25.1-1ubuntu3.3/changelog
|
||||
git config --global --add safe.directory /__w/spack/spack
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
||||
- name: Setup repo and non-root user
|
||||
run: |
|
||||
git --version
|
||||
@@ -200,7 +255,15 @@ jobs:
|
||||
bzip2 curl file g++ gcc patchelf gfortran git gzip \
|
||||
make patch unzip xz-utils python3 python3-dev tree \
|
||||
gawk
|
||||
- uses: actions/checkout@v2
|
||||
- name: Work around CVE-2022-24765
|
||||
run: |
|
||||
# Apparently Ubuntu patched git v2.25.1 with a security patch that introduces
|
||||
# a breaking behavior. See:
|
||||
# - https://github.blog/2022-04-12-git-security-vulnerability-announced/
|
||||
# - https://github.com/actions/checkout/issues/760
|
||||
# - http://changelogs.ubuntu.com/changelogs/pool/main/g/git/git_2.25.1-1ubuntu3.3/changelog
|
||||
git config --global --add safe.directory /__w/spack/spack
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
||||
- name: Setup repo and non-root user
|
||||
run: |
|
||||
git --version
|
||||
@@ -213,7 +276,7 @@ jobs:
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
spack solve zlib
|
||||
spack bootstrap untrust github-actions
|
||||
spack bootstrap untrust github-actions-v0.2
|
||||
spack -d gpg list
|
||||
tree ~/.spack/bootstrap/store/
|
||||
|
||||
@@ -225,7 +288,7 @@ jobs:
|
||||
brew install tree
|
||||
# Remove GnuPG since we want to bootstrap it
|
||||
sudo rm -rf /usr/local/bin/gpg
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
||||
- name: Bootstrap GnuPG
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
@@ -241,11 +304,11 @@ jobs:
|
||||
brew install gawk tree
|
||||
# Remove GnuPG since we want to bootstrap it
|
||||
sudo rm -rf /usr/local/bin/gpg
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
|
||||
- name: Bootstrap GnuPG
|
||||
run: |
|
||||
source share/spack/setup-env.sh
|
||||
spack solve zlib
|
||||
spack bootstrap untrust github-actions
|
||||
spack bootstrap untrust github-actions-v0.2
|
||||
spack -d gpg list
|
||||
tree ~/.spack/bootstrap/store/
|
||||
|
56
.github/workflows/build-containers.yml
vendored
56
.github/workflows/build-containers.yml
vendored
@@ -12,6 +12,9 @@ on:
|
||||
- develop
|
||||
paths:
|
||||
- '.github/workflows/build-containers.yml'
|
||||
- 'share/spack/docker/*'
|
||||
- 'share/templates/container/*'
|
||||
- 'lib/spack/spack/container/*'
|
||||
# Let's also build & tag Spack containers on releases.
|
||||
release:
|
||||
types: [published]
|
||||
@@ -28,15 +31,21 @@ jobs:
|
||||
# A matrix of Dockerfile paths, associated tags, and which architectures
|
||||
# they support.
|
||||
matrix:
|
||||
dockerfile: [[amazon-linux, amazonlinux-2.dockerfile, 'linux/amd64,linux/arm64'],
|
||||
[centos7, centos-7.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le'],
|
||||
[leap15, leap-15.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le'],
|
||||
[ubuntu-xenial, ubuntu-1604.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le'],
|
||||
[ubuntu-bionic, ubuntu-1804.dockerfile, 'linux/amd64,linux/arm64,linux/ppc64le']]
|
||||
# Meaning of the various items in the matrix list
|
||||
# 0: Container name (e.g. ubuntu-bionic)
|
||||
# 1: Platforms to build for
|
||||
# 2: Base image (e.g. ubuntu:18.04)
|
||||
dockerfile: [[amazon-linux, 'linux/amd64,linux/arm64', 'amazonlinux:2'],
|
||||
[centos7, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:7'],
|
||||
[centos-stream, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:stream'],
|
||||
[leap15, 'linux/amd64,linux/arm64,linux/ppc64le', 'opensuse/leap:15'],
|
||||
[ubuntu-bionic, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:18.04'],
|
||||
[ubuntu-focal, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:20.04'],
|
||||
[ubuntu-jammy, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:22.04']]
|
||||
name: Build ${{ matrix.dockerfile[0] }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
|
||||
- name: Set Container Tag Normal (Nightly)
|
||||
run: |
|
||||
@@ -51,14 +60,26 @@ jobs:
|
||||
versioned="${{matrix.dockerfile[0]}}:${GITHUB_REF##*/}"
|
||||
echo "versioned=${versioned}" >> $GITHUB_ENV
|
||||
|
||||
- name: Check ${{ matrix.dockerfile[1] }} Exists
|
||||
- name: Generate the Dockerfile
|
||||
env:
|
||||
SPACK_YAML_OS: "${{ matrix.dockerfile[2] }}"
|
||||
run: |
|
||||
printf "Preparing to build ${{ env.container }} from ${{ matrix.dockerfile[1] }}"
|
||||
if [ ! -f "share/spack/docker/${{ matrix.dockerfile[1]}}" ]; then
|
||||
printf "Dockerfile ${{ matrix.dockerfile[0]}} does not exist"
|
||||
.github/workflows/generate_spack_yaml_containerize.sh
|
||||
. share/spack/setup-env.sh
|
||||
mkdir -p dockerfiles/${{ matrix.dockerfile[0] }}
|
||||
spack containerize --last-stage=bootstrap | tee dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile
|
||||
printf "Preparing to build ${{ env.container }} from dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile"
|
||||
if [ ! -f "dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile" ]; then
|
||||
printf "dockerfiles/${{ matrix.dockerfile[0] }}/Dockerfile does not exist"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
- name: Upload Dockerfile
|
||||
uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535
|
||||
with:
|
||||
name: dockerfiles
|
||||
path: dockerfiles
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@27d0a4f181a40b142cce983c5393082c365d1480 # @v1
|
||||
|
||||
@@ -66,24 +87,27 @@ jobs:
|
||||
uses: docker/setup-buildx-action@94ab11c41e45d028884a99163086648e898eed25 # @v1
|
||||
|
||||
- name: Log in to GitHub Container Registry
|
||||
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 # @v1
|
||||
uses: docker/login-action@dd4fa0671be5250ee6f50aedf4cb05514abda2c7 # @v1
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Log in to DockerHub
|
||||
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 # @v1
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/login-action@dd4fa0671be5250ee6f50aedf4cb05514abda2c7 # @v1
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Build & Deploy ${{ matrix.dockerfile[1] }}
|
||||
uses: docker/build-push-action@a66e35b9cbcf4ad0ea91ffcaf7bbad63ad9e0229 # @v2
|
||||
- name: Build & Deploy ${{ matrix.dockerfile[0] }}
|
||||
uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a # @v2
|
||||
with:
|
||||
file: share/spack/docker/${{matrix.dockerfile[1]}}
|
||||
platforms: ${{ matrix.dockerfile[2] }}
|
||||
context: dockerfiles/${{ matrix.dockerfile[0] }}
|
||||
platforms: ${{ matrix.dockerfile[1] }}
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
tags: |
|
||||
spack/${{ env.container }}
|
||||
spack/${{ env.versioned }}
|
||||
|
7
.github/workflows/execute_installer.ps1
vendored
Normal file
7
.github/workflows/execute_installer.ps1
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
$ proc = Start-Process ${{ env.spack_installer }}\spack.exe "/install /quiet" -Passthru
|
||||
$handle = $proc.Handle # cache proc.Handle
|
||||
$proc.WaitForExit();
|
||||
|
||||
if ($proc.ExitCode -ne 0) {
|
||||
Write-Warning "$_ exited with status code $($proc.ExitCode)"
|
||||
}
|
9
.github/workflows/generate_spack_yaml_containerize.sh
vendored
Executable file
9
.github/workflows/generate_spack_yaml_containerize.sh
vendored
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
(echo "spack:" \
|
||||
&& echo " specs: []" \
|
||||
&& echo " container:" \
|
||||
&& echo " format: docker" \
|
||||
&& echo " images:" \
|
||||
&& echo " os: \"${SPACK_YAML_OS}\"" \
|
||||
&& echo " spack:" \
|
||||
&& echo " ref: ${GITHUB_REF}") > spack.yaml
|
16
.github/workflows/install_spack.sh
vendored
16
.github/workflows/install_spack.sh
vendored
@@ -2,19 +2,7 @@
|
||||
. share/spack/setup-env.sh
|
||||
echo -e "config:\n build_jobs: 2" > etc/spack/config.yaml
|
||||
spack config add "packages:all:target:[x86_64]"
|
||||
# TODO: remove this explicit setting once apple-clang detection is fixed
|
||||
cat <<EOF > etc/spack/compilers.yaml
|
||||
compilers:
|
||||
- compiler:
|
||||
spec: apple-clang@11.0.3
|
||||
paths:
|
||||
cc: /usr/bin/clang
|
||||
cxx: /usr/bin/clang++
|
||||
f77: /usr/local/bin/gfortran-9
|
||||
fc: /usr/local/bin/gfortran-9
|
||||
modules: []
|
||||
operating_system: catalina
|
||||
target: x86_64
|
||||
EOF
|
||||
spack compiler find
|
||||
spack compiler info apple-clang
|
||||
spack debug report
|
||||
spack solve zlib
|
||||
|
14
.github/workflows/macos_python.yml
vendored
14
.github/workflows/macos_python.yml
vendored
@@ -24,23 +24,23 @@ jobs:
|
||||
name: gcc with clang
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: spack install
|
||||
run: |
|
||||
. .github/workflows/install_spack.sh
|
||||
# 9.2.0 is the latest version on which we apply homebrew patch
|
||||
spack install -v --fail-fast gcc@9.2.0 %apple-clang
|
||||
spack install -v --fail-fast gcc@11.2.0 %apple-clang
|
||||
|
||||
install_jupyter_clang:
|
||||
name: jupyter
|
||||
runs-on: macos-latest
|
||||
timeout-minutes: 700
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: spack install
|
||||
@@ -52,8 +52,8 @@ jobs:
|
||||
name: scipy, mpl, pd
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: spack install
|
||||
|
11
.github/workflows/setup_git.ps1
vendored
Normal file
11
.github/workflows/setup_git.ps1
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# (c) 2021 Lawrence Livermore National Laboratory
|
||||
|
||||
Set-Location spack
|
||||
|
||||
git config --global user.email "spack@example.com"
|
||||
git config --global user.name "Test User"
|
||||
|
||||
if ($(git branch --show-current) -ne "develop")
|
||||
{
|
||||
git branch develop origin/develop
|
||||
}
|
4
.github/workflows/system_shortcut_check.ps1
vendored
Normal file
4
.github/workflows/system_shortcut_check.ps1
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
param ($systemFolder, $shortcut)
|
||||
|
||||
$start = [System.Environment]::GetFolderPath("$systemFolder")
|
||||
Invoke-Item "$start\Programs\Spack\$shortcut"
|
133
.github/workflows/unit_tests.yaml
vendored
133
.github/workflows/unit_tests.yaml
vendored
@@ -15,28 +15,28 @@ jobs:
|
||||
validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: '3.10'
|
||||
- name: Install Python Packages
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install --upgrade vermin
|
||||
- name: vermin (Spack's Core)
|
||||
run: vermin --backport argparse --violations --backport typing -t=2.6- -t=3.5- -vvv lib/spack/spack/ lib/spack/llnl/ bin/
|
||||
run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.5- -vvv lib/spack/spack/ lib/spack/llnl/ bin/
|
||||
- name: vermin (Repositories)
|
||||
run: vermin --backport argparse --violations --backport typing -t=2.6- -t=3.5- -vvv var/spack/repos
|
||||
run: vermin --backport argparse --violations --backport typing -t=2.7- -t=3.5- -vvv var/spack/repos
|
||||
# Run style checks on the files that have been changed
|
||||
style:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: '3.10'
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
pip install --upgrade pip six setuptools types-six
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
packages: ${{ steps.filter.outputs.packages }}
|
||||
with_coverage: ${{ steps.coverage.outputs.with_coverage }}
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
if: ${{ github.event_name == 'push' }}
|
||||
with:
|
||||
fetch-depth: 0
|
||||
@@ -96,13 +96,20 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [2.7, 3.5, 3.6, 3.7, 3.8, 3.9]
|
||||
concretizer: ['original', 'clingo']
|
||||
python-version: ['2.7', '3.5', '3.6', '3.7', '3.8', '3.9', '3.10']
|
||||
concretizer: ['clingo']
|
||||
include:
|
||||
- python-version: 2.7
|
||||
concretizer: original
|
||||
- python-version: 3.6
|
||||
concretizer: original
|
||||
- python-version: 3.9
|
||||
concretizer: original
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install System packages
|
||||
@@ -114,12 +121,16 @@ jobs:
|
||||
patchelf cmake bison libbison-dev kcov
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
pip install --upgrade pip six setuptools codecov coverage[toml]
|
||||
pip install --upgrade pip six setuptools pytest codecov "coverage[toml]<=6.2"
|
||||
# ensure style checks are not skipped in unit tests for python >= 3.6
|
||||
# note that true/false (i.e., 1/0) are opposite in conditions in python and bash
|
||||
if python -c 'import sys; sys.exit(not sys.version_info >= (3, 6))'; then
|
||||
pip install --upgrade flake8 isort>=4.3.5 mypy>=0.900 black
|
||||
fi
|
||||
- name: Pin pathlib for Python 2.7
|
||||
if: ${{ matrix.python-version == 2.7 }}
|
||||
run: |
|
||||
pip install -U pathlib2==2.3.6
|
||||
- name: Setup git configuration
|
||||
run: |
|
||||
# Need this for the git tests to succeed.
|
||||
@@ -151,7 +162,7 @@ jobs:
|
||||
SPACK_TEST_SOLVER: ${{ matrix.concretizer }}
|
||||
run: |
|
||||
share/spack/qa/run-unit-tests
|
||||
- uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0
|
||||
- uses: codecov/codecov-action@e3c560433a6cc60aec8812599b7844a7b4fa0d71 # @v2.1.0
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||
with:
|
||||
flags: unittests,linux,${{ matrix.concretizer }}
|
||||
@@ -160,12 +171,12 @@ jobs:
|
||||
needs: [ validate, style, changes ]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: '3.10'
|
||||
- name: Install System packages
|
||||
run: |
|
||||
sudo apt-get -y update
|
||||
@@ -173,7 +184,7 @@ jobs:
|
||||
sudo apt-get install -y coreutils kcov csh zsh tcsh fish dash bash
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
pip install --upgrade pip six setuptools codecov coverage[toml]
|
||||
pip install --upgrade pip six setuptools pytest codecov coverage[toml]==6.2
|
||||
- name: Setup git configuration
|
||||
run: |
|
||||
# Need this for the git tests to succeed.
|
||||
@@ -189,43 +200,10 @@ jobs:
|
||||
COVERAGE: true
|
||||
run: |
|
||||
share/spack/qa/run-shell-tests
|
||||
- uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0
|
||||
- uses: codecov/codecov-action@e3c560433a6cc60aec8812599b7844a7b4fa0d71 # @v2.1.0
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||
with:
|
||||
flags: shelltests,linux
|
||||
# Test for Python2.6 run on Centos 6
|
||||
centos6:
|
||||
needs: [ validate, style, changes ]
|
||||
runs-on: ubuntu-latest
|
||||
container: spack/github-actions:centos6
|
||||
steps:
|
||||
- name: Run unit tests (full test-suite)
|
||||
# The CentOS 6 container doesn't run with coverage, but
|
||||
# under the same conditions it runs the full test suite
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||
env:
|
||||
HOME: /home/spack-test
|
||||
SPACK_TEST_SOLVER: original
|
||||
run: |
|
||||
whoami && echo $HOME && cd $HOME
|
||||
git clone "${{ github.server_url }}/${{ github.repository }}.git" && cd spack
|
||||
git fetch origin "${{ github.ref }}:test-branch"
|
||||
git checkout test-branch
|
||||
. .github/workflows/setup_git.sh
|
||||
bin/spack unit-test -x
|
||||
- name: Run unit tests (only package tests)
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'false' }}
|
||||
env:
|
||||
HOME: /home/spack-test
|
||||
ONLY_PACKAGES: true
|
||||
SPACK_TEST_SOLVER: original
|
||||
run: |
|
||||
whoami && echo $HOME && cd $HOME
|
||||
git clone "${{ github.server_url }}/${{ github.repository }}.git" && cd spack
|
||||
git fetch origin "${{ github.ref }}:test-branch"
|
||||
git checkout test-branch
|
||||
. .github/workflows/setup_git.sh
|
||||
bin/spack unit-test -x -m "not maybeslow" -k "package_sanity"
|
||||
|
||||
# Test RHEL8 UBI with platform Python. This job is run
|
||||
# only on PRs modifying core Spack
|
||||
@@ -240,7 +218,7 @@ jobs:
|
||||
dnf install -y \
|
||||
bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \
|
||||
make patch tcl unzip which xz
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- name: Setup repo and non-root user
|
||||
run: |
|
||||
git --version
|
||||
@@ -259,12 +237,12 @@ jobs:
|
||||
needs: [ validate, style, changes ]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
python-version: '3.10'
|
||||
- name: Install System packages
|
||||
run: |
|
||||
sudo apt-get -y update
|
||||
@@ -274,7 +252,7 @@ jobs:
|
||||
patchelf kcov
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
pip install --upgrade pip six setuptools codecov coverage[toml] clingo
|
||||
pip install --upgrade pip six setuptools pytest codecov coverage[toml]==6.2 clingo
|
||||
- name: Setup git configuration
|
||||
run: |
|
||||
# Need this for the git tests to succeed.
|
||||
@@ -296,7 +274,7 @@ jobs:
|
||||
SPACK_TEST_SOLVER: clingo
|
||||
run: |
|
||||
share/spack/qa/run-unit-tests
|
||||
- uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0
|
||||
- uses: codecov/codecov-action@e3c560433a6cc60aec8812599b7844a7b4fa0d71 # @v2.1.0
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||
with:
|
||||
flags: unittests,linux,clingo
|
||||
@@ -308,16 +286,16 @@ jobs:
|
||||
matrix:
|
||||
python-version: [3.8]
|
||||
steps:
|
||||
- uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # @v2
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@dc73133d4da04e56a135ae2246682783cc7c7cb6 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
pip install --upgrade pip six setuptools
|
||||
pip install --upgrade codecov coverage[toml]
|
||||
pip install --upgrade pytest codecov coverage[toml]==6.2
|
||||
- name: Setup Homebrew packages
|
||||
run: |
|
||||
brew install dash fish gcc gnupg2 kcov
|
||||
@@ -342,8 +320,37 @@ jobs:
|
||||
echo "ONLY PACKAGE RECIPES CHANGED [skipping coverage]"
|
||||
$(which spack) unit-test -x -m "not maybeslow" -k "package_sanity"
|
||||
fi
|
||||
- uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # @v2.1.0
|
||||
- uses: codecov/codecov-action@e3c560433a6cc60aec8812599b7844a7b4fa0d71 # @v2.1.0
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||
with:
|
||||
files: ./coverage.xml
|
||||
flags: unittests,macos
|
||||
|
||||
# Run audits on all the packages in the built-in repository
|
||||
package-audits:
|
||||
needs: [ validate, style, changes ]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # @v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6 # @v2
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
pip install --upgrade pip six setuptools pytest codecov coverage[toml]==6.2
|
||||
- name: Package audits (with coverage)
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||
run: |
|
||||
. share/spack/setup-env.sh
|
||||
coverage run $(which spack) audit packages
|
||||
coverage combine
|
||||
coverage xml
|
||||
- name: Package audits (wwithout coverage)
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'false' }}
|
||||
run: |
|
||||
. share/spack/setup-env.sh
|
||||
$(which spack) audit packages
|
||||
- uses: codecov/codecov-action@e3c560433a6cc60aec8812599b7844a7b4fa0d71 # @v2.1.0
|
||||
if: ${{ needs.changes.outputs.with_coverage == 'true' }}
|
||||
with:
|
||||
flags: unittests,linux,audits
|
||||
|
188
.github/workflows/windows_python.yml
vendored
Normal file
188
.github/workflows/windows_python.yml
vendored
Normal file
@@ -0,0 +1,188 @@
|
||||
name: windows tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- develop
|
||||
- releases/**
|
||||
pull_request:
|
||||
branches:
|
||||
- develop
|
||||
- releases/**
|
||||
defaults:
|
||||
run:
|
||||
shell:
|
||||
powershell Invoke-Expression -Command ".\share\spack\qa\windows_test_setup.ps1"; {0}
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install Python Packages
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install --upgrade vermin
|
||||
- name: vermin (Spack's Core)
|
||||
run: vermin --backport argparse --backport typing -t='2.7-' -t='3.5-' -v spack/lib/spack/spack/ spack/lib/spack/llnl/ spack/bin/
|
||||
- name: vermin (Repositories)
|
||||
run: vermin --backport argparse --backport typing -t='2.7-' -t='3.5-' -v spack/var/spack/repos
|
||||
# Run style checks on the files that have been changed
|
||||
style:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
python -m pip install --upgrade pip six setuptools flake8 isort>=4.3.5 mypy>=0.800 black pywin32 types-python-dateutil
|
||||
- name: Create local develop
|
||||
run: |
|
||||
.\spack\.github\workflows\setup_git.ps1
|
||||
- name: Run style tests
|
||||
run: |
|
||||
spack style
|
||||
- name: Verify license headers
|
||||
run: |
|
||||
python spack\bin\spack license verify
|
||||
unittest:
|
||||
needs: [ validate, style ]
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||
- name: Create local develop
|
||||
run: |
|
||||
.\spack\.github\workflows\setup_git.ps1
|
||||
- name: Unit Test
|
||||
run: |
|
||||
echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml
|
||||
spack unit-test --verbose --ignore=lib/spack/spack/test/cmd
|
||||
unittest-cmd:
|
||||
needs: [ validate, style ]
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||
- name: Create local develop
|
||||
run: |
|
||||
.\spack\.github\workflows\setup_git.ps1
|
||||
- name: Command Unit Test
|
||||
run: |
|
||||
echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml
|
||||
spack unit-test lib/spack/spack/test/cmd --verbose
|
||||
buildtest:
|
||||
needs: [ validate, style ]
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||
- name: Build Test
|
||||
run: |
|
||||
spack compiler find
|
||||
echo F|xcopy .\spack\share\spack\qa\configuration\windows_config.yaml $env:USERPROFILE\.spack\windows\config.yaml
|
||||
spack external find cmake
|
||||
spack external find ninja
|
||||
spack install abseil-cpp
|
||||
generate-installer-test:
|
||||
needs: [ validate, style ]
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Disable Windows Symlinks
|
||||
run: |
|
||||
git config --global core.symlinks false
|
||||
shell:
|
||||
powershell
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||
- name: Add Light and Candle to Path
|
||||
run: |
|
||||
$env:WIX >> $GITHUB_PATH
|
||||
- name: Run Installer
|
||||
run: |
|
||||
.\spack\share\spack\qa\setup_spack.ps1
|
||||
spack make-installer -s spack -g SILENT pkg
|
||||
echo "installer_root=$((pwd).Path)" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
||||
env:
|
||||
ProgressPreference: SilentlyContinue
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Windows Spack Installer Bundle
|
||||
path: ${{ env.installer_root }}\pkg\Spack.exe
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Windows Spack Installer
|
||||
path: ${{ env.installer_root}}\pkg\Spack.msi
|
||||
execute-installer:
|
||||
needs: generate-installer-test
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: pwsh
|
||||
steps:
|
||||
- uses: actions/setup-python@98f2ad02fd48d057ee3b4d4f66525b231c3e52b6
|
||||
with:
|
||||
python-version: 3.9
|
||||
- name: Install Python packages
|
||||
run: |
|
||||
python -m pip install --upgrade pip six pywin32 setuptools codecov coverage
|
||||
- name: Setup installer directory
|
||||
run: |
|
||||
mkdir -p spack_installer
|
||||
echo "spack_installer=$((pwd).Path)\spack_installer" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: Windows Spack Installer Bundle
|
||||
path: ${{ env.spack_installer }}
|
||||
- name: Execute Bundled Installer
|
||||
run: |
|
||||
$proc = Start-Process ${{ env.spack_installer }}\spack.exe "/install /quiet" -Passthru
|
||||
$handle = $proc.Handle # cache proc.Handle
|
||||
$proc.WaitForExit();
|
||||
$LASTEXITCODE
|
||||
env:
|
||||
ProgressPreference: SilentlyContinue
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: Windows Spack Installer
|
||||
path: ${{ env.spack_installer }}
|
||||
- name: Execute MSI
|
||||
run: |
|
||||
$proc = Start-Process ${{ env.spack_installer }}\spack.msi "/quiet" -Passthru
|
||||
$handle = $proc.Handle # cache proc.Handle
|
||||
$proc.WaitForExit();
|
||||
$LASTEXITCODE
|
16
CHANGELOG.md
16
CHANGELOG.md
@@ -1,3 +1,19 @@
|
||||
# v0.17.2 (2022-04-13)
|
||||
|
||||
### Spack bugfixes
|
||||
* Fix --reuse with upstreams set in an environment (#29680)
|
||||
* config add: fix parsing of validator error to infer type from oneOf (#29475)
|
||||
* Fix spack -C command_line_scope used in conjunction with other flags (#28418)
|
||||
* Use Spec.constrain to construct spec lists for stacks (#28783)
|
||||
* Fix bug occurring when searching for inherited patches in packages (#29574)
|
||||
* Fixed a few bugs when manipulating symlinks (#28318, #29515, #29636)
|
||||
* Fixed a few minor bugs affecting command prompt, terminal title and argument completion (#28279, #28278, #28939, #29405, #29070, #29402)
|
||||
* Fixed a few bugs affecting the spack ci command (#29518, #29419)
|
||||
* Fix handling of Intel compiler environment (#29439)
|
||||
* Fix a few edge cases when reindexing the DB (#28764)
|
||||
* Remove "Known issues" from documentation (#29664)
|
||||
* Other miscellaneous bugfixes (0b72e070583fc5bcd016f5adc8a84c99f2b7805f, #28403, #29261)
|
||||
|
||||
# v0.17.1 (2021-12-23)
|
||||
|
||||
### Spack Bugfixes
|
||||
|
58
CITATION.cff
Normal file
58
CITATION.cff
Normal file
@@ -0,0 +1,58 @@
|
||||
# If you are referencing Spack in a publication, please cite the SC'15 paper
|
||||
# described here.
|
||||
#
|
||||
# Here's the raw citation:
|
||||
#
|
||||
# Todd Gamblin, Matthew P. LeGendre, Michael R. Collette, Gregory L. Lee,
|
||||
# Adam Moody, Bronis R. de Supinski, and W. Scott Futral.
|
||||
# The Spack Package Manager: Bringing Order to HPC Software Chaos.
|
||||
# In Supercomputing 2015 (SC’15), Austin, Texas, November 15-20 2015. LLNL-CONF-669890.
|
||||
#
|
||||
# Or, in BibTeX:
|
||||
#
|
||||
# @inproceedings{Gamblin_The_Spack_Package_2015,
|
||||
# address = {Austin, Texas, USA},
|
||||
# author = {Gamblin, Todd and LeGendre, Matthew and
|
||||
# Collette, Michael R. and Lee, Gregory L. and
|
||||
# Moody, Adam and de Supinski, Bronis R. and Futral, Scott},
|
||||
# doi = {10.1145/2807591.2807623},
|
||||
# month = {November 15-20},
|
||||
# note = {LLNL-CONF-669890},
|
||||
# series = {Supercomputing 2015 (SC’15)},
|
||||
# title = {{The Spack Package Manager: Bringing Order to HPC Software Chaos}},
|
||||
# url = {https://github.com/spack/spack},
|
||||
# year = {2015}
|
||||
# }
|
||||
#
|
||||
# And here's the CITATION.cff format:
|
||||
#
|
||||
cff-version: 1.2.0
|
||||
message: "If you are referencing Spack in a publication, please cite the paper below."
|
||||
preferred-citation:
|
||||
type: conference-paper
|
||||
doi: "10.1145/2807591.2807623"
|
||||
url: "https://github.com/spack/spack"
|
||||
authors:
|
||||
- family-names: "Gamblin"
|
||||
given-names: "Todd"
|
||||
- family-names: "LeGendre"
|
||||
given-names: "Matthew"
|
||||
- family-names: "Collette"
|
||||
given-names: "Michael R."
|
||||
- family-names: "Lee"
|
||||
given-names: "Gregory L."
|
||||
- family-names: "Moody"
|
||||
given-names: "Adam"
|
||||
- family-names: "de Supinski"
|
||||
given-names: "Bronis R."
|
||||
- family-names: "Futral"
|
||||
given-names: "Scott"
|
||||
title: "The Spack Package Manager: Bringing Order to HPC Software Chaos"
|
||||
conference:
|
||||
name: "Supercomputing 2015 (SC’15)"
|
||||
city: "Austin"
|
||||
region: "Texas"
|
||||
country: "USA"
|
||||
month: November 15-20
|
||||
year: 2015
|
||||
notes: LLNL-CONF-669890
|
32
COPYRIGHT
32
COPYRIGHT
@@ -34,10 +34,22 @@ includes the sbang tool directly in bin/sbang. These packages are covered
|
||||
by various permissive licenses. A summary listing follows. See the
|
||||
license included with each package for full details.
|
||||
|
||||
PackageName: altgraph
|
||||
PackageHomePage: https://altgraph.readthedocs.io/en/latest/index.html
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: argparse
|
||||
PackageHomePage: https://pypi.python.org/pypi/argparse
|
||||
PackageLicenseDeclared: Python-2.0
|
||||
|
||||
PackageName: astunparse
|
||||
PackageHomePage: https://github.com/simonpercivall/astunparse
|
||||
PackageLicenseDeclared: Python-2.0
|
||||
|
||||
PackageName: attrs
|
||||
PackageHomePage: https://github.com/python-attrs/attrs
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: ctest_log_parser
|
||||
PackageHomePage: https://github.com/Kitware/CMake
|
||||
PackageLicenseDeclared: BSD-3-Clause
|
||||
@@ -46,8 +58,8 @@ PackageName: distro
|
||||
PackageHomePage: https://pypi.python.org/pypi/distro
|
||||
PackageLicenseDeclared: Apache-2.0
|
||||
|
||||
PackageName: functools
|
||||
PackageHomePage: https://github.com/python/cpython/blob/2.7/Lib/functools.py
|
||||
PackageName: functools32
|
||||
PackageHomePage: https://github.com/MiCHiLU/python-functools32
|
||||
PackageLicenseDeclared: Python-2.0
|
||||
|
||||
PackageName: jinja2
|
||||
@@ -58,6 +70,10 @@ PackageName: jsonschema
|
||||
PackageHomePage: https://pypi.python.org/pypi/jsonschema
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: macholib
|
||||
PackageHomePage: https://macholib.readthedocs.io/en/latest/index.html
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: markupsafe
|
||||
PackageHomePage: https://pypi.python.org/pypi/MarkupSafe
|
||||
PackageLicenseDeclared: BSD-3-Clause
|
||||
@@ -70,6 +86,10 @@ PackageName: py
|
||||
PackageHomePage: https://pypi.python.org/pypi/py
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: pyrsistent
|
||||
PackageHomePage: http://github.com/tobgu/pyrsistent
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: pytest
|
||||
PackageHomePage: https://pypi.python.org/pypi/pytest
|
||||
PackageLicenseDeclared: MIT
|
||||
@@ -85,11 +105,3 @@ PackageLicenseDeclared: Apache-2.0 OR MIT
|
||||
PackageName: six
|
||||
PackageHomePage: https://pypi.python.org/pypi/six
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: macholib
|
||||
PackageHomePage: https://macholib.readthedocs.io/en/latest/index.html
|
||||
PackageLicenseDeclared: MIT
|
||||
|
||||
PackageName: altgraph
|
||||
PackageHomePage: https://altgraph.readthedocs.io/en/latest/index.html
|
||||
PackageLicenseDeclared: MIT
|
||||
|
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2013-2020 LLNS, LLC and other Spack Project Developers.
|
||||
Copyright (c) 2013-2022 LLNS, LLC and other Spack Project Developers.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@@ -125,6 +125,9 @@ If you are referencing Spack in a publication, please cite the following paper:
|
||||
[**The Spack Package Manager: Bringing Order to HPC Software Chaos**](https://www.computer.org/csdl/proceedings/sc/2015/3723/00/2807623.pdf).
|
||||
In *Supercomputing 2015 (SC’15)*, Austin, Texas, November 15-20 2015. LLNL-CONF-669890.
|
||||
|
||||
On GitHub, you can copy this citation in APA or BibTeX format via the "Cite this repository"
|
||||
button. Or, see the comments in `CITATION.cff` for the raw BibTeX.
|
||||
|
||||
License
|
||||
----------------
|
||||
|
||||
|
@@ -10,6 +10,7 @@ For more on Spack's release structure, see
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| develop | :white_check_mark: |
|
||||
| 0.17.x | :white_check_mark: |
|
||||
| 0.16.x | :white_check_mark: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
20
bin/haspywin.py
Normal file
20
bin/haspywin.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# Copyright 2013-2021 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)
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
def getpywin():
|
||||
try:
|
||||
import win32con # noqa
|
||||
except ImportError:
|
||||
subprocess.check_call(
|
||||
[sys.executable, "-m", "pip", "-q", "install", "--upgrade", "pip"])
|
||||
subprocess.check_call(
|
||||
[sys.executable, "-m", "pip", "-q", "install", "pywin32"])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
getpywin()
|
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# -*- python -*-
|
||||
#
|
||||
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
# Copyright 2013-2022 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)
|
||||
@@ -33,11 +33,11 @@ import sys
|
||||
|
||||
min_python3 = (3, 5)
|
||||
|
||||
if sys.version_info[:2] < (2, 6) or (
|
||||
if sys.version_info[:2] < (2, 7) or (
|
||||
sys.version_info[:2] >= (3, 0) and sys.version_info[:2] < min_python3
|
||||
):
|
||||
v_info = sys.version_info[:3]
|
||||
msg = "Spack requires Python 2.6, 2.7 or %d.%d or higher " % min_python3
|
||||
msg = "Spack requires Python 2.7 or %d.%d or higher " % min_python3
|
||||
msg += "You are running spack with Python %d.%d.%d." % v_info
|
||||
sys.exit(msg)
|
||||
|
||||
@@ -54,8 +54,6 @@ spack_external_libs = os.path.join(spack_lib_path, "external")
|
||||
|
||||
if sys.version_info[:2] <= (2, 7):
|
||||
sys.path.insert(0, os.path.join(spack_external_libs, "py2"))
|
||||
if sys.version_info[:2] == (2, 6):
|
||||
sys.path.insert(0, os.path.join(spack_external_libs, "py26"))
|
||||
|
||||
sys.path.insert(0, spack_external_libs)
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
# Copyright 2013-2022 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)
|
||||
|
223
bin/spack.bat
Normal file
223
bin/spack.bat
Normal file
@@ -0,0 +1,223 @@
|
||||
:: Copyright 2013-2021 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)
|
||||
::#######################################################################
|
||||
::
|
||||
:: This file is part of Spack and sets up the spack environment for batch,
|
||||
:: This includes environment modules and lmod support,
|
||||
:: and it also puts spack in your path. The script also checks that at least
|
||||
:: module support exists, and provides suggestions if it doesn't. Source
|
||||
:: it like this:
|
||||
::
|
||||
:: . /path/to/spack/install/spack_cmd.bat
|
||||
::
|
||||
@echo off
|
||||
|
||||
set spack=%SPACK_ROOT%\bin\spack
|
||||
|
||||
::#######################################################################
|
||||
:: This is a wrapper around the spack command that forwards calls to
|
||||
:: 'spack load' and 'spack unload' to shell functions. This in turn
|
||||
:: allows them to be used to invoke environment modules functions.
|
||||
::
|
||||
:: 'spack load' is smarter than just 'load' because it converts its
|
||||
:: arguments into a unique Spack spec that is then passed to module
|
||||
:: commands. This allows the user to use packages without knowing all
|
||||
:: their installation details.
|
||||
::
|
||||
:: e.g., rather than requiring a full spec for libelf, the user can type:
|
||||
::
|
||||
:: spack load libelf
|
||||
::
|
||||
:: This will first find the available libelf module file and use a
|
||||
:: matching one. If there are two versions of libelf, the user would
|
||||
:: need to be more specific, e.g.:
|
||||
::
|
||||
:: spack load libelf@0.8.13
|
||||
::
|
||||
:: This is very similar to how regular spack commands work and it
|
||||
:: avoids the need to come up with a user-friendly naming scheme for
|
||||
:: spack module files.
|
||||
::#######################################################################
|
||||
|
||||
:_sp_shell_wrapper
|
||||
set "_sp_flags="
|
||||
set "_sp_args="
|
||||
set "_sp_subcommand="
|
||||
setlocal enabledelayedexpansion
|
||||
:: commands have the form '[flags] [subcommand] [args]'
|
||||
:: flags will always start with '-', e.g. --help or -V
|
||||
:: subcommands will never start with '-'
|
||||
:: everything after the subcommand is an arg
|
||||
for %%x in (%*) do (
|
||||
set t="%%~x"
|
||||
if "!t:~0,1!" == "-" (
|
||||
if defined _sp_subcommand (
|
||||
:: We already have a subcommand, processing args now
|
||||
set "_sp_args=!_sp_args! !t!"
|
||||
) else (
|
||||
set "_sp_flags=!_sp_flags! !t!"
|
||||
shift
|
||||
)
|
||||
) else if not defined _sp_subcommand (
|
||||
set "_sp_subcommand=!t!"
|
||||
shift
|
||||
) else (
|
||||
set "_sp_args=!_sp_args! !t!"
|
||||
shift
|
||||
)
|
||||
)
|
||||
|
||||
:: --help, -h and -V flags don't require further output parsing.
|
||||
:: If we encounter, execute and exit
|
||||
if defined _sp_flags (
|
||||
if NOT "%_sp_flags%"=="%_sp_flags:-h=%" (
|
||||
python "%spack%" %_sp_flags%
|
||||
exit /B 0
|
||||
) else if NOT "%_sp_flags%"=="%_sp_flags:--help=%" (
|
||||
python "%spack%" %_sp_flags%
|
||||
exit /B 0
|
||||
) else if NOT "%_sp_flags%"=="%_sp_flags:-V=%" (
|
||||
python "%spack%" %_sp_flags%
|
||||
exit /B 0
|
||||
)
|
||||
)
|
||||
:: pass parsed variables outside of local scope. Need to do
|
||||
:: this because delayedexpansion can only be set by setlocal
|
||||
echo %_sp_flags%>flags
|
||||
echo %_sp_args%>args
|
||||
echo %_sp_subcommand%>subcmd
|
||||
endlocal
|
||||
set /p _sp_subcommand=<subcmd
|
||||
set /p _sp_flags=<flags
|
||||
set /p _sp_args=<args
|
||||
set str_subcommand=%_sp_subcommand:"='%
|
||||
set str_flags=%_sp_flags:"='%
|
||||
set str_args=%_sp_args:"='%
|
||||
if "%str_subcommand%"=="ECHO is off." (set "_sp_subcommand=")
|
||||
if "%str_flags%"=="ECHO is off." (set "_sp_flags=")
|
||||
if "%str_args%"=="ECHO is off." (set "_sp_args=")
|
||||
del subcmd
|
||||
del flags
|
||||
del args
|
||||
|
||||
:: Filter out some commands. For any others, just run the command.
|
||||
if "%_sp_subcommand%" == "cd" (
|
||||
goto :case_cd
|
||||
) else if "%_sp_subcommand%" == "env" (
|
||||
goto :case_env
|
||||
) else if "%_sp_subcommand%" == "load" (
|
||||
goto :case_load
|
||||
) else if "%_sp_subcommand%" == "unload" (
|
||||
goto :case_load
|
||||
) else (
|
||||
goto :default_case
|
||||
)
|
||||
|
||||
::#######################################################################
|
||||
|
||||
:case_cd
|
||||
:: Check for --help or -h
|
||||
:: TODO: This is not exactly the same as setup-env.
|
||||
:: In setup-env, '--help' or '-h' must follow the cd
|
||||
:: Here, they may be anywhere in the args
|
||||
if defined _sp_args (
|
||||
if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
||||
python "%spack%" cd -h
|
||||
goto :end_switch
|
||||
) else if NOT "%_sp_args%"=="%_sp_args:-h=%" (
|
||||
python "%spack%" cd -h
|
||||
goto :end_switch
|
||||
)
|
||||
)
|
||||
|
||||
for /F "tokens=* USEBACKQ" %%F in (
|
||||
`python "%spack%" location %_sp_args%`) do (
|
||||
set "LOC=%%F"
|
||||
)
|
||||
for %%Z in ("%LOC%") do if EXIST %%~sZ\NUL (cd /d "%LOC%")
|
||||
goto :end_switch
|
||||
|
||||
:case_env
|
||||
:: If no args or args contain --bat or -h/--help: just execute.
|
||||
if NOT defined _sp_args (
|
||||
goto :default_case
|
||||
)else if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
||||
goto :default_case
|
||||
) else if NOT "%_sp_args%"=="%_sp_args: -h=%" (
|
||||
goto :default_case
|
||||
) else if NOT "%_sp_args%"=="%_sp_args:--bat=%" (
|
||||
goto :default_case
|
||||
) else if NOT "%_sp_args%"=="%_sp_args:deactivate=%" (
|
||||
for /f "tokens=* USEBACKQ" %%I in (
|
||||
`call python "%spack%" %_sp_flags% env deactivate --bat %_sp_args:deactivate=%`
|
||||
) do %%I
|
||||
) else if NOT "%_sp_args%"=="%_sp_args:activate=%" (
|
||||
for /f "tokens=* USEBACKQ" %%I in (
|
||||
`call python "%spack%" %_sp_flags% env activate --bat %_sp_args:activate=%`
|
||||
) do %%I
|
||||
) else (
|
||||
goto :default_case
|
||||
)
|
||||
goto :end_switch
|
||||
|
||||
:case_load
|
||||
:: If args contain --sh, --csh, or -h/--help: just execute.
|
||||
if defined _sp_args (
|
||||
if NOT "%_sp_args%"=="%_sp_args:--help=%" (
|
||||
goto :default_case
|
||||
) else if NOT "%_sp_args%"=="%_sp_args: -h=%" (
|
||||
goto :default_case
|
||||
) else if NOT "%_sp_args%"=="%_sp_args:--bat=%" (
|
||||
goto :default_case
|
||||
)
|
||||
)
|
||||
|
||||
for /f "tokens=* USEBACKQ" %%I in (
|
||||
`python "%spack%" %_sp_flags% %_sp_subcommand% --bat %_sp_args%`) do %%I
|
||||
)
|
||||
goto :end_switch
|
||||
|
||||
:case_unload
|
||||
goto :case_load
|
||||
|
||||
:default_case
|
||||
python "%spack%" %_sp_flags% %_sp_subcommand% %_sp_args%
|
||||
goto :end_switch
|
||||
|
||||
:end_switch
|
||||
exit /B %ERRORLEVEL%
|
||||
|
||||
|
||||
::########################################################################
|
||||
:: Prepends directories to path, if they exist.
|
||||
:: pathadd /path/to/dir # add to PATH
|
||||
:: or pathadd OTHERPATH /path/to/dir # add to OTHERPATH
|
||||
::########################################################################
|
||||
|
||||
:_spack_pathadd
|
||||
set "_pa_varname=PATH"
|
||||
set "_pa_new_path=%~1"
|
||||
if NOT "%~2" == "" (
|
||||
set "_pa_varname=%~1"
|
||||
set "_pa_new_path=%~2"
|
||||
)
|
||||
set "_pa_oldvalue=%_pa_varname%"
|
||||
for %%Z in ("%_pa_new_path%") do if EXIST %%~sZ\NUL (
|
||||
if defined %_pa_oldvalue% (
|
||||
set "_pa_varname=%_pa_new_path%:%_pa_oldvalue%"
|
||||
) else (
|
||||
set "_pa_varname=%_pa_new_path%"
|
||||
)
|
||||
)
|
||||
exit /b 0
|
||||
|
||||
:: set module system roots
|
||||
:_sp_multi_pathadd
|
||||
for %%I in (%~2) do (
|
||||
for %%Z in (%_sp_compatible_sys_types%) do (
|
||||
:pathadd "%~1" "%%I\%%Z"
|
||||
)
|
||||
)
|
||||
exit /B %ERRORLEVEL%
|
72
bin/spack_cmd.bat
Normal file
72
bin/spack_cmd.bat
Normal file
@@ -0,0 +1,72 @@
|
||||
@ECHO OFF
|
||||
setlocal EnableDelayedExpansion
|
||||
:: (c) 2021 Lawrence Livermore National Laboratory
|
||||
:: To use this file independently of Spack's installer, execute this script in its directory, or add the
|
||||
:: associated bin directory to your PATH. Invoke to launch Spack Shell.
|
||||
::
|
||||
:: source_dir/spack/bin/spack_cmd.bat
|
||||
::
|
||||
pushd %~dp0..
|
||||
set SPACK_ROOT=%CD%
|
||||
pushd %CD%\..
|
||||
set spackinstdir=%CD%
|
||||
popd
|
||||
|
||||
|
||||
:: Check if Python is on the PATH
|
||||
if not defined python_pf_ver (
|
||||
(for /f "delims=" %%F in ('where python.exe') do (
|
||||
set "python_pf_ver=%%F"
|
||||
goto :found_python
|
||||
) ) 2> NUL
|
||||
)
|
||||
:found_python
|
||||
if not defined python_pf_ver (
|
||||
:: If not, look for Python from the Spack installer
|
||||
:get_builtin
|
||||
(for /f "tokens=*" %%g in ('dir /b /a:d "!spackinstdir!\Python*"') do (
|
||||
set "python_ver=%%g")) 2> NUL
|
||||
|
||||
if not defined python_ver (
|
||||
echo Python was not found on your system.
|
||||
echo Please install Python or add Python to your PATH.
|
||||
) else (
|
||||
set "py_path=!spackinstdir!\!python_ver!"
|
||||
set "py_exe=!py_path!\python.exe"
|
||||
)
|
||||
goto :exitpoint
|
||||
) else (
|
||||
:: Python is already on the path
|
||||
set "py_exe=!python_pf_ver!"
|
||||
(for /F "tokens=* USEBACKQ" %%F in (
|
||||
`"!py_exe!" --version`) do (set "output=%%F")) 2>NUL
|
||||
if not "!output:Microsoft Store=!"=="!output!" goto :get_builtin
|
||||
goto :exitpoint
|
||||
)
|
||||
:exitpoint
|
||||
|
||||
set "PATH=%SPACK_ROOT%\bin\;%PATH%"
|
||||
if defined py_path (
|
||||
set "PATH=%py_path%;%PATH%"
|
||||
)
|
||||
|
||||
if defined py_exe (
|
||||
"%py_exe%" "%SPACK_ROOT%\bin\haspywin.py"
|
||||
"%py_exe%" "%SPACK_ROOT%\bin\spack" external find python >NUL
|
||||
)
|
||||
|
||||
set "EDITOR=notepad"
|
||||
|
||||
DOSKEY spacktivate=spack env activate $*
|
||||
|
||||
@echo **********************************************************************
|
||||
@echo ** Spack Package Manager
|
||||
@echo **********************************************************************
|
||||
|
||||
IF "%1"=="" GOTO CONTINUE
|
||||
set
|
||||
GOTO:EOF
|
||||
|
||||
:continue
|
||||
set PROMPT=[spack] %PROMPT%
|
||||
%comspec% /k
|
10
bin/spack_pwsh.ps1
Normal file
10
bin/spack_pwsh.ps1
Normal file
@@ -0,0 +1,10 @@
|
||||
# Copyright 2013-2022 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)
|
||||
|
||||
$Env:SPACK_PS1_PATH="$PSScriptRoot\..\share\spack\setup-env.ps1"
|
||||
& (Get-Process -Id $pid).Path -NoExit {
|
||||
. $Env:SPACK_PS1_PATH ;
|
||||
Push-Location $ENV:SPACK_ROOT
|
||||
}
|
@@ -9,15 +9,24 @@ bootstrap:
|
||||
# may not be able to bootstrap all of the software that Spack needs,
|
||||
# depending on its type.
|
||||
sources:
|
||||
- name: 'github-actions'
|
||||
- name: 'github-actions-v0.2'
|
||||
type: buildcache
|
||||
description: |
|
||||
Buildcache generated from a public workflow using Github Actions.
|
||||
The sha256 checksum of binaries is checked before installation.
|
||||
info:
|
||||
url: https://mirror.spack.io/bootstrap/github-actions/v0.2
|
||||
homepage: https://github.com/spack/spack-bootstrap-mirrors
|
||||
releases: https://github.com/spack/spack-bootstrap-mirrors/releases
|
||||
- name: 'github-actions-v0.1'
|
||||
type: buildcache
|
||||
description: |
|
||||
Buildcache generated from a public workflow using Github Actions.
|
||||
The sha256 checksum of binaries is checked before installation.
|
||||
info:
|
||||
url: https://mirror.spack.io/bootstrap/github-actions/v0.1
|
||||
homepage: https://github.com/alalazo/spack-bootstrap-mirrors
|
||||
releases: https://github.com/alalazo/spack-bootstrap-mirrors/releases
|
||||
homepage: https://github.com/spack/spack-bootstrap-mirrors
|
||||
releases: https://github.com/spack/spack-bootstrap-mirrors/releases
|
||||
# This method is just Spack bootstrapping the software it needs from sources.
|
||||
# It has been added here so that users can selectively disable bootstrapping
|
||||
# from sources by "untrusting" it.
|
||||
@@ -28,5 +37,5 @@ bootstrap:
|
||||
trusted:
|
||||
# By default we trust bootstrapping from sources and from binaries
|
||||
# produced on Github via the workflow
|
||||
github-actions: true
|
||||
github-actions-v0.2: true
|
||||
spack-install: true
|
||||
|
17
etc/spack/defaults/concretizer.yaml
Normal file
17
etc/spack/defaults/concretizer.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
# -------------------------------------------------------------------------
|
||||
# This is the default spack configuration file.
|
||||
#
|
||||
# Settings here are versioned with Spack and are intended to provide
|
||||
# sensible defaults out of the box. Spack maintainers should edit this
|
||||
# file to keep it current.
|
||||
#
|
||||
# Users can override these settings by editing
|
||||
# `$SPACK_ROOT/etc/spack/concretizer.yaml`, `~/.spack/concretizer.yaml`,
|
||||
# or by adding a `concretizer:` section to an environment.
|
||||
# -------------------------------------------------------------------------
|
||||
concretizer:
|
||||
# Whether to consider installed packages or packages from buildcaches when
|
||||
# concretizing specs. If `true`, we'll try to use as many installs/binaries
|
||||
# as possible, rather than building. If `false`, we'll always give you a fresh
|
||||
# concretization.
|
||||
reuse: false
|
@@ -155,14 +155,17 @@ config:
|
||||
|
||||
# The concretization algorithm to use in Spack. Options are:
|
||||
#
|
||||
# 'original': Spack's original greedy, fixed-point concretizer. This
|
||||
# algorithm can make decisions too early and will not backtrack
|
||||
# sufficiently for many specs.
|
||||
#
|
||||
# 'clingo': Uses a logic solver under the hood to solve DAGs with full
|
||||
# backtracking and optimization for user preferences. Spack will
|
||||
# try to bootstrap the logic solver, if not already available.
|
||||
#
|
||||
# 'original': Spack's original greedy, fixed-point concretizer. This
|
||||
# algorithm can make decisions too early and will not backtrack
|
||||
# sufficiently for many specs. This will soon be deprecated in
|
||||
# favor of clingo.
|
||||
#
|
||||
# See `concretizer.yaml` for more settings you can fine-tune when
|
||||
# using clingo.
|
||||
concretizer: clingo
|
||||
|
||||
|
||||
|
@@ -35,18 +35,21 @@ modules:
|
||||
|
||||
# These are configurations for the module set named "default"
|
||||
default:
|
||||
# These values are defaulted in the code. They are not defaulted here so
|
||||
# that we can enable backwards compatibility with the old syntax more
|
||||
# easily (old value is in the config yaml, config:module_roots)
|
||||
# Where to install modules
|
||||
# roots:
|
||||
# tcl: $spack/share/spack/modules
|
||||
# lmod: $spack/share/spack/lmod
|
||||
roots:
|
||||
tcl: $spack/share/spack/modules
|
||||
lmod: $spack/share/spack/lmod
|
||||
# What type of modules to use
|
||||
enable:
|
||||
- tcl
|
||||
|
||||
tcl:
|
||||
all:
|
||||
autoload: none
|
||||
|
||||
# Default configurations if lmod is enabled
|
||||
lmod:
|
||||
all:
|
||||
autoload: direct
|
||||
hierarchy:
|
||||
- mpi
|
||||
|
@@ -34,6 +34,7 @@ packages:
|
||||
java: [openjdk, jdk, ibm-java]
|
||||
jpeg: [libjpeg-turbo, libjpeg]
|
||||
lapack: [openblas, amdlibflame]
|
||||
libllvm: [llvm, llvm-amdgpu]
|
||||
lua-lang: [lua, lua-luajit]
|
||||
mariadb-client: [mariadb-c-client, mariadb]
|
||||
mkl: [intel-mkl]
|
||||
|
5
etc/spack/defaults/windows/config.yaml
Normal file
5
etc/spack/defaults/windows/config.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
config:
|
||||
locks: false
|
||||
concretizer: original
|
||||
build_stage::
|
||||
- '$spack/.staging'
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -59,7 +59,7 @@ are available:
|
||||
install_files : install file listing read from install_manifest.json
|
||||
environment_variables : environment variables parsed from spack-build-env.txt
|
||||
config_args : config args loaded from spack-configure-args.txt
|
||||
abigail : Application Binary Interface (ABI) features for objects
|
||||
libabigail : Application Binary Interface (ABI) features for objects
|
||||
|
||||
|
||||
In the above, the first three are fairly simple - parsing metadata files from
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -194,9 +194,9 @@ Reusing installed dependencies
|
||||
|
||||
.. warning::
|
||||
|
||||
The ``--reuse`` option described here is experimental, and it will
|
||||
likely be replaced with a different option and configuration settings
|
||||
in the next Spack release.
|
||||
The ``--reuse`` option described here will become the default installation
|
||||
method in the next Spack version, and you will be able to get the current
|
||||
behavior by using ``spack install --fresh``.
|
||||
|
||||
By default, when you run ``spack install``, Spack tries to build a new
|
||||
version of the package you asked for, along with updated versions of
|
||||
@@ -216,6 +216,9 @@ the ``mpich`` will be build with the installed versions, if possible.
|
||||
You can use the :ref:`spack spec -I <cmd-spack-spec>` command to see what
|
||||
will be reused and what will be built before you install.
|
||||
|
||||
You can configure Spack to use the ``--reuse`` behavior by default in
|
||||
``concretizer.yaml``.
|
||||
|
||||
.. _cmd-spack-uninstall:
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
@@ -1280,7 +1283,7 @@ Normally users don't have to bother specifying the architecture if they
|
||||
are installing software for their current host, as in that case the
|
||||
values will be detected automatically. If you need fine-grained control
|
||||
over which packages use which targets (or over *all* packages' default
|
||||
target), see :ref:`concretization-preferences`.
|
||||
target), see :ref:`package-preferences`.
|
||||
|
||||
.. admonition:: Cray machines
|
||||
|
||||
@@ -1720,8 +1723,8 @@ Activating Extensions in a View
|
||||
|
||||
Another way to use extensions is to create a view, which merges the
|
||||
python installation along with the extensions into a single prefix.
|
||||
See :ref:`filesystem-views` for a more in-depth description of views and
|
||||
:ref:`cmd-spack-view` for usage of the ``spack view`` command.
|
||||
See :ref:`configuring_environment_views` for a more in-depth description
|
||||
of views.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Activating Extensions Globally
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,13 +1,13 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
||||
.. _build-settings:
|
||||
|
||||
===================
|
||||
Build Customization
|
||||
===================
|
||||
================================
|
||||
Package Settings (packages.yaml)
|
||||
================================
|
||||
|
||||
Spack allows you to customize how your software is built through the
|
||||
``packages.yaml`` file. Using it, you can make Spack prefer particular
|
||||
@@ -209,11 +209,49 @@ Specific limitations include:
|
||||
then Spack will not add a new external entry (``spack config blame packages``
|
||||
can help locate all external entries).
|
||||
|
||||
.. _concretization-preferences:
|
||||
.. _concretizer-options:
|
||||
|
||||
--------------------------
|
||||
Concretization Preferences
|
||||
--------------------------
|
||||
----------------------
|
||||
Concretizer options
|
||||
----------------------
|
||||
|
||||
``packages.yaml`` gives the concretizer preferences for specific packages,
|
||||
but you can also use ``concretizer.yaml`` to customize aspects of the
|
||||
algorithm it uses to select the dependencies you install:
|
||||
|
||||
.. _code-block: yaml
|
||||
|
||||
concretizer:
|
||||
# Whether to consider installed packages or packages from buildcaches when
|
||||
# concretizing specs. If `true`, we'll try to use as many installs/binaries
|
||||
# as possible, rather than building. If `false`, we'll always give you a fresh
|
||||
# concretization.
|
||||
reuse: false
|
||||
|
||||
^^^^^^^^^^^^^^^^
|
||||
``reuse``
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This controls whether Spack will prefer to use installed packages (``true``), or
|
||||
whether it will do a "fresh" installation and prefer the latest settings from
|
||||
``package.py`` files and ``packages.yaml`` (``false``). .
|
||||
|
||||
You can use ``spack install --reuse`` to enable reuse for a single installation,
|
||||
and you can use ``spack install --fresh`` to do a fresh install if ``reuse`` is
|
||||
enabled by default.
|
||||
|
||||
.. note::
|
||||
|
||||
``reuse: false`` is the current default, but ``reuse: true`` will be the default
|
||||
in the next Spack release. You will still be able to use ``spack install --fresh``
|
||||
to get the old behavior.
|
||||
|
||||
|
||||
.. _package-preferences:
|
||||
|
||||
-------------------
|
||||
Package Preferences
|
||||
-------------------
|
||||
|
||||
Spack can be configured to prefer certain compilers, package
|
||||
versions, dependencies, and variants during concretization.
|
||||
@@ -269,6 +307,7 @@ concretization rules. A provider lists a value that packages may
|
||||
``depend_on`` (e.g, MPI) and a list of rules for fulfilling that
|
||||
dependency.
|
||||
|
||||
|
||||
.. _package_permissions:
|
||||
|
||||
-------------------
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -51,6 +51,7 @@ on these ideas for each distinct build system that Spack supports:
|
||||
build_systems/perlpackage
|
||||
build_systems/pythonpackage
|
||||
build_systems/rpackage
|
||||
build_systems/racketpackage
|
||||
build_systems/rubypackage
|
||||
|
||||
.. toctree::
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -420,6 +420,24 @@ Or when one variant controls multiple flags:
|
||||
config_args += self.with_or_without('memchecker', variant='debug_tools')
|
||||
config_args += self.with_or_without('profiler', variant='debug_tools')
|
||||
|
||||
|
||||
""""""""""""""""""""
|
||||
Conditional variants
|
||||
""""""""""""""""""""
|
||||
|
||||
When a variant is conditional and its condition is not met on the concrete spec, the
|
||||
``with_or_without`` and ``enable_or_disable`` methods will simply return an empty list.
|
||||
|
||||
For example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant('profiler', when='@2.0:')
|
||||
config_args += self.with_or_without('profiler')
|
||||
|
||||
will neither add ``--with-profiler`` nor ``--without-profiler`` when the version is
|
||||
below ``2.0``.
|
||||
|
||||
""""""""""""""""""""
|
||||
Activation overrides
|
||||
""""""""""""""""""""
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -145,6 +145,99 @@ and without the :meth:`~spack.build_systems.cmake.CMakePackage.define` and
|
||||
|
||||
return args
|
||||
|
||||
Spack supports CMake defines from conditional variants too. Whenever the condition on
|
||||
the variant is not met, ``define_from_variant()`` will simply return an empty string,
|
||||
and CMake simply ignores the empty command line argument. For example the following
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant('example', default=True, when='@2.0:')
|
||||
|
||||
def cmake_args(self):
|
||||
return [self.define_from_variant('EXAMPLE', 'example')]
|
||||
|
||||
will generate ``'cmake' '-DEXAMPLE=ON' ...`` when `@2.0: +example` is met, but will
|
||||
result in ``'cmake' '' ...`` when the spec version is below ``2.0``.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
CMake arguments provided by Spack
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The following default arguments are controlled by Spack:
|
||||
|
||||
|
||||
``CMAKE_INSTALL_PREFIX``
|
||||
------------------------
|
||||
|
||||
Is set to the the package's install directory.
|
||||
|
||||
|
||||
``CMAKE_PREFIX_PATH``
|
||||
---------------------
|
||||
|
||||
CMake finds dependencies through calls to ``find_package()``, ``find_program()``,
|
||||
``find_library()``, ``find_file()``, and ``find_path()``, which use a list of search
|
||||
paths from ``CMAKE_PREFIX_PATH``. Spack sets this variable to a list of prefixes of the
|
||||
spec's transitive dependencies.
|
||||
|
||||
For troubleshooting cases where CMake fails to find a dependency, add the
|
||||
``--debug-find`` flag to ``cmake_args``.
|
||||
|
||||
``CMAKE_BUILD_TYPE``
|
||||
--------------------
|
||||
|
||||
Every CMake-based package accepts a ``-DCMAKE_BUILD_TYPE`` flag to
|
||||
dictate which level of optimization to use. In order to ensure
|
||||
uniformity across packages, the ``CMakePackage`` base class adds
|
||||
a variant to control this:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant('build_type', default='RelWithDebInfo',
|
||||
description='CMake build type',
|
||||
values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel'))
|
||||
|
||||
However, not every CMake package accepts all four of these options.
|
||||
Grep the ``CMakeLists.txt`` file to see if the default values are
|
||||
missing or replaced. For example, the
|
||||
`dealii <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/dealii/package.py>`_
|
||||
package overrides the default variant with:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant('build_type', default='DebugRelease',
|
||||
description='The build type to build',
|
||||
values=('Debug', 'Release', 'DebugRelease'))
|
||||
|
||||
For more information on ``CMAKE_BUILD_TYPE``, see:
|
||||
https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
|
||||
|
||||
|
||||
``CMAKE_INSTALL_RPATH`` and ``CMAKE_INSTALL_RPATH_USE_LINK_PATH=ON``
|
||||
--------------------------------------------------------------------
|
||||
|
||||
CMake uses different RPATHs during the build and after installation, so that executables
|
||||
can locate the libraries they're linked to during the build, and installed executables
|
||||
do not have RPATHs to build directories. In Spack, we have to make sure that RPATHs are
|
||||
set properly after installation.
|
||||
|
||||
Spack sets ``CMAKE_INSTALL_RPATH`` to a list of ``<prefix>/lib`` or ``<prefix>/lib64``
|
||||
directories of the spec's link-type dependencies. Apart from that, it sets
|
||||
``-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON``, which should add RPATHs for directories of
|
||||
linked libraries not in the directories covered by ``CMAKE_INSTALL_RPATH``.
|
||||
|
||||
Usually it's enough to set only ``-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON``, but the
|
||||
reason to provide both options is that packages may dynamically open shared libraries,
|
||||
which CMake cannot detect. In those cases, the RPATHs from ``CMAKE_INSTALL_RPATH`` are
|
||||
used as search paths.
|
||||
|
||||
.. note::
|
||||
|
||||
Some packages provide stub libraries, which contain an interface for linking without
|
||||
an implementation. When using such libraries, it's best to override the option
|
||||
``-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=OFF`` in ``cmake_args``, so that stub libraries
|
||||
are not used at runtime.
|
||||
|
||||
|
||||
^^^^^^^^^^
|
||||
Generators
|
||||
@@ -182,36 +275,6 @@ generators, but it should be simple to add support for alternative
|
||||
generators. For more information on CMake generators, see:
|
||||
https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html
|
||||
|
||||
^^^^^^^^^^^^^^^^
|
||||
CMAKE_BUILD_TYPE
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
Every CMake-based package accepts a ``-DCMAKE_BUILD_TYPE`` flag to
|
||||
dictate which level of optimization to use. In order to ensure
|
||||
uniformity across packages, the ``CMakePackage`` base class adds
|
||||
a variant to control this:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant('build_type', default='RelWithDebInfo',
|
||||
description='CMake build type',
|
||||
values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel'))
|
||||
|
||||
However, not every CMake package accepts all four of these options.
|
||||
Grep the ``CMakeLists.txt`` file to see if the default values are
|
||||
missing or replaced. For example, the
|
||||
`dealii <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/dealii/package.py>`_
|
||||
package overrides the default variant with:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant('build_type', default='DebugRelease',
|
||||
description='The build type to build',
|
||||
values=('Debug', 'Release', 'DebugRelease'))
|
||||
|
||||
For more information on ``CMAKE_BUILD_TYPE``, see:
|
||||
https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
CMakeLists.txt in a sub-directory
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -649,7 +649,7 @@ follow `the next section <intel-install-libs_>`_ instead.
|
||||
|
||||
* If you specified a custom variant (for example ``+vtune``) you may want to add this as your
|
||||
preferred variant in the packages configuration for the ``intel-parallel-studio`` package
|
||||
as described in :ref:`concretization-preferences`. Otherwise you will have to specify
|
||||
as described in :ref:`package-preferences`. Otherwise you will have to specify
|
||||
the variant everytime ``intel-parallel-studio`` is being used as ``mkl``, ``fftw`` or ``mpi``
|
||||
implementation to avoid pulling in a different variant.
|
||||
|
||||
@@ -811,13 +811,13 @@ by one of the following means:
|
||||
$ spack install libxc@3.0.0%intel
|
||||
|
||||
|
||||
* Alternatively, request Intel compilers implicitly by concretization preferences.
|
||||
* Alternatively, request Intel compilers implicitly by package preferences.
|
||||
Configure the order of compilers in the appropriate ``packages.yaml`` file,
|
||||
under either an ``all:`` or client-package-specific entry, in a
|
||||
``compiler:`` list. Consult the Spack documentation for
|
||||
`Configuring Package Preferences <https://spack-tutorial.readthedocs.io/en/latest/tutorial_configuration.html#configuring-package-preferences>`_
|
||||
and
|
||||
:ref:`Concretization Preferences <concretization-preferences>`.
|
||||
:ref:`Package Preferences <package-preferences>`.
|
||||
|
||||
Example: ``etc/spack/packages.yaml`` might simply contain:
|
||||
|
||||
@@ -867,7 +867,7 @@ virtual package, in order of decreasing preference. To learn more about the
|
||||
``providers:`` settings, see the Spack tutorial for
|
||||
`Configuring Package Preferences <https://spack-tutorial.readthedocs.io/en/latest/tutorial_configuration.html#configuring-package-preferences>`_
|
||||
and the section
|
||||
:ref:`Concretization Preferences <concretization-preferences>`.
|
||||
:ref:`Package Preferences <package-preferences>`.
|
||||
|
||||
Example: The following fairly minimal example for ``packages.yaml`` shows how
|
||||
to exclusively use the standalone ``intel-mkl`` package for all the linear
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -9,224 +9,94 @@
|
||||
PythonPackage
|
||||
-------------
|
||||
|
||||
Python packages and modules have their own special build system.
|
||||
Python packages and modules have their own special build system. This
|
||||
documentation covers everything you'll need to know in order to write
|
||||
a Spack build recipe for a Python library.
|
||||
|
||||
^^^^^^
|
||||
Phases
|
||||
^^^^^^
|
||||
^^^^^^^^^^^
|
||||
Terminology
|
||||
^^^^^^^^^^^
|
||||
|
||||
The ``PythonPackage`` base class provides the following phases that
|
||||
can be overridden:
|
||||
In the Python ecosystem, there are a number of terms that are
|
||||
important to understand.
|
||||
|
||||
* ``build``
|
||||
* ``build_py``
|
||||
* ``build_ext``
|
||||
* ``build_clib``
|
||||
* ``build_scripts``
|
||||
* ``install``
|
||||
* ``install_lib``
|
||||
* ``install_headers``
|
||||
* ``install_scripts``
|
||||
* ``install_data``
|
||||
**PyPI**
|
||||
The `Python Package Index <https://pypi.org/>`_, where most Python
|
||||
libraries are hosted.
|
||||
|
||||
These are all standard ``setup.py`` commands and can be found by running:
|
||||
**sdist**
|
||||
Source distributions, distributed as tarballs (.tar.gz) and zip
|
||||
files (.zip). Contain the source code of the package.
|
||||
|
||||
.. code-block:: console
|
||||
**bdist**
|
||||
Built distributions, distributed as wheels (.whl). Contain the
|
||||
pre-built library.
|
||||
|
||||
$ python setup.py --help-commands
|
||||
**wheel**
|
||||
A binary distribution format common in the Python ecosystem. This
|
||||
file is actually just a zip file containing specific metadata and
|
||||
code. See the
|
||||
`documentation <https://packaging.python.org/en/latest/specifications/binary-distribution-format/>`_
|
||||
for more details.
|
||||
|
||||
**build frontend**
|
||||
Command-line tools used to build and install wheels. Examples
|
||||
include `pip <https://pip.pypa.io/>`_,
|
||||
`build <https://pypa-build.readthedocs.io/>`_, and
|
||||
`installer <https://installer.readthedocs.io/>`_.
|
||||
|
||||
By default, only the ``build`` and ``install`` phases are run:
|
||||
**build backend**
|
||||
Libraries used to define how to build a wheel. Examples
|
||||
include `setuptools <https://setuptools.pypa.io/>`__,
|
||||
`flit <https://flit.readthedocs.io/>`_, and
|
||||
`poetry <https://python-poetry.org/>`_.
|
||||
|
||||
#. ``build`` - build everything needed to install
|
||||
#. ``install`` - install everything from build directory
|
||||
^^^^^^^^^^^
|
||||
Downloading
|
||||
^^^^^^^^^^^
|
||||
|
||||
If for whatever reason you need to run more phases, simply modify your
|
||||
``phases`` list like so:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
phases = ['build_ext', 'install']
|
||||
|
||||
|
||||
Each phase provides a function ``<phase>`` that runs:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python -s setup.py --no-user-cfg <phase>
|
||||
|
||||
|
||||
Each phase also has a ``<phase_args>`` function that can pass arguments to
|
||||
this call. All of these functions are empty except for the ``install_args``
|
||||
function, which passes ``--prefix=/path/to/installation/prefix``. There is
|
||||
also some additional logic specific to setuptools and eggs.
|
||||
|
||||
If you need to run a phase that is not a standard ``setup.py`` command,
|
||||
you'll need to define a function for it like so:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
phases = ['configure', 'build', 'install']
|
||||
|
||||
def configure(self, spec, prefix):
|
||||
self.setup_py('configure')
|
||||
|
||||
|
||||
^^^^^^
|
||||
Wheels
|
||||
^^^^^^
|
||||
|
||||
Some Python packages are closed-source and distributed as wheels.
|
||||
Instead of using the ``PythonPackage`` base class, you should extend
|
||||
the ``Package`` base class and implement the following custom installation
|
||||
procedure:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def install(self, spec, prefix):
|
||||
pip = which('pip')
|
||||
pip('install', self.stage.archive_file, '--prefix={0}'.format(prefix))
|
||||
|
||||
|
||||
This will require a dependency on pip, as mentioned below.
|
||||
|
||||
^^^^^^^^^^^^^^^
|
||||
Important files
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
Python packages can be identified by the presence of a ``setup.py`` file.
|
||||
This file is used by package managers like ``pip`` to determine a
|
||||
package's dependencies and the version of dependencies required, so if
|
||||
the ``setup.py`` file is not accurate, the package will not build properly.
|
||||
For this reason, the ``setup.py`` file should be fairly reliable. If the
|
||||
documentation and ``setup.py`` disagree on something, the ``setup.py``
|
||||
file should be considered to be the truth. As dependencies are added or
|
||||
removed, the documentation is much more likely to become outdated than
|
||||
the ``setup.py``.
|
||||
|
||||
The Python ecosystem has evolved significantly over the years. Before
|
||||
setuptools became popular, most packages listed their dependencies in a
|
||||
``requirements.txt`` file. Once setuptools took over, these dependencies
|
||||
were listed directly in the ``setup.py``. Newer PEPs introduced additional
|
||||
files, like ``setup.cfg`` and ``pyproject.toml``. You should look out for
|
||||
all of these files, as they may all contain important information about
|
||||
package dependencies.
|
||||
|
||||
Some Python packages are closed-source and are distributed as Python
|
||||
wheels. For example, ``py-azureml-sdk`` downloads a ``.whl`` file. This
|
||||
file is simply a zip file, and can be extracted using:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ unzip *.whl
|
||||
|
||||
|
||||
The zip file will not contain a ``setup.py``, but it will contain a
|
||||
``METADATA`` file which contains all the information you need to
|
||||
write a ``package.py`` build recipe.
|
||||
|
||||
^^^^
|
||||
PyPI
|
||||
^^^^
|
||||
|
||||
The vast majority of Python packages are hosted on PyPI - The Python
|
||||
Package Index. ``pip`` only supports packages hosted on PyPI, making
|
||||
it the only option for developers who want a simple installation.
|
||||
Search for "PyPI <package-name>" to find the download page. Note that
|
||||
some pages are versioned, and the first result may not be the newest
|
||||
version. Click on the "Latest Version" button to the top right to see
|
||||
if a newer version is available. The download page is usually at::
|
||||
The first step in packaging a Python library is to figure out where
|
||||
to download it from. The vast majority of Python packages are hosted
|
||||
on `PyPI <https://pypi.org/>`_, which is
|
||||
:ref:`preferred over GitHub <pypi-vs-github>` for downloading
|
||||
packages. Search for the package name on PyPI to find the project
|
||||
page. The project page is usually located at::
|
||||
|
||||
https://pypi.org/project/<package-name>
|
||||
|
||||
|
||||
Since PyPI is so common, the ``PythonPackage`` base class has a
|
||||
``pypi`` attribute that can be set. Once set, ``pypi`` will be used
|
||||
to define the ``homepage``, ``url``, and ``list_url``. For example,
|
||||
the following:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
homepage = 'https://pypi.org/project/setuptools/'
|
||||
url = 'https://pypi.org/packages/source/s/setuptools/setuptools-49.2.0.zip'
|
||||
list_url = 'https://pypi.org/simple/setuptools/'
|
||||
|
||||
|
||||
is equivalent to:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
pypi = 'setuptools/setuptools-49.2.0.zip'
|
||||
|
||||
|
||||
^^^^^^^^^^^
|
||||
Description
|
||||
^^^^^^^^^^^
|
||||
|
||||
The top of the PyPI downloads page contains a description of the
|
||||
package. The first line is usually a short description, while there
|
||||
may be a several line "Project Description" that follows. Choose whichever
|
||||
is more useful. You can also get these descriptions on the command-line
|
||||
using:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python setup.py --description
|
||||
$ python setup.py --long-description
|
||||
|
||||
|
||||
^^^^^^^^
|
||||
Homepage
|
||||
^^^^^^^^
|
||||
|
||||
Package developers use ``setup.py`` to upload new versions to PyPI.
|
||||
The ``setup`` method often passes metadata like ``homepage`` to PyPI.
|
||||
This metadata is displayed on the left side of the download page.
|
||||
Search for the text "Homepage" under "Project links" to find it. You
|
||||
should use this page instead of the PyPI page if they differ. You can
|
||||
also get the homepage on the command-line by running:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python setup.py --url
|
||||
|
||||
|
||||
^^^
|
||||
URL
|
||||
^^^
|
||||
|
||||
If ``pypi`` is set as mentioned above, ``url`` and ``list_url`` will
|
||||
be automatically set for you. If both ``.tar.gz`` and ``.zip`` versions
|
||||
are available, ``.tar.gz`` is preferred. If some releases offer both
|
||||
``.tar.gz`` and ``.zip`` versions, but some only offer ``.zip`` versions,
|
||||
use ``.zip``.
|
||||
|
||||
Some Python packages are closed-source and do not ship ``.tar.gz`` or ``.zip``
|
||||
files on either PyPI or GitHub. If this is the case, you can still download
|
||||
and install a Python wheel. For example, ``py-azureml-sdk`` is closed source
|
||||
and can be downloaded from::
|
||||
On the project page, there is a "Download files" tab containing
|
||||
download URLs. Whenever possible, we prefer to build Spack packages
|
||||
from source. If PyPI only has wheels, check to see if the project is
|
||||
hosted on GitHub and see if GitHub has source distributions. The
|
||||
project page usually has a "Homepage" and/or "Source code" link for
|
||||
this. If the project is closed-source, it may only have wheels
|
||||
available. For example, ``py-azureml-sdk`` is closed-source and can
|
||||
be downloaded from::
|
||||
|
||||
https://pypi.io/packages/py3/a/azureml_sdk/azureml_sdk-1.11.0-py3-none-any.whl
|
||||
|
||||
Once you've found a URL to download the package from, run:
|
||||
|
||||
You may see Python-specific or OS-specific URLs. Note that when you add a
|
||||
``.whl`` URL, you should add ``expand=False`` to ensure that Spack doesn't
|
||||
try to extract the wheel:
|
||||
.. code-block:: console
|
||||
|
||||
.. code-block:: python
|
||||
$ spack create <url>
|
||||
|
||||
version('1.11.0', sha256='d8c9d24ea90457214d798b0d922489863dad518adde3638e08ef62de28fb183a', expand=False)
|
||||
|
||||
to create a new package template.
|
||||
|
||||
.. _pypi-vs-github:
|
||||
|
||||
"""""""""""""""
|
||||
PyPI vs. GitHub
|
||||
"""""""""""""""
|
||||
|
||||
Many packages are hosted on PyPI, but are developed on GitHub or another
|
||||
version control systems. The tarball can be downloaded from either
|
||||
location, but PyPI is preferred for the following reasons:
|
||||
Many packages are hosted on PyPI, but are developed on GitHub or
|
||||
another version control system hosting service. The source code can
|
||||
be downloaded from either location, but PyPI is preferred for the
|
||||
following reasons:
|
||||
|
||||
#. PyPI contains the bare minimum number of files needed to install the package.
|
||||
#. PyPI contains the bare minimum number of files needed to install
|
||||
the package.
|
||||
|
||||
You may notice that the tarball you download from PyPI does not
|
||||
have the same checksum as the tarball you download from GitHub.
|
||||
@@ -263,249 +133,124 @@ location, but PyPI is preferred for the following reasons:
|
||||
PyPI is nice because it makes it physically impossible to
|
||||
re-release the same version of a package with a different checksum.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Build system dependencies
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
The only reason to use GitHub instead of PyPI is if PyPI only has
|
||||
wheels or if the PyPI sdist is missing a file needed to build the
|
||||
package. If this is the case, please add a comment above the ``url``
|
||||
explaining this.
|
||||
|
||||
There are a few dependencies common to the ``PythonPackage`` build system.
|
||||
^^^^
|
||||
PyPI
|
||||
^^^^
|
||||
|
||||
""""""
|
||||
Python
|
||||
""""""
|
||||
|
||||
Obviously, every ``PythonPackage`` needs Python at build-time to run
|
||||
``python setup.py build && python setup.py install``. Python is also
|
||||
needed at run-time if you want to import the module. Due to backwards
|
||||
incompatible changes between Python 2 and 3, it is very important to
|
||||
specify which versions of Python are supported. If the documentation
|
||||
mentions that Python 3 is required, this can be specified as:
|
||||
Since PyPI is so commonly used to host Python libraries, the
|
||||
``PythonPackage`` base class has a ``pypi`` attribute that can be
|
||||
set. Once set, ``pypi`` will be used to define the ``homepage``,
|
||||
``url``, and ``list_url``. For example, the following:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('python@3:', type=('build', 'run'))
|
||||
homepage = 'https://pypi.org/project/setuptools/'
|
||||
url = 'https://pypi.org/packages/source/s/setuptools/setuptools-49.2.0.zip'
|
||||
list_url = 'https://pypi.org/simple/setuptools/'
|
||||
|
||||
|
||||
If Python 2 is required, this would look like:
|
||||
is equivalent to:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('python@:2', type=('build', 'run'))
|
||||
pypi = 'setuptools/setuptools-49.2.0.zip'
|
||||
|
||||
|
||||
If Python 2.7 is the only version that works, you can use:
|
||||
If a package has a different homepage listed on PyPI, you can
|
||||
override it by setting your own ``homepage``.
|
||||
|
||||
^^^^^^^^^^^
|
||||
Description
|
||||
^^^^^^^^^^^
|
||||
|
||||
The top of the PyPI project page contains a short description of the
|
||||
package. The "Project description" tab may also contain a longer
|
||||
description of the package. Either of these can be used to populate
|
||||
the package docstring.
|
||||
|
||||
^^^^^^^^^^^^^
|
||||
Build backend
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
Once you've determined the basic metadata for a package, the next
|
||||
step is to determine the build backend. ``PythonPackage`` uses
|
||||
`pip <https://pip.pypa.io/>`_ to install the package, but pip
|
||||
requires a backend to actually build the package.
|
||||
|
||||
To determine the build backend, look for a ``pyproject.toml`` file.
|
||||
If there is no ``pyproject.toml`` file and only a ``setup.py`` or
|
||||
``setup.cfg`` file, you can assume that the project uses
|
||||
:ref:`setuptools`. If there is a ``pyproject.toml`` file, see if it
|
||||
contains a ``[build-system]`` section. For example:
|
||||
|
||||
.. code-block:: toml
|
||||
|
||||
[build-system]
|
||||
requires = [
|
||||
"setuptools>=42",
|
||||
"wheel",
|
||||
]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
|
||||
This section does two things: the ``requires`` key lists build
|
||||
dependencies of the project, and the ``build-backend`` key defines
|
||||
the build backend. All of these build dependencies should be added as
|
||||
dependencies to your package:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('python@2.7:2.8', type=('build', 'run'))
|
||||
depends_on('py-setuptools@42:', type='build')
|
||||
|
||||
|
||||
The documentation may not always specify supported Python versions.
|
||||
Another place to check is in the ``setup.py`` or ``setup.cfg`` file.
|
||||
Look for a line containing ``python_requires``. An example from
|
||||
`py-numpy <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/py-numpy/package.py>`_
|
||||
looks like:
|
||||
Note that ``py-wheel`` is already listed as a build dependency in the
|
||||
``PythonPackage`` base class, so you don't need to add it unless you
|
||||
need to specify a specific version requirement or change the
|
||||
dependency type.
|
||||
|
||||
.. code-block:: python
|
||||
See `PEP 517 <https://www.python.org/dev/peps/pep-0517/>`_ and
|
||||
`PEP 518 <https://www.python.org/dev/peps/pep-0518/>`_ for more
|
||||
information on the design of ``pyproject.toml``.
|
||||
|
||||
python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*'
|
||||
Depending on which build backend a project uses, there are various
|
||||
places that run-time dependencies can be listed.
|
||||
|
||||
"""""""""
|
||||
distutils
|
||||
"""""""""
|
||||
|
||||
You may also find a version check at the top of the ``setup.py``:
|
||||
Before the introduction of setuptools and other build backends,
|
||||
Python packages had to rely on the built-in distutils library.
|
||||
Distutils is missing many of the features that setuptools and other
|
||||
build backends offer, and users are encouraged to use setuptools
|
||||
instead. In fact, distutils was deprecated in Python 3.10 and will be
|
||||
removed in Python 3.12. Because of this, pip actually replaces all
|
||||
imports of distutils with setuptools. If a package uses distutils,
|
||||
you should instead add a build dependency on setuptools. Check for a
|
||||
``requirements.txt`` file that may list dependencies of the project.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
if sys.version_info[:2] < (2, 7) or (3, 0) <= sys.version_info[:2] < (3, 4):
|
||||
raise RuntimeError("Python version 2.7 or >= 3.4 required.")
|
||||
|
||||
|
||||
This can be converted to Spack's spec notation like so:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('python@2.7:2.8,3.4:', type=('build', 'run'))
|
||||
|
||||
|
||||
If you are writing a recipe for a package that only distributes
|
||||
wheels, look for a section in the ``METADATA`` file that looks like::
|
||||
|
||||
Requires-Python: >=3.5,<4
|
||||
|
||||
|
||||
This would be translated to:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
extends('python')
|
||||
depends_on('python@3.5:3', type=('build', 'run'))
|
||||
|
||||
|
||||
Many ``setup.py`` or ``setup.cfg`` files also contain information like::
|
||||
|
||||
Programming Language :: Python :: 2
|
||||
Programming Language :: Python :: 2.6
|
||||
Programming Language :: Python :: 2.7
|
||||
Programming Language :: Python :: 3
|
||||
Programming Language :: Python :: 3.3
|
||||
Programming Language :: Python :: 3.4
|
||||
Programming Language :: Python :: 3.5
|
||||
Programming Language :: Python :: 3.6
|
||||
|
||||
|
||||
This is a list of versions of Python that the developer likely tests.
|
||||
However, you should not use this to restrict the versions of Python
|
||||
the package uses unless one of the two former methods (``python_requires``
|
||||
or ``sys.version_info``) is used. There is no logic in setuptools
|
||||
that prevents the package from building for Python versions not in
|
||||
this list, and often new releases like Python 3.7 or 3.8 work just fine.
|
||||
.. _setuptools:
|
||||
|
||||
""""""""""
|
||||
setuptools
|
||||
""""""""""
|
||||
|
||||
Originally, the Python language had a single build system called
|
||||
distutils, which is built into Python. Distutils provided a common
|
||||
framework for package authors to describe their project and how it
|
||||
should be built. However, distutils was not without limitations.
|
||||
Most notably, there was no way to list a project's dependencies
|
||||
with distutils. Along came setuptools, a non-builtin build system
|
||||
designed to overcome the limitations of distutils. Both projects
|
||||
use a similar API, making the transition easy while adding much
|
||||
needed functionality. Today, setuptools is used in around 90% of
|
||||
the Python packages in Spack.
|
||||
|
||||
Since setuptools isn't built-in to Python, you need to add it as a
|
||||
dependency. To determine whether or not a package uses setuptools,
|
||||
search the file for an import statement like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import setuptools
|
||||
|
||||
|
||||
or:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from setuptools import setup
|
||||
|
||||
|
||||
Some packages are designed to work with both setuptools and distutils,
|
||||
so you may find something like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
try:
|
||||
from setuptools import setup
|
||||
except ImportError:
|
||||
from distutils.core import setup
|
||||
|
||||
|
||||
This uses setuptools if available, and falls back to distutils if not.
|
||||
In this case, you would still want to add a setuptools dependency, as
|
||||
it offers us more control over the installation.
|
||||
|
||||
Unless specified otherwise, setuptools is usually a build-only dependency.
|
||||
That is, it is needed to install the software, but is not needed at
|
||||
run-time. This can be specified as:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('py-setuptools', type='build')
|
||||
|
||||
|
||||
"""
|
||||
pip
|
||||
"""
|
||||
|
||||
Packages distributed as Python wheels will require an extra dependency
|
||||
on pip:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('py-pip', type='build')
|
||||
|
||||
|
||||
We will use pip to install the actual wheel.
|
||||
|
||||
""""""
|
||||
cython
|
||||
""""""
|
||||
|
||||
Compared to compiled languages, interpreted languages like Python can
|
||||
be quite a bit slower. To work around this, some Python developers
|
||||
rewrite computationally demanding sections of code in C, a process
|
||||
referred to as "cythonizing". In order to build these package, you
|
||||
need to add a build dependency on cython:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('py-cython', type='build')
|
||||
|
||||
|
||||
Look for references to "cython" in the ``setup.py`` to determine
|
||||
whether or not this is necessary. Cython may be optional, but
|
||||
even then you should list it as a required dependency. Spack is
|
||||
designed to compile software, and is meant for HPC facilities
|
||||
where speed is crucial. There is no reason why someone would not
|
||||
want an optimized version of a library instead of the pure-Python
|
||||
version.
|
||||
|
||||
Note that some release tarballs come pre-cythonized, and cython is
|
||||
not needed as a dependency. However, this is becoming less common
|
||||
as Python continues to evolve and developers discover that cythonized
|
||||
sources are no longer compatible with newer versions of Python and
|
||||
need to be re-cythonized.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
Python dependencies
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
When you install a package with ``pip``, it reads the ``setup.py``
|
||||
file in order to determine the dependencies of the package.
|
||||
If the dependencies are not yet installed, ``pip`` downloads them
|
||||
and installs them for you. This may sound convenient, but Spack
|
||||
cannot rely on this behavior for two reasons:
|
||||
|
||||
#. Spack needs to be able to install packages on air-gapped networks.
|
||||
|
||||
If there is no internet connection, ``pip`` can't download the
|
||||
package dependencies. By explicitly listing every dependency in
|
||||
the ``package.py``, Spack knows what to download ahead of time.
|
||||
|
||||
#. Duplicate installations of the same dependency may occur.
|
||||
|
||||
Spack supports *activation* of Python extensions, which involves
|
||||
symlinking the package installation prefix to the Python installation
|
||||
prefix. If your package is missing a dependency, that dependency
|
||||
will be installed to the installation directory of the same package.
|
||||
If you try to activate the package + dependency, it may cause a
|
||||
problem if that package has already been activated.
|
||||
|
||||
For these reasons, you must always explicitly list all dependencies.
|
||||
Although the documentation may list the package's dependencies,
|
||||
often the developers assume people will use ``pip`` and won't have to
|
||||
worry about it. Always check the ``setup.py`` to find the true
|
||||
dependencies.
|
||||
|
||||
If the package relies on ``distutils``, it may not explicitly list its
|
||||
dependencies. Check for statements like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
try:
|
||||
import numpy
|
||||
except ImportError:
|
||||
raise ImportError("numpy must be installed prior to installation")
|
||||
|
||||
|
||||
Obviously, this means that ``py-numpy`` is a dependency.
|
||||
|
||||
If the package uses ``setuptools``, check for the following clues:
|
||||
If the ``pyproject.toml`` lists ``setuptools.build_meta`` as a
|
||||
``build-backend``, or if the package has a ``setup.py`` that imports
|
||||
``setuptools``, or if the package has a ``setup.cfg`` file, then it
|
||||
uses setuptools to build. Setuptools is a replacement for the
|
||||
distutils library, and has almost the exact same API. Dependencies
|
||||
can be listed in the ``setup.py`` or ``setup.cfg`` file. Look for the
|
||||
following arguments:
|
||||
|
||||
* ``python_requires``
|
||||
|
||||
As mentioned above, this specifies which versions of Python are
|
||||
required.
|
||||
This specifies the version of Python that is required.
|
||||
|
||||
* ``setup_requires``
|
||||
|
||||
@@ -517,43 +262,88 @@ If the package uses ``setuptools``, check for the following clues:
|
||||
These packages are required for building and installation. You can
|
||||
add them with ``type=('build', 'run')``.
|
||||
|
||||
* ``extra_requires``
|
||||
* ``extras_require``
|
||||
|
||||
These packages are optional dependencies that enable additional
|
||||
functionality. You should add a variant that optionally adds these
|
||||
dependencies. This variant should be False by default.
|
||||
|
||||
* ``test_requires``
|
||||
* ``tests_require``
|
||||
|
||||
These are packages that are required to run the unit tests for the
|
||||
package. These dependencies can be specified using the
|
||||
``type='test'`` dependency type. However, the PyPI tarballs rarely
|
||||
contain unit tests, so there is usually no reason to add these.
|
||||
|
||||
In the root directory of the package, you may notice a
|
||||
``requirements.txt`` file. It may look like this file contains a list
|
||||
of all of the package's dependencies. Don't be fooled. This file is
|
||||
used by tools like Travis to install the pre-requisites for the
|
||||
package... and a whole bunch of other things. It often contains
|
||||
dependencies only needed for unit tests, like:
|
||||
See https://setuptools.pypa.io/en/latest/userguide/dependency_management.html
|
||||
for more information on how setuptools handles dependency management.
|
||||
See `PEP 440 <https://www.python.org/dev/peps/pep-0440/#version-specifiers>`_
|
||||
for documentation on version specifiers in setuptools.
|
||||
|
||||
* mock
|
||||
* nose
|
||||
* pytest
|
||||
""""
|
||||
flit
|
||||
""""
|
||||
|
||||
It can also contain dependencies for building the documentation, like
|
||||
sphinx. If you can't find any information about the package's
|
||||
dependencies, you can take a look in ``requirements.txt``, but be sure
|
||||
not to add test or documentation dependencies.
|
||||
There are actually two possible ``build-backend`` for flit, ``flit``
|
||||
and ``flit_core``. If you see these in the ``pyproject.toml``, add a
|
||||
build dependency to your package. With flit, all dependencies are
|
||||
listed directly in the ``pyproject.toml`` file. Older versions of
|
||||
flit used to store this info in a ``flit.ini`` file, so check for
|
||||
this too.
|
||||
|
||||
Newer PEPs have added alternative ways to specify a package's dependencies.
|
||||
If you don't see any dependencies listed in the ``setup.py``, look for a
|
||||
``setup.cfg`` or ``pyproject.toml``. These files can be used to store the
|
||||
same ``install_requires`` information that ``setup.py`` used to use.
|
||||
Either of these files may contain keys like:
|
||||
|
||||
If you are write a recipe for a package that only distributes wheels,
|
||||
check the ``METADATA`` file for lines like::
|
||||
* ``requires-python``
|
||||
|
||||
This specifies the version of Python that is required
|
||||
|
||||
* ``dependencies`` or ``requires``
|
||||
|
||||
These packages are required for building and installation. You can
|
||||
add them with ``type=('build', 'run')``.
|
||||
|
||||
* ``project.optional-dependencies`` or ``requires-extra``
|
||||
|
||||
This section includes keys with lists of optional dependencies
|
||||
needed to enable those features. You should add a variant that
|
||||
optionally adds these dependencies. This variant should be False
|
||||
by default.
|
||||
|
||||
See https://flit.readthedocs.io/en/latest/pyproject_toml.html for
|
||||
more information.
|
||||
|
||||
""""""
|
||||
poetry
|
||||
""""""
|
||||
|
||||
Like flit, poetry also has two possible ``build-backend``, ``poetry``
|
||||
and ``poetry_core``. If you see these in the ``pyproject.toml``, add
|
||||
a build dependency to your package. With poetry, all dependencies are
|
||||
listed directly in the ``pyproject.toml`` file. Dependencies are
|
||||
listed in a ``[tool.poetry.dependencies]`` section, and use a
|
||||
`custom syntax <https://python-poetry.org/docs/dependency-specification/#version-constraints>`_
|
||||
for specifying the version requirements. Note that ``~=`` works
|
||||
differently in poetry than in setuptools and flit for versions that
|
||||
start with a zero.
|
||||
|
||||
""""""
|
||||
wheels
|
||||
""""""
|
||||
|
||||
Some Python packages are closed-source and are distributed as Python
|
||||
wheels. For example, ``py-azureml-sdk`` downloads a ``.whl`` file. This
|
||||
file is simply a zip file, and can be extracted using:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ unzip *.whl
|
||||
|
||||
|
||||
The zip file will not contain a ``setup.py``, but it will contain a
|
||||
``METADATA`` file which contains all the information you need to
|
||||
write a ``package.py`` build recipe. Check for lines like::
|
||||
|
||||
Requires-Python: >=3.5,<4
|
||||
Requires-Dist: azureml-core (~=1.11.0)
|
||||
Requires-Dist: azureml-dataset-runtime[fuse] (~=1.11.0)
|
||||
Requires-Dist: azureml-train (~=1.11.0)
|
||||
@@ -565,62 +355,58 @@ check the ``METADATA`` file for lines like::
|
||||
Requires-Dist: azureml-train-automl (~=1.11.0); extra == 'automl'
|
||||
|
||||
|
||||
Lines that use ``Requires-Dist`` are similar to ``install_requires``.
|
||||
Lines that use ``Provides-Extra`` are similar to ``extra_requires``,
|
||||
and you can add a variant for those dependencies. The ``~=1.11.0``
|
||||
syntax is equivalent to ``1.11.0:1.11``.
|
||||
|
||||
""""""""""
|
||||
setuptools
|
||||
""""""""""
|
||||
|
||||
Setuptools is a bit of a special case. If a package requires setuptools
|
||||
at run-time, how do they express this? They could add it to
|
||||
``install_requires``, but setuptools is imported long before this and is
|
||||
needed to read this line. And since you can't install the package
|
||||
without setuptools, the developers assume that setuptools will already
|
||||
be there, so they never mention when it is required. We don't want to
|
||||
add run-time dependencies if they aren't needed, so you need to
|
||||
determine whether or not setuptools is needed. Grep the installation
|
||||
directory for any files containing a reference to ``setuptools`` or
|
||||
``pkg_resources``. Both modules come from ``py-setuptools``.
|
||||
``pkg_resources`` is particularly common in scripts found in
|
||||
``prefix/bin``.
|
||||
``Requires-Python`` is equivalent to ``python_requires`` and
|
||||
``Requires-Dist`` is equivalent to ``install_requires``.
|
||||
``Provides-Extra`` is used to name optional features (variants) and
|
||||
a ``Requires-Dist`` with ``extra == 'foo'`` will list any
|
||||
dependencies needed for that feature.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Passing arguments to setup.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The default build and install phases should be sufficient to install
|
||||
most packages. However, you may want to pass additional flags to
|
||||
either phase.
|
||||
The default install phase should be sufficient to install most
|
||||
packages. However, the installation instructions for a package may
|
||||
suggest passing certain flags to the ``setup.py`` call. The
|
||||
``PythonPackage`` class has two techniques for doing this.
|
||||
|
||||
You can view the available options for a particular phase with:
|
||||
""""""""""""""
|
||||
Global options
|
||||
""""""""""""""
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ python setup.py <phase> --help
|
||||
|
||||
|
||||
Each phase provides a ``<phase_args>`` function that can be used to
|
||||
pass arguments to that phase. For example,
|
||||
`py-numpy <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/py-numpy/package.py>`_
|
||||
adds:
|
||||
These flags are added directly after ``setup.py`` when pip runs
|
||||
``python setup.py install``. For example, the ``py-pyyaml`` package
|
||||
has an optional dependency on ``libyaml`` that can be enabled like so:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def build_args(self, spec, prefix):
|
||||
args = []
|
||||
def global_options(self, spec, prefix):
|
||||
options = []
|
||||
if '+libyaml' in spec:
|
||||
options.append('--with-libyaml')
|
||||
else:
|
||||
options.append('--without-libyaml')
|
||||
return options
|
||||
|
||||
# From NumPy 1.10.0 on it's possible to do a parallel build.
|
||||
if self.version >= Version('1.10.0'):
|
||||
# But Parallel build in Python 3.5+ is broken. See:
|
||||
# https://github.com/spack/spack/issues/7927
|
||||
# https://github.com/scipy/scipy/issues/7112
|
||||
if spec['python'].version < Version('3.5'):
|
||||
args = ['-j', str(make_jobs)]
|
||||
|
||||
return args
|
||||
"""""""""""""""
|
||||
Install options
|
||||
"""""""""""""""
|
||||
|
||||
These flags are added directly after ``install`` when pip runs
|
||||
``python setup.py install``. For example, the ``py-pyyaml`` package
|
||||
allows you to specify the directories to search for ``libyaml``:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def install_options(self, spec, prefix):
|
||||
options = []
|
||||
if '+libyaml' in spec:
|
||||
options.extend([
|
||||
spec['libyaml'].libs.search_flags,
|
||||
spec['libyaml'].headers.include_flags,
|
||||
])
|
||||
return options
|
||||
|
||||
|
||||
^^^^^^^
|
||||
@@ -662,9 +448,9 @@ a "package" is a directory containing files like:
|
||||
|
||||
whereas a "module" is a single Python file.
|
||||
|
||||
The ``PythonPackage`` base class automatically detects these module
|
||||
names for you. If, for whatever reason, the module names detected
|
||||
are wrong, you can provide the names yourself by overriding
|
||||
The ``PythonPackage`` base class automatically detects these package
|
||||
and module names for you. If, for whatever reason, the module names
|
||||
detected are wrong, you can provide the names yourself by overriding
|
||||
``import_modules`` like so:
|
||||
|
||||
.. code-block:: python
|
||||
@@ -685,10 +471,8 @@ This can be expressed like so:
|
||||
@property
|
||||
def import_modules(self):
|
||||
modules = ['yaml']
|
||||
|
||||
if '+libyaml' in self.spec:
|
||||
modules.append('yaml.cyaml')
|
||||
|
||||
return modules
|
||||
|
||||
|
||||
@@ -706,10 +490,10 @@ Unit tests
|
||||
""""""""""
|
||||
|
||||
The package may have its own unit or regression tests. Spack can
|
||||
run these tests during the installation by adding phase-appropriate
|
||||
test methods.
|
||||
run these tests during the installation by adding test methods after
|
||||
installation.
|
||||
|
||||
For example, ``py-numpy`` adds the following as a check to run
|
||||
For example, ``py-numpy`` adds the following as a check to run
|
||||
after the ``install`` phase:
|
||||
|
||||
.. code-block:: python
|
||||
@@ -733,34 +517,14 @@ when testing is enabled during the installation (i.e., ``spack install
|
||||
Setup file in a sub-directory
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
In order to be compatible with package managers like ``pip``, the package
|
||||
is required to place its ``setup.py`` in the root of the tarball. However,
|
||||
not every Python package cares about ``pip`` or PyPI. If you are installing
|
||||
a package that is not hosted on PyPI, you may find that it places its
|
||||
``setup.py`` in a sub-directory. To handle this, add the directory containing
|
||||
``setup.py`` to the package like so:
|
||||
Many C/C++ libraries provide optional Python bindings in a
|
||||
subdirectory. To tell pip which directory to build from, you can
|
||||
override the ``build_directory`` attribute. For example, if a package
|
||||
provides Python bindings in a ``python`` directory, you can use:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
build_directory = 'source'
|
||||
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Alternate names for setup.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
As previously mentioned, packages need to call their setup script ``setup.py``
|
||||
in order to be compatible with package managers like ``pip``. However, some
|
||||
packages like
|
||||
`py-meep <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/py-meep/package.py>`_ and
|
||||
`py-adios <https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/py-adios/package.py>`_
|
||||
come with multiple setup scripts, one for a serial build and another for a
|
||||
parallel build. You can override the default name to use like so:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def setup_file(self):
|
||||
return 'setup-mpi.py' if '+mpi' in self.spec else 'setup.py'
|
||||
build_directory = 'python'
|
||||
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -774,10 +538,14 @@ on Python are not necessarily ``PythonPackage``'s.
|
||||
Choosing a build system
|
||||
"""""""""""""""""""""""
|
||||
|
||||
First of all, you need to select a build system. ``spack create`` usually
|
||||
does this for you, but if for whatever reason you need to do this manually,
|
||||
choose ``PythonPackage`` if and only if the package contains a ``setup.py``
|
||||
file.
|
||||
First of all, you need to select a build system. ``spack create``
|
||||
usually does this for you, but if for whatever reason you need to do
|
||||
this manually, choose ``PythonPackage`` if and only if the package
|
||||
contains one of the following files:
|
||||
|
||||
* ``pyproject.toml``
|
||||
* ``setup.py``
|
||||
* ``setup.cfg``
|
||||
|
||||
"""""""""""""""""""""""
|
||||
Choosing a package name
|
||||
@@ -850,10 +618,9 @@ having to add that module to ``PYTHONPATH``.
|
||||
|
||||
When deciding between ``extends`` and ``depends_on``, the best rule of
|
||||
thumb is to check the installation prefix. If Python libraries are
|
||||
installed to ``prefix/lib/python2.7/site-packages`` (where 2.7 is the
|
||||
MAJOR.MINOR version of Python you used to install the package), then
|
||||
you should use ``extends``. If Python libraries are installed elsewhere
|
||||
or the only files that get installed reside in ``prefix/bin``, then
|
||||
installed to ``<prefix>/lib/pythonX.Y/site-packages``, then you
|
||||
should use ``extends``. If Python libraries are installed elsewhere
|
||||
or the only files that get installed reside in ``<prefix>/bin``, then
|
||||
don't use ``extends``, as symlinking the package wouldn't be useful.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -878,12 +645,24 @@ are not yet in Spack, and Spack contains many Python packages that are
|
||||
not yet in Anaconda. The main advantage of Spack over Anaconda is its
|
||||
ability to choose a specific compiler and BLAS/LAPACK or MPI library.
|
||||
Spack also has better platform support for supercomputers, and can build
|
||||
optimized binaries for your specific microarchitecture. On the other hand,
|
||||
Anaconda offers Windows support.
|
||||
optimized binaries for your specific microarchitecture.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
External documentation
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For more information on Python packaging, see:
|
||||
https://packaging.python.org/
|
||||
|
||||
* https://packaging.python.org/
|
||||
|
||||
For more information on build and installation frontend tools, see:
|
||||
|
||||
* pip: https://pip.pypa.io/
|
||||
* build: https://pypa-build.readthedocs.io/
|
||||
* installer: https://installer.readthedocs.io/
|
||||
|
||||
For more information on build backend tools, see:
|
||||
|
||||
* setuptools: https://setuptools.pypa.io/
|
||||
* flit: https://flit.readthedocs.io/
|
||||
* poetry: https://python-poetry.org/
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
46
lib/spack/docs/build_systems/racketpackage.rst
Normal file
46
lib/spack/docs/build_systems/racketpackage.rst
Normal file
@@ -0,0 +1,46 @@
|
||||
.. Copyright 2013-2021 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)
|
||||
|
||||
.. _racketpackage:
|
||||
|
||||
-------------
|
||||
RacketPackage
|
||||
-------------
|
||||
|
||||
Much like Python, Racket packages and modules have their own special build system.
|
||||
To learn more about the specifics of Racket package system, please refer to the
|
||||
`Racket Docs <https://docs.racket-lang.org/pkg/cmdline.html>`_.
|
||||
|
||||
^^^^^^
|
||||
Phases
|
||||
^^^^^^
|
||||
|
||||
The ``RacketPackage`` base class provides an ``install`` phase that
|
||||
can be overridden, corresponding to the use of:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ raco pkg install
|
||||
|
||||
^^^^^^^
|
||||
Caveats
|
||||
^^^^^^^
|
||||
|
||||
In principle, ``raco`` supports a second, ``setup`` phase; however, we have not
|
||||
implemented this separately, as in normal circumstances, ``install`` also handles
|
||||
running ``setup`` automatically.
|
||||
|
||||
Unlike Python, Racket currently on supports two installation scopes for packages, user
|
||||
or system, and keeps a registry of installed packages at each scope in its configuration files.
|
||||
This means we can't simply compose a "``RACKET_PATH``" environment variable listing all of the
|
||||
places packages are installed, and update this at will.
|
||||
|
||||
Unfortunately this means that all currently installed packages which extend Racket via ``raco pkg install``
|
||||
are accessible whenever Racket is accessible.
|
||||
|
||||
Additionally, because Spack does not implement uninstall hooks, uninstalling a Spack ``rkt-`` package
|
||||
will have no effect on the ``raco`` installed packages visible to your Racket installation.
|
||||
Instead, you must manually run ``raco pkg remove`` to keep the two package managers in a mutually
|
||||
consistent state.
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
# Copyright 2013-2022 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)
|
||||
@@ -30,6 +30,7 @@
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
sys.path.insert(0, os.path.abspath('_spack_root/lib/spack/external'))
|
||||
sys.path.insert(0, os.path.abspath('_spack_root/lib/spack/external/pytest-fallback'))
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
sys.path.insert(
|
||||
@@ -179,6 +180,7 @@ def setup(sphinx):
|
||||
('py:class', '_frozen_importlib_external.SourceFileLoader'),
|
||||
# Spack classes that are private and we don't want to expose
|
||||
('py:class', 'spack.provider_index._IndexBase'),
|
||||
('py:class', 'spack.repo._PrependFileLoader'),
|
||||
]
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||
|
@@ -1,13 +1,13 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
||||
.. _config-yaml:
|
||||
|
||||
==============
|
||||
Basic Settings
|
||||
==============
|
||||
============================
|
||||
Spack Settings (config.yaml)
|
||||
============================
|
||||
|
||||
Spack's basic configuration options are set in ``config.yaml``. You can
|
||||
see the default settings by looking at
|
||||
@@ -72,21 +72,6 @@ used to configure module names.
|
||||
packages have been installed will prevent Spack from being
|
||||
able to find the old installation directories.
|
||||
|
||||
--------------------
|
||||
``module_roots``
|
||||
--------------------
|
||||
|
||||
Controls where Spack installs generated module files. You can customize
|
||||
the location for each type of module. e.g.:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
module_roots:
|
||||
tcl: $spack/share/spack/modules
|
||||
lmod: $spack/share/spack/lmod
|
||||
|
||||
See :ref:`modules` for details.
|
||||
|
||||
--------------------
|
||||
``build_stage``
|
||||
--------------------
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -13,12 +13,16 @@ Spack has many configuration files. Here is a quick list of them, in
|
||||
case you want to skip directly to specific docs:
|
||||
|
||||
* :ref:`compilers.yaml <compiler-config>`
|
||||
* :ref:`concretizer.yaml <concretizer-options>`
|
||||
* :ref:`config.yaml <config-yaml>`
|
||||
* :ref:`mirrors.yaml <mirrors>`
|
||||
* :ref:`modules.yaml <modules>`
|
||||
* :ref:`packages.yaml <build-settings>`
|
||||
* :ref:`repos.yaml <repositories>`
|
||||
|
||||
You can also add any of these as inline configuration in ``spack.yaml``
|
||||
in an :ref:`environment <environment-configuration>`.
|
||||
|
||||
-----------
|
||||
YAML Format
|
||||
-----------
|
||||
@@ -33,8 +37,6 @@ Here is an example ``config.yaml`` file:
|
||||
|
||||
config:
|
||||
install_tree: $spack/opt/spack
|
||||
module_roots:
|
||||
lmod: $spack/share/spack/lmod
|
||||
build_stage:
|
||||
- $tempdir/$user/spack-stage
|
||||
- ~/.spack/stage
|
||||
@@ -249,8 +251,6 @@ your configurations look like this:
|
||||
|
||||
config:
|
||||
install_tree: $spack/opt/spack
|
||||
module_roots:
|
||||
lmod: $spack/share/spack/lmod
|
||||
build_stage:
|
||||
- $tempdir/$user/spack-stage
|
||||
- ~/.spack/stage
|
||||
@@ -274,8 +274,6 @@ command:
|
||||
$ spack config get config
|
||||
config:
|
||||
install_tree: /some/other/directory
|
||||
module_roots:
|
||||
lmod: $spack/share/spack/lmod
|
||||
build_stage:
|
||||
- $tempdir/$user/spack-stage
|
||||
- ~/.spack/stage
|
||||
@@ -341,13 +339,11 @@ higher-precedence scope is *prepended* to the defaults. ``spack config
|
||||
get config`` shows the result:
|
||||
|
||||
.. code-block:: console
|
||||
:emphasize-lines: 7-10
|
||||
:emphasize-lines: 5-8
|
||||
|
||||
$ spack config get config
|
||||
config:
|
||||
install_tree: /some/other/directory
|
||||
module_roots:
|
||||
lmod: $spack/share/spack/lmod
|
||||
build_stage:
|
||||
- /lustre-scratch/$user/spack
|
||||
- ~/mystage
|
||||
@@ -371,13 +367,11 @@ user config looked like this:
|
||||
The merged configuration would look like this:
|
||||
|
||||
.. code-block:: console
|
||||
:emphasize-lines: 7-8
|
||||
:emphasize-lines: 5-6
|
||||
|
||||
$ spack config get config
|
||||
config:
|
||||
install_tree: /some/other/directory
|
||||
module_roots:
|
||||
lmod: $spack/share/spack/lmod
|
||||
build_stage:
|
||||
- /lustre-scratch/$user/spack
|
||||
- ~/mystage
|
||||
@@ -498,9 +492,6 @@ account all scopes. For example, to see the fully merged
|
||||
template_dirs:
|
||||
- $spack/templates
|
||||
directory_layout: {architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}
|
||||
module_roots:
|
||||
tcl: $spack/share/spack/modules
|
||||
lmod: $spack/share/spack/lmod
|
||||
build_stage:
|
||||
- $tempdir/$user/spack-stage
|
||||
- ~/.spack/stage
|
||||
@@ -548,9 +539,6 @@ down the problem:
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:23 template_dirs:
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:24 - $spack/templates
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:28 directory_layout: {architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:32 module_roots:
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:33 tcl: $spack/share/spack/modules
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:34 lmod: $spack/share/spack/lmod
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:49 build_stage:
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:50 - $tempdir/$user/spack-stage
|
||||
/home/myuser/spack/etc/spack/defaults/config.yaml:51 - ~/.spack/stage
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -71,7 +71,7 @@ locally to speed up the review process.
|
||||
new release that is causing problems. If this is the case, please file an issue.
|
||||
|
||||
|
||||
We currently test against Python 2.6, 2.7, and 3.5-3.7 on both macOS and Linux and
|
||||
We currently test against Python 2.7 and 3.5-3.9 on both macOS and Linux and
|
||||
perform 3 types of tests:
|
||||
|
||||
.. _cmd-spack-unit-test:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -671,6 +671,13 @@ If you need to write a hook that is relevant to a failure within a build
|
||||
process, you would want to instead use ``on_phase_failure``.
|
||||
|
||||
|
||||
"""""""""""""""""""""""""""
|
||||
``on_install_cancel(spec)``
|
||||
"""""""""""""""""""""""""""
|
||||
|
||||
The same, but triggered if a spec install is cancelled for any reason.
|
||||
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""
|
||||
``on_phase_success(pkg, phase_name, log_file)``
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""
|
||||
@@ -1050,39 +1057,39 @@ Release branches
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
There are currently two types of Spack releases: :ref:`major releases
|
||||
<major-releases>` (``0.13.0``, ``0.14.0``, etc.) and :ref:`point releases
|
||||
<point-releases>` (``0.13.1``, ``0.13.2``, ``0.13.3``, etc.). Here is a
|
||||
<major-releases>` (``0.17.0``, ``0.18.0``, etc.) and :ref:`point releases
|
||||
<point-releases>` (``0.17.1``, ``0.17.2``, ``0.17.3``, etc.). Here is a
|
||||
diagram of how Spack release branches work::
|
||||
|
||||
o branch: develop (latest version)
|
||||
o branch: develop (latest version, v0.19.0.dev0)
|
||||
|
|
||||
o merge v0.14.1 into develop
|
||||
|\
|
||||
| o branch: releases/v0.14, tag: v0.14.1
|
||||
o | merge v0.14.0 into develop
|
||||
|\|
|
||||
| o tag: v0.14.0
|
||||
o
|
||||
| o branch: releases/v0.18, tag: v0.18.1
|
||||
o |
|
||||
| o tag: v0.18.0
|
||||
o |
|
||||
| o
|
||||
|/
|
||||
o merge v0.13.2 into develop
|
||||
|\
|
||||
| o branch: releases/v0.13, tag: v0.13.2
|
||||
o | merge v0.13.1 into develop
|
||||
|\|
|
||||
| o tag: v0.13.1
|
||||
o | merge v0.13.0 into develop
|
||||
|\|
|
||||
| o tag: v0.13.0
|
||||
o
|
||||
|
|
||||
o
|
||||
| o branch: releases/v0.17, tag: v0.17.2
|
||||
o |
|
||||
| o tag: v0.17.1
|
||||
o |
|
||||
| o tag: v0.17.0
|
||||
o |
|
||||
| o
|
||||
|/
|
||||
o
|
||||
|
||||
The ``develop`` branch has the latest contributions, and nearly all pull
|
||||
requests target ``develop``.
|
||||
requests target ``develop``. The ``develop`` branch will report that its
|
||||
version is that of the next **major** release with a ``.dev0`` suffix.
|
||||
|
||||
Each Spack release series also has a corresponding branch, e.g.
|
||||
``releases/v0.14`` has ``0.14.x`` versions of Spack, and
|
||||
``releases/v0.13`` has ``0.13.x`` versions. A major release is the first
|
||||
``releases/v0.18`` has ``0.18.x`` versions of Spack, and
|
||||
``releases/v0.17`` has ``0.17.x`` versions. A major release is the first
|
||||
tagged version on a release branch. Minor releases are back-ported from
|
||||
develop onto release branches. This is typically done by cherry-picking
|
||||
bugfix commits off of ``develop``.
|
||||
@@ -1093,12 +1100,20 @@ packages. They should generally only contain fixes to the Spack core.
|
||||
However, sometimes priorities are such that new functionality needs to
|
||||
be added to a minor release.
|
||||
|
||||
Both major and minor releases are tagged. After each release, we merge
|
||||
the release branch back into ``develop`` so that the version bump and any
|
||||
other release-specific changes are visible in the mainline. As a
|
||||
convenience, we also tag the latest release as ``releases/latest``,
|
||||
so that users can easily check it out to get the latest
|
||||
stable version. See :ref:`merging-releases` for more details.
|
||||
Both major and minor releases are tagged. As a convenience, we also tag
|
||||
the latest release as ``releases/latest``, so that users can easily check
|
||||
it out to get the latest stable version. See :ref:`updating-latest-release`
|
||||
for more details.
|
||||
|
||||
.. note::
|
||||
|
||||
Older spack releases were merged **back** into develop so that we could
|
||||
do fancy things with tags, but since tarballs and many git checkouts do
|
||||
not have tags, this proved overly complex and confusing.
|
||||
|
||||
We have since converted to using `PEP 440 <https://peps.python.org/pep-0440/>`_
|
||||
compliant versions. `See here <https://github.com/spack/spack/pull/25267>`_ for
|
||||
details.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Scheduling work for releases
|
||||
@@ -1156,10 +1171,11 @@ completed, the steps to make the major release are:
|
||||
``releases/vX.Y``. That is, you should create a ``releases/vX.Y``
|
||||
branch if you are preparing the ``X.Y.0`` release.
|
||||
|
||||
#. Bump the version in ``lib/spack/spack/__init__.py``.
|
||||
#. Remove the ``dev0`` development release segment from the version tuple in
|
||||
``lib/spack/spack/__init__.py``.
|
||||
|
||||
See `this example from 0.13.0
|
||||
<https://github.com/spack/spack/commit/8eeb64096c98b8a43d1c587f13ece743c864fba9>`_
|
||||
The version number itself should already be correct and should not be
|
||||
modified.
|
||||
|
||||
#. Update ``CHANGELOG.md`` with major highlights in bullet form.
|
||||
|
||||
@@ -1177,9 +1193,20 @@ completed, the steps to make the major release are:
|
||||
If CI is not passing, submit pull requests to ``develop`` as normal
|
||||
and keep rebasing the release branch on ``develop`` until CI passes.
|
||||
|
||||
#. Make sure the entire documentation is up to date. If documentation
|
||||
is outdated submit pull requests to ``develop`` as normal
|
||||
and keep rebasing the release branch on ``develop``.
|
||||
|
||||
#. Bump the major version in the ``develop`` branch.
|
||||
|
||||
Create a pull request targeting the ``develop`` branch, bumping the major
|
||||
version in ``lib/spack/spack/__init__.py`` with a ``dev0`` release segment.
|
||||
For instance when you have just released ``v0.15.0``, set the version
|
||||
to ``(0, 16, 0, 'dev0')`` on ``develop``.
|
||||
|
||||
#. Follow the steps in :ref:`publishing-releases`.
|
||||
|
||||
#. Follow the steps in :ref:`merging-releases`.
|
||||
#. Follow the steps in :ref:`updating-latest-release`.
|
||||
|
||||
#. Follow the steps in :ref:`announcing-releases`.
|
||||
|
||||
@@ -1255,9 +1282,6 @@ completed, the steps to make the point release are:
|
||||
|
||||
#. Bump the version in ``lib/spack/spack/__init__.py``.
|
||||
|
||||
See `this example from 0.14.1
|
||||
<https://github.com/spack/spack/commit/ff0abb9838121522321df2a054d18e54b566b44a>`_.
|
||||
|
||||
#. Update ``CHANGELOG.md`` with a list of the changes.
|
||||
|
||||
This is typically a summary of the commits you cherry-picked onto the
|
||||
@@ -1279,7 +1303,7 @@ completed, the steps to make the point release are:
|
||||
|
||||
#. Follow the steps in :ref:`publishing-releases`.
|
||||
|
||||
#. Follow the steps in :ref:`merging-releases`.
|
||||
#. Follow the steps in :ref:`updating-latest-release`.
|
||||
|
||||
#. Follow the steps in :ref:`announcing-releases`.
|
||||
|
||||
@@ -1340,11 +1364,11 @@ Publishing a release on GitHub
|
||||
selectable in the versions menu.
|
||||
|
||||
|
||||
.. _merging-releases:
|
||||
.. _updating-latest-release:
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updating `releases/latest` and `develop`
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Updating `releases/latest`
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
If the new release is the **highest** Spack release yet, you should
|
||||
also tag it as ``releases/latest``. For example, suppose the highest
|
||||
@@ -1368,40 +1392,6 @@ To tag ``releases/latest``, do this:
|
||||
The ``--force`` argument to ``git tag`` makes ``git`` overwrite the existing
|
||||
``releases/latest`` tag with the new one.
|
||||
|
||||
We also merge each release that we tag as ``releases/latest`` into ``develop``.
|
||||
Make sure to do this with a merge commit:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git checkout develop
|
||||
$ git merge --no-ff -s ours vX.Y.Z # vX.Y.Z is the new release's tag
|
||||
$ git push
|
||||
|
||||
We merge back to ``develop`` because it:
|
||||
|
||||
* updates the version and ``CHANGELOG.md`` on ``develop``; and
|
||||
* ensures that your release tag is reachable from the head of
|
||||
``develop``.
|
||||
|
||||
We *must* use a real merge commit (via the ``--no-ff`` option) to
|
||||
ensure that the release tag is reachable from the tip of ``develop``.
|
||||
This is necessary for ``spack -V`` to work properly -- it uses ``git
|
||||
describe --tags`` to find the last reachable tag in the repository and
|
||||
reports how far we are from it. For example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack -V
|
||||
0.14.2-1486-b80d5e74e5
|
||||
|
||||
This says that we are at commit ``b80d5e74e5``, which is 1,486 commits
|
||||
ahead of the ``0.14.2`` release.
|
||||
|
||||
We put this step last in the process because it's best to do it only once
|
||||
the release is complete and tagged. If you do it before you've tagged the
|
||||
release and later decide you want to tag some later commit, you'll need
|
||||
to merge again.
|
||||
|
||||
|
||||
.. _announcing-releases:
|
||||
|
||||
|
@@ -1,13 +1,13 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
||||
.. _environments:
|
||||
|
||||
============
|
||||
Environments
|
||||
============
|
||||
=========================
|
||||
Environments (spack.yaml)
|
||||
=========================
|
||||
|
||||
An environment is used to group together a set of specs for the
|
||||
purpose of building, rebuilding and deploying in a coherent fashion.
|
||||
@@ -384,18 +384,11 @@ Sourcing that file in Bash will make the environment available to the
|
||||
user; and can be included in ``.bashrc`` files, etc. The ``loads``
|
||||
file may also be copied out of the environment, renamed, etc.
|
||||
|
||||
----------
|
||||
spack.yaml
|
||||
----------
|
||||
|
||||
Spack environments can be customized at finer granularity by editing
|
||||
the ``spack.yaml`` manifest file directly.
|
||||
|
||||
.. _environment-configuration:
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
------------------------
|
||||
Configuring Environments
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
------------------------
|
||||
|
||||
A variety of Spack behaviors are changed through Spack configuration
|
||||
files, covered in more detail in the :ref:`configuration`
|
||||
@@ -417,9 +410,9 @@ environment can be specified by ``env:NAME`` (to affect environment
|
||||
``foo``, set ``--scope env:foo``). These commands will automatically
|
||||
manipulate configuration inline in the ``spack.yaml`` file.
|
||||
|
||||
"""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
Inline configurations
|
||||
"""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Inline Environment-scope configuration is done using the same yaml
|
||||
format as standard Spack configuration scopes, covered in the
|
||||
@@ -440,9 +433,9 @@ a ``packages.yaml`` file) could contain:
|
||||
This configuration sets the default compiler for all packages to
|
||||
``intel``.
|
||||
|
||||
"""""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Included configurations
|
||||
"""""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Spack environments allow an ``include`` heading in their yaml
|
||||
schema. This heading pulls in external configuration files and applies
|
||||
@@ -462,9 +455,9 @@ to make small changes to an individual Environment. Included configs
|
||||
listed earlier will have higher precedence, as the included configs are
|
||||
applied in reverse order.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
-------------------------------
|
||||
Manually Editing the Specs List
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
-------------------------------
|
||||
|
||||
The list of abstract/root specs in the Environment is maintained in
|
||||
the ``spack.yaml`` manifest under the heading ``specs``.
|
||||
@@ -482,9 +475,9 @@ Appending to this list in the yaml is identical to using the ``spack
|
||||
add`` command from the command line. However, there is more power
|
||||
available from the yaml file.
|
||||
|
||||
"""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
Spec concretization
|
||||
"""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Specs can be concretized separately or together, as already
|
||||
explained in :ref:`environments_concretization`. The behavior active
|
||||
@@ -510,9 +503,9 @@ which can currently take either one of the two allowed values ``together`` or ``
|
||||
the environment remains consistent. When instead the specs are concretized
|
||||
separately only the new specs will be re-concretized after any addition.
|
||||
|
||||
"""""""""""""
|
||||
^^^^^^^^^^^^^
|
||||
Spec Matrices
|
||||
"""""""""""""
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
Entries in the ``specs`` list can be individual abstract specs or a
|
||||
spec matrix.
|
||||
@@ -572,9 +565,9 @@ This allows one to create toolchains out of combinations of
|
||||
constraints and apply them somewhat indiscriminately to packages,
|
||||
without regard for the applicability of the constraint.
|
||||
|
||||
""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
Spec List References
|
||||
""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The last type of possible entry in the specs list is a reference.
|
||||
|
||||
@@ -674,9 +667,9 @@ The valid variables for a ``when`` clause are:
|
||||
#. ``hostname``. The hostname of the system (if ``hostname`` is an
|
||||
executable in the user's PATH).
|
||||
|
||||
""""""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
SpecLists as Constraints
|
||||
""""""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Dependencies and compilers in Spack can be both packages in an
|
||||
environment and constraints on other packages. References to SpecLists
|
||||
@@ -708,41 +701,41 @@ For example, the following environment has three root packages:
|
||||
This allows for a much-needed reduction in redundancy between packages
|
||||
and constraints.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Environment-managed Views
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
----------------
|
||||
Filesystem Views
|
||||
----------------
|
||||
|
||||
Spack Environments can define filesystem views of their software,
|
||||
which are maintained as packages and can be installed and uninstalled from
|
||||
the Environment. Filesystem views provide an access point for packages
|
||||
from the filesystem for users who want to access those packages
|
||||
directly. For more information on filesystem views, see the section
|
||||
:ref:`filesystem-views`.
|
||||
|
||||
Spack Environment managed views are updated every time the environment
|
||||
is written out to the lock file ``spack.lock``, so the concrete
|
||||
environment and the view are always compatible.
|
||||
Spack Environments can define filesystem views, which provide a direct access point
|
||||
for software similar to the directory hierarchy that might exist under ``/usr/local``.
|
||||
Filesystem views are updated every time the environment is written out to the lock
|
||||
file ``spack.lock``, so the concrete environment and the view are always compatible.
|
||||
The files of the view's installed packages are brought into the view by symbolic or
|
||||
hard links, referencing the original Spack installation, or by copy.
|
||||
|
||||
.. _configuring_environment_views:
|
||||
|
||||
"""""""""""""""""""""""""""""
|
||||
Configuring environment views
|
||||
"""""""""""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Configuration in ``spack.yaml``
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The Spack Environment manifest file has a top-level keyword
|
||||
``view``. Each entry under that heading is a view descriptor, headed
|
||||
by a name. The view descriptor contains the root of the view, and
|
||||
``view``. Each entry under that heading is a **view descriptor**, headed
|
||||
by a name. Any number of views may be defined under the ``view`` heading.
|
||||
The view descriptor contains the root of the view, and
|
||||
optionally the projections for the view, ``select`` and
|
||||
``exclude`` lists for the view and link information via ``link`` and
|
||||
``link_type``. For example, in the following manifest
|
||||
``link_type``.
|
||||
|
||||
For example, in the following manifest
|
||||
file snippet we define a view named ``mpis``, rooted at
|
||||
``/path/to/view`` in which all projections use the package name,
|
||||
version, and compiler name to determine the path for a given
|
||||
package. This view selects all packages that depend on MPI, and
|
||||
excludes those built with the PGI compiler at version 18.5.
|
||||
All the dependencies of each root spec in the environment will be linked
|
||||
in the view due to the command ``link: all`` and the files in the view will
|
||||
be symlinks to the spack install directories.
|
||||
The root specs with their (transitive) link and run type dependencies
|
||||
will be put in the view due to the ``link: all`` option,
|
||||
and the files in the view will be symlinks to the spack install
|
||||
directories.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@@ -758,16 +751,26 @@ be symlinks to the spack install directories.
|
||||
link: all
|
||||
link_type: symlink
|
||||
|
||||
For more information on using view projections, see the section on
|
||||
:ref:`adding_projections_to_views`. The default for the ``select`` and
|
||||
The default for the ``select`` and
|
||||
``exclude`` values is to select everything and exclude nothing. The
|
||||
default projection is the default view projection (``{}``). The ``link``
|
||||
defaults to ``all`` but can also be ``roots`` when only the root specs
|
||||
in the environment are desired in the view. The ``link_type`` defaults
|
||||
to ``symlink`` but can also take the value of ``hardlink`` or ``copy``.
|
||||
attribute allows the following values:
|
||||
|
||||
#. ``link: all`` include root specs with their transitive run and link type
|
||||
dependencies (default);
|
||||
#. ``link: run`` include root specs with their transitive run type dependencies;
|
||||
#. ``link: roots`` include root specs without their dependencies.
|
||||
|
||||
The ``link_type`` defaults to ``symlink`` but can also take the value
|
||||
of ``hardlink`` or ``copy``.
|
||||
|
||||
.. tip::
|
||||
|
||||
The option ``link: run`` can be used to create small environment views for
|
||||
Python packages. Python will be able to import packages *inside* of the view even
|
||||
when the environment is not activated, and linked libraries will be located
|
||||
*outside* of the view thanks to rpaths.
|
||||
|
||||
Any number of views may be defined under the ``view`` heading in a
|
||||
Spack Environment.
|
||||
|
||||
There are two shorthands for environments with a single view. If the
|
||||
environment at ``/path/to/env`` has a single view, with a root at
|
||||
@@ -833,9 +836,47 @@ regenerate`` will regenerate the views for the environment. This will
|
||||
apply any updates in the environment configuration that have not yet
|
||||
been applied.
|
||||
|
||||
""""""""""""""""""""""""""""
|
||||
.. _view_projections:
|
||||
|
||||
""""""""""""""""
|
||||
View Projections
|
||||
""""""""""""""""
|
||||
The default projection into a view is to link every package into the
|
||||
root of the view. The projections attribute is a mapping of partial specs to
|
||||
spec format strings, defined by the :meth:`~spack.spec.Spec.format`
|
||||
function, as shown in the example below:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
projections:
|
||||
zlib: {name}-{version}
|
||||
^mpi: {name}-{version}/{^mpi.name}-{^mpi.version}-{compiler.name}-{compiler.version}
|
||||
all: {name}-{version}/{compiler.name}-{compiler.version}
|
||||
|
||||
The entries in the projections configuration file must all be either
|
||||
specs or the keyword ``all``. For each spec, the projection used will
|
||||
be the first non-``all`` entry that the spec satisfies, or ``all`` if
|
||||
there is an entry for ``all`` and no other entry is satisfied by the
|
||||
spec. Where the keyword ``all`` appears in the file does not
|
||||
matter.
|
||||
|
||||
Given the example above, the spec ``zlib@1.2.8``
|
||||
will be linked into ``/my/view/zlib-1.2.8/``, the spec
|
||||
``hdf5@1.8.10+mpi %gcc@4.9.3 ^mvapich2@2.2`` will be linked into
|
||||
``/my/view/hdf5-1.8.10/mvapich2-2.2-gcc-4.9.3``, and the spec
|
||||
``hdf5@1.8.10~mpi %gcc@4.9.3`` will be linked into
|
||||
``/my/view/hdf5-1.8.10/gcc-4.9.3``.
|
||||
|
||||
If the keyword ``all`` does not appear in the projections
|
||||
configuration file, any spec that does not satisfy any entry in the
|
||||
file will be linked into the root of the view as in a single-prefix
|
||||
view. Any entries that appear below the keyword ``all`` in the
|
||||
projections configuration file will not be used, as all specs will use
|
||||
the projection under ``all`` before reaching those entries.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Activating environment views
|
||||
""""""""""""""""""""""""""""
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The ``spack env activate`` command will put the default view for the
|
||||
environment into the user's path, in addition to activating the
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -38,8 +38,7 @@ obtained by cloning the corresponding git repository:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pwd
|
||||
/home/user
|
||||
$ cd ~/
|
||||
$ mkdir tmp && cd tmp
|
||||
$ git clone https://github.com/alalazo/spack-scripting.git
|
||||
Cloning into 'spack-scripting'...
|
||||
@@ -62,7 +61,7 @@ paths to ``config.yaml``. In the case of our example this means ensuring that:
|
||||
|
||||
config:
|
||||
extensions:
|
||||
- /home/user/tmp/spack-scripting
|
||||
- ~/tmp/spack-scripting
|
||||
|
||||
is part of your configuration file. Once this is setup any command that the extension provides
|
||||
will be available from the command line:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -149,27 +149,28 @@ Spack fall back to bootstrapping from sources:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack bootstrap untrust github-actions
|
||||
==> "github-actions" is now untrusted and will not be used for bootstrapping
|
||||
$ spack bootstrap untrust github-actions-v0.2
|
||||
==> "github-actions-v0.2" is now untrusted and will not be used for bootstrapping
|
||||
|
||||
You can verify that the new settings are effective with:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack bootstrap list
|
||||
Name: github-actions UNTRUSTED
|
||||
Name: github-actions-v0.2 UNTRUSTED
|
||||
|
||||
Type: buildcache
|
||||
|
||||
Info:
|
||||
url: https://mirror.spack.io/bootstrap/github-actions/v0.1
|
||||
homepage: https://github.com/alalazo/spack-bootstrap-mirrors
|
||||
releases: https://github.com/alalazo/spack-bootstrap-mirrors/releases
|
||||
url: https://mirror.spack.io/bootstrap/github-actions/v0.2
|
||||
homepage: https://github.com/spack/spack-bootstrap-mirrors
|
||||
releases: https://github.com/spack/spack-bootstrap-mirrors/releases
|
||||
|
||||
Description:
|
||||
Buildcache generated from a public workflow using Github Actions.
|
||||
The sha256 checksum of binaries is checked before installation.
|
||||
|
||||
[ ... ]
|
||||
|
||||
Name: spack-install TRUSTED
|
||||
|
||||
@@ -271,9 +272,10 @@ Compiler configuration
|
||||
----------------------
|
||||
|
||||
Spack has the ability to build packages with multiple compilers and
|
||||
compiler versions. Spack searches for compilers on your machine
|
||||
automatically the first time it is run. It does this by inspecting
|
||||
your ``PATH``.
|
||||
compiler versions. Compilers can be made available to Spack by
|
||||
specifying them manually in ``compilers.yaml``, or automatically by
|
||||
running ``spack compiler find``, but for convenience Spack will
|
||||
automatically detect compilers the first time it needs them.
|
||||
|
||||
.. _cmd-spack-compilers:
|
||||
|
||||
@@ -281,7 +283,7 @@ your ``PATH``.
|
||||
``spack compilers``
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
You can see which compilers spack has found by running ``spack
|
||||
You can see which compilers are available to Spack by running ``spack
|
||||
compilers`` or ``spack compiler list``:
|
||||
|
||||
.. code-block:: console
|
||||
@@ -320,9 +322,10 @@ An alias for ``spack compiler find``.
|
||||
``spack compiler find``
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
If you do not see a compiler in this list, but you want to use it with
|
||||
Spack, you can simply run ``spack compiler find`` with the path to
|
||||
where the compiler is installed. For example:
|
||||
Lists the compilers currently available to Spack. If you do not see
|
||||
a compiler in this list, but you want to use it with Spack, you can
|
||||
simply run ``spack compiler find`` with the path to where the
|
||||
compiler is installed. For example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@@ -1514,3 +1517,238 @@ To ensure that Spack does not autodetect the Cray programming
|
||||
environment, unset the environment variable ``MODULEPATH``. This
|
||||
will cause Spack to treat a linux container on a Cray system as a base
|
||||
linux distro.
|
||||
|
||||
.. _windows_support:
|
||||
|
||||
----------------
|
||||
Spack On Windows
|
||||
----------------
|
||||
|
||||
Windows support for Spack is currently under development. While this work is still in an early stage,
|
||||
it is currently possible to set up Spack and perform a few operations on Windows. This section will guide
|
||||
you through the steps needed to install Spack and start running it on a fresh Windows machine.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Step 1: Install prerequisites
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
To use Spack on Windows, you will need the following packages:
|
||||
|
||||
Required:
|
||||
* Microsoft Visual Studio
|
||||
* Python
|
||||
* Git
|
||||
|
||||
Optional:
|
||||
* Intel Fortran (needed for some packages)
|
||||
|
||||
.. note::
|
||||
|
||||
Currently MSVC is the only compiler tested for C/C++ projects. Intel OneAPI provides Fortran support.
|
||||
|
||||
"""""""""""""""""""""""
|
||||
Microsoft Visual Studio
|
||||
"""""""""""""""""""""""
|
||||
|
||||
Microsoft Visual Studio provides the only Windows C/C++ compiler that is currently supported by Spack.
|
||||
|
||||
We require several specific components to be included in the Visual Studio installation.
|
||||
One is the C/C++ toolset, which can be selected as "Desktop development with C++" or "C++ build tools,"
|
||||
depending on installation type (Professional, Build Tools, etc.) The other required component is
|
||||
"C++ CMake tools for Windows," which can be selected from among the optional packages.
|
||||
This provides CMake and Ninja for use during Spack configuration.
|
||||
|
||||
If you already have Visual Studio installed, you can make sure these components are installed by
|
||||
rerunning the installer. Next to your installation, select "Modify" and look at the
|
||||
"Installation details" pane on the right.
|
||||
|
||||
"""""""""""""
|
||||
Intel Fortran
|
||||
"""""""""""""
|
||||
|
||||
For Fortran-based packages on Windows, we strongly recommend Intel's oneAPI Fortran compilers.
|
||||
The suite is free to download from Intel's website, located at
|
||||
https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/fortran-compiler.html#gs.70t5tw.
|
||||
The executable of choice for Spack will be Intel's Beta Compiler, ifx, which supports the classic
|
||||
compiler's (ifort's) frontend and runtime libraries by using LLVM.
|
||||
|
||||
""""""
|
||||
Python
|
||||
""""""
|
||||
|
||||
As Spack is a Python-based package, an installation of Python will be needed to run it.
|
||||
Python 3 can be downloaded and installed from the Windows Store, and will be automatically added
|
||||
to your ``PATH`` in this case.
|
||||
|
||||
.. note::
|
||||
Spack currently supports Python versions later than 3.2 inclusive.
|
||||
|
||||
"""
|
||||
Git
|
||||
"""
|
||||
|
||||
A bash console and GUI can be downloaded from https://git-scm.com/downloads.
|
||||
If you are unfamiliar with Git, there are a myriad of resources online to help
|
||||
guide you through checking out repositories and switching development branches.
|
||||
|
||||
When given the option of adjusting your ``PATH``, choose the ``Git from the
|
||||
command line and also from 3rd-party software`` option. This will automatically
|
||||
update your ``PATH`` variable to include the ``git`` command.
|
||||
|
||||
Spack support on Windows is currently dependent on installing the Git for Windows project
|
||||
as the project providing Git support on Windows. This is additionally the recommended method
|
||||
for installing Git on Windows, a link to which can be found above. Spack requires the
|
||||
utilities vendored by this project.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Step 2: Install and setup Spack
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
We are now ready to get the Spack environment set up on our machine. We
|
||||
begin by using Git to clone the Spack repo, hosted at https://github.com/spack/spack.git
|
||||
into a desired directory, for our purposes today, called ``spack_install``.
|
||||
|
||||
In order to install Spack with Windows support, run the following one liner
|
||||
in a Windows CMD prompt.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
git clone https://github.com/spack/spack.git
|
||||
|
||||
.. note::
|
||||
If you chose to install Spack into a directory on Windows that is set up to require Administrative
|
||||
Privleges, Spack will require elevated privleges to run.
|
||||
Administrative Privleges can be denoted either by default such as
|
||||
``C:\Program Files``, or aministrator applied administrative restrictions
|
||||
on a directory that spack installs files to such as ``C:\Users``
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Step 3: Run and configure Spack
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
To use Spack, run ``bin\spack_cmd.bat`` (you may need to Run as Administrator) from the top-level spack
|
||||
directory. This will provide a Windows command prompt with an environment properly set up with Spack
|
||||
and its prerequisites. If you receive a warning message that Python is not in your ``PATH``
|
||||
(which may happen if you installed Python from the website and not the Windows Store) add the location
|
||||
of the Python executable to your ``PATH`` now. You can permanently add Python to your ``PATH`` variable
|
||||
by using the ``Edit the system environment variables`` utility in Windows Control Panel.
|
||||
|
||||
.. note::
|
||||
Alternatively, Powershell can be used in place of CMD
|
||||
|
||||
To configure Spack, first run the following command inside the Spack console:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
spack compiler find
|
||||
|
||||
This creates a ``.staging`` directory in our Spack prefix, along with a ``windows`` subdirectory
|
||||
containing a ``compilers.yaml`` file. On a fresh Windows install with the above packages
|
||||
installed, this command should only detect Microsoft Visual Studio and the Intel Fortran
|
||||
compiler will be integrated within the first version of MSVC present in the ``compilers.yaml``
|
||||
output.
|
||||
|
||||
Spack provides a default ``config.yaml`` file for Windows that it will use unless overridden.
|
||||
This file is located at ``etc\spack\defaults\windows\config.yaml``. You can read more on how to
|
||||
do this and write your own configuration files in the :ref:`Configuration Files<configuration>` section of our
|
||||
documentation. If you do this, pay particular attention to the ``build_stage`` block of the file
|
||||
as this specifies the directory that will temporarily hold the source code for the packages to
|
||||
be installed. This path name must be sufficiently short for compliance with cmd, otherwise you
|
||||
will see build errors during installation (particularly with CMake) tied to long path names.
|
||||
|
||||
To allow Spack use of external tools and dependencies already on your system, the
|
||||
external pieces of software must be described in the ``packages.yaml`` file.
|
||||
There are two methods to populate this file:
|
||||
|
||||
The first and easiest choice is to use Spack to find installation on your system. In
|
||||
the Spack terminal, run the following commands:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
spack external find cmake
|
||||
spack external find ninja
|
||||
|
||||
The ``spack external find <name>`` will find executables on your system
|
||||
with the same name given. The command will store the items found in
|
||||
``packages.yaml`` in the ``.staging\`` directory.
|
||||
|
||||
Assuming that the command found CMake and Ninja executables in the previous
|
||||
step, continue to Step 4. If no executables were found, we may need to manually direct spack towards the CMake
|
||||
and Ninja installations we set up with Visual Studio. Therefore, your ``packages.yaml`` file will look something
|
||||
like this, with possibly slight variants in the paths to CMake and Ninja:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
packages:
|
||||
cmake:
|
||||
externals:
|
||||
- spec: cmake@3.19
|
||||
prefix: 'c:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake'
|
||||
buildable: False
|
||||
ninja:
|
||||
externals:
|
||||
- spec: ninja@1.8.2
|
||||
prefix: 'c:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake\Ninja'
|
||||
buildable: False
|
||||
|
||||
You can also use an separate installation of CMake if you have one and prefer
|
||||
to use it. If you don't have a path to Ninja analogous to the above, then you can
|
||||
obtain it by running the Visual Studio Installer and following the instructions
|
||||
at the start of this section. Also note that .yaml files use spaces for indentation
|
||||
and not tabs, so ensure that this is the case when editing one directly.
|
||||
|
||||
|
||||
.. note:: Cygwin
|
||||
The use of Cygwin is not officially supported by Spack and is not tested.
|
||||
However Spack will not throw an error, so use if choosing to use Spack
|
||||
with Cygwin, know that no functionality is garunteed.
|
||||
|
||||
^^^^^^^^^^^^^^^^^
|
||||
Step 4: Use Spack
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
Once the configuration is complete, it is time to give the installation a test. Install a basic package though the
|
||||
Spack console via:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
spack install cpuinfo
|
||||
|
||||
If in the previous step, you did not have CMake or Ninja installed, running the command above should boostrap both packages
|
||||
|
||||
"""""""""""""""""""""""""""
|
||||
Windows Compatible Packages
|
||||
"""""""""""""""""""""""""""
|
||||
|
||||
Many Spack packages are not currently compatible with Windows, due to Unix
|
||||
dependencies or incompatible build tools like autoconf. Here are several
|
||||
packages known to work on Windows:
|
||||
|
||||
* abseil-cpp
|
||||
* clingo
|
||||
* cpuinfo
|
||||
* cmake
|
||||
* glm
|
||||
* nasm
|
||||
* netlib-lapack (requires Intel Fortran)
|
||||
* ninja
|
||||
* openssl
|
||||
* perl
|
||||
* python
|
||||
* ruby
|
||||
* wrf
|
||||
* zlib
|
||||
|
||||
.. note::
|
||||
This is by no means a comprehensive list
|
||||
|
||||
^^^^^^^^^^^^^^
|
||||
For developers
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
The intent is to provide a Windows installer that will automatically set up
|
||||
Python, Git, and Spack, instead of requiring the user to do so manually.
|
||||
Instructions for creating the installer are at
|
||||
https://github.com/spack/spack/blob/develop/lib/spack/spack/cmd/installer/README.md
|
||||
|
||||
Alternatively a pre-built copy of the Windows installer is available as an artifact of Spack's Windows CI
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -54,9 +54,8 @@ or refer to the full manual below.
|
||||
features
|
||||
getting_started
|
||||
basic_usage
|
||||
workflows
|
||||
Tutorial: Spack 101 <https://spack-tutorial.readthedocs.io>
|
||||
known_issues
|
||||
replace_conda_homebrew
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
@@ -1,77 +0,0 @@
|
||||
.. Copyright 2013-2021 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)
|
||||
|
||||
============
|
||||
Known Issues
|
||||
============
|
||||
|
||||
This is a list of known bugs in Spack. It provides ways of getting around these
|
||||
problems if you encounter them.
|
||||
|
||||
---------------------------------------------------
|
||||
Variants are not properly forwarded to dependencies
|
||||
---------------------------------------------------
|
||||
|
||||
**Status:** Expected to be fixed by Spack's new concretizer
|
||||
|
||||
Sometimes, a variant of a package can also affect how its dependencies are
|
||||
built. For example, in order to build MPI support for a package, it may
|
||||
require that its dependencies are also built with MPI support. In the
|
||||
``package.py``, this looks like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('hdf5~mpi', when='~mpi')
|
||||
depends_on('hdf5+mpi', when='+mpi')
|
||||
|
||||
Spack handles this situation properly for *immediate* dependencies, and
|
||||
builds ``hdf5`` with the same variant you used for the package that
|
||||
depends on it. However, for *indirect* dependencies (dependencies of
|
||||
dependencies), Spack does not backtrack up the DAG far enough to handle
|
||||
this. Users commonly run into this situation when trying to build R with
|
||||
X11 support:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack install r+X
|
||||
...
|
||||
==> Error: Invalid spec: 'cairo@1.14.8%gcc@6.2.1+X arch=linux-fedora25-x86_64 ^bzip2@1.0.6%gcc@6.2.1+shared arch=linux-fedora25-x86_64 ^font-util@1.3.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^fontconfig@2.12.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^freetype@2.7.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^gettext@0.19.8.1%gcc@6.2.1+bzip2+curses+git~libunistring+libxml2+tar+xz arch=linux-fedora25-x86_64 ^glib@2.53.1%gcc@6.2.1~libmount arch=linux-fedora25-x86_64 ^inputproto@2.3.2%gcc@6.2.1 arch=linux-fedora25-x86_64 ^kbproto@1.0.7%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libffi@3.2.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libpng@1.6.29%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libpthread-stubs@0.4%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libx11@1.6.5%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxau@1.0.8%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxcb@1.12%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxdmcp@1.1.2%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxext@1.3.3%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxml2@2.9.4%gcc@6.2.1~python arch=linux-fedora25-x86_64 ^libxrender@0.9.10%gcc@6.2.1 arch=linux-fedora25-x86_64 ^ncurses@6.0%gcc@6.2.1~symlinks arch=linux-fedora25-x86_64 ^openssl@1.0.2k%gcc@6.2.1 arch=linux-fedora25-x86_64 ^pcre@8.40%gcc@6.2.1+utf arch=linux-fedora25-x86_64 ^pixman@0.34.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^pkg-config@0.29.2%gcc@6.2.1+internal_glib arch=linux-fedora25-x86_64 ^python@2.7.13%gcc@6.2.1+shared~tk~ucs4 arch=linux-fedora25-x86_64 ^readline@7.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^renderproto@0.11.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^sqlite@3.18.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^tar^util-macros@1.19.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xcb-proto@1.12%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xextproto@7.3.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xproto@7.0.31%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xtrans@1.3.5%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xz@5.2.3%gcc@6.2.1 arch=linux-fedora25-x86_64 ^zlib@1.2.11%gcc@6.2.1+pic+shared arch=linux-fedora25-x86_64'.
|
||||
Package cairo requires variant ~X, but spec asked for +X
|
||||
|
||||
A workaround is to explicitly activate the variants of dependencies as well:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack install r+X ^cairo+X ^pango+X
|
||||
|
||||
See https://github.com/spack/spack/issues/267 and
|
||||
https://github.com/spack/spack/issues/2546 for further details.
|
||||
|
||||
-----------------------------------------------
|
||||
depends_on cannot handle recursive dependencies
|
||||
-----------------------------------------------
|
||||
|
||||
**Status:** Not yet a work in progress
|
||||
|
||||
Although ``depends_on`` can handle any aspect of Spack's spec syntax,
|
||||
it currently cannot handle recursive dependencies. If the ``^`` sigil
|
||||
appears in a ``depends_on`` statement, the concretizer will hang.
|
||||
For example, something like:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('mfem+cuda ^hypre+cuda', when='+cuda')
|
||||
|
||||
|
||||
should be rewritten as:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
depends_on('mfem+cuda', when='+cuda')
|
||||
depends_on('hypre+cuda', when='+cuda')
|
||||
|
||||
|
||||
See https://github.com/spack/spack/issues/17660 and
|
||||
https://github.com/spack/spack/issues/11160 for more details.
|
@@ -1,13 +1,13 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
||||
.. _mirrors:
|
||||
|
||||
=======
|
||||
Mirrors
|
||||
=======
|
||||
======================
|
||||
Mirrors (mirrors.yaml)
|
||||
======================
|
||||
|
||||
Some sites may not have access to the internet for fetching packages.
|
||||
These sites will need a local repository of tarballs from which they
|
||||
|
@@ -1,13 +1,13 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
||||
.. _modules:
|
||||
|
||||
=======
|
||||
Modules
|
||||
=======
|
||||
======================
|
||||
Modules (modules.yaml)
|
||||
======================
|
||||
|
||||
The use of module systems to manage user environment in a controlled way
|
||||
is a common practice at HPC centers that is often embraced also by
|
||||
@@ -181,10 +181,7 @@ to the environment variables listed below the folder name.
|
||||
Spack modules can be configured for multiple module sets. The default
|
||||
module set is named ``default``. All Spack commands which operate on
|
||||
modules default to apply the ``default`` module set, but can be
|
||||
applied to any module set in the configuration. Settings applied at
|
||||
the root of the configuration (e.g. ``modules:enable`` rather than
|
||||
``modules:default:enable``) are applied to the default module set for
|
||||
backwards compatibility.
|
||||
applied to any module set in the configuration.
|
||||
|
||||
"""""""""""""""""""""""""
|
||||
Changing the modules root
|
||||
@@ -273,29 +270,30 @@ of the installed software. For instance, in the snippet below:
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
tcl:
|
||||
# The keyword `all` selects every package
|
||||
all:
|
||||
environment:
|
||||
set:
|
||||
BAR: 'bar'
|
||||
# This anonymous spec selects any package that
|
||||
# depends on openmpi. The double colon at the
|
||||
# end clears the set of rules that matched so far.
|
||||
^openmpi::
|
||||
environment:
|
||||
set:
|
||||
BAR: 'baz'
|
||||
# Selects any zlib package
|
||||
zlib:
|
||||
environment:
|
||||
prepend_path:
|
||||
LD_LIBRARY_PATH: 'foo'
|
||||
# Selects zlib compiled with gcc@4.8
|
||||
zlib%gcc@4.8:
|
||||
environment:
|
||||
unset:
|
||||
- FOOBAR
|
||||
default:
|
||||
tcl:
|
||||
# The keyword `all` selects every package
|
||||
all:
|
||||
environment:
|
||||
set:
|
||||
BAR: 'bar'
|
||||
# This anonymous spec selects any package that
|
||||
# depends on openmpi. The double colon at the
|
||||
# end clears the set of rules that matched so far.
|
||||
^openmpi::
|
||||
environment:
|
||||
set:
|
||||
BAR: 'baz'
|
||||
# Selects any zlib package
|
||||
zlib:
|
||||
environment:
|
||||
prepend_path:
|
||||
LD_LIBRARY_PATH: 'foo'
|
||||
# Selects zlib compiled with gcc@4.8
|
||||
zlib%gcc@4.8:
|
||||
environment:
|
||||
unset:
|
||||
- FOOBAR
|
||||
|
||||
you are instructing Spack to set the environment variable ``BAR=bar`` for every module,
|
||||
unless the associated spec satisfies ``^openmpi`` in which case ``BAR=baz``.
|
||||
@@ -322,9 +320,10 @@ your system. If you write a configuration file like:
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
tcl:
|
||||
whitelist: ['gcc', 'llvm'] # Whitelist will have precedence over blacklist
|
||||
blacklist: ['%gcc@4.4.7'] # Assuming gcc@4.4.7 is the system compiler
|
||||
default:
|
||||
tcl:
|
||||
whitelist: ['gcc', 'llvm'] # Whitelist will have precedence over blacklist
|
||||
blacklist: ['%gcc@4.4.7'] # Assuming gcc@4.4.7 is the system compiler
|
||||
|
||||
you will prevent the generation of module files for any package that
|
||||
is compiled with ``gcc@4.4.7``, with the only exception of any ``gcc``
|
||||
@@ -349,8 +348,9 @@ shows how to set hash length in the module file names:
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
tcl:
|
||||
hash_length: 7
|
||||
default:
|
||||
tcl:
|
||||
hash_length: 7
|
||||
|
||||
To help make module names more readable, and to help alleviate name conflicts
|
||||
with a short hash, one can use the ``suffixes`` option in the modules
|
||||
@@ -360,11 +360,12 @@ For instance, the following config options,
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
tcl:
|
||||
all:
|
||||
suffixes:
|
||||
^python@2.7.12: 'python-2.7.12'
|
||||
^openblas: 'openblas'
|
||||
default:
|
||||
tcl:
|
||||
all:
|
||||
suffixes:
|
||||
^python@2.7.12: 'python-2.7.12'
|
||||
^openblas: 'openblas'
|
||||
|
||||
will add a ``python-2.7.12`` version string to any packages compiled with
|
||||
python matching the spec, ``python@2.7.12``. This is useful to know which
|
||||
@@ -374,15 +375,16 @@ most likely via the ``+blas`` variant specification.
|
||||
|
||||
The most heavyweight solution to module naming is to change the entire
|
||||
naming convention for module files. This uses the projections format
|
||||
covered in :ref:`adding_projections_to_views`.
|
||||
covered in :ref:`view_projections`.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
tcl:
|
||||
projections:
|
||||
all: '{name}/{version}-{compiler.name}-{compiler.version}-module'
|
||||
^mpi: '{name}/{version}-{^mpi.name}-{^mpi.version}-{compiler.name}-{compiler.version}-module'
|
||||
default:
|
||||
tcl:
|
||||
projections:
|
||||
all: '{name}/{version}-{compiler.name}-{compiler.version}-module'
|
||||
^mpi: '{name}/{version}-{^mpi.name}-{^mpi.version}-{compiler.name}-{compiler.version}-module'
|
||||
|
||||
will create module files that are nested in directories by package
|
||||
name, contain the version and compiler name and version, and have the
|
||||
@@ -403,15 +405,16 @@ that are already in the LMod hierarchy.
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
enable:
|
||||
- tcl
|
||||
tcl:
|
||||
projections:
|
||||
all: '{name}/{version}-{compiler.name}-{compiler.version}'
|
||||
all:
|
||||
conflict:
|
||||
- '{name}'
|
||||
- 'intel/14.0.1'
|
||||
default:
|
||||
enable:
|
||||
- tcl
|
||||
tcl:
|
||||
projections:
|
||||
all: '{name}/{version}-{compiler.name}-{compiler.version}'
|
||||
all:
|
||||
conflict:
|
||||
- '{name}'
|
||||
- 'intel/14.0.1'
|
||||
|
||||
will create module files that will conflict with ``intel/14.0.1`` and with the
|
||||
base directory of the same module, effectively preventing the possibility to
|
||||
@@ -431,16 +434,17 @@ that are already in the LMod hierarchy.
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
enable:
|
||||
- lmod
|
||||
lmod:
|
||||
core_compilers:
|
||||
- 'gcc@4.8'
|
||||
core_specs:
|
||||
- 'python'
|
||||
hierarchy:
|
||||
- 'mpi'
|
||||
- 'lapack'
|
||||
default:
|
||||
enable:
|
||||
- lmod
|
||||
lmod:
|
||||
core_compilers:
|
||||
- 'gcc@4.8'
|
||||
core_specs:
|
||||
- 'python'
|
||||
hierarchy:
|
||||
- 'mpi'
|
||||
- 'lapack'
|
||||
|
||||
that will generate a hierarchy in which the ``lapack`` and ``mpi`` layer can be switched
|
||||
independently. This allows a site to build the same libraries or applications against different
|
||||
@@ -533,8 +537,7 @@ configuration:
|
||||
|
||||
#. The configuration is for an :ref:`environment <environments>` and
|
||||
will never be applied outside the environment,
|
||||
#. The environment in question is configured to use a :ref:`view
|
||||
<filesystem-views>`,
|
||||
#. The environment in question is configured to use a view,
|
||||
#. The :ref:`environment view is configured
|
||||
<configuring_environment_views>` with a projection that ensures
|
||||
every package is linked to a unique directory,
|
||||
@@ -591,11 +594,12 @@ do so by using the environment blacklist:
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
tcl:
|
||||
all:
|
||||
filter:
|
||||
# Exclude changes to any of these variables
|
||||
environment_blacklist: ['CPATH', 'LIBRARY_PATH']
|
||||
default:
|
||||
tcl:
|
||||
all:
|
||||
filter:
|
||||
# Exclude changes to any of these variables
|
||||
environment_blacklist: ['CPATH', 'LIBRARY_PATH']
|
||||
|
||||
The configuration above will generate module files that will not contain
|
||||
modifications to either ``CPATH`` or ``LIBRARY_PATH``.
|
||||
@@ -607,42 +611,39 @@ modifications to either ``CPATH`` or ``LIBRARY_PATH``.
|
||||
Autoload dependencies
|
||||
"""""""""""""""""""""
|
||||
|
||||
In some cases it can be useful to have module files that automatically load
|
||||
their dependencies. This may be the case for Python extensions, if not
|
||||
activated using ``spack activate``:
|
||||
Often it is required for a module to have its (transient) dependencies loaded as well.
|
||||
One example where this is useful is when one package needs to use executables provided
|
||||
by its dependency; when the dependency is autoloaded, the executable will be in the
|
||||
PATH. Similarly for scripting languages such as Python, packages and their dependencies
|
||||
have to be loaded together.
|
||||
|
||||
Autoloading is enabled by default for LMod, as it has great builtin support for through
|
||||
the ``depends_on`` function. For Environment Modules it is disabled by default.
|
||||
|
||||
Autoloading can also be enabled conditionally:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
tcl:
|
||||
^python:
|
||||
autoload: 'direct'
|
||||
modules:
|
||||
default:
|
||||
tcl:
|
||||
all:
|
||||
autoload: none
|
||||
^python:
|
||||
autoload: direct
|
||||
|
||||
The configuration file above will produce module files that will
|
||||
load their direct dependencies if the package installed depends on ``python``.
|
||||
The allowed values for the ``autoload`` statement are either ``none``,
|
||||
``direct`` or ``all``. The default is ``none``.
|
||||
|
||||
.. tip::
|
||||
Building external software
|
||||
Setting ``autoload`` to ``direct`` for all packages can be useful
|
||||
when building software outside of a Spack installation that depends on
|
||||
artifacts in that installation. E.g. (adjust ``lmod`` vs ``tcl``
|
||||
as appropriate):
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
modules:
|
||||
lmod:
|
||||
all:
|
||||
autoload: 'direct'
|
||||
``direct`` or ``all``.
|
||||
|
||||
.. note::
|
||||
TCL prerequisites
|
||||
In the ``tcl`` section of the configuration file it is possible to use
|
||||
the ``prerequisites`` directive that accepts the same values as
|
||||
``autoload``. It will produce module files that have a ``prereq``
|
||||
statement instead of automatically loading other modules.
|
||||
statement, which can be used to autoload dependencies in some versions
|
||||
of Environment Modules.
|
||||
|
||||
------------------------
|
||||
Maintaining Module Files
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
@@ -705,7 +705,8 @@ as follows:
|
||||
|
||||
#. The following special strings are considered larger than any other
|
||||
numeric or non-numeric version component, and satisfy the following
|
||||
order between themselves: ``develop > main > master > head > trunk``.
|
||||
order between themselves:
|
||||
``develop > main > master > head > trunk > stable``.
|
||||
|
||||
#. Numbers are ordered numerically, are less than special strings, and
|
||||
larger than other non-numeric components.
|
||||
@@ -1422,6 +1423,37 @@ other similar operations:
|
||||
).with_default('auto').with_non_feature_values('auto'),
|
||||
)
|
||||
|
||||
"""""""""""""""""""""""""""
|
||||
Conditional Possible Values
|
||||
"""""""""""""""""""""""""""
|
||||
|
||||
There are cases where a variant may take multiple values, and the list of allowed values
|
||||
expand over time. Think for instance at the C++ standard with which we might compile
|
||||
Boost, which can take one of multiple possible values with the latest standards
|
||||
only available from a certain version on.
|
||||
|
||||
To model a similar situation we can use *conditional possible values* in the variant declaration:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant(
|
||||
'cxxstd', default='98',
|
||||
values=(
|
||||
'98', '11', '14',
|
||||
# C++17 is not supported by Boost < 1.63.0.
|
||||
conditional('17', when='@1.63.0:'),
|
||||
# C++20/2a is not support by Boost < 1.73.0
|
||||
conditional('2a', '2b', when='@1.73.0:')
|
||||
),
|
||||
multi=False,
|
||||
description='Use the specified C++ standard when building.',
|
||||
)
|
||||
|
||||
The snippet above allows ``98``, ``11`` and ``14`` as unconditional possible values for the
|
||||
``cxxstd`` variant, while ``17`` requires a version greater or equal to ``1.63.0``
|
||||
and both ``2a`` and ``2b`` require a version greater or equal to ``1.73.0``.
|
||||
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
Conditional Variants
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -1441,6 +1473,32 @@ The ``when`` clause follows the same syntax and accepts the same
|
||||
values as the ``when`` argument of
|
||||
:py:func:`spack.directives.depends_on`
|
||||
|
||||
^^^^^^^^^^^^^^^
|
||||
Sticky Variants
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The variant directive can be marked as ``sticky`` by setting to ``True`` the
|
||||
corresponding argument:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
variant('bar', default=False, sticky=True)
|
||||
|
||||
A ``sticky`` variant differs from a regular one in that it is always set
|
||||
to either:
|
||||
|
||||
#. An explicit value appearing in a spec literal or
|
||||
#. Its default value
|
||||
|
||||
The concretizer thus is not free to pick an alternate value to work
|
||||
around conflicts, but will error out instead.
|
||||
Setting this property on a variant is useful in cases where the
|
||||
variant allows some dangerous or controversial options (e.g. using unsupported versions
|
||||
of a compiler for a library) and the packager wants to ensure that
|
||||
allowing these options is done on purpose by the user, rather than
|
||||
automatically by the solver.
|
||||
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
Overriding Variants
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
@@ -2443,6 +2501,24 @@ Now, the ``py-numpy`` package can be used as an argument to ``spack
|
||||
activate``. When it is activated, all the files in its prefix will be
|
||||
symbolically linked into the prefix of the python package.
|
||||
|
||||
A package can only extend one other package at a time. To support packages
|
||||
that may extend one of a list of other packages, Spack supports multiple
|
||||
``extends`` directives as long as at most one of them is selected as
|
||||
a dependency during concretization. For example, a lua package could extend
|
||||
either lua or luajit, but not both:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class LuaLpeg(Package):
|
||||
...
|
||||
variant('use_lua', default=True)
|
||||
extends('lua', when='+use_lua')
|
||||
extends('lua-luajit', when='~use_lua')
|
||||
...
|
||||
|
||||
Now, a user can install, and activate, the ``lua-lpeg`` package for either
|
||||
lua or luajit.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Adding additional constraints
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -2498,7 +2574,7 @@ from being linked in at activation time.
|
||||
Views
|
||||
-----
|
||||
|
||||
As covered in :ref:`filesystem-views`, the ``spack view`` command can be
|
||||
The ``spack view`` command can be
|
||||
used to symlink a number of packages into a merged prefix. The methods of
|
||||
``PackageViewMixin`` can be overridden to customize how packages are added
|
||||
to views. Generally this can be used to create copies of specific files rather
|
||||
@@ -2832,7 +2908,7 @@ be concretized on their system. For example, one user may prefer packages
|
||||
built with OpenMPI and the Intel compiler. Another user may prefer
|
||||
packages be built with MVAPICH and GCC.
|
||||
|
||||
See the :ref:`concretization-preferences` section for more details.
|
||||
See the :ref:`package-preferences` section for more details.
|
||||
|
||||
|
||||
.. _group_when_spec:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
206
lib/spack/docs/replace_conda_homebrew.rst
Normal file
206
lib/spack/docs/replace_conda_homebrew.rst
Normal file
@@ -0,0 +1,206 @@
|
||||
.. Copyright 2013-2022 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)
|
||||
|
||||
=====================================
|
||||
Using Spack to Replace Homebrew/Conda
|
||||
=====================================
|
||||
|
||||
Spack is an incredibly powerful package manager, designed for supercomputers
|
||||
where users have diverse installation needs. But Spack can also be used to
|
||||
handle simple single-user installations on your laptop. Most macOS users are
|
||||
already familiar with package managers like Homebrew and Conda, where all
|
||||
installed packages are symlinked to a single central location like ``/usr/local``.
|
||||
In this section, we will show you how to emulate the behavior of Homebrew/Conda
|
||||
using :ref:`environments`!
|
||||
|
||||
-----
|
||||
Setup
|
||||
-----
|
||||
|
||||
First, let's create a new environment. We'll assume that Spack is already set up
|
||||
correctly, and that you've already sourced the setup script for your shell.
|
||||
To create a new environment, simply run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack env create myenv
|
||||
|
||||
Here, *myenv* can be anything you want to name your environment. Next, we can add
|
||||
a list of packages we would like to install into our environment. Let's say we
|
||||
want a newer version of Bash than the one that comes with macOS, and we want a
|
||||
few Python libraries. We can run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack -e myenv add bash@5 python py-numpy py-scipy py-matplotlib
|
||||
|
||||
Each package can be listed on a separate line, or combined into a single line like we did above.
|
||||
Notice that we're explicitly asking for Bash 5 here. You can use any spec
|
||||
you would normally use on the command line with other Spack commands.
|
||||
|
||||
Next, we want to manually configure a couple of things:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack -e myenv config edit
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# This is a Spack Environment file.
|
||||
#
|
||||
# It describes a set of packages to be installed, along with
|
||||
# configuration settings.
|
||||
spack:
|
||||
# add package specs to the `specs` list
|
||||
specs: [bash@5, python, py-numpy, py-scipy, py-matplotlib]
|
||||
view: true
|
||||
|
||||
You can see the packages we added earlier in the ``specs:`` section. If you
|
||||
ever want to add more packages, you can either use ``spack add`` or manually
|
||||
edit this file.
|
||||
|
||||
We also need to change the ``concretization:`` option. By default, Spack
|
||||
concretizes each spec *separately*, allowing multiple versions of the same
|
||||
package to coexist. Since we want a single consistent environment, we want to
|
||||
concretize all of the specs *together*.
|
||||
|
||||
Here is what your ``spack.yaml`` looks like with this new setting:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# This is a Spack Environment file.
|
||||
#
|
||||
# It describes a set of packages to be installed, along with
|
||||
# configuration settings.
|
||||
spack:
|
||||
# add package specs to the `specs` list
|
||||
specs: [bash@5, python, py-numpy, py-scipy, py-matplotlib]
|
||||
view: true
|
||||
concretization: together
|
||||
|
||||
^^^^^^^^^^^^^^^^
|
||||
Symlink location
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
Spack symlinks all installations to ``/Users/me/spack/var/spack/environments/myenv/.spack-env/view``,
|
||||
which is the default when ``view: true``.
|
||||
You can actually change this to any directory you want. For example, Homebrew
|
||||
uses ``/usr/local``, while Conda uses ``/Users/me/anaconda``. In order to access
|
||||
files in these locations, you need to update ``PATH`` and other environment variables
|
||||
to point to them. Activating the Spack environment does this automatically, but
|
||||
you can also manually set them in your ``.bashrc``.
|
||||
|
||||
.. warning::
|
||||
|
||||
There are several reasons why you shouldn't use ``/usr/local``:
|
||||
|
||||
1. If you are on macOS 10.11+ (El Capitan and newer), Apple makes it hard
|
||||
for you. You may notice permissions issues on ``/usr/local`` due to their
|
||||
`System Integrity Protection <https://support.apple.com/en-us/HT204899>`_.
|
||||
By default, users don't have permissions to install anything in ``/usr/local``,
|
||||
and you can't even change this using ``sudo chown`` or ``sudo chmod``.
|
||||
2. Other package managers like Homebrew will try to install things to the
|
||||
same directory. If you plan on using Homebrew in conjunction with Spack,
|
||||
don't symlink things to ``/usr/local``.
|
||||
3. If you are on a shared workstation, or don't have sudo privileges, you
|
||||
can't do this.
|
||||
|
||||
If you still want to do this anyway, there are several ways around SIP.
|
||||
You could disable SIP by booting into recovery mode and running
|
||||
``csrutil disable``, but this is not recommended, as it can open up your OS
|
||||
to security vulnerabilities. Another technique is to run ``spack concretize``
|
||||
and ``spack install`` using ``sudo``. This is also not recommended.
|
||||
|
||||
The safest way I've found is to create your installation directories using
|
||||
sudo, then change ownership back to the user like so:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
for directory in .spack bin contrib include lib man share
|
||||
do
|
||||
sudo mkdir -p /usr/local/$directory
|
||||
sudo chown $(id -un):$(id -gn) /usr/local/$directory
|
||||
done
|
||||
|
||||
Depending on the packages you install in your environment, the exact list of
|
||||
directories you need to create may vary. You may also find some packages
|
||||
like Java libraries that install a single file to the installation prefix
|
||||
instead of in a subdirectory. In this case, the action is the same, just replace
|
||||
``mkdir -p`` with ``touch`` in the for-loop above.
|
||||
|
||||
But again, it's safer just to use the default symlink location.
|
||||
|
||||
|
||||
------------
|
||||
Installation
|
||||
------------
|
||||
|
||||
To actually concretize the environment, run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack -e myenv concretize
|
||||
|
||||
This will tell you which if any packages are already installed, and alert you
|
||||
to any conflicting specs.
|
||||
|
||||
To actually install these packages and symlink them to your ``view:``
|
||||
directory, simply run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack -e myenv install
|
||||
$ spack env activate myenv
|
||||
|
||||
Now, when you type ``which python3``, it should find the one you just installed.
|
||||
|
||||
In order to change the default shell to our newer Bash installation, we first
|
||||
need to add it to this list of acceptable shells. Run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ sudo vim /etc/shells
|
||||
|
||||
and add the absolute path to your bash executable. Then run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ chsh -s /path/to/bash
|
||||
|
||||
Now, when you log out and log back in, ``echo $SHELL`` should point to the
|
||||
newer version of Bash.
|
||||
|
||||
---------------------------
|
||||
Updating Installed Packages
|
||||
---------------------------
|
||||
|
||||
Let's say you upgraded to a new version of macOS, or a new version of Python
|
||||
was released, and you want to rebuild your entire software stack. To do this,
|
||||
simply run the following commands:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack env activate myenv
|
||||
$ spack concretize --force
|
||||
$ spack install
|
||||
|
||||
The ``--force`` flag tells Spack to overwrite its previous concretization
|
||||
decisions, allowing you to choose a new version of Python. If any of the new
|
||||
packages like Bash are already installed, ``spack install`` won't re-install
|
||||
them, it will keep the symlinks in place.
|
||||
|
||||
--------------
|
||||
Uninstallation
|
||||
--------------
|
||||
|
||||
If you decide that Spack isn't right for you, uninstallation is simple.
|
||||
Just run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ spack env activate myenv
|
||||
$ spack uninstall --all
|
||||
|
||||
This will uninstall all packages in your environment and remove the symlinks.
|
@@ -1,13 +1,13 @@
|
||||
.. Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
.. Copyright 2013-2022 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)
|
||||
|
||||
.. _repositories:
|
||||
|
||||
=============================
|
||||
Package Repositories
|
||||
=============================
|
||||
=================================
|
||||
Package Repositories (repos.yaml)
|
||||
=================================
|
||||
|
||||
Spack comes with thousands of built-in package recipes in
|
||||
``var/spack/repos/builtin/``. This is a **package repository** -- a
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
# Copyright 2013-2022 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)
|
||||
|
@@ -1,5 +1,5 @@
|
||||
Name, Supported Versions, Notes, Requirement Reason
|
||||
Python, 2.6/2.7/3.5-3.9, , Interpreter for Spack
|
||||
Python, 2.7/3.5-3.10, , Interpreter for Spack
|
||||
C/C++ Compilers, , , Building software
|
||||
make, , , Build software
|
||||
patch, , , Build software
|
||||
|
|
File diff suppressed because it is too large
Load Diff
10
lib/spack/env/cc
vendored
10
lib/spack/env/cc
vendored
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# shellcheck disable=SC2034 # evals in this script fool shellcheck
|
||||
#
|
||||
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
# Copyright 2013-2022 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)
|
||||
@@ -241,28 +241,28 @@ case "$command" in
|
||||
mode=cpp
|
||||
debug_flags="-g"
|
||||
;;
|
||||
cc|c89|c99|gcc|clang|armclang|icc|icx|pgcc|nvc|xlc|xlc_r|fcc)
|
||||
cc|c89|c99|gcc|clang|armclang|icc|icx|pgcc|nvc|xlc|xlc_r|fcc|amdclang|cl.exe)
|
||||
command="$SPACK_CC"
|
||||
language="C"
|
||||
comp="CC"
|
||||
lang_flags=C
|
||||
debug_flags="-g"
|
||||
;;
|
||||
c++|CC|g++|clang++|armclang++|icpc|icpx|pgc++|nvc++|xlc++|xlc++_r|FCC)
|
||||
c++|CC|g++|clang++|armclang++|icpc|icpx|dpcpp|pgc++|nvc++|xlc++|xlc++_r|FCC|amdclang++)
|
||||
command="$SPACK_CXX"
|
||||
language="C++"
|
||||
comp="CXX"
|
||||
lang_flags=CXX
|
||||
debug_flags="-g"
|
||||
;;
|
||||
ftn|f90|fc|f95|gfortran|flang|armflang|ifort|ifx|pgfortran|nvfortran|xlf90|xlf90_r|nagfor|frt)
|
||||
ftn|f90|fc|f95|gfortran|flang|armflang|ifort|ifx|pgfortran|nvfortran|xlf90|xlf90_r|nagfor|frt|amdflang)
|
||||
command="$SPACK_FC"
|
||||
language="Fortran 90"
|
||||
comp="FC"
|
||||
lang_flags=F
|
||||
debug_flags="-g"
|
||||
;;
|
||||
f77|xlf|xlf_r|pgf77)
|
||||
f77|xlf|xlf_r|pgf77|amdflang)
|
||||
command="$SPACK_F77"
|
||||
language="Fortran 77"
|
||||
comp="F77"
|
||||
|
1
lib/spack/env/oneapi/dpcpp
vendored
Symbolic link
1
lib/spack/env/oneapi/dpcpp
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../cc
|
1
lib/spack/env/rocmcc/amdclang
vendored
Symbolic link
1
lib/spack/env/rocmcc/amdclang
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../cc
|
1
lib/spack/env/rocmcc/amdclang++
vendored
Symbolic link
1
lib/spack/env/rocmcc/amdclang++
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../cpp
|
1
lib/spack/env/rocmcc/amdflang
vendored
Symbolic link
1
lib/spack/env/rocmcc/amdflang
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../fc
|
100
lib/spack/external/__init__.py
vendored
100
lib/spack/external/__init__.py
vendored
@@ -1,4 +1,4 @@
|
||||
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||
# Copyright 2013-2022 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)
|
||||
@@ -6,6 +6,13 @@
|
||||
"""This module contains the following external, potentially separately
|
||||
licensed, packages that are included in Spack:
|
||||
|
||||
altgraph
|
||||
--------
|
||||
|
||||
* Homepage: https://altgraph.readthedocs.io/en/latest/index.html
|
||||
* Usage: dependency of macholib
|
||||
* Version: 0.17.2
|
||||
|
||||
archspec
|
||||
--------
|
||||
|
||||
@@ -17,13 +24,36 @@
|
||||
--------
|
||||
|
||||
* Homepage: https://pypi.python.org/pypi/argparse
|
||||
* Usage: We include our own version to be Python 2.6 compatible.
|
||||
* Usage: We include our own version to be Python 3.X compatible.
|
||||
* Version: 1.4.0
|
||||
* Note: This package has been slightly modified to improve
|
||||
error message formatting. See the following commit if the
|
||||
vendored copy ever needs to be updated again:
|
||||
https://github.com/spack/spack/pull/6786/commits/dfcef577b77249106ea4e4c69a6cd9e64fa6c418
|
||||
|
||||
astunparse
|
||||
----------------
|
||||
|
||||
* Homepage: https://github.com/simonpercivall/astunparse
|
||||
* Usage: Unparsing Python ASTs for package hashes in Spack
|
||||
* Version: 1.6.3 (plus modifications)
|
||||
* Note: This is in ``spack.util.unparse`` because it's very heavily
|
||||
modified, and we want to track coverage for it.
|
||||
Specifically, we have modified this library to generate consistent unparsed ASTs
|
||||
regardless of the Python version. It is based on:
|
||||
1. The original ``astunparse`` library;
|
||||
2. Modifications for consistency;
|
||||
3. Backports from the ``ast.unparse`` function in Python 3.9 and later
|
||||
The unparsing is now mostly consistent with upstream ``ast.unparse``, so if
|
||||
we ever require Python 3.9 or higher, we can drop this external package.
|
||||
|
||||
attrs
|
||||
----------------
|
||||
|
||||
* Homepage: https://github.com/python-attrs/attrs
|
||||
* Usage: Needed by jsonschema.
|
||||
* Version: 21.2.0 (83d3cd70f90a3f4d19ee8b508e58d1c58821c0ad)
|
||||
|
||||
ctest_log_parser
|
||||
----------------
|
||||
|
||||
@@ -37,49 +67,43 @@
|
||||
|
||||
* Homepage: https://pypi.python.org/pypi/distro
|
||||
* Usage: Provides a more stable linux distribution detection.
|
||||
* Version: 1.0.4 (last version supporting Python 2.6)
|
||||
* Version: 1.6.0 (64946a1e2a9ff529047070657728600e006c99ff)
|
||||
* Note: Last version supporting Python 2.7
|
||||
|
||||
functools
|
||||
---------
|
||||
|
||||
* Homepage: https://github.com/python/cpython/blob/2.7/Lib/functools.py
|
||||
* Usage: Used for implementation of total_ordering.
|
||||
* Version: Unversioned
|
||||
* Note: This is the functools.total_ordering implementation
|
||||
from Python 2.7 backported so we can run on Python 2.6.
|
||||
functools32
|
||||
-----------
|
||||
* Homepage: https://github.com/MiCHiLU/python-functools32
|
||||
* Usage: Needed by jsonschema when using Python 2.7.
|
||||
* Version: 3.2.3-2
|
||||
|
||||
jinja2
|
||||
------
|
||||
|
||||
* Homepage: https://pypi.python.org/pypi/Jinja2
|
||||
* Usage: A modern and designer-friendly templating language for Python.
|
||||
* Version: 2.10
|
||||
* Version: 2.11.3 (last version supporting Python 2.7)
|
||||
|
||||
jsonschema
|
||||
----------
|
||||
|
||||
* Homepage: https://pypi.python.org/pypi/jsonschema
|
||||
* Usage: An implementation of JSON Schema for Python.
|
||||
* Version: 2.4.0 (last version before functools32 dependency was added)
|
||||
* Note: functools32 doesn't support Python 2.6 or 3.0, so jsonschema
|
||||
cannot be upgraded any further until we drop 2.6.
|
||||
Also, jsonschema/validators.py has been modified NOT to try to import
|
||||
requests (see 7a1dd517b8).
|
||||
* Version: 3.2.0 (last version before 2.7 and 3.6 support was dropped)
|
||||
* Note: We don't include tests or benchmarks; just what Spack needs.
|
||||
|
||||
macholib
|
||||
--------
|
||||
|
||||
* Homepage: https://macholib.readthedocs.io/en/latest/index.html#
|
||||
* Usage: Manipulation of Mach-o binaries for relocating macOS buildcaches on Linux
|
||||
* Version: 1.15.2
|
||||
|
||||
markupsafe
|
||||
----------
|
||||
|
||||
* Homepage: https://pypi.python.org/pypi/MarkupSafe
|
||||
* Usage: Implements a XML/HTML/XHTML Markup safe string for Python.
|
||||
* Version: 1.0
|
||||
|
||||
orderddict
|
||||
----------
|
||||
|
||||
* Homepage: https://pypi.org/project/ordereddict/
|
||||
* Usage: A drop-in substitute for Py2.7's new collections.OrderedDict
|
||||
that works in Python 2.4-2.6.
|
||||
* Version: 1.1
|
||||
* Version: 1.1.1 (last version supporting Python 2.7)
|
||||
|
||||
py
|
||||
--
|
||||
@@ -91,6 +115,14 @@
|
||||
* Note: This packages has been modified:
|
||||
* https://github.com/pytest-dev/py/pull/186 was backported
|
||||
|
||||
pyrsistent
|
||||
----------
|
||||
|
||||
* Homepage: http://github.com/tobgu/pyrsistent/
|
||||
* Usage: Needed by `jsonschema`
|
||||
* Version: 0.16.1 (last version supporting Python 2.7)
|
||||
* Note: We only include the parts needed for `jsonschema`.
|
||||
|
||||
pytest
|
||||
------
|
||||
|
||||
@@ -120,20 +152,6 @@
|
||||
|
||||
* Homepage: https://pypi.python.org/pypi/six
|
||||
* Usage: Python 2 and 3 compatibility utilities.
|
||||
* Version: 1.11.0
|
||||
|
||||
macholib
|
||||
--------
|
||||
|
||||
* Homepage: https://macholib.readthedocs.io/en/latest/index.html#
|
||||
* Usage: Manipulation of Mach-o binaries for relocating macOS buildcaches on Linux
|
||||
* Version: 1.12
|
||||
|
||||
altgraph
|
||||
--------
|
||||
|
||||
* Homepage: https://altgraph.readthedocs.io/en/latest/index.html
|
||||
* Usage: dependency of macholib
|
||||
* Version: 0.16.1
|
||||
* Version: 1.16.0
|
||||
|
||||
"""
|
||||
|
100
lib/spack/external/altgraph/Dot.py
vendored
100
lib/spack/external/altgraph/Dot.py
vendored
@@ -1,4 +1,4 @@
|
||||
'''
|
||||
"""
|
||||
altgraph.Dot - Interface to the dot language
|
||||
============================================
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
- for more details on how to control the graph drawing process see the
|
||||
`graphviz reference
|
||||
<http://www.research.att.com/sw/tools/graphviz/refs.html>`_.
|
||||
'''
|
||||
"""
|
||||
import os
|
||||
import warnings
|
||||
|
||||
@@ -115,25 +115,34 @@
|
||||
|
||||
|
||||
class Dot(object):
|
||||
'''
|
||||
"""
|
||||
A class providing a **graphviz** (dot language) representation
|
||||
allowing a fine grained control over how the graph is being
|
||||
displayed.
|
||||
|
||||
If the :command:`dot` and :command:`dotty` programs are not in the current
|
||||
system path their location needs to be specified in the contructor.
|
||||
'''
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self, graph=None, nodes=None, edgefn=None, nodevisitor=None,
|
||||
edgevisitor=None, name="G", dot='dot', dotty='dotty',
|
||||
neato='neato', graphtype="digraph"):
|
||||
'''
|
||||
self,
|
||||
graph=None,
|
||||
nodes=None,
|
||||
edgefn=None,
|
||||
nodevisitor=None,
|
||||
edgevisitor=None,
|
||||
name="G",
|
||||
dot="dot",
|
||||
dotty="dotty",
|
||||
neato="neato",
|
||||
graphtype="digraph",
|
||||
):
|
||||
"""
|
||||
Initialization.
|
||||
'''
|
||||
"""
|
||||
self.name, self.attr = name, {}
|
||||
|
||||
assert graphtype in ['graph', 'digraph']
|
||||
assert graphtype in ["graph", "digraph"]
|
||||
self.type = graphtype
|
||||
|
||||
self.temp_dot = "tmp_dot.dot"
|
||||
@@ -148,8 +157,10 @@ def __init__(
|
||||
if graph is not None and nodes is None:
|
||||
nodes = graph
|
||||
if graph is not None and edgefn is None:
|
||||
|
||||
def edgefn(node, graph=graph):
|
||||
return graph.out_nbrs(node)
|
||||
|
||||
if nodes is None:
|
||||
nodes = ()
|
||||
|
||||
@@ -177,20 +188,19 @@ def edgefn(node, graph=graph):
|
||||
self.edge_style(head, tail, **edgestyle)
|
||||
|
||||
def style(self, **attr):
|
||||
'''
|
||||
"""
|
||||
Changes the overall style
|
||||
'''
|
||||
"""
|
||||
self.attr = attr
|
||||
|
||||
def display(self, mode='dot'):
|
||||
'''
|
||||
def display(self, mode="dot"):
|
||||
"""
|
||||
Displays the current graph via dotty
|
||||
'''
|
||||
"""
|
||||
|
||||
if mode == 'neato':
|
||||
if mode == "neato":
|
||||
self.save_dot(self.temp_neo)
|
||||
neato_cmd = "%s -o %s %s" % (
|
||||
self.neato, self.temp_dot, self.temp_neo)
|
||||
neato_cmd = "%s -o %s %s" % (self.neato, self.temp_dot, self.temp_neo)
|
||||
os.system(neato_cmd)
|
||||
else:
|
||||
self.save_dot(self.temp_dot)
|
||||
@@ -199,24 +209,24 @@ def display(self, mode='dot'):
|
||||
os.system(plot_cmd)
|
||||
|
||||
def node_style(self, node, **kwargs):
|
||||
'''
|
||||
"""
|
||||
Modifies a node style to the dot representation.
|
||||
'''
|
||||
"""
|
||||
if node not in self.edges:
|
||||
self.edges[node] = {}
|
||||
self.nodes[node] = kwargs
|
||||
|
||||
def all_node_style(self, **kwargs):
|
||||
'''
|
||||
"""
|
||||
Modifies all node styles
|
||||
'''
|
||||
"""
|
||||
for node in self.nodes:
|
||||
self.node_style(node, **kwargs)
|
||||
|
||||
def edge_style(self, head, tail, **kwargs):
|
||||
'''
|
||||
"""
|
||||
Modifies an edge style to the dot representation.
|
||||
'''
|
||||
"""
|
||||
if tail not in self.nodes:
|
||||
raise GraphError("invalid node %s" % (tail,))
|
||||
|
||||
@@ -229,10 +239,10 @@ def edge_style(self, head, tail, **kwargs):
|
||||
|
||||
def iterdot(self):
|
||||
# write graph title
|
||||
if self.type == 'digraph':
|
||||
yield 'digraph %s {\n' % (self.name,)
|
||||
elif self.type == 'graph':
|
||||
yield 'graph %s {\n' % (self.name,)
|
||||
if self.type == "digraph":
|
||||
yield "digraph %s {\n" % (self.name,)
|
||||
elif self.type == "graph":
|
||||
yield "graph %s {\n" % (self.name,)
|
||||
|
||||
else:
|
||||
raise GraphError("unsupported graphtype %s" % (self.type,))
|
||||
@@ -240,11 +250,11 @@ def iterdot(self):
|
||||
# write overall graph attributes
|
||||
for attr_name, attr_value in sorted(self.attr.items()):
|
||||
yield '%s="%s";' % (attr_name, attr_value)
|
||||
yield '\n'
|
||||
yield "\n"
|
||||
|
||||
# some reusable patterns
|
||||
cpatt = '%s="%s",' # to separate attributes
|
||||
epatt = '];\n' # to end attributes
|
||||
cpatt = '%s="%s",' # to separate attributes
|
||||
epatt = "];\n" # to end attributes
|
||||
|
||||
# write node attributes
|
||||
for node_name, node_attr in sorted(self.nodes.items()):
|
||||
@@ -256,25 +266,24 @@ def iterdot(self):
|
||||
# write edge attributes
|
||||
for head in sorted(self.edges):
|
||||
for tail in sorted(self.edges[head]):
|
||||
if self.type == 'digraph':
|
||||
if self.type == "digraph":
|
||||
yield '\t"%s" -> "%s" [' % (head, tail)
|
||||
else:
|
||||
yield '\t"%s" -- "%s" [' % (head, tail)
|
||||
for attr_name, attr_value in \
|
||||
sorted(self.edges[head][tail].items()):
|
||||
for attr_name, attr_value in sorted(self.edges[head][tail].items()):
|
||||
yield cpatt % (attr_name, attr_value)
|
||||
yield epatt
|
||||
|
||||
# finish file
|
||||
yield '}\n'
|
||||
yield "}\n"
|
||||
|
||||
def __iter__(self):
|
||||
return self.iterdot()
|
||||
|
||||
def save_dot(self, file_name=None):
|
||||
'''
|
||||
"""
|
||||
Saves the current graph representation into a file
|
||||
'''
|
||||
"""
|
||||
|
||||
if not file_name:
|
||||
warnings.warn(DeprecationWarning, "always pass a file_name")
|
||||
@@ -284,19 +293,18 @@ def save_dot(self, file_name=None):
|
||||
for chunk in self.iterdot():
|
||||
fp.write(chunk)
|
||||
|
||||
def save_img(self, file_name=None, file_type="gif", mode='dot'):
|
||||
'''
|
||||
def save_img(self, file_name=None, file_type="gif", mode="dot"):
|
||||
"""
|
||||
Saves the dot file as an image file
|
||||
'''
|
||||
"""
|
||||
|
||||
if not file_name:
|
||||
warnings.warn(DeprecationWarning, "always pass a file_name")
|
||||
file_name = "out"
|
||||
|
||||
if mode == 'neato':
|
||||
if mode == "neato":
|
||||
self.save_dot(self.temp_neo)
|
||||
neato_cmd = "%s -o %s %s" % (
|
||||
self.neato, self.temp_dot, self.temp_neo)
|
||||
neato_cmd = "%s -o %s %s" % (self.neato, self.temp_dot, self.temp_neo)
|
||||
os.system(neato_cmd)
|
||||
plot_cmd = self.dot
|
||||
else:
|
||||
@@ -305,5 +313,9 @@ def save_img(self, file_name=None, file_type="gif", mode='dot'):
|
||||
|
||||
file_name = "%s.%s" % (file_name, file_type)
|
||||
create_cmd = "%s -T%s %s -o %s" % (
|
||||
plot_cmd, file_type, self.temp_dot, file_name)
|
||||
plot_cmd,
|
||||
file_type,
|
||||
self.temp_dot,
|
||||
file_name,
|
||||
)
|
||||
os.system(create_cmd)
|
||||
|
34
lib/spack/external/altgraph/Graph.py
vendored
34
lib/spack/external/altgraph/Graph.py
vendored
@@ -13,9 +13,10 @@
|
||||
#--Nathan Denny, May 27, 1999
|
||||
"""
|
||||
|
||||
from altgraph import GraphError
|
||||
from collections import deque
|
||||
|
||||
from altgraph import GraphError
|
||||
|
||||
|
||||
class Graph(object):
|
||||
"""
|
||||
@@ -58,8 +59,10 @@ def __init__(self, edges=None):
|
||||
raise GraphError("Cannot create edge from %s" % (item,))
|
||||
|
||||
def __repr__(self):
|
||||
return '<Graph: %d nodes, %d edges>' % (
|
||||
self.number_of_nodes(), self.number_of_edges())
|
||||
return "<Graph: %d nodes, %d edges>" % (
|
||||
self.number_of_nodes(),
|
||||
self.number_of_edges(),
|
||||
)
|
||||
|
||||
def add_node(self, node, node_data=None):
|
||||
"""
|
||||
@@ -111,7 +114,7 @@ def add_edge(self, head_id, tail_id, edge_data=1, create_nodes=True):
|
||||
self.nodes[tail_id][0].append(edge)
|
||||
self.nodes[head_id][1].append(edge)
|
||||
except KeyError:
|
||||
raise GraphError('Invalid nodes %s -> %s' % (head_id, tail_id))
|
||||
raise GraphError("Invalid nodes %s -> %s" % (head_id, tail_id))
|
||||
|
||||
# store edge information
|
||||
self.edges[edge] = (head_id, tail_id, edge_data)
|
||||
@@ -124,13 +127,12 @@ def hide_edge(self, edge):
|
||||
time.
|
||||
"""
|
||||
try:
|
||||
head_id, tail_id, edge_data = \
|
||||
self.hidden_edges[edge] = self.edges[edge]
|
||||
head_id, tail_id, edge_data = self.hidden_edges[edge] = self.edges[edge]
|
||||
self.nodes[tail_id][0].remove(edge)
|
||||
self.nodes[head_id][1].remove(edge)
|
||||
del self.edges[edge]
|
||||
except KeyError:
|
||||
raise GraphError('Invalid edge %s' % edge)
|
||||
raise GraphError("Invalid edge %s" % edge)
|
||||
|
||||
def hide_node(self, node):
|
||||
"""
|
||||
@@ -144,7 +146,7 @@ def hide_node(self, node):
|
||||
self.hide_edge(edge)
|
||||
del self.nodes[node]
|
||||
except KeyError:
|
||||
raise GraphError('Invalid node %s' % node)
|
||||
raise GraphError("Invalid node %s" % node)
|
||||
|
||||
def restore_node(self, node):
|
||||
"""
|
||||
@@ -157,7 +159,7 @@ def restore_node(self, node):
|
||||
self.restore_edge(edge)
|
||||
del self.hidden_nodes[node]
|
||||
except KeyError:
|
||||
raise GraphError('Invalid node %s' % node)
|
||||
raise GraphError("Invalid node %s" % node)
|
||||
|
||||
def restore_edge(self, edge):
|
||||
"""
|
||||
@@ -170,7 +172,7 @@ def restore_edge(self, edge):
|
||||
self.edges[edge] = head_id, tail_id, data
|
||||
del self.hidden_edges[edge]
|
||||
except KeyError:
|
||||
raise GraphError('Invalid edge %s' % edge)
|
||||
raise GraphError("Invalid edge %s" % edge)
|
||||
|
||||
def restore_all_edges(self):
|
||||
"""
|
||||
@@ -203,7 +205,7 @@ def edge_by_id(self, edge):
|
||||
head, tail, data = self.edges[edge]
|
||||
except KeyError:
|
||||
head, tail = None, None
|
||||
raise GraphError('Invalid edge %s' % edge)
|
||||
raise GraphError("Invalid edge %s" % edge)
|
||||
|
||||
return (head, tail)
|
||||
|
||||
@@ -339,7 +341,7 @@ def out_edges(self, node):
|
||||
try:
|
||||
return list(self.nodes[node][1])
|
||||
except KeyError:
|
||||
raise GraphError('Invalid node %s' % node)
|
||||
raise GraphError("Invalid node %s" % node)
|
||||
|
||||
def inc_edges(self, node):
|
||||
"""
|
||||
@@ -348,7 +350,7 @@ def inc_edges(self, node):
|
||||
try:
|
||||
return list(self.nodes[node][0])
|
||||
except KeyError:
|
||||
raise GraphError('Invalid node %s' % node)
|
||||
raise GraphError("Invalid node %s" % node)
|
||||
|
||||
def all_edges(self, node):
|
||||
"""
|
||||
@@ -488,7 +490,7 @@ def iterdfs(self, start, end=None, forward=True):
|
||||
The forward parameter specifies whether it is a forward or backward
|
||||
traversal.
|
||||
"""
|
||||
visited, stack = set([start]), deque([start])
|
||||
visited, stack = {start}, deque([start])
|
||||
|
||||
if forward:
|
||||
get_edges = self.out_edges
|
||||
@@ -515,7 +517,7 @@ def iterdata(self, start, end=None, forward=True, condition=None):
|
||||
condition callback is only called when node_data is not None.
|
||||
"""
|
||||
|
||||
visited, stack = set([start]), deque([start])
|
||||
visited, stack = {start}, deque([start])
|
||||
|
||||
if forward:
|
||||
get_edges = self.out_edges
|
||||
@@ -547,7 +549,7 @@ def _iterbfs(self, start, end=None, forward=True):
|
||||
traversal. Returns a list of tuples where the first value is the hop
|
||||
value the second value is the node id.
|
||||
"""
|
||||
queue, visited = deque([(start, 0)]), set([start])
|
||||
queue, visited = deque([(start, 0)]), {start}
|
||||
|
||||
# the direction of the bfs depends on the edges that are sampled
|
||||
if forward:
|
||||
|
53
lib/spack/external/altgraph/GraphAlgo.py
vendored
53
lib/spack/external/altgraph/GraphAlgo.py
vendored
@@ -1,7 +1,7 @@
|
||||
'''
|
||||
"""
|
||||
altgraph.GraphAlgo - Graph algorithms
|
||||
=====================================
|
||||
'''
|
||||
"""
|
||||
from altgraph import GraphError
|
||||
|
||||
|
||||
@@ -28,9 +28,9 @@ def dijkstra(graph, start, end=None):
|
||||
Adapted to altgraph by Istvan Albert, Pennsylvania State University -
|
||||
June, 9 2004
|
||||
"""
|
||||
D = {} # dictionary of final distances
|
||||
P = {} # dictionary of predecessors
|
||||
Q = _priorityDictionary() # estimated distances of non-final vertices
|
||||
D = {} # dictionary of final distances
|
||||
P = {} # dictionary of predecessors
|
||||
Q = _priorityDictionary() # estimated distances of non-final vertices
|
||||
Q[start] = 0
|
||||
|
||||
for v in Q:
|
||||
@@ -44,7 +44,8 @@ def dijkstra(graph, start, end=None):
|
||||
if w in D:
|
||||
if vwLength < D[w]:
|
||||
raise GraphError(
|
||||
"Dijkstra: found better path to already-final vertex")
|
||||
"Dijkstra: found better path to already-final vertex"
|
||||
)
|
||||
elif w not in Q or vwLength < Q[w]:
|
||||
Q[w] = vwLength
|
||||
P[w] = v
|
||||
@@ -76,7 +77,7 @@ def shortest_path(graph, start, end):
|
||||
# Utility classes and functions
|
||||
#
|
||||
class _priorityDictionary(dict):
|
||||
'''
|
||||
"""
|
||||
Priority dictionary using binary heaps (internal use only)
|
||||
|
||||
David Eppstein, UC Irvine, 8 Mar 2002
|
||||
@@ -92,22 +93,22 @@ class _priorityDictionary(dict):
|
||||
order. Each item is not removed until the next item is requested,
|
||||
so D[x] will still return a useful value until the next iteration
|
||||
of the for-loop. Each operation takes logarithmic amortized time.
|
||||
'''
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
'''
|
||||
"""
|
||||
Initialize priorityDictionary by creating binary heap of pairs
|
||||
(value,key). Note that changing or removing a dict entry will not
|
||||
remove the old pair from the heap until it is found by smallest()
|
||||
or until the heap is rebuilt.
|
||||
'''
|
||||
"""
|
||||
self.__heap = []
|
||||
dict.__init__(self)
|
||||
|
||||
def smallest(self):
|
||||
'''
|
||||
"""
|
||||
Find smallest item after removing deleted items from front of heap.
|
||||
'''
|
||||
"""
|
||||
if len(self) == 0:
|
||||
raise IndexError("smallest of empty priorityDictionary")
|
||||
heap = self.__heap
|
||||
@@ -115,9 +116,11 @@ def smallest(self):
|
||||
lastItem = heap.pop()
|
||||
insertionPoint = 0
|
||||
while 1:
|
||||
smallChild = 2*insertionPoint+1
|
||||
if smallChild+1 < len(heap) and \
|
||||
heap[smallChild] > heap[smallChild+1]:
|
||||
smallChild = 2 * insertionPoint + 1
|
||||
if (
|
||||
smallChild + 1 < len(heap)
|
||||
and heap[smallChild] > heap[smallChild + 1]
|
||||
):
|
||||
smallChild += 1
|
||||
if smallChild >= len(heap) or lastItem <= heap[smallChild]:
|
||||
heap[insertionPoint] = lastItem
|
||||
@@ -127,22 +130,24 @@ def smallest(self):
|
||||
return heap[0][1]
|
||||
|
||||
def __iter__(self):
|
||||
'''
|
||||
"""
|
||||
Create destructive sorted iterator of priorityDictionary.
|
||||
'''
|
||||
"""
|
||||
|
||||
def iterfn():
|
||||
while len(self) > 0:
|
||||
x = self.smallest()
|
||||
yield x
|
||||
del self[x]
|
||||
|
||||
return iterfn()
|
||||
|
||||
def __setitem__(self, key, val):
|
||||
'''
|
||||
"""
|
||||
Change value stored in dictionary and add corresponding pair to heap.
|
||||
Rebuilds the heap if the number of deleted items gets large, to avoid
|
||||
memory leakage.
|
||||
'''
|
||||
"""
|
||||
dict.__setitem__(self, key, val)
|
||||
heap = self.__heap
|
||||
if len(heap) > 2 * len(self):
|
||||
@@ -152,15 +157,15 @@ def __setitem__(self, key, val):
|
||||
newPair = (val, key)
|
||||
insertionPoint = len(heap)
|
||||
heap.append(None)
|
||||
while insertionPoint > 0 and newPair < heap[(insertionPoint-1)//2]:
|
||||
heap[insertionPoint] = heap[(insertionPoint-1)//2]
|
||||
insertionPoint = (insertionPoint-1)//2
|
||||
while insertionPoint > 0 and newPair < heap[(insertionPoint - 1) // 2]:
|
||||
heap[insertionPoint] = heap[(insertionPoint - 1) // 2]
|
||||
insertionPoint = (insertionPoint - 1) // 2
|
||||
heap[insertionPoint] = newPair
|
||||
|
||||
def setdefault(self, key, val):
|
||||
'''
|
||||
"""
|
||||
Reimplement setdefault to pass through our customized __setitem__.
|
||||
'''
|
||||
"""
|
||||
if key not in self:
|
||||
self[key] = val
|
||||
return self[key]
|
||||
|
24
lib/spack/external/altgraph/GraphStat.py
vendored
24
lib/spack/external/altgraph/GraphStat.py
vendored
@@ -1,11 +1,11 @@
|
||||
'''
|
||||
"""
|
||||
altgraph.GraphStat - Functions providing various graph statistics
|
||||
=================================================================
|
||||
'''
|
||||
"""
|
||||
|
||||
|
||||
def degree_dist(graph, limits=(0, 0), bin_num=10, mode='out'):
|
||||
'''
|
||||
def degree_dist(graph, limits=(0, 0), bin_num=10, mode="out"):
|
||||
"""
|
||||
Computes the degree distribution for a graph.
|
||||
|
||||
Returns a list of tuples where the first element of the tuple is the
|
||||
@@ -15,10 +15,10 @@ def degree_dist(graph, limits=(0, 0), bin_num=10, mode='out'):
|
||||
Example::
|
||||
|
||||
....
|
||||
'''
|
||||
"""
|
||||
|
||||
deg = []
|
||||
if mode == 'inc':
|
||||
if mode == "inc":
|
||||
get_deg = graph.inc_degree
|
||||
else:
|
||||
get_deg = graph.out_degree
|
||||
@@ -34,38 +34,38 @@ def degree_dist(graph, limits=(0, 0), bin_num=10, mode='out'):
|
||||
return results
|
||||
|
||||
|
||||
_EPS = 1.0/(2.0**32)
|
||||
_EPS = 1.0 / (2.0 ** 32)
|
||||
|
||||
|
||||
def _binning(values, limits=(0, 0), bin_num=10):
|
||||
'''
|
||||
"""
|
||||
Bins data that falls between certain limits, if the limits are (0, 0) the
|
||||
minimum and maximum values are used.
|
||||
|
||||
Returns a list of tuples where the first element of the tuple is the
|
||||
center of the bin and the second element of the tuple are the counts.
|
||||
'''
|
||||
"""
|
||||
if limits == (0, 0):
|
||||
min_val, max_val = min(values) - _EPS, max(values) + _EPS
|
||||
else:
|
||||
min_val, max_val = limits
|
||||
|
||||
# get bin size
|
||||
bin_size = (max_val - min_val)/float(bin_num)
|
||||
bin_size = (max_val - min_val) / float(bin_num)
|
||||
bins = [0] * (bin_num)
|
||||
|
||||
# will ignore these outliers for now
|
||||
for value in values:
|
||||
try:
|
||||
if (value - min_val) >= 0:
|
||||
index = int((value - min_val)/float(bin_size))
|
||||
index = int((value - min_val) / float(bin_size))
|
||||
bins[index] += 1
|
||||
except IndexError:
|
||||
pass
|
||||
|
||||
# make it ready for an x,y plot
|
||||
result = []
|
||||
center = (bin_size/2) + min_val
|
||||
center = (bin_size / 2) + min_val
|
||||
for i, y in enumerate(bins):
|
||||
x = center + bin_size * i
|
||||
result.append((x, y))
|
||||
|
37
lib/spack/external/altgraph/GraphUtil.py
vendored
37
lib/spack/external/altgraph/GraphUtil.py
vendored
@@ -1,31 +1,29 @@
|
||||
'''
|
||||
"""
|
||||
altgraph.GraphUtil - Utility classes and functions
|
||||
==================================================
|
||||
'''
|
||||
"""
|
||||
|
||||
import random
|
||||
from collections import deque
|
||||
from altgraph import Graph
|
||||
from altgraph import GraphError
|
||||
|
||||
from altgraph import Graph, GraphError
|
||||
|
||||
|
||||
def generate_random_graph(
|
||||
node_num, edge_num, self_loops=False, multi_edges=False):
|
||||
'''
|
||||
def generate_random_graph(node_num, edge_num, self_loops=False, multi_edges=False):
|
||||
"""
|
||||
Generates and returns a :py:class:`~altgraph.Graph.Graph` instance with
|
||||
*node_num* nodes randomly connected by *edge_num* edges.
|
||||
'''
|
||||
"""
|
||||
g = Graph.Graph()
|
||||
|
||||
if not multi_edges:
|
||||
if self_loops:
|
||||
max_edges = node_num * node_num
|
||||
else:
|
||||
max_edges = node_num * (node_num-1)
|
||||
max_edges = node_num * (node_num - 1)
|
||||
|
||||
if edge_num > max_edges:
|
||||
raise GraphError(
|
||||
"inconsistent arguments to 'generate_random_graph'")
|
||||
raise GraphError("inconsistent arguments to 'generate_random_graph'")
|
||||
|
||||
nodes = range(node_num)
|
||||
|
||||
@@ -52,17 +50,16 @@ def generate_random_graph(
|
||||
return g
|
||||
|
||||
|
||||
def generate_scale_free_graph(
|
||||
steps, growth_num, self_loops=False, multi_edges=False):
|
||||
'''
|
||||
def generate_scale_free_graph(steps, growth_num, self_loops=False, multi_edges=False):
|
||||
"""
|
||||
Generates and returns a :py:class:`~altgraph.Graph.Graph` instance that
|
||||
will have *steps* \* *growth_num* nodes and a scale free (powerlaw)
|
||||
will have *steps* \\* *growth_num* nodes and a scale free (powerlaw)
|
||||
connectivity. Starting with a fully connected graph with *growth_num*
|
||||
nodes at every step *growth_num* nodes are added to the graph and are
|
||||
connected to existing nodes with a probability proportional to the degree
|
||||
of these existing nodes.
|
||||
'''
|
||||
# FIXME: The code doesn't seem to do what the documentation claims.
|
||||
"""
|
||||
# The code doesn't seem to do what the documentation claims.
|
||||
graph = Graph.Graph()
|
||||
|
||||
# initialize the graph
|
||||
@@ -113,7 +110,7 @@ def filter_stack(graph, head, filters):
|
||||
in *removes*.
|
||||
"""
|
||||
|
||||
visited, removes, orphans = set([head]), set(), set()
|
||||
visited, removes, orphans = {head}, set(), set()
|
||||
stack = deque([(head, head)])
|
||||
get_data = graph.node_data
|
||||
get_edges = graph.out_edges
|
||||
@@ -137,8 +134,6 @@ def filter_stack(graph, head, filters):
|
||||
visited.add(tail)
|
||||
stack.append((last_good, tail))
|
||||
|
||||
orphans = [
|
||||
(lg, tl)
|
||||
for (lg, tl) in orphans if tl not in removes]
|
||||
orphans = [(lg, tl) for (lg, tl) in orphans if tl not in removes]
|
||||
|
||||
return visited, removes, orphans
|
||||
|
12
lib/spack/external/altgraph/ObjectGraph.py
vendored
12
lib/spack/external/altgraph/ObjectGraph.py
vendored
@@ -27,7 +27,7 @@ def __init__(self, graph=None, debug=0):
|
||||
graph.add_node(self, None)
|
||||
|
||||
def __repr__(self):
|
||||
return '<%s>' % (type(self).__name__,)
|
||||
return "<%s>" % (type(self).__name__,)
|
||||
|
||||
def flatten(self, condition=None, start=None):
|
||||
"""
|
||||
@@ -58,6 +58,7 @@ def iter_edges(lst, n):
|
||||
if ident not in seen:
|
||||
yield self.findNode(ident)
|
||||
seen.add(ident)
|
||||
|
||||
return iter_edges(outraw, 3), iter_edges(incraw, 2)
|
||||
|
||||
def edgeData(self, fromNode, toNode):
|
||||
@@ -87,12 +88,12 @@ def filterStack(self, filters):
|
||||
visited, removes, orphans = filter_stack(self.graph, self, filters)
|
||||
|
||||
for last_good, tail in orphans:
|
||||
self.graph.add_edge(last_good, tail, edge_data='orphan')
|
||||
self.graph.add_edge(last_good, tail, edge_data="orphan")
|
||||
|
||||
for node in removes:
|
||||
self.graph.hide_node(node)
|
||||
|
||||
return len(visited)-1, len(removes), len(orphans)
|
||||
return len(visited) - 1, len(removes), len(orphans)
|
||||
|
||||
def removeNode(self, node):
|
||||
"""
|
||||
@@ -135,7 +136,7 @@ def getRawIdent(self, node):
|
||||
"""
|
||||
if node is self:
|
||||
return node
|
||||
ident = getattr(node, 'graphident', None)
|
||||
ident = getattr(node, "graphident", None)
|
||||
return ident
|
||||
|
||||
def __contains__(self, node):
|
||||
@@ -192,8 +193,7 @@ def msg(self, level, s, *args):
|
||||
Print a debug message with the given level
|
||||
"""
|
||||
if s and level <= self.debug:
|
||||
print("%s%s %s" % (
|
||||
" " * self.indent, s, ' '.join(map(repr, args))))
|
||||
print("%s%s %s" % (" " * self.indent, s, " ".join(map(repr, args))))
|
||||
|
||||
def msgin(self, level, s, *args):
|
||||
"""
|
||||
|
14
lib/spack/external/altgraph/__init__.py
vendored
14
lib/spack/external/altgraph/__init__.py
vendored
@@ -1,4 +1,4 @@
|
||||
'''
|
||||
"""
|
||||
altgraph - a python graph library
|
||||
=================================
|
||||
|
||||
@@ -138,13 +138,11 @@
|
||||
@newfield contributor: Contributors:
|
||||
@contributor: U{Reka Albert <http://www.phys.psu.edu/~ralbert/>}
|
||||
|
||||
'''
|
||||
# import pkg_resources
|
||||
# __version__ = pkg_resources.require('altgraph')[0].version
|
||||
# pkg_resources is not finding the altgraph import despite the fact that it is in sys.path
|
||||
# there is no .dist-info or .egg-info for pkg_resources to query the version from
|
||||
# so it must be set manually
|
||||
__version__ = '0.16.1'
|
||||
"""
|
||||
import pkg_resources
|
||||
|
||||
__version__ = pkg_resources.require("altgraph")[0].version
|
||||
|
||||
|
||||
class GraphError(ValueError):
|
||||
pass
|
||||
|
21
lib/spack/external/attr/LICENSE
vendored
Normal file
21
lib/spack/external/attr/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Hynek Schlawack
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
78
lib/spack/external/attr/__init__.py
vendored
Normal file
78
lib/spack/external/attr/__init__.py
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
from __future__ import absolute_import, division, print_function
|
||||
|
||||
import sys
|
||||
|
||||
from functools import partial
|
||||
|
||||
from . import converters, exceptions, filters, setters, validators
|
||||
from ._cmp import cmp_using
|
||||
from ._config import get_run_validators, set_run_validators
|
||||
from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types
|
||||
from ._make import (
|
||||
NOTHING,
|
||||
Attribute,
|
||||
Factory,
|
||||
attrib,
|
||||
attrs,
|
||||
fields,
|
||||
fields_dict,
|
||||
make_class,
|
||||
validate,
|
||||
)
|
||||
from ._version_info import VersionInfo
|
||||
|
||||
|
||||
__version__ = "21.2.0"
|
||||
__version_info__ = VersionInfo._from_version_string(__version__)
|
||||
|
||||
__title__ = "attrs"
|
||||
__description__ = "Classes Without Boilerplate"
|
||||
__url__ = "https://www.attrs.org/"
|
||||
__uri__ = __url__
|
||||
__doc__ = __description__ + " <" + __uri__ + ">"
|
||||
|
||||
__author__ = "Hynek Schlawack"
|
||||
__email__ = "hs@ox.cx"
|
||||
|
||||
__license__ = "MIT"
|
||||
__copyright__ = "Copyright (c) 2015 Hynek Schlawack"
|
||||
|
||||
|
||||
s = attributes = attrs
|
||||
ib = attr = attrib
|
||||
dataclass = partial(attrs, auto_attribs=True) # happy Easter ;)
|
||||
|
||||
__all__ = [
|
||||
"Attribute",
|
||||
"Factory",
|
||||
"NOTHING",
|
||||
"asdict",
|
||||
"assoc",
|
||||
"astuple",
|
||||
"attr",
|
||||
"attrib",
|
||||
"attributes",
|
||||
"attrs",
|
||||
"cmp_using",
|
||||
"converters",
|
||||
"evolve",
|
||||
"exceptions",
|
||||
"fields",
|
||||
"fields_dict",
|
||||
"filters",
|
||||
"get_run_validators",
|
||||
"has",
|
||||
"ib",
|
||||
"make_class",
|
||||
"resolve_types",
|
||||
"s",
|
||||
"set_run_validators",
|
||||
"setters",
|
||||
"validate",
|
||||
"validators",
|
||||
]
|
||||
|
||||
if sys.version_info[:2] >= (3, 6):
|
||||
from ._next_gen import define, field, frozen, mutable
|
||||
|
||||
__all__.extend((define, field, frozen, mutable))
|
152
lib/spack/external/attr/_cmp.py
vendored
Normal file
152
lib/spack/external/attr/_cmp.py
vendored
Normal file
@@ -0,0 +1,152 @@
|
||||
from __future__ import absolute_import, division, print_function
|
||||
|
||||
import functools
|
||||
|
||||
from ._compat import new_class
|
||||
from ._make import _make_ne
|
||||
|
||||
|
||||
_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="}
|
||||
|
||||
|
||||
def cmp_using(
|
||||
eq=None,
|
||||
lt=None,
|
||||
le=None,
|
||||
gt=None,
|
||||
ge=None,
|
||||
require_same_type=True,
|
||||
class_name="Comparable",
|
||||
):
|
||||
"""
|
||||
Create a class that can be passed into `attr.ib`'s ``eq``, ``order``, and
|
||||
``cmp`` arguments to customize field comparison.
|
||||
|
||||
The resulting class will have a full set of ordering methods if
|
||||
at least one of ``{lt, le, gt, ge}`` and ``eq`` are provided.
|
||||
|
||||
:param Optional[callable] eq: `callable` used to evaluate equality
|
||||
of two objects.
|
||||
:param Optional[callable] lt: `callable` used to evaluate whether
|
||||
one object is less than another object.
|
||||
:param Optional[callable] le: `callable` used to evaluate whether
|
||||
one object is less than or equal to another object.
|
||||
:param Optional[callable] gt: `callable` used to evaluate whether
|
||||
one object is greater than another object.
|
||||
:param Optional[callable] ge: `callable` used to evaluate whether
|
||||
one object is greater than or equal to another object.
|
||||
|
||||
:param bool require_same_type: When `True`, equality and ordering methods
|
||||
will return `NotImplemented` if objects are not of the same type.
|
||||
|
||||
:param Optional[str] class_name: Name of class. Defaults to 'Comparable'.
|
||||
|
||||
See `comparison` for more details.
|
||||
|
||||
.. versionadded:: 21.1.0
|
||||
"""
|
||||
|
||||
body = {
|
||||
"__slots__": ["value"],
|
||||
"__init__": _make_init(),
|
||||
"_requirements": [],
|
||||
"_is_comparable_to": _is_comparable_to,
|
||||
}
|
||||
|
||||
# Add operations.
|
||||
num_order_functions = 0
|
||||
has_eq_function = False
|
||||
|
||||
if eq is not None:
|
||||
has_eq_function = True
|
||||
body["__eq__"] = _make_operator("eq", eq)
|
||||
body["__ne__"] = _make_ne()
|
||||
|
||||
if lt is not None:
|
||||
num_order_functions += 1
|
||||
body["__lt__"] = _make_operator("lt", lt)
|
||||
|
||||
if le is not None:
|
||||
num_order_functions += 1
|
||||
body["__le__"] = _make_operator("le", le)
|
||||
|
||||
if gt is not None:
|
||||
num_order_functions += 1
|
||||
body["__gt__"] = _make_operator("gt", gt)
|
||||
|
||||
if ge is not None:
|
||||
num_order_functions += 1
|
||||
body["__ge__"] = _make_operator("ge", ge)
|
||||
|
||||
type_ = new_class(class_name, (object,), {}, lambda ns: ns.update(body))
|
||||
|
||||
# Add same type requirement.
|
||||
if require_same_type:
|
||||
type_._requirements.append(_check_same_type)
|
||||
|
||||
# Add total ordering if at least one operation was defined.
|
||||
if 0 < num_order_functions < 4:
|
||||
if not has_eq_function:
|
||||
# functools.total_ordering requires __eq__ to be defined,
|
||||
# so raise early error here to keep a nice stack.
|
||||
raise ValueError(
|
||||
"eq must be define is order to complete ordering from "
|
||||
"lt, le, gt, ge."
|
||||
)
|
||||
type_ = functools.total_ordering(type_)
|
||||
|
||||
return type_
|
||||
|
||||
|
||||
def _make_init():
|
||||
"""
|
||||
Create __init__ method.
|
||||
"""
|
||||
|
||||
def __init__(self, value):
|
||||
"""
|
||||
Initialize object with *value*.
|
||||
"""
|
||||
self.value = value
|
||||
|
||||
return __init__
|
||||
|
||||
|
||||
def _make_operator(name, func):
|
||||
"""
|
||||
Create operator method.
|
||||
"""
|
||||
|
||||
def method(self, other):
|
||||
if not self._is_comparable_to(other):
|
||||
return NotImplemented
|
||||
|
||||
result = func(self.value, other.value)
|
||||
if result is NotImplemented:
|
||||
return NotImplemented
|
||||
|
||||
return result
|
||||
|
||||
method.__name__ = "__%s__" % (name,)
|
||||
method.__doc__ = "Return a %s b. Computed by attrs." % (
|
||||
_operation_names[name],
|
||||
)
|
||||
|
||||
return method
|
||||
|
||||
|
||||
def _is_comparable_to(self, other):
|
||||
"""
|
||||
Check whether `other` is comparable to `self`.
|
||||
"""
|
||||
for func in self._requirements:
|
||||
if not func(self, other):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def _check_same_type(self, other):
|
||||
"""
|
||||
Return True if *self* and *other* are of the same type, False otherwise.
|
||||
"""
|
||||
return other.value.__class__ is self.value.__class__
|
242
lib/spack/external/attr/_compat.py
vendored
Normal file
242
lib/spack/external/attr/_compat.py
vendored
Normal file
@@ -0,0 +1,242 @@
|
||||
from __future__ import absolute_import, division, print_function
|
||||
|
||||
import platform
|
||||
import sys
|
||||
import types
|
||||
import warnings
|
||||
|
||||
|
||||
PY2 = sys.version_info[0] == 2
|
||||
PYPY = platform.python_implementation() == "PyPy"
|
||||
|
||||
|
||||
if PYPY or sys.version_info[:2] >= (3, 6):
|
||||
ordered_dict = dict
|
||||
else:
|
||||
from collections import OrderedDict
|
||||
|
||||
ordered_dict = OrderedDict
|
||||
|
||||
|
||||
if PY2:
|
||||
from collections import Mapping, Sequence
|
||||
|
||||
from UserDict import IterableUserDict
|
||||
|
||||
# We 'bundle' isclass instead of using inspect as importing inspect is
|
||||
# fairly expensive (order of 10-15 ms for a modern machine in 2016)
|
||||
def isclass(klass):
|
||||
return isinstance(klass, (type, types.ClassType))
|
||||
|
||||
def new_class(name, bases, kwds, exec_body):
|
||||
"""
|
||||
A minimal stub of types.new_class that we need for make_class.
|
||||
"""
|
||||
ns = {}
|
||||
exec_body(ns)
|
||||
|
||||
return type(name, bases, ns)
|
||||
|
||||
# TYPE is used in exceptions, repr(int) is different on Python 2 and 3.
|
||||
TYPE = "type"
|
||||
|
||||
def iteritems(d):
|
||||
return d.iteritems()
|
||||
|
||||
# Python 2 is bereft of a read-only dict proxy, so we make one!
|
||||
class ReadOnlyDict(IterableUserDict):
|
||||
"""
|
||||
Best-effort read-only dict wrapper.
|
||||
"""
|
||||
|
||||
def __setitem__(self, key, val):
|
||||
# We gently pretend we're a Python 3 mappingproxy.
|
||||
raise TypeError(
|
||||
"'mappingproxy' object does not support item assignment"
|
||||
)
|
||||
|
||||
def update(self, _):
|
||||
# We gently pretend we're a Python 3 mappingproxy.
|
||||
raise AttributeError(
|
||||
"'mappingproxy' object has no attribute 'update'"
|
||||
)
|
||||
|
||||
def __delitem__(self, _):
|
||||
# We gently pretend we're a Python 3 mappingproxy.
|
||||
raise TypeError(
|
||||
"'mappingproxy' object does not support item deletion"
|
||||
)
|
||||
|
||||
def clear(self):
|
||||
# We gently pretend we're a Python 3 mappingproxy.
|
||||
raise AttributeError(
|
||||
"'mappingproxy' object has no attribute 'clear'"
|
||||
)
|
||||
|
||||
def pop(self, key, default=None):
|
||||
# We gently pretend we're a Python 3 mappingproxy.
|
||||
raise AttributeError(
|
||||
"'mappingproxy' object has no attribute 'pop'"
|
||||
)
|
||||
|
||||
def popitem(self):
|
||||
# We gently pretend we're a Python 3 mappingproxy.
|
||||
raise AttributeError(
|
||||
"'mappingproxy' object has no attribute 'popitem'"
|
||||
)
|
||||
|
||||
def setdefault(self, key, default=None):
|
||||
# We gently pretend we're a Python 3 mappingproxy.
|
||||
raise AttributeError(
|
||||
"'mappingproxy' object has no attribute 'setdefault'"
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
# Override to be identical to the Python 3 version.
|
||||
return "mappingproxy(" + repr(self.data) + ")"
|
||||
|
||||
def metadata_proxy(d):
|
||||
res = ReadOnlyDict()
|
||||
res.data.update(d) # We blocked update, so we have to do it like this.
|
||||
return res
|
||||
|
||||
def just_warn(*args, **kw): # pragma: no cover
|
||||
"""
|
||||
We only warn on Python 3 because we are not aware of any concrete
|
||||
consequences of not setting the cell on Python 2.
|
||||
"""
|
||||
|
||||
|
||||
else: # Python 3 and later.
|
||||
from collections.abc import Mapping, Sequence # noqa
|
||||
|
||||
def just_warn(*args, **kw):
|
||||
"""
|
||||
We only warn on Python 3 because we are not aware of any concrete
|
||||
consequences of not setting the cell on Python 2.
|
||||
"""
|
||||
warnings.warn(
|
||||
"Running interpreter doesn't sufficiently support code object "
|
||||
"introspection. Some features like bare super() or accessing "
|
||||
"__class__ will not work with slotted classes.",
|
||||
RuntimeWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
|
||||
def isclass(klass):
|
||||
return isinstance(klass, type)
|
||||
|
||||
TYPE = "class"
|
||||
|
||||
def iteritems(d):
|
||||
return d.items()
|
||||
|
||||
new_class = types.new_class
|
||||
|
||||
def metadata_proxy(d):
|
||||
return types.MappingProxyType(dict(d))
|
||||
|
||||
|
||||
def make_set_closure_cell():
|
||||
"""Return a function of two arguments (cell, value) which sets
|
||||
the value stored in the closure cell `cell` to `value`.
|
||||
"""
|
||||
# pypy makes this easy. (It also supports the logic below, but
|
||||
# why not do the easy/fast thing?)
|
||||
if PYPY:
|
||||
|
||||
def set_closure_cell(cell, value):
|
||||
cell.__setstate__((value,))
|
||||
|
||||
return set_closure_cell
|
||||
|
||||
# Otherwise gotta do it the hard way.
|
||||
|
||||
# Create a function that will set its first cellvar to `value`.
|
||||
def set_first_cellvar_to(value):
|
||||
x = value
|
||||
return
|
||||
|
||||
# This function will be eliminated as dead code, but
|
||||
# not before its reference to `x` forces `x` to be
|
||||
# represented as a closure cell rather than a local.
|
||||
def force_x_to_be_a_cell(): # pragma: no cover
|
||||
return x
|
||||
|
||||
try:
|
||||
# Extract the code object and make sure our assumptions about
|
||||
# the closure behavior are correct.
|
||||
if PY2:
|
||||
co = set_first_cellvar_to.func_code
|
||||
else:
|
||||
co = set_first_cellvar_to.__code__
|
||||
if co.co_cellvars != ("x",) or co.co_freevars != ():
|
||||
raise AssertionError # pragma: no cover
|
||||
|
||||
# Convert this code object to a code object that sets the
|
||||
# function's first _freevar_ (not cellvar) to the argument.
|
||||
if sys.version_info >= (3, 8):
|
||||
# CPython 3.8+ has an incompatible CodeType signature
|
||||
# (added a posonlyargcount argument) but also added
|
||||
# CodeType.replace() to do this without counting parameters.
|
||||
set_first_freevar_code = co.replace(
|
||||
co_cellvars=co.co_freevars, co_freevars=co.co_cellvars
|
||||
)
|
||||
else:
|
||||
args = [co.co_argcount]
|
||||
if not PY2:
|
||||
args.append(co.co_kwonlyargcount)
|
||||
args.extend(
|
||||
[
|
||||
co.co_nlocals,
|
||||
co.co_stacksize,
|
||||
co.co_flags,
|
||||
co.co_code,
|
||||
co.co_consts,
|
||||
co.co_names,
|
||||
co.co_varnames,
|
||||
co.co_filename,
|
||||
co.co_name,
|
||||
co.co_firstlineno,
|
||||
co.co_lnotab,
|
||||
# These two arguments are reversed:
|
||||
co.co_cellvars,
|
||||
co.co_freevars,
|
||||
]
|
||||
)
|
||||
set_first_freevar_code = types.CodeType(*args)
|
||||
|
||||
def set_closure_cell(cell, value):
|
||||
# Create a function using the set_first_freevar_code,
|
||||
# whose first closure cell is `cell`. Calling it will
|
||||
# change the value of that cell.
|
||||
setter = types.FunctionType(
|
||||
set_first_freevar_code, {}, "setter", (), (cell,)
|
||||
)
|
||||
# And call it to set the cell.
|
||||
setter(value)
|
||||
|
||||
# Make sure it works on this interpreter:
|
||||
def make_func_with_cell():
|
||||
x = None
|
||||
|
||||
def func():
|
||||
return x # pragma: no cover
|
||||
|
||||
return func
|
||||
|
||||
if PY2:
|
||||
cell = make_func_with_cell().func_closure[0]
|
||||
else:
|
||||
cell = make_func_with_cell().__closure__[0]
|
||||
set_closure_cell(cell, 100)
|
||||
if cell.cell_contents != 100:
|
||||
raise AssertionError # pragma: no cover
|
||||
|
||||
except Exception:
|
||||
return just_warn
|
||||
else:
|
||||
return set_closure_cell
|
||||
|
||||
|
||||
set_closure_cell = make_set_closure_cell()
|
23
lib/spack/external/attr/_config.py
vendored
Normal file
23
lib/spack/external/attr/_config.py
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
from __future__ import absolute_import, division, print_function
|
||||
|
||||
|
||||
__all__ = ["set_run_validators", "get_run_validators"]
|
||||
|
||||
_run_validators = True
|
||||
|
||||
|
||||
def set_run_validators(run):
|
||||
"""
|
||||
Set whether or not validators are run. By default, they are run.
|
||||
"""
|
||||
if not isinstance(run, bool):
|
||||
raise TypeError("'run' must be bool.")
|
||||
global _run_validators
|
||||
_run_validators = run
|
||||
|
||||
|
||||
def get_run_validators():
|
||||
"""
|
||||
Return whether or not validators are run.
|
||||
"""
|
||||
return _run_validators
|
395
lib/spack/external/attr/_funcs.py
vendored
Normal file
395
lib/spack/external/attr/_funcs.py
vendored
Normal file
@@ -0,0 +1,395 @@
|
||||
from __future__ import absolute_import, division, print_function
|
||||
|
||||
import copy
|
||||
|
||||
from ._compat import iteritems
|
||||
from ._make import NOTHING, _obj_setattr, fields
|
||||
from .exceptions import AttrsAttributeNotFoundError
|
||||
|
||||
|
||||
def asdict(
|
||||
inst,
|
||||
recurse=True,
|
||||
filter=None,
|
||||
dict_factory=dict,
|
||||
retain_collection_types=False,
|
||||
value_serializer=None,
|
||||
):
|
||||
"""
|
||||
Return the ``attrs`` attribute values of *inst* as a dict.
|
||||
|
||||
Optionally recurse into other ``attrs``-decorated classes.
|
||||
|
||||
:param inst: Instance of an ``attrs``-decorated class.
|
||||
:param bool recurse: Recurse into classes that are also
|
||||
``attrs``-decorated.
|
||||
:param callable filter: A callable whose return code determines whether an
|
||||
attribute or element is included (``True``) or dropped (``False``). Is
|
||||
called with the `attr.Attribute` as the first argument and the
|
||||
value as the second argument.
|
||||
:param callable dict_factory: A callable to produce dictionaries from. For
|
||||
example, to produce ordered dictionaries instead of normal Python
|
||||
dictionaries, pass in ``collections.OrderedDict``.
|
||||
:param bool retain_collection_types: Do not convert to ``list`` when
|
||||
encountering an attribute whose type is ``tuple`` or ``set``. Only
|
||||
meaningful if ``recurse`` is ``True``.
|
||||
:param Optional[callable] value_serializer: A hook that is called for every
|
||||
attribute or dict key/value. It receives the current instance, field
|
||||
and value and must return the (updated) value. The hook is run *after*
|
||||
the optional *filter* has been applied.
|
||||
|
||||
:rtype: return type of *dict_factory*
|
||||
|
||||
:raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
|
||||
class.
|
||||
|
||||
.. versionadded:: 16.0.0 *dict_factory*
|
||||
.. versionadded:: 16.1.0 *retain_collection_types*
|
||||
.. versionadded:: 20.3.0 *value_serializer*
|
||||
"""
|
||||
attrs = fields(inst.__class__)
|
||||
rv = dict_factory()
|
||||
for a in attrs:
|
||||
v = getattr(inst, a.name)
|
||||
if filter is not None and not filter(a, v):
|
||||
continue
|
||||
|
||||
if value_serializer is not None:
|
||||
v = value_serializer(inst, a, v)
|
||||
|
||||
if recurse is True:
|
||||
if has(v.__class__):
|
||||
rv[a.name] = asdict(
|
||||
v,
|
||||
True,
|
||||
filter,
|
||||
dict_factory,
|
||||
retain_collection_types,
|
||||
value_serializer,
|
||||
)
|
||||
elif isinstance(v, (tuple, list, set, frozenset)):
|
||||
cf = v.__class__ if retain_collection_types is True else list
|
||||
rv[a.name] = cf(
|
||||
[
|
||||
_asdict_anything(
|
||||
i,
|
||||
filter,
|
||||
dict_factory,
|
||||
retain_collection_types,
|
||||
value_serializer,
|
||||
)
|
||||
for i in v
|
||||
]
|
||||
)
|
||||
elif isinstance(v, dict):
|
||||
df = dict_factory
|
||||
rv[a.name] = df(
|
||||
(
|
||||
_asdict_anything(
|
||||
kk,
|
||||
filter,
|
||||
df,
|
||||
retain_collection_types,
|
||||
value_serializer,
|
||||
),
|
||||
_asdict_anything(
|
||||
vv,
|
||||
filter,
|
||||
df,
|
||||
retain_collection_types,
|
||||
value_serializer,
|
||||
),
|
||||
)
|
||||
for kk, vv in iteritems(v)
|
||||
)
|
||||
else:
|
||||
rv[a.name] = v
|
||||
else:
|
||||
rv[a.name] = v
|
||||
return rv
|
||||
|
||||
|
||||
def _asdict_anything(
|
||||
val,
|
||||
filter,
|
||||
dict_factory,
|
||||
retain_collection_types,
|
||||
value_serializer,
|
||||
):
|
||||
"""
|
||||
``asdict`` only works on attrs instances, this works on anything.
|
||||
"""
|
||||
if getattr(val.__class__, "__attrs_attrs__", None) is not None:
|
||||
# Attrs class.
|
||||
rv = asdict(
|
||||
val,
|
||||
True,
|
||||
filter,
|
||||
dict_factory,
|
||||
retain_collection_types,
|
||||
value_serializer,
|
||||
)
|
||||
elif isinstance(val, (tuple, list, set, frozenset)):
|
||||
cf = val.__class__ if retain_collection_types is True else list
|
||||
rv = cf(
|
||||
[
|
||||
_asdict_anything(
|
||||
i,
|
||||
filter,
|
||||
dict_factory,
|
||||
retain_collection_types,
|
||||
value_serializer,
|
||||
)
|
||||
for i in val
|
||||
]
|
||||
)
|
||||
elif isinstance(val, dict):
|
||||
df = dict_factory
|
||||
rv = df(
|
||||
(
|
||||
_asdict_anything(
|
||||
kk, filter, df, retain_collection_types, value_serializer
|
||||
),
|
||||
_asdict_anything(
|
||||
vv, filter, df, retain_collection_types, value_serializer
|
||||
),
|
||||
)
|
||||
for kk, vv in iteritems(val)
|
||||
)
|
||||
else:
|
||||
rv = val
|
||||
if value_serializer is not None:
|
||||
rv = value_serializer(None, None, rv)
|
||||
|
||||
return rv
|
||||
|
||||
|
||||
def astuple(
|
||||
inst,
|
||||
recurse=True,
|
||||
filter=None,
|
||||
tuple_factory=tuple,
|
||||
retain_collection_types=False,
|
||||
):
|
||||
"""
|
||||
Return the ``attrs`` attribute values of *inst* as a tuple.
|
||||
|
||||
Optionally recurse into other ``attrs``-decorated classes.
|
||||
|
||||
:param inst: Instance of an ``attrs``-decorated class.
|
||||
:param bool recurse: Recurse into classes that are also
|
||||
``attrs``-decorated.
|
||||
:param callable filter: A callable whose return code determines whether an
|
||||
attribute or element is included (``True``) or dropped (``False``). Is
|
||||
called with the `attr.Attribute` as the first argument and the
|
||||
value as the second argument.
|
||||
:param callable tuple_factory: A callable to produce tuples from. For
|
||||
example, to produce lists instead of tuples.
|
||||
:param bool retain_collection_types: Do not convert to ``list``
|
||||
or ``dict`` when encountering an attribute which type is
|
||||
``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is
|
||||
``True``.
|
||||
|
||||
:rtype: return type of *tuple_factory*
|
||||
|
||||
:raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
|
||||
class.
|
||||
|
||||
.. versionadded:: 16.2.0
|
||||
"""
|
||||
attrs = fields(inst.__class__)
|
||||
rv = []
|
||||
retain = retain_collection_types # Very long. :/
|
||||
for a in attrs:
|
||||
v = getattr(inst, a.name)
|
||||
if filter is not None and not filter(a, v):
|
||||
continue
|
||||
if recurse is True:
|
||||
if has(v.__class__):
|
||||
rv.append(
|
||||
astuple(
|
||||
v,
|
||||
recurse=True,
|
||||
filter=filter,
|
||||
tuple_factory=tuple_factory,
|
||||
retain_collection_types=retain,
|
||||
)
|
||||
)
|
||||
elif isinstance(v, (tuple, list, set, frozenset)):
|
||||
cf = v.__class__ if retain is True else list
|
||||
rv.append(
|
||||
cf(
|
||||
[
|
||||
astuple(
|
||||
j,
|
||||
recurse=True,
|
||||
filter=filter,
|
||||
tuple_factory=tuple_factory,
|
||||
retain_collection_types=retain,
|
||||
)
|
||||
if has(j.__class__)
|
||||
else j
|
||||
for j in v
|
||||
]
|
||||
)
|
||||
)
|
||||
elif isinstance(v, dict):
|
||||
df = v.__class__ if retain is True else dict
|
||||
rv.append(
|
||||
df(
|
||||
(
|
||||
astuple(
|
||||
kk,
|
||||
tuple_factory=tuple_factory,
|
||||
retain_collection_types=retain,
|
||||
)
|
||||
if has(kk.__class__)
|
||||
else kk,
|
||||
astuple(
|
||||
vv,
|
||||
tuple_factory=tuple_factory,
|
||||
retain_collection_types=retain,
|
||||
)
|
||||
if has(vv.__class__)
|
||||
else vv,
|
||||
)
|
||||
for kk, vv in iteritems(v)
|
||||
)
|
||||
)
|
||||
else:
|
||||
rv.append(v)
|
||||
else:
|
||||
rv.append(v)
|
||||
|
||||
return rv if tuple_factory is list else tuple_factory(rv)
|
||||
|
||||
|
||||
def has(cls):
|
||||
"""
|
||||
Check whether *cls* is a class with ``attrs`` attributes.
|
||||
|
||||
:param type cls: Class to introspect.
|
||||
:raise TypeError: If *cls* is not a class.
|
||||
|
||||
:rtype: bool
|
||||
"""
|
||||
return getattr(cls, "__attrs_attrs__", None) is not None
|
||||
|
||||
|
||||
def assoc(inst, **changes):
|
||||
"""
|
||||
Copy *inst* and apply *changes*.
|
||||
|
||||
:param inst: Instance of a class with ``attrs`` attributes.
|
||||
:param changes: Keyword changes in the new copy.
|
||||
|
||||
:return: A copy of inst with *changes* incorporated.
|
||||
|
||||
:raise attr.exceptions.AttrsAttributeNotFoundError: If *attr_name* couldn't
|
||||
be found on *cls*.
|
||||
:raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
|
||||
class.
|
||||
|
||||
.. deprecated:: 17.1.0
|
||||
Use `evolve` instead.
|
||||
"""
|
||||
import warnings
|
||||
|
||||
warnings.warn(
|
||||
"assoc is deprecated and will be removed after 2018/01.",
|
||||
DeprecationWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
new = copy.copy(inst)
|
||||
attrs = fields(inst.__class__)
|
||||
for k, v in iteritems(changes):
|
||||
a = getattr(attrs, k, NOTHING)
|
||||
if a is NOTHING:
|
||||
raise AttrsAttributeNotFoundError(
|
||||
"{k} is not an attrs attribute on {cl}.".format(
|
||||
k=k, cl=new.__class__
|
||||
)
|
||||
)
|
||||
_obj_setattr(new, k, v)
|
||||
return new
|
||||
|
||||
|
||||
def evolve(inst, **changes):
|
||||
"""
|
||||
Create a new instance, based on *inst* with *changes* applied.
|
||||
|
||||
:param inst: Instance of a class with ``attrs`` attributes.
|
||||
:param changes: Keyword changes in the new copy.
|
||||
|
||||
:return: A copy of inst with *changes* incorporated.
|
||||
|
||||
:raise TypeError: If *attr_name* couldn't be found in the class
|
||||
``__init__``.
|
||||
:raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
|
||||
class.
|
||||
|
||||
.. versionadded:: 17.1.0
|
||||
"""
|
||||
cls = inst.__class__
|
||||
attrs = fields(cls)
|
||||
for a in attrs:
|
||||
if not a.init:
|
||||
continue
|
||||
attr_name = a.name # To deal with private attributes.
|
||||
init_name = attr_name if attr_name[0] != "_" else attr_name[1:]
|
||||
if init_name not in changes:
|
||||
changes[init_name] = getattr(inst, attr_name)
|
||||
|
||||
return cls(**changes)
|
||||
|
||||
|
||||
def resolve_types(cls, globalns=None, localns=None, attribs=None):
|
||||
"""
|
||||
Resolve any strings and forward annotations in type annotations.
|
||||
|
||||
This is only required if you need concrete types in `Attribute`'s *type*
|
||||
field. In other words, you don't need to resolve your types if you only
|
||||
use them for static type checking.
|
||||
|
||||
With no arguments, names will be looked up in the module in which the class
|
||||
was created. If this is not what you want, e.g. if the name only exists
|
||||
inside a method, you may pass *globalns* or *localns* to specify other
|
||||
dictionaries in which to look up these names. See the docs of
|
||||
`typing.get_type_hints` for more details.
|
||||
|
||||
:param type cls: Class to resolve.
|
||||
:param Optional[dict] globalns: Dictionary containing global variables.
|
||||
:param Optional[dict] localns: Dictionary containing local variables.
|
||||
:param Optional[list] attribs: List of attribs for the given class.
|
||||
This is necessary when calling from inside a ``field_transformer``
|
||||
since *cls* is not an ``attrs`` class yet.
|
||||
|
||||
:raise TypeError: If *cls* is not a class.
|
||||
:raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs``
|
||||
class and you didn't pass any attribs.
|
||||
:raise NameError: If types cannot be resolved because of missing variables.
|
||||
|
||||
:returns: *cls* so you can use this function also as a class decorator.
|
||||
Please note that you have to apply it **after** `attr.s`. That means
|
||||
the decorator has to come in the line **before** `attr.s`.
|
||||
|
||||
.. versionadded:: 20.1.0
|
||||
.. versionadded:: 21.1.0 *attribs*
|
||||
|
||||
"""
|
||||
try:
|
||||
# Since calling get_type_hints is expensive we cache whether we've
|
||||
# done it already.
|
||||
cls.__attrs_types_resolved__
|
||||
except AttributeError:
|
||||
import typing
|
||||
|
||||
hints = typing.get_type_hints(cls, globalns=globalns, localns=localns)
|
||||
for field in fields(cls) if attribs is None else attribs:
|
||||
if field.name in hints:
|
||||
# Since fields have been frozen we must work around it.
|
||||
_obj_setattr(field, "type", hints[field.name])
|
||||
cls.__attrs_types_resolved__ = True
|
||||
|
||||
# Return the class so you can use it as a decorator too.
|
||||
return cls
|
3052
lib/spack/external/attr/_make.py
vendored
Normal file
3052
lib/spack/external/attr/_make.py
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user