mirror of
https://github.com/pyenv/pyenv.git
synced 2025-11-08 11:33:49 -05:00
Compare commits
538 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97993fcc26 | ||
|
|
323bd16fbf | ||
|
|
67f474d3e3 | ||
|
|
004f6706a1 | ||
|
|
c579b63696 | ||
|
|
abf1376487 | ||
|
|
44172d69f2 | ||
|
|
2f4bdcdb43 | ||
|
|
47eef10ce1 | ||
|
|
5051a42b2c | ||
|
|
1c2a7658f0 | ||
|
|
8e5379ebe3 | ||
|
|
ab2a5ad030 | ||
|
|
09fbed1d4f | ||
|
|
496dcfc384 | ||
|
|
a7de2004eb | ||
|
|
f37a5a80d3 | ||
|
|
ddeb3facf0 | ||
|
|
519f90a67a | ||
|
|
fee6057680 | ||
|
|
1c7fe36c55 | ||
|
|
d327702c4d | ||
|
|
b3dad5887e | ||
|
|
8775ffe76c | ||
|
|
823dd3cef9 | ||
|
|
8d93ccae39 | ||
|
|
734d6323d8 | ||
|
|
c9514d8e8e | ||
|
|
e98a0b489f | ||
|
|
0173299078 | ||
|
|
850a74c5cd | ||
|
|
4c6b0e9c3b | ||
|
|
330e3fc130 | ||
|
|
2aff0df76d | ||
|
|
2acb2296e5 | ||
|
|
04b440df0b | ||
|
|
5d80be09cb | ||
|
|
e0504fc2f8 | ||
|
|
51937ccc19 | ||
|
|
ac2f882aab | ||
|
|
25c966eb4f | ||
|
|
c6973391f3 | ||
|
|
38421ba6aa | ||
|
|
a1edb81e8e | ||
|
|
5f7892f728 | ||
|
|
86be59a6d5 | ||
|
|
dc873cf568 | ||
|
|
aef6a2a6d0 | ||
|
|
527d8fab3e | ||
|
|
fc0e27c24b | ||
|
|
a2ad48aa40 | ||
|
|
d04a081dcb | ||
|
|
cb83169098 | ||
|
|
3bdb9bd1e7 | ||
|
|
cc40a3f965 | ||
|
|
25e70b2c80 | ||
|
|
4c90a3147f | ||
|
|
ee84e89ef1 | ||
|
|
a39449bc50 | ||
|
|
3bc0d858cc | ||
|
|
0f8b2b2b84 | ||
|
|
c424717a39 | ||
|
|
81632f0ab4 | ||
|
|
a79440470e | ||
|
|
84037dff4e | ||
|
|
a7a0354da9 | ||
|
|
6140619301 | ||
|
|
61c0f25ef5 | ||
|
|
1e8e96b8a2 | ||
|
|
707e8d1ef8 | ||
|
|
04b32e2d46 | ||
|
|
6393a4dfce | ||
|
|
b0d6a67881 | ||
|
|
d64d1aa1e0 | ||
|
|
96b3fb2fc3 | ||
|
|
7f60ef0b54 | ||
|
|
37ad06f7ce | ||
|
|
6711e9a21d | ||
|
|
f3e288c6ad | ||
|
|
770eb66ec8 | ||
|
|
630b3700ad | ||
|
|
fb9880e460 | ||
|
|
050f88c78b | ||
|
|
3ced1c4751 | ||
|
|
03b60aafec | ||
|
|
6a7ecfe409 | ||
|
|
d201daeb33 | ||
|
|
468dc81107 | ||
|
|
5180c3cfb5 | ||
|
|
95917cb753 | ||
|
|
55134ea1a1 | ||
|
|
3f2ef9e00a | ||
|
|
62fc392515 | ||
|
|
d8f5b583bd | ||
|
|
6517caf583 | ||
|
|
9c40f0b67e | ||
|
|
d60d1c5cdc | ||
|
|
1cabb6e02b | ||
|
|
2e658d3e35 | ||
|
|
d8c8338cd8 | ||
|
|
ac5c87e044 | ||
|
|
b123520826 | ||
|
|
5fcd9d7a4f | ||
|
|
669d1f1038 | ||
|
|
57a6772451 | ||
|
|
9ecd803bff | ||
|
|
11efbdce46 | ||
|
|
9e7010b72f | ||
|
|
6511ce26cd | ||
|
|
9b09a7efc9 | ||
|
|
f17809c4b9 | ||
|
|
ae5ee4de26 | ||
|
|
e9611beffe | ||
|
|
e44b12c2dc | ||
|
|
9373970678 | ||
|
|
88f76ee787 | ||
|
|
e396561661 | ||
|
|
cdd97d8c30 | ||
|
|
adf3c2bccf | ||
|
|
50e726ac41 | ||
|
|
662b5ddd13 | ||
|
|
d81eebf8d1 | ||
|
|
b11728c284 | ||
|
|
ca90363d73 | ||
|
|
672eef1561 | ||
|
|
384361167a | ||
|
|
1bcaab05b7 | ||
|
|
2c2c7616e2 | ||
|
|
e8e8cfddcd | ||
|
|
9546f729f7 | ||
|
|
d660c5a84f | ||
|
|
7947efc130 | ||
|
|
bc6a0db677 | ||
|
|
756aad2613 | ||
|
|
cb27e44291 | ||
|
|
42c66c92d8 | ||
|
|
613e5142b3 | ||
|
|
4b60ddd06d | ||
|
|
7a91070c02 | ||
|
|
a86ca7ac2e | ||
|
|
cb99cbcc8e | ||
|
|
0963c8ac02 | ||
|
|
79951112cc | ||
|
|
2e0bb023e1 | ||
|
|
b0cd5bf883 | ||
|
|
4ab9b3710b | ||
|
|
8a464cfed1 | ||
|
|
56956e9d90 | ||
|
|
98c5b711dc | ||
|
|
2ecec311fe | ||
|
|
0e0ca0966b | ||
|
|
948f53f6d8 | ||
|
|
037ba4516b | ||
|
|
aabaa89243 | ||
|
|
ef8daeaea7 | ||
|
|
8c7fc98c4f | ||
|
|
3ff54e89bc | ||
|
|
e1f07da73a | ||
|
|
e5997ef66b | ||
|
|
21eef94ea0 | ||
|
|
961882403a | ||
|
|
b80d5fd28d | ||
|
|
5b4d5a32d3 | ||
|
|
465b8ee74a | ||
|
|
51a626c1ea | ||
|
|
7e550e31f7 | ||
|
|
7deace6666 | ||
|
|
e41f7c9ee4 | ||
|
|
0167890c8c | ||
|
|
c5eae0f263 | ||
|
|
21c2a3dd69 | ||
|
|
556edfb0ae | ||
|
|
5503efffcf | ||
|
|
1e017f3917 | ||
|
|
05bb4f9a8d | ||
|
|
9d8764f545 | ||
|
|
57594c0600 | ||
|
|
2aa13dc4fe | ||
|
|
5d06a27118 | ||
|
|
dbbe2b63f4 | ||
|
|
a43259a186 | ||
|
|
8316450887 | ||
|
|
02e1d4a293 | ||
|
|
f9a2bb81b6 | ||
|
|
932dc464f5 | ||
|
|
8f8a5e03b4 | ||
|
|
5e4879a2bc | ||
|
|
aca9af761e | ||
|
|
443de6614b | ||
|
|
9908daf81d | ||
|
|
2374260efa | ||
|
|
f82acf8d44 | ||
|
|
46d3954bff | ||
|
|
6e3b91a816 | ||
|
|
920d8d4dbe | ||
|
|
2d85075123 | ||
|
|
2798a6694d | ||
|
|
2c69732fec | ||
|
|
96f93fd553 | ||
|
|
3c92216ea2 | ||
|
|
74a2523c97 | ||
|
|
dfde39650e | ||
|
|
2aa2d17f05 | ||
|
|
fce51d45a0 | ||
|
|
d3766f22a5 | ||
|
|
99d74e78f7 | ||
|
|
3fc9f4381a | ||
|
|
1a9e9ee5da | ||
|
|
3e1b4e0be1 | ||
|
|
ebff965cc6 | ||
|
|
2fb5b9e9a3 | ||
|
|
efb01775c0 | ||
|
|
1239b7cb1f | ||
|
|
10f8805526 | ||
|
|
ae74597ded | ||
|
|
ac32a20f83 | ||
|
|
ae1c5d2bff | ||
|
|
94d879c92a | ||
|
|
ef0c2a787b | ||
|
|
4405459f57 | ||
|
|
62242c1d56 | ||
|
|
d312301099 | ||
|
|
988258ea5f | ||
|
|
fb2c65f149 | ||
|
|
087793a660 | ||
|
|
63c471d020 | ||
|
|
54f7a7c046 | ||
|
|
011bbf0cca | ||
|
|
a9a92dfdc5 | ||
|
|
968fc797c3 | ||
|
|
27525adece | ||
|
|
f50b99265c | ||
|
|
9c8f92cf4e | ||
|
|
d25cd0d0f5 | ||
|
|
709534c21f | ||
|
|
62e2e9c743 | ||
|
|
509d3a8855 | ||
|
|
c6f0d31dc9 | ||
|
|
b8b6846a21 | ||
|
|
dee8a9dbad | ||
|
|
bb38acd994 | ||
|
|
7d7e7e5b93 | ||
|
|
928f69cf9a | ||
|
|
44c8f061af | ||
|
|
931a7d7c7f | ||
|
|
0ada42d89d | ||
|
|
7fbec9a971 | ||
|
|
28e7000b48 | ||
|
|
a19d613877 | ||
|
|
3edc31eb3d | ||
|
|
c9477dfd21 | ||
|
|
3fda63be30 | ||
|
|
f7f096503a | ||
|
|
8b0c743f12 | ||
|
|
bed2ec2f73 | ||
|
|
a82598e174 | ||
|
|
d2c4d963d2 | ||
|
|
c844b332ca | ||
|
|
64af7c3e54 | ||
|
|
261fd7c462 | ||
|
|
91928bfbc4 | ||
|
|
8cfc75604b | ||
|
|
da3ac7b7a3 | ||
|
|
259b5cad26 | ||
|
|
bdfb80cc12 | ||
|
|
abfa56e31d | ||
|
|
1dbb100933 | ||
|
|
9100243866 | ||
|
|
18ed727eb0 | ||
|
|
3ba8df29e5 | ||
|
|
e1b7e1b519 | ||
|
|
2cbba05966 | ||
|
|
6be6231444 | ||
|
|
7ec5c30451 | ||
|
|
14cf54fb1c | ||
|
|
6e79eb0b7c | ||
|
|
a8075debe5 | ||
|
|
552827d3f9 | ||
|
|
035c9336d2 | ||
|
|
c85ca6ce60 | ||
|
|
79a501139f | ||
|
|
791ae90aef | ||
|
|
db871427c7 | ||
|
|
4c5eac68c5 | ||
|
|
d4ff57d0ce | ||
|
|
ac5efed3a8 | ||
|
|
8aabba9485 | ||
|
|
879fa68b35 | ||
|
|
e908606554 | ||
|
|
b81204c08b | ||
|
|
37cc45a831 | ||
|
|
3f6bc8d16a | ||
|
|
dd5378941a | ||
|
|
2506c9773c | ||
|
|
51166377b7 | ||
|
|
af1a54482b | ||
|
|
64c70feb08 | ||
|
|
7b713a88c4 | ||
|
|
1874f95a0e | ||
|
|
1a882c6053 | ||
|
|
05dcd45741 | ||
|
|
a2dff4809b | ||
|
|
ad0d131032 | ||
|
|
7c17c741eb | ||
|
|
ba8b58f90d | ||
|
|
fe76b05445 | ||
|
|
c5d2639082 | ||
|
|
d4bd7bbe2b | ||
|
|
38ac747239 | ||
|
|
8f655d2ca6 | ||
|
|
d0b78fd5fe | ||
|
|
43f40eca05 | ||
|
|
687944d991 | ||
|
|
0f337a6c9a | ||
|
|
afe2615a1c | ||
|
|
d7d5ab5148 | ||
|
|
e79dd97afa | ||
|
|
021b6c2da0 | ||
|
|
e008430451 | ||
|
|
09fc5b8824 | ||
|
|
6eeda1f87e | ||
|
|
452647ab33 | ||
|
|
4086e452fd | ||
|
|
82c8d511c4 | ||
|
|
578c7507c6 | ||
|
|
23c727a767 | ||
|
|
fb73c4b714 | ||
|
|
3fa5812bfc | ||
|
|
c8a23e26e6 | ||
|
|
def5cd994e | ||
|
|
b5576240a2 | ||
|
|
920ef1456a | ||
|
|
528d10e96f | ||
|
|
cf9d0dcd7b | ||
|
|
aa5fd27e2f | ||
|
|
73b6307399 | ||
|
|
a57e0b5019 | ||
|
|
b3c91b37d6 | ||
|
|
777089466d | ||
|
|
20189ff06f | ||
|
|
5a8dbcf143 | ||
|
|
9a4f9c2511 | ||
|
|
bee178a95d | ||
|
|
0f75cd8800 | ||
|
|
29c4f279a3 | ||
|
|
be4939604e | ||
|
|
fc616a0aee | ||
|
|
b613a4abeb | ||
|
|
b1ee6c93c4 | ||
|
|
9fad1f46c5 | ||
|
|
f51d3dcb47 | ||
|
|
deb4935187 | ||
|
|
e28d747b83 | ||
|
|
ddd37eb823 | ||
|
|
be2bd5f03d | ||
|
|
4ef81b5c7a | ||
|
|
6bb75b3ba7 | ||
|
|
f507d08064 | ||
|
|
ad15c75e0e | ||
|
|
6052caa038 | ||
|
|
e8a4b54231 | ||
|
|
bcbdadf10d | ||
|
|
904dd5f828 | ||
|
|
3226a1870b | ||
|
|
0d19efecf5 | ||
|
|
ecab7b0d17 | ||
|
|
3bfc97ad29 | ||
|
|
276ce32643 | ||
|
|
b30508f9b8 | ||
|
|
0e80d0725b | ||
|
|
6bec7a50fe | ||
|
|
28be65992d | ||
|
|
68918e69b7 | ||
|
|
86a4423bbb | ||
|
|
0ab9683e58 | ||
|
|
7fe647968d | ||
|
|
c8daaa3954 | ||
|
|
88be70722f | ||
|
|
47d88d2c5f | ||
|
|
6b758c8cf9 | ||
|
|
017b6d877e | ||
|
|
063aa457e4 | ||
|
|
fcd7806529 | ||
|
|
a3f0bddc2a | ||
|
|
f72c1712dc | ||
|
|
a7b181c3ca | ||
|
|
c8c324afb4 | ||
|
|
72c5b034ca | ||
|
|
446411dc64 | ||
|
|
9fe80f28e5 | ||
|
|
9248255f70 | ||
|
|
368e04f3fa | ||
|
|
76e93b073e | ||
|
|
e3fe82a9b1 | ||
|
|
dd60d5fae2 | ||
|
|
96828af31e | ||
|
|
c998eae677 | ||
|
|
c20fc7bd6a | ||
|
|
f1a1f59c87 | ||
|
|
b64b0ab5e2 | ||
|
|
1a0b555baf | ||
|
|
819e2b8f45 | ||
|
|
bd618ea9ef | ||
|
|
b77b0be089 | ||
|
|
906246da4c | ||
|
|
12e74e147a | ||
|
|
2b0dd7355d | ||
|
|
f40397088c | ||
|
|
e447fe5b73 | ||
|
|
4242694a0e | ||
|
|
83619f3fbe | ||
|
|
4bd8a975f4 | ||
|
|
2a5bbf6cb5 | ||
|
|
b9a27af7b8 | ||
|
|
c03d9cf84c | ||
|
|
c7f2c4db45 | ||
|
|
3bc3a624db | ||
|
|
f4598bc1f0 | ||
|
|
fc4c0ac52d | ||
|
|
579c34e570 | ||
|
|
2369ac2a08 | ||
|
|
25c974d59a | ||
|
|
2ea797e226 | ||
|
|
7d7f8b94ae | ||
|
|
e715e03be0 | ||
|
|
b3a5b5eee3 | ||
|
|
894bcd8717 | ||
|
|
03ee3ffd32 | ||
|
|
3d83bcdbef | ||
|
|
f897c50202 | ||
|
|
773c65416b | ||
|
|
ca1593c80e | ||
|
|
cb5da5e831 | ||
|
|
31f372034d | ||
|
|
ff93c58bab | ||
|
|
2bb59169db | ||
|
|
f9e519611a | ||
|
|
ae04877154 | ||
|
|
e82e12739c | ||
|
|
6b9795728e | ||
|
|
23576296ae | ||
|
|
2128b4f27d | ||
|
|
9ba6124833 | ||
|
|
6c63e086e9 | ||
|
|
540c94bdb1 | ||
|
|
18f62f266d | ||
|
|
49cc88094a | ||
|
|
cad18bb332 | ||
|
|
79fdf1e3bb | ||
|
|
03bba03291 | ||
|
|
cf50e2a2db | ||
|
|
b3d52b05d2 | ||
|
|
73dc5547fc | ||
|
|
3f0dd1962f | ||
|
|
48b0224aaf | ||
|
|
8cfa967d74 | ||
|
|
a57106c932 | ||
|
|
189e73e5e8 | ||
|
|
8680247381 | ||
|
|
606ff454a1 | ||
|
|
b05d15f673 | ||
|
|
881ba40ff4 | ||
|
|
58bbbf8880 | ||
|
|
c1674cd552 | ||
|
|
74f923b5fc | ||
|
|
59c560893a | ||
|
|
4971d9e35e | ||
|
|
6d13db992f | ||
|
|
13d8568620 | ||
|
|
cc56f76733 | ||
|
|
4c261e6ea1 | ||
|
|
31355676f0 | ||
|
|
c162dcd932 | ||
|
|
0b6320d371 | ||
|
|
3bfaa33c1b | ||
|
|
cd2858aa17 | ||
|
|
19359de7b8 | ||
|
|
8dd46e3915 | ||
|
|
ed1083ec27 | ||
|
|
904fe964b0 | ||
|
|
036fd63bbd | ||
|
|
1250d7dd30 | ||
|
|
ad6a950734 | ||
|
|
6da0e89207 | ||
|
|
e03118235a | ||
|
|
a8f921ce4d | ||
|
|
4a031504db | ||
|
|
75022d5d7c | ||
|
|
a12f947cc3 | ||
|
|
0b5e16add3 | ||
|
|
5b0ac41dec | ||
|
|
44510a68f1 | ||
|
|
16c4924f22 | ||
|
|
ac30d5f4e4 | ||
|
|
9f5dcbffd4 | ||
|
|
faceb4b79c | ||
|
|
d7389c10ee | ||
|
|
0726e02e3a | ||
|
|
03a5d65387 | ||
|
|
776f6ff9fa | ||
|
|
bb0f2ae1a7 | ||
|
|
ea6085e3f3 | ||
|
|
2c2619a49e | ||
|
|
1f526edbdd | ||
|
|
8b226c9679 | ||
|
|
f3521e88be | ||
|
|
5b08a6492b | ||
|
|
d722f059a0 | ||
|
|
093d0b3a49 | ||
|
|
73d4f3102a | ||
|
|
aa07a3a37c | ||
|
|
e6446555f3 | ||
|
|
c5e0d2cd94 | ||
|
|
cfe684ef42 | ||
|
|
1d28067353 | ||
|
|
0740fdf910 | ||
|
|
75fc9f6fd4 | ||
|
|
a0fbdad292 | ||
|
|
6a104f68d0 | ||
|
|
f6f1803ac9 | ||
|
|
23559ee6d1 | ||
|
|
4e31668c21 | ||
|
|
2b22145670 | ||
|
|
7c1c180551 | ||
|
|
a648682ed6 | ||
|
|
47b0ce77c0 | ||
|
|
fdabd14c2b | ||
|
|
e52ad61389 | ||
|
|
2e5983b004 | ||
|
|
27b5f62dfb | ||
|
|
7c1e3a710c | ||
|
|
13f273188d | ||
|
|
c89a69a6ed | ||
|
|
a8afc61146 | ||
|
|
e4a0c12b1b | ||
|
|
afeb971fa2 | ||
|
|
965421d5d4 | ||
|
|
ae22c69505 |
11
.editorconfig
Normal file
11
.editorconfig
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Editor configuration, see https://editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
|
||||||
|
# Makefiles always use tabs for indentation
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = unset # Allow user-defined tab width
|
||||||
5
.github/ISSUE_TEMPLATE.md
vendored
5
.github/ISSUE_TEMPLATE.md
vendored
@@ -19,3 +19,8 @@ Make sure you have checked all steps below.
|
|||||||
- [ ] C Compiler information (e.g. gcc 7.3):
|
- [ ] C Compiler information (e.g. gcc 7.3):
|
||||||
- [ ] Please attach the debug trace of the failing command as a gist:
|
- [ ] Please attach the debug trace of the failing command as a gist:
|
||||||
* Run `env PYENV_DEBUG=1 <faulty command> 2>&1 | tee trace.log` and attach `trace.log`. E.g. if you have a problem with installing Python, run `env PYENV_DEBUG=1 pyenv install -v <version> 2>&1 | tee trace.log` (note the `-v` option to `pyenv install`).
|
* Run `env PYENV_DEBUG=1 <faulty command> 2>&1 | tee trace.log` and attach `trace.log`. E.g. if you have a problem with installing Python, run `env PYENV_DEBUG=1 pyenv install -v <version> 2>&1 | tee trace.log` (note the `-v` option to `pyenv install`).
|
||||||
|
- [ ] If you have a problem with installing Python, please also attach `config.log` from the build directory
|
||||||
|
* The build directory is reported after the "BUILD FAILED" message and is usually under `/tmp`.
|
||||||
|
- [ ] If the build succeeds but the problem is still with the build process (e.g. the resulting Python is missing a feature), please attach
|
||||||
|
* the debug trace from reinstalling the faulty version with `env PYENV_DEBUG=1 pyenv install -f -k -v <version> 2>&1 | tee trace.log`
|
||||||
|
* `config.log` from the build directory. When using `pyenv install` with `-k` as per above, the build directory will be under `$PYENV_ROOT/sources`.
|
||||||
|
|||||||
10
.github/dependabot.yml
vendored
Normal file
10
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "monthly"
|
||||||
|
groups:
|
||||||
|
github-actions:
|
||||||
|
patterns:
|
||||||
|
- "*"
|
||||||
19
.github/workflows/macos_build.yml
vendored
19
.github/workflows/macos_build.yml
vendored
@@ -1,18 +1,23 @@
|
|||||||
name: macos_build
|
name: macos_build
|
||||||
on: [pull_request, push]
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
macos_build:
|
macos_build:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
python-version:
|
python-version:
|
||||||
- 3.7.10
|
- "3.9"
|
||||||
- 3.8.10
|
- "3.10"
|
||||||
- 3.9.5
|
- "3.11"
|
||||||
- 3.10.0
|
- "3.12"
|
||||||
runs-on: macos-10.15
|
- "3.13"
|
||||||
|
runs-on: macos-14
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
# Normally, we would use the superbly maintained...
|
# Normally, we would use the superbly maintained...
|
||||||
# - uses: actions/setup-python@v2
|
# - uses: actions/setup-python@v2
|
||||||
# with:
|
# with:
|
||||||
@@ -27,7 +32,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo $PYENV_ROOT
|
echo $PYENV_ROOT
|
||||||
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
||||||
bin/pyenv install ${{ matrix.python-version }}
|
bin/pyenv --debug install ${{ matrix.python-version }}
|
||||||
bin/pyenv global ${{ matrix.python-version }}
|
bin/pyenv global ${{ matrix.python-version }}
|
||||||
bin/pyenv rehash
|
bin/pyenv rehash
|
||||||
- run: python --version
|
- run: python --version
|
||||||
|
|||||||
254
.github/workflows/modified_scripts_build.yml
vendored
254
.github/workflows/modified_scripts_build.yml
vendored
@@ -6,20 +6,29 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
versions: ${{steps.modified-versions.outputs.versions}}
|
versions: ${{steps.modified-versions.outputs.versions}}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- run: git fetch origin "$GITHUB_BASE_REF"
|
- run: git fetch origin "$GITHUB_BASE_REF"
|
||||||
- shell: bash
|
- shell: bash
|
||||||
run: >
|
run: >
|
||||||
versions=$(git diff "origin/$GITHUB_BASE_REF" --name-only -z
|
versions=$(git diff "origin/$GITHUB_BASE_REF" --name-only -z
|
||||||
| perl -ne 'BEGIN {$\="\n";$/="\0";} chomp;
|
| perl -ne 'BEGIN {$\="\n";$/="\0";} chomp;
|
||||||
if (/^plugins\/python-build\/share\/python-build\/(?:([^\/]+)|patches\/([^\/]+)\/.*)$/)
|
if (/^plugins\/python-build\/share\/python-build\/(?:([^\/]+)|patches\/([^\/]+)\/.*)$/ and -e $& )
|
||||||
{ print $1.$2; }' \
|
{ print $1.$2; }' \
|
||||||
| sort -u);
|
| sort -u);
|
||||||
echo -e "versions<<!\\n$versions\\n!" >> $GITHUB_ENV
|
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64);
|
||||||
|
echo "versions<<$EOF" >> $GITHUB_ENV;
|
||||||
|
echo "$versions" >> $GITHUB_ENV;
|
||||||
|
echo "$EOF" >> $GITHUB_ENV;
|
||||||
|
|
||||||
|
versions_cpython_only=$(grep -Ee '^[[:digit:]]' <<<"$version")
|
||||||
|
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64);
|
||||||
|
echo "versions_cpython_only<<$EOF" >> $GITHUB_ENV;
|
||||||
|
echo $versions_cpython_only >> $GITHUB_ENV;
|
||||||
|
echo "$EOF" >> $GITHUB_ENV;
|
||||||
- id: modified-versions
|
- id: modified-versions
|
||||||
run: |
|
run: |
|
||||||
echo -n "::set-output name=versions::"
|
echo "versions=`echo "${{ env.versions }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT
|
||||||
echo "${{ env.versions }}" | jq -R . | jq -sc .
|
echo "versions_cpython_only=`echo "${{ env.versions_cpython_only }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT
|
||||||
macos_build:
|
macos_build:
|
||||||
needs: discover_modified_scripts
|
needs: discover_modified_scripts
|
||||||
if: needs.discover_modified_scripts.outputs.versions != '[""]'
|
if: needs.discover_modified_scripts.outputs.versions != '[""]'
|
||||||
@@ -27,33 +36,115 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}}
|
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}}
|
||||||
os: ["macos-10.15", "macos-11"]
|
os: ["macos-13", "macos-14"]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- run: |
|
|
||||||
brew install openssl openssl@1.1 readline sqlite3 xz zlib
|
|
||||||
- run: |
|
- run: |
|
||||||
|
#envvars
|
||||||
export PYENV_ROOT="$GITHUB_WORKSPACE"
|
export PYENV_ROOT="$GITHUB_WORKSPACE"
|
||||||
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV
|
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV
|
||||||
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
||||||
- run: |
|
- run: |
|
||||||
pyenv install ${{ matrix.python-version }}
|
#prerequisites
|
||||||
pyenv global ${{ matrix.python-version }}
|
brew install openssl openssl@1.1 readline sqlite3 xz zlib
|
||||||
|
if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then
|
||||||
|
export PYENV_BOOTSTRAP_VERSION=pypy2.7-7
|
||||||
|
echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV
|
||||||
|
pyenv install $PYENV_BOOTSTRAP_VERSION
|
||||||
|
fi
|
||||||
- run: |
|
- run: |
|
||||||
python --version
|
#build
|
||||||
python -m pip --version
|
pyenv --debug install ${{ matrix.python-version }}
|
||||||
- shell: python # Prove that actual Python == expected Python
|
pyenv global ${{ matrix.python-version }}
|
||||||
env:
|
# Micropython doesn't support --version
|
||||||
|
- run: |
|
||||||
|
#print version
|
||||||
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
|
python -c 'import sys; print(sys.version)'
|
||||||
|
else
|
||||||
|
python --version
|
||||||
|
python -m pip --version
|
||||||
|
fi
|
||||||
|
# Micropython doesn't support sys.executable, os.path, older versions even os
|
||||||
|
- env:
|
||||||
EXPECTED_PYTHON: ${{ matrix.python-version }}
|
EXPECTED_PYTHON: ${{ matrix.python-version }}
|
||||||
run: |
|
run: |
|
||||||
import os, sys, os.path
|
#check
|
||||||
correct_dir = os.path.join(
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
os.environ['PYENV_ROOT'],
|
[[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1
|
||||||
'versions',
|
python -c 'import sys; assert sys.implementation.name == "micropython"'
|
||||||
os.environ['EXPECTED_PYTHON'],
|
else
|
||||||
'bin')
|
python -c 'if True:
|
||||||
assert os.path.dirname(sys.executable) == correct_dir
|
import os, sys, os.path
|
||||||
|
correct_dir = os.path.join(
|
||||||
|
os.environ["PYENV_ROOT"],
|
||||||
|
"versions",
|
||||||
|
os.environ["EXPECTED_PYTHON"],
|
||||||
|
"bin")
|
||||||
|
assert os.path.dirname(sys.executable) == correct_dir'
|
||||||
|
fi
|
||||||
|
# bundled executables in some Anaconda releases cause the post-run step to hang in MacOS
|
||||||
|
- run: |
|
||||||
|
pyenv global system
|
||||||
|
rm -f "$(pyenv root)"/shims/*
|
||||||
|
|
||||||
|
macos_build_bundled_dependencies:
|
||||||
|
needs: discover_modified_scripts
|
||||||
|
if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]'
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}}
|
||||||
|
os: ["macos-13", "macos-14"]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- run: |
|
||||||
|
#envvars
|
||||||
|
export PYENV_ROOT="$GITHUB_WORKSPACE"
|
||||||
|
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV
|
||||||
|
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
||||||
|
- run: |
|
||||||
|
#prerequisites
|
||||||
|
brew install sqlite3 xz zlib
|
||||||
|
"$GITHUB_WORKSPACE/.github/workflows/scripts/brew-uninstall-cascade.sh" openssl@3 openssl@1.1 readline
|
||||||
|
if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then
|
||||||
|
export PYENV_BOOTSTRAP_VERSION=pypy2.7-7
|
||||||
|
echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV
|
||||||
|
pyenv install $PYENV_BOOTSTRAP_VERSION
|
||||||
|
fi
|
||||||
|
- run: |
|
||||||
|
#build
|
||||||
|
pyenv --debug install ${{ matrix.python-version }}
|
||||||
|
pyenv global ${{ matrix.python-version }}
|
||||||
|
# Micropython doesn't support --version
|
||||||
|
- run: |
|
||||||
|
#print version
|
||||||
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
|
python -c 'import sys; print(sys.version)'
|
||||||
|
else
|
||||||
|
python --version
|
||||||
|
python -m pip --version
|
||||||
|
fi
|
||||||
|
# Micropython doesn't support sys.executable, os.path, older versions even os
|
||||||
|
- env:
|
||||||
|
EXPECTED_PYTHON: ${{ matrix.python-version }}
|
||||||
|
run: |
|
||||||
|
#check
|
||||||
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
|
[[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1
|
||||||
|
python -c 'import sys; assert sys.implementation.name == "micropython"'
|
||||||
|
else
|
||||||
|
python -c 'if True:
|
||||||
|
import os, sys, os.path
|
||||||
|
correct_dir = os.path.join(
|
||||||
|
os.environ["PYENV_ROOT"],
|
||||||
|
"versions",
|
||||||
|
os.environ["EXPECTED_PYTHON"],
|
||||||
|
"bin")
|
||||||
|
assert os.path.dirname(sys.executable) == correct_dir'
|
||||||
|
fi
|
||||||
# bundled executables in some Anaconda releases cause the post-run step to hang in MacOS
|
# bundled executables in some Anaconda releases cause the post-run step to hang in MacOS
|
||||||
- run: |
|
- run: |
|
||||||
pyenv global system
|
pyenv global system
|
||||||
@@ -66,32 +157,113 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}}
|
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}}
|
||||||
os: ["ubuntu-18.04", "ubuntu-20.04"]
|
os: ["ubuntu-22.04", "ubuntu-24.04"]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- run: |
|
|
||||||
sudo apt-get update -q; sudo apt-get install -yq build-essential \
|
|
||||||
libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \
|
|
||||||
wget curl llvm libncurses5-dev libncursesw5-dev \
|
|
||||||
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
|
|
||||||
- run: |
|
- run: |
|
||||||
|
#envvars
|
||||||
export PYENV_ROOT="$GITHUB_WORKSPACE"
|
export PYENV_ROOT="$GITHUB_WORKSPACE"
|
||||||
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV
|
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV
|
||||||
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
||||||
- run: |
|
- run: |
|
||||||
pyenv install ${{ matrix.python-version }}
|
#prerequisites
|
||||||
|
sudo apt-get update -q; sudo apt-get install -yq make build-essential \
|
||||||
|
libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \
|
||||||
|
curl llvm libncurses5-dev libncursesw5-dev \
|
||||||
|
xz-utils tk-dev libffi-dev liblzma-dev
|
||||||
|
if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then
|
||||||
|
export PYENV_BOOTSTRAP_VERSION=pypy2.7-7
|
||||||
|
echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV
|
||||||
|
pyenv install $PYENV_BOOTSTRAP_VERSION
|
||||||
|
fi
|
||||||
|
- run: |
|
||||||
|
#build
|
||||||
|
pyenv install -v ${{ matrix.python-version }}
|
||||||
pyenv global ${{ matrix.python-version }}
|
pyenv global ${{ matrix.python-version }}
|
||||||
- run: python --version
|
# Micropython doesn't support --version
|
||||||
- run: python -m pip --version
|
- run: |
|
||||||
- shell: python # Prove that actual Python == expected Python
|
#print version
|
||||||
env:
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
|
python -c 'import sys; print(sys.version)'
|
||||||
|
else
|
||||||
|
python --version
|
||||||
|
python -m pip --version
|
||||||
|
fi
|
||||||
|
# Micropython doesn't support sys.executable, os.path, older versions even os
|
||||||
|
- env:
|
||||||
EXPECTED_PYTHON: ${{ matrix.python-version }}
|
EXPECTED_PYTHON: ${{ matrix.python-version }}
|
||||||
run: |
|
run: |
|
||||||
import os, sys, os.path
|
#check
|
||||||
correct_dir = os.path.join(
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
os.environ['PYENV_ROOT'],
|
[[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1
|
||||||
'versions',
|
python -c 'import sys; assert sys.implementation.name == "micropython"'
|
||||||
os.environ['EXPECTED_PYTHON'],
|
else
|
||||||
'bin')
|
python -c 'if True:
|
||||||
assert os.path.dirname(sys.executable) == correct_dir
|
import os, sys, os.path
|
||||||
|
correct_dir = os.path.join(
|
||||||
|
os.environ["PYENV_ROOT"],
|
||||||
|
"versions",
|
||||||
|
os.environ["EXPECTED_PYTHON"],
|
||||||
|
"bin")
|
||||||
|
assert os.path.dirname(sys.executable) == correct_dir'
|
||||||
|
fi
|
||||||
|
ubuntu_build_tar_gz:
|
||||||
|
needs: discover_modified_scripts
|
||||||
|
if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]'
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}}
|
||||||
|
os: ["ubuntu-latest"]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- run: |
|
||||||
|
#envvars
|
||||||
|
export PYENV_ROOT="$GITHUB_WORKSPACE"
|
||||||
|
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV
|
||||||
|
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
||||||
|
echo "_PYTHON_BUILD_FORCE_SKIP_XZ=1" >> $GITHUB_PATH
|
||||||
|
- run: |
|
||||||
|
#prerequisites
|
||||||
|
sudo apt-get update -q; sudo apt-get install -yq make build-essential \
|
||||||
|
libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \
|
||||||
|
curl llvm libncurses5-dev libncursesw5-dev \
|
||||||
|
xz-utils tk-dev libffi-dev liblzma-dev
|
||||||
|
if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then
|
||||||
|
export PYENV_BOOTSTRAP_VERSION=pypy2.7-7
|
||||||
|
echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV
|
||||||
|
pyenv install $PYENV_BOOTSTRAP_VERSION
|
||||||
|
fi
|
||||||
|
- run: |
|
||||||
|
#build
|
||||||
|
pyenv install -v ${{ matrix.python-version }}
|
||||||
|
pyenv global ${{ matrix.python-version }}
|
||||||
|
# Micropython doesn't support --version
|
||||||
|
- run: |
|
||||||
|
#print version
|
||||||
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
|
python -c 'import sys; print(sys.version)'
|
||||||
|
else
|
||||||
|
python --version
|
||||||
|
python -m pip --version
|
||||||
|
fi
|
||||||
|
# Micropython doesn't support sys.executable, os.path, older versions even os
|
||||||
|
- env:
|
||||||
|
EXPECTED_PYTHON: ${{ matrix.python-version }}
|
||||||
|
run: |
|
||||||
|
#check
|
||||||
|
if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then
|
||||||
|
[[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1
|
||||||
|
python -c 'import sys; assert sys.implementation.name == "micropython"'
|
||||||
|
else
|
||||||
|
python -c 'if True:
|
||||||
|
import os, sys, os.path
|
||||||
|
correct_dir = os.path.join(
|
||||||
|
os.environ["PYENV_ROOT"],
|
||||||
|
"versions",
|
||||||
|
os.environ["EXPECTED_PYTHON"],
|
||||||
|
"bin")
|
||||||
|
assert os.path.dirname(sys.executable) == correct_dir'
|
||||||
|
fi
|
||||||
|
|||||||
56
.github/workflows/no-response.yml
vendored
56
.github/workflows/no-response.yml
vendored
@@ -1,26 +1,30 @@
|
|||||||
name: No Response
|
name: No Response
|
||||||
|
|
||||||
# Both `issue_comment` and `scheduled` event types are required for this Action
|
# Both `issue_comment` and `scheduled` event types are required for this Action
|
||||||
# to work properly.
|
# to work properly.
|
||||||
on:
|
on:
|
||||||
issue_comment:
|
issue_comment:
|
||||||
types: [created]
|
types: [created]
|
||||||
schedule:
|
schedule:
|
||||||
# Schedule for ten minutes after the hour, every hour
|
# Schedule for ten minutes after the hour, every hour
|
||||||
- cron: '10 * * * *'
|
- cron: '10 * * * *'
|
||||||
|
|
||||||
jobs:
|
permissions: {}
|
||||||
noResponse:
|
jobs:
|
||||||
runs-on: ubuntu-latest
|
noResponse:
|
||||||
steps:
|
permissions:
|
||||||
- uses: lee-dohm/no-response@v0.5.0
|
issues: write # to update issues (lee-dohm/no-response)
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
runs-on: ubuntu-latest
|
||||||
daysUntilClose: 30
|
steps:
|
||||||
responseRequiredLabel: need-feedback
|
- uses: lee-dohm/no-response@v0.5.0
|
||||||
closeComment: >
|
with:
|
||||||
This issue has been automatically closed because there has been no response
|
token: ${{ github.token }}
|
||||||
to our request for more information from the original author. With only the
|
daysUntilClose: 30
|
||||||
information that is currently in the issue, we don't have enough information
|
responseRequiredLabel: need-feedback
|
||||||
to take action. Please reach out if you have or find the answers we need so
|
closeComment: >
|
||||||
that we can investigate further.
|
This issue has been automatically closed because there has been no response
|
||||||
|
to our request for more information from the original author. With only the
|
||||||
|
information that is currently in the issue, we don't have enough information
|
||||||
|
to take action. Please reach out if you have or find the answers we need so
|
||||||
|
that we can investigate further.
|
||||||
|
|||||||
19
.github/workflows/pyenv_tests.yml
vendored
19
.github/workflows/pyenv_tests.yml
vendored
@@ -1,18 +1,22 @@
|
|||||||
name: pyenv_tests
|
name: pyenv_tests
|
||||||
on: [pull_request, push]
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pyenv_tests:
|
pyenv_tests:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os:
|
os:
|
||||||
- ubuntu-20.04
|
- ubuntu-24.04
|
||||||
- ubuntu-18.04
|
- ubuntu-22.04
|
||||||
- macos-11
|
- macos-14
|
||||||
- macos-10.15
|
- macos-13
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
# Normally, we would use the superbly maintained...
|
# Normally, we would use the superbly maintained...
|
||||||
# - uses: actions/setup-python@v2
|
# - uses: actions/setup-python@v2
|
||||||
# with:
|
# with:
|
||||||
@@ -38,3 +42,8 @@ jobs:
|
|||||||
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
||||||
- run: |
|
- run: |
|
||||||
make test
|
make test
|
||||||
|
- env:
|
||||||
|
PYENV_NATIVE_EXT: 1
|
||||||
|
run: |
|
||||||
|
(cd src; ./configure; make)
|
||||||
|
bats/bin/bats test/{pyenv,hooks,versions}.bats
|
||||||
11
.github/workflows/scripts/brew-uninstall-cascade.sh
vendored
Executable file
11
.github/workflows/scripts/brew-uninstall-cascade.sh
vendored
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
declare -a packages rdepends
|
||||||
|
packages=("$@")
|
||||||
|
|
||||||
|
# have to try one by one, otherwise `brew uses` would only print
|
||||||
|
# packages that require them all rather than any of them
|
||||||
|
for package in "${packages[@]}"; do
|
||||||
|
rdepends+=($(brew uses --installed --include-build --include-test --include-optional --recursive "$package"))
|
||||||
|
done
|
||||||
|
brew uninstall "${packages[@]}" "${rdepends[@]}"
|
||||||
25
.github/workflows/ubuntu_build.yml
vendored
25
.github/workflows/ubuntu_build.yml
vendored
@@ -1,27 +1,32 @@
|
|||||||
name: ubuntu_build
|
name: ubuntu_build
|
||||||
on: [pull_request, push]
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ubuntu_build:
|
ubuntu_build:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
python-version:
|
python-version:
|
||||||
- 3.7.10
|
- "3.9"
|
||||||
- 3.8.10
|
- "3.10"
|
||||||
- 3.9.5
|
- "3.11"
|
||||||
- 3.10.0
|
- "3.12"
|
||||||
runs-on: Ubuntu-20.04
|
- "3.13"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
# Normally, we would use the superbly maintained...
|
# Normally, we would use the superbly maintained...
|
||||||
# - uses: actions/setup-python@v2
|
# - uses: actions/setup-python@v2
|
||||||
# with:
|
# with:
|
||||||
# python-version: ${{ matrix.python-version }}
|
# python-version: ${{ matrix.python-version }}
|
||||||
# ... but in the repo, we want to test pyenv builds on Ubuntu
|
# ... but in the repo, we want to test pyenv builds on Ubuntu
|
||||||
- run: |
|
- run: |
|
||||||
sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \
|
sudo apt-get update -q; sudo apt install -yq make build-essential libssl-dev zlib1g-dev \
|
||||||
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
|
libbz2-dev libreadline-dev libsqlite3-dev curl \
|
||||||
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
|
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
|
||||||
# https://github.com/pyenv/pyenv#installation
|
# https://github.com/pyenv/pyenv#installation
|
||||||
- run: pwd
|
- run: pwd
|
||||||
- env:
|
- env:
|
||||||
@@ -29,7 +34,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo $PYENV_ROOT
|
echo $PYENV_ROOT
|
||||||
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
|
||||||
bin/pyenv install ${{ matrix.python-version }}
|
bin/pyenv --debug install ${{ matrix.python-version }}
|
||||||
bin/pyenv global ${{ matrix.python-version }}
|
bin/pyenv global ${{ matrix.python-version }}
|
||||||
bin/pyenv rehash
|
bin/pyenv rehash
|
||||||
- run: python --version
|
- run: python --version
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,3 +8,5 @@
|
|||||||
/src/*.o
|
/src/*.o
|
||||||
/bats/
|
/bats/
|
||||||
/default-packages
|
/default-packages
|
||||||
|
.idea
|
||||||
|
*.un~
|
||||||
|
|||||||
83
.travis.yml
83
.travis.yml
@@ -1,83 +0,0 @@
|
|||||||
# Two types of tests:
|
|
||||||
#
|
|
||||||
# 1. shell tests run using bats
|
|
||||||
# 2. build tests also run using bats
|
|
||||||
#
|
|
||||||
# Shell tests are run unconditionally on Linux (see jobs.include).
|
|
||||||
#
|
|
||||||
# Build tests can be skipped by starting the commit message with
|
|
||||||
# '[skip build]'.
|
|
||||||
#
|
|
||||||
# Build tests are run on platforms generated from all combinations
|
|
||||||
# of keys below.
|
|
||||||
language: c
|
|
||||||
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
|
|
||||||
dist:
|
|
||||||
- focal
|
|
||||||
|
|
||||||
# https://docs.travis-ci.com/user/reference/osx/#macos-version
|
|
||||||
osx_image:
|
|
||||||
- xcode9.4.1 # macOS 10.13.6
|
|
||||||
- xcode10.3 # macOS 10.14.4
|
|
||||||
- xcode11.6 # macOS 10.15.7
|
|
||||||
- xcode12.2 # macOS 10.15.7
|
|
||||||
|
|
||||||
env:
|
|
||||||
- PYTHON_BUILD_VERSION=3.9.1
|
|
||||||
- PYTHON_BUILD_VERSION=3.7.5
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- date +%Y-%m-%dT%H:%M:%S
|
|
||||||
|
|
||||||
install: git clone --depth 1 --branch v1.2.0 https://github.com/bats-core/bats-core.git bats
|
|
||||||
|
|
||||||
# Default for auto-generated jobs.
|
|
||||||
script: make test-build
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
# Shell-based tests should execute every time.
|
|
||||||
- stage: test shell
|
|
||||||
script: make test
|
|
||||||
env: PYENV_NATIVE_EXT=1
|
|
||||||
after_script: []
|
|
||||||
os: linux
|
|
||||||
- stage: test shell
|
|
||||||
script: make test
|
|
||||||
env: PYENV_NATIVE_EXT=
|
|
||||||
after_script: []
|
|
||||||
os: linux
|
|
||||||
|
|
||||||
exclude:
|
|
||||||
# For each osx_image but one there should be an entry in the exclude
|
|
||||||
# list, to prevent duplicate Linux builds.
|
|
||||||
- os: linux
|
|
||||||
osx_image: xcode9.4
|
|
||||||
- os: linux
|
|
||||||
osx_image: xcode10
|
|
||||||
|
|
||||||
allow_failures:
|
|
||||||
- env: PYTHON_BUILD_VERSION=3.9.1
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- test shell
|
|
||||||
- name: test
|
|
||||||
if: NOT (commit_message =~ /^\[skip build\]/)
|
|
||||||
|
|
||||||
# Default
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email:
|
|
||||||
on_success: never
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: releases
|
|
||||||
api_key:
|
|
||||||
secure: FLWevL09KYp7V1SjJUNEdWzuomuocXwNvPr1DSAFH7mmrjKTtjzwrjINAthSqzjlDrs5B//P47l1VLyHp5byEzy673W+bOmEg8swmqc7E9FrHLRyEByd/yca3DzkZgXEXgGdY/cl7tHhM4V2fYKEgAIWbFV+takmTFMK4WkEtNg=
|
|
||||||
on:
|
|
||||||
repo: pyenv/pyenv
|
|
||||||
tags: true
|
|
||||||
429
CHANGELOG.md
429
CHANGELOG.md
@@ -1,4 +1,431 @@
|
|||||||
## Version History
|
# Version History
|
||||||
|
|
||||||
|
## Release v2.5.5
|
||||||
|
* Add graalpy 24.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3215
|
||||||
|
* Switch 3.9+ to OpenSSL 3 by @native-api in https://github.com/pyenv/pyenv/pull/3223
|
||||||
|
* Add miniforge3-24.11.3-1, miniforge3-24.11.3-2, miniforge3-25.1.1 by @native-api in https://github.com/pyenv/pyenv/pull/3224
|
||||||
|
* Add CPython 3.9.22, 3.10.17, 3.11.12, 3.12.10, 3.13.3, 3.14.0a7 by @native-api in https://github.com/pyenv/pyenv/pull/3233
|
||||||
|
|
||||||
|
## Release v2.5.4
|
||||||
|
* Add anaconda3-2025.1.1-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3198
|
||||||
|
* Add PyPy v7.3.19 by @jsirois in https://github.com/pyenv/pyenv/pull/3205
|
||||||
|
* Add CPython 3.14.0a6 by @nedbat in https://github.com/pyenv/pyenv/pull/3213
|
||||||
|
|
||||||
|
## Release v2.5.3
|
||||||
|
* Add PyPy v7.3.18 by @dand-oss in https://github.com/pyenv/pyenv/pull/3184
|
||||||
|
* Add Miniconda3 25.1.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3190
|
||||||
|
* Add miniforge3-25.1.1-0, miniforge3-24.11.3-0 by @native-api in https://github.com/pyenv/pyenv/pull/3191
|
||||||
|
* Add CPython 3.14.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3194
|
||||||
|
* Add Miniconda3 25.1.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3192
|
||||||
|
* Update hashes for Python 3.14.0a5 tarballs by @jsirois in https://github.com/pyenv/pyenv/pull/3196
|
||||||
|
* rehash: Do not execute conda-specific code if conda is not installed by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3151
|
||||||
|
|
||||||
|
## Release v2.5.2
|
||||||
|
* Fix OpenSSL version parsing in python-build script by @threadflow in https://github.com/pyenv/pyenv/pull/3181
|
||||||
|
* Add GraalPy 24.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3176
|
||||||
|
* Add CPython 3.12.9 and 3.13.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3183
|
||||||
|
|
||||||
|
## Release v2.5.1
|
||||||
|
* CI: use Ubuntu 24.04; use ubuntu-latest for the ubuntu_build check by @native-api in https://github.com/pyenv/pyenv/pull/3144
|
||||||
|
* Fix: mistake in configuration hints in `pyenv init` and manpage by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3145
|
||||||
|
* README: Add recommended curl arguments to suggested installer invocation by @JayBazuzi in https://github.com/pyenv/pyenv/pull/3155
|
||||||
|
* Add miniforge3-24.11.2-0, miniforge3-24.11.2-1 by @native-api in https://github.com/pyenv/pyenv/pull/3163
|
||||||
|
* Fix "Unsupported options" error building bundled OpenSSL <3.2.0 by @native-api in https://github.com/pyenv/pyenv/pull/3164
|
||||||
|
* Add CPython 3.14.0a4 by @nedbat in https://github.com/pyenv/pyenv/pull/3168
|
||||||
|
|
||||||
|
## Release v2.5.0
|
||||||
|
* `pyenv init -` performance improvements; recommend using `pyenv init - <shell>` by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3136
|
||||||
|
* Add miniconda3-24.11.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3138
|
||||||
|
* Add miniconda3-24.3.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3139
|
||||||
|
* CI: only run macos_build_bundled_dependencies and ubuntu_build_tar_gz for CPython by @native-api in https://github.com/pyenv/pyenv/pull/3141
|
||||||
|
* Add miniforge3 and mambaforge3 24.1.2-0, 24.3.0-0, 24.5.0-0, 24.7.1-0, 24.7.1-1, 24.7.1-2, 24.9.0-0, 24.9.2-0, 24.11.0-0, 24.11.0-1 by @native-api in https://github.com/pyenv/pyenv/pull/3142
|
||||||
|
* Skip broken miniforge3/mambaforge3 22.11.0-0, 22.11.0-1, 22.11.0-2 in the generation script by @native-api in https://github.com/pyenv/pyenv/pull/3143
|
||||||
|
|
||||||
|
## Release v2.4.23
|
||||||
|
* README: explain using multiple versions by @Finkregh in https://github.com/pyenv/pyenv/pull/3126
|
||||||
|
* Support PACKAGE_CPPFLAGS and PACKAGE_LDFLAGS by @native-api in https://github.com/pyenv/pyenv/pull/3130
|
||||||
|
* Adjust suggested shell startup code to support Pyenv with Pyenv-Win in WSL by @native-api in https://github.com/pyenv/pyenv/pull/3132
|
||||||
|
* Support nonexistent versions being present and set in a local .python-version by @native-api in https://github.com/pyenv/pyenv/pull/3134
|
||||||
|
* Add CPython 3.14.0a3 by @nedbat in https://github.com/pyenv/pyenv/pull/3135
|
||||||
|
|
||||||
|
## Release v2.4.22
|
||||||
|
* Speed up building bundled OpenSSL by @native-api in https://github.com/pyenv/pyenv/pull/3124
|
||||||
|
* CI: add building modified scripts with bundled MacOS dependencies by @native-api in https://github.com/pyenv/pyenv/pull/3123
|
||||||
|
* CL: + test modified scripts with tar.gz source by @native-api in https://github.com/pyenv/pyenv/pull/3125
|
||||||
|
* Fix 404 for openssl-3.4.0 release in build 3.13.1 by @dlamblin in https://github.com/pyenv/pyenv/pull/3122
|
||||||
|
|
||||||
|
## Release v2.4.21
|
||||||
|
* Add CPython 3.13.1t by @makukha in https://github.com/pyenv/pyenv/pull/3120
|
||||||
|
* Prefer tcl-tk@8 from Homebrew due to release of Tcl/Tk 9 with which only 3.12+ are compatible by @native-api in https://github.com/pyenv/pyenv/pull/3118
|
||||||
|
|
||||||
|
## Release v2.4.20
|
||||||
|
* README: Fix Markdown in "Notes about python releases" by @noelleleigh in https://github.com/pyenv/pyenv/pull/3112
|
||||||
|
* README: correct link to shell setup instructions by @shortcuts in https://github.com/pyenv/pyenv/pull/3113
|
||||||
|
* Add CPython 3.9.21, 3.10.16, 3.11.11, 3.12.8 and 3.13.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3117
|
||||||
|
|
||||||
|
## Release v2.4.19
|
||||||
|
* Add CPython 3.14.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3110
|
||||||
|
* Add quick start section and gif demo to accompany it. by @madhu-GG in https://github.com/pyenv/pyenv/pull/3044
|
||||||
|
|
||||||
|
## Release v2.4.18
|
||||||
|
* Add miniforge3-24.9.2-0 by @goerz in https://github.com/pyenv/pyenv/pull/3106
|
||||||
|
|
||||||
|
## Release v2.4.17
|
||||||
|
* Add miniconda3-24.9.2-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3096
|
||||||
|
* Add Anaconda3-2024.10-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3097
|
||||||
|
|
||||||
|
## Release v2.4.16
|
||||||
|
* Add GraalPy 24.1.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3092
|
||||||
|
* Add CPython 3.14.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3093
|
||||||
|
|
||||||
|
## Release v2.4.15
|
||||||
|
* CI: replace set-output with GITHUB_OUTPUT by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3079
|
||||||
|
* Make uninstall yes/no prompt consistent with others by @dpoznik in https://github.com/pyenv/pyenv/pull/3080
|
||||||
|
* Add CPython 3.13.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3081
|
||||||
|
* Avoid shadowing of virtualenvs with the name starting with "python-" by @aarbouin in https://github.com/pyenv/pyenv/pull/3086
|
||||||
|
* Support free-threaded CPython flavor in prefix resolution by @native-api in https://github.com/pyenv/pyenv/pull/3090
|
||||||
|
|
||||||
|
## Release v2.4.14
|
||||||
|
* Add CPython 3.12.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3078
|
||||||
|
* Add CPython 3.13.0rc3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3077
|
||||||
|
|
||||||
|
## Release v2.4.13
|
||||||
|
* docs: Use `--verbose` with performance CPython build instructions by @caerulescens in https://github.com/pyenv/pyenv/pull/3053
|
||||||
|
* Fix latest version resolution when using `python-` prefix by @edmorley in https://github.com/pyenv/pyenv/pull/3056
|
||||||
|
* Fix tgz checksum for 3.9.20; fallback OpenSSL URLs and checksums by @native-api in https://github.com/pyenv/pyenv/pull/3060
|
||||||
|
* Fix OpenSSL 3.3.2 download URLs by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3059
|
||||||
|
* Add GraalPy 24.1.0 by @msimacek in https://github.com/pyenv/pyenv/pull/3066
|
||||||
|
|
||||||
|
## Release v2.4.12
|
||||||
|
* Add CPython 3.13.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3049
|
||||||
|
* Add CPython 3.8.20, 3.9.20, 3.10.15, 3.11.10 and 3.12.6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3050
|
||||||
|
|
||||||
|
## Release v2.4.11
|
||||||
|
* Add /usr/etc/pyenv.d to hooks path by @tomschr in https://github.com/pyenv/pyenv/pull/3039
|
||||||
|
* Add miniconda3-24.7.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3040
|
||||||
|
* Add PyPy v7.3.17 by @jsirois in https://github.com/pyenv/pyenv/pull/3045
|
||||||
|
|
||||||
|
## Release v2.4.10
|
||||||
|
* Add CPython 3.12.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3030
|
||||||
|
|
||||||
|
## Release v2.4.9
|
||||||
|
* Add miniforge3-24.3.0-0 by @goerz in https://github.com/pyenv/pyenv/pull/3028
|
||||||
|
* Add CPython 3.13.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3029
|
||||||
|
|
||||||
|
## Release v2.4.8
|
||||||
|
* Fix pyenv-uninstall not having the debug tracing invocation by @native-api in https://github.com/pyenv/pyenv/pull/3020
|
||||||
|
* Add CPython 3.13.0b4 and 3.13.0b4t by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3019
|
||||||
|
* README: Remove reference to Fig by @ThomasHaz in https://github.com/pyenv/pyenv/pull/3018
|
||||||
|
* Fix tests failing if plugins are installed by @native-api in https://github.com/pyenv/pyenv/pull/3022
|
||||||
|
* pyenv-latest: replace -q with -b and -f, document as internal by @native-api in https://github.com/pyenv/pyenv/pull/3021
|
||||||
|
|
||||||
|
## Release v2.4.7
|
||||||
|
* Add support for anaconda3-2024.06-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3009
|
||||||
|
* Fix debug build for X.Yt-dev by @native-api in https://github.com/pyenv/pyenv/pull/
|
||||||
|
|
||||||
|
## Release v2.4.6
|
||||||
|
* CI: push MacOS jobs to MacOS 13 and 14 by @native-api in https://github.com/pyenv/pyenv/pull/3002
|
||||||
|
* Add 3.13.0b3t and exclude it from `pyenv latest` by @colesbury in https://github.com/pyenv/pyenv/pull/3001
|
||||||
|
* Speed up `pyenv prefix` by not constructing advice text when it would be discarded by @Erotemic in https://github.com/pyenv/pyenv/pull/3005
|
||||||
|
|
||||||
|
## Release v2.4.5
|
||||||
|
* Add CPython 3.13.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2996
|
||||||
|
|
||||||
|
## Release v2.4.4
|
||||||
|
* Add support for miniconda3 24.5.0-0 with py3.12, py3.11, py3.10, py3.9 by @binbjz in https://github.com/pyenv/pyenv/pull/2994
|
||||||
|
* Add support for free-threaded Python by @colesbury in https://github.com/pyenv/pyenv/pull/2995
|
||||||
|
|
||||||
|
## Release v2.4.3
|
||||||
|
* Add miniconda3 24.4.0-0 by @binbjz in https://github.com/pyenv/pyenv/pull/2982
|
||||||
|
|
||||||
|
## Release v2.4.2
|
||||||
|
* Add script to install graalpy development builds by @timfel in https://github.com/pyenv/pyenv/pull/2969
|
||||||
|
* Correct the Explanation of PATH Variable Lookup by @Y-askour in https://github.com/pyenv/pyenv/pull/2975
|
||||||
|
* Document PYTHON_BUILD_CURL_OPTS, PYTHON_BUILD_WGET_OPTS, PYTHON_BUILD_ARIA2_OPTS by @native-api in https://github.com/pyenv/pyenv/pull/2976
|
||||||
|
* Add sed and greadlink to shim exceptions by @native-api in https://github.com/pyenv/pyenv/pull/2977
|
||||||
|
* Add CPython 3.13.0b2 by @jsirois in https://github.com/pyenv/pyenv/pull/2978
|
||||||
|
* Add CPython 3.12.4 by @xxzgc in https://github.com/pyenv/pyenv/pull/2981
|
||||||
|
|
||||||
|
## Release v2.4.1
|
||||||
|
* Add CPython 3.12.3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2941
|
||||||
|
* Add CPython 3.13.0a6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2942
|
||||||
|
* Add PyPy v7.3.16 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2948
|
||||||
|
* Add CPython 3.14-dev, update 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2960
|
||||||
|
* Add CPython 3.13.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2959
|
||||||
|
|
||||||
|
## Release v2.4.0
|
||||||
|
* Add CPython 3.13.0a4 by @saaketp in https://github.com/pyenv/pyenv/pull/2903
|
||||||
|
* Handle the case where `pyenv-commands --sh` returns nothing by @aphedges in https://github.com/pyenv/pyenv/pull/2908
|
||||||
|
* Document default build configuration customizations by @native-api in https://github.com/pyenv/pyenv/pull/2911
|
||||||
|
* Use Homebrew in Linux if Pyenv is installled with Homebrew by @native-api in https://github.com/pyenv/pyenv/pull/2906
|
||||||
|
* Add miniforge and mambaforge 22.11.1-3, 22.11.1-4, 23.1.0-0 to 23.11.0-0 by @aphedges in https://github.com/pyenv/pyenv/pull/2909
|
||||||
|
* Add miniconda3-24.1.2 by @binbjz in https://github.com/pyenv/pyenv/pull/2915
|
||||||
|
* Minor grammar fix in libffi backport patch in 2.5.x by @cuinix in https://github.com/pyenv/pyenv/pull/2922
|
||||||
|
* Add CPython 3.13.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2924
|
||||||
|
* Add CPython 3.8.19 and 3.9.19 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2929
|
||||||
|
* Add GraalPy 24.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2928
|
||||||
|
* Add CPython 3.10.14 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2930
|
||||||
|
* Add Jython 2.7.3 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/2936
|
||||||
|
* Add CPython 3.11.9 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2938
|
||||||
|
* Add anaconda 2024.02 by @native-api in https://github.com/pyenv/pyenv/pull/2939
|
||||||
|
|
||||||
|
## Release v2.3.36
|
||||||
|
* Add a Dependabot config to auto-update GitHub action versions by @kurtmckee in https://github.com/pyenv/pyenv/pull/2863
|
||||||
|
* Bump the github-actions group with 1 update by @dependabot in https://github.com/pyenv/pyenv/pull/2864
|
||||||
|
* Add installation prefix to `python-config --ldflags` output by @mhaeuser in https://github.com/pyenv/pyenv/pull/2865
|
||||||
|
* Add support for miniconda3 23.11.0-1, 23.11.0-2 with py3.11, py3.10, py3.9, py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2870
|
||||||
|
* Add micropython 1.20.0 and 1.21.0 by @cpzt in https://github.com/pyenv/pyenv/pull/2869
|
||||||
|
* Make "Automatic installer" command in the README a copy-able code block by @ryan-williams in https://github.com/pyenv/pyenv/pull/2874
|
||||||
|
* Add PyPy 7.3.14 by @dand-oss in https://github.com/pyenv/pyenv/pull/2876
|
||||||
|
* Add graalpy-23.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/2884
|
||||||
|
* Add CPython 3.13.0a3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2885
|
||||||
|
* Add PyPy v7.3.15 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2886
|
||||||
|
* Update pypy3.9-7.3.13 checksums by @ecerulm in https://github.com/pyenv/pyenv/pull/2887
|
||||||
|
* Add CPython 3.12.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2899
|
||||||
|
* Add CPython 3.11.8 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2898
|
||||||
|
|
||||||
|
## Release v2.3.35
|
||||||
|
* Add CPython 3.12.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2861
|
||||||
|
|
||||||
|
## Release v2.3.34
|
||||||
|
* Fix graalpy-community to use a separate package name by @native-api in https://github.com/pyenv/pyenv/pull/2855
|
||||||
|
* Move 3.11.5+ to OpenSSL 3 by default by @native-api in https://github.com/pyenv/pyenv/pull/2858
|
||||||
|
* Add CPython 3.11.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2860
|
||||||
|
|
||||||
|
## Release v2.3.33
|
||||||
|
* Add miniforge3-23.3.1-1 by @goerz in https://github.com/pyenv/pyenv/pull/2839
|
||||||
|
* Add support for miniconda3-3.11-23.10.0-1 by @binbjz in https://github.com/pyenv/pyenv/pull/2843
|
||||||
|
* Add support for miniconda3 23.10.0-1 with py3.10、py3.9、py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2844
|
||||||
|
* Add CPython 3.13.0a2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2849
|
||||||
|
* python-build: Document PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA and PYTHON_BUILD_HTTP_CLIENT by @native-api in https://github.com/pyenv/pyenv/pull/2853
|
||||||
|
|
||||||
|
## Release v2.3.32
|
||||||
|
* Describe --no-rehash option in the manpage by @fsc-eriker in https://github.com/pyenv/pyenv/pull/2832
|
||||||
|
* Make adding $PYENV_ROOT/bin to PATH independent of other software by @native-api in https://github.com/pyenv/pyenv/pull/2837
|
||||||
|
* Make `pyenv init` output insertable to startup files by @native-api in https://github.com/pyenv/pyenv/pull/2838
|
||||||
|
|
||||||
|
## Release v2.3.31
|
||||||
|
* Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2824
|
||||||
|
|
||||||
|
## Release v2.3.30
|
||||||
|
|
||||||
|
* Fix intermittent "broken pipe" in tests by @native-api in https://github.com/pyenv/pyenv/pull/2817
|
||||||
|
* Add CPython 3.13.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2818
|
||||||
|
* Add PyPy 7.3.13 by @dand-oss in https://github.com/pyenv/pyenv/pull/2807
|
||||||
|
* Fix linking against Homebrew's Tcl/Tk 8.6.13 in MacOS by @startergo in https://github.com/pyenv/pyenv/pull/2820
|
||||||
|
|
||||||
|
## Release v2.3.29
|
||||||
|
|
||||||
|
* Add CPython 3.11.6 by @thecesrom in https://github.com/pyenv/pyenv/pull/2806
|
||||||
|
* Add GraalPy 23.1.0 definition using the faster Oracle GraalVM distribution by @eregon in https://github.com/pyenv/pyenv/pull/2812
|
||||||
|
* Install ncurses from Homebrew, if available by @aphedges in https://github.com/pyenv/pyenv/pull/2813
|
||||||
|
|
||||||
|
## Release v2.3.28
|
||||||
|
|
||||||
|
* Prioritize 'zlib from xcode sdk' flag correctly by @native-api in https://github.com/pyenv/pyenv/pull/2791
|
||||||
|
* Prefer OpenSSL 3 in Homebrew in 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2793
|
||||||
|
* Add CPython 3.12.0rc3 by @saaketp in https://github.com/pyenv/pyenv/pull/2795
|
||||||
|
* Add graalpy-23.1.0 and split between graalpy and graalpy-community by @msimacek in https://github.com/pyenv/pyenv/pull/2796
|
||||||
|
* Update the OpenSSL dependency for Python 2.7.18 by @lpapp-foundry in https://github.com/pyenv/pyenv/pull/2797
|
||||||
|
* Add CPython 3.12.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2804
|
||||||
|
|
||||||
|
## Release v2.3.27
|
||||||
|
|
||||||
|
* Prefer OpenSSL 3 in Homebrew since 3.12 by @native-api in https://github.com/pyenv/pyenv/pull/2781
|
||||||
|
* Fix get-pip urls for older pypy versions by @TimPansino in https://github.com/pyenv/pyenv/pull/2788
|
||||||
|
* Update openssl url for 3.12.0rc2 by @zsol in https://github.com/pyenv/pyenv/pull/2789
|
||||||
|
|
||||||
|
## Release v2.3.26
|
||||||
|
|
||||||
|
* Prevent `grep` warning in `conda.bash` by @aphedges in https://github.com/pyenv/pyenv/pull/2768
|
||||||
|
* fix a typo in README.md by @xzmeng in https://github.com/pyenv/pyenv/pull/2769
|
||||||
|
* use -I with ensurepip by @xaocon in https://github.com/pyenv/pyenv/pull/2764
|
||||||
|
* Add CPython 3.12.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2778
|
||||||
|
|
||||||
|
## Release v2.3.25
|
||||||
|
|
||||||
|
* Add CPython 3.8.18, 3.9.18, 3.10.13, 3.11.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2763
|
||||||
|
|
||||||
|
## Release v2.3.24
|
||||||
|
|
||||||
|
* README update: Added UNIX reference near Automatic installer by @VictorieeMan in https://github.com/pyenv/pyenv/pull/2744
|
||||||
|
* Fix FreeBSD tests in MacOS CI by @native-api in https://github.com/pyenv/pyenv/pull/2748
|
||||||
|
* Add CPython 3.12.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2752
|
||||||
|
* [Add an updated Anaconda and Miniconda installers](https://github.com/pyenv/pyenv/commit/db871427c7a232e18ee7a6dc0182989a646ccca9)
|
||||||
|
|
||||||
|
## Release v2.3.23
|
||||||
|
|
||||||
|
* Add CPython 3.12.0b4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2741
|
||||||
|
* Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2742
|
||||||
|
|
||||||
|
## Release v2.3.22
|
||||||
|
|
||||||
|
* Add CPython 3.12.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2730
|
||||||
|
* Add Cinder 3.10 and Cinder configure patches by @filips123 in https://github.com/pyenv/pyenv/pull/2739
|
||||||
|
|
||||||
|
## Release v2.3.21
|
||||||
|
|
||||||
|
* Add graalpy-23.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2724
|
||||||
|
* Add PyPy 7.3.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2726
|
||||||
|
* Fix occasional 'libexec/pyenv-latest: line 39: printf: write error: Broken pipe' by @native-api in https://github.com/pyenv/pyenv/pull/2729
|
||||||
|
|
||||||
|
## Release v2.3.20
|
||||||
|
|
||||||
|
* Backport bpo-42351 to 3.5.10 by @native-api in https://github.com/pyenv/pyenv/pull/2717
|
||||||
|
* Add missing patches for Python 3.7/3.8/3.9 by @tomkins in https://github.com/pyenv/pyenv/pull/2718
|
||||||
|
|
||||||
|
## Release v2.3.19
|
||||||
|
|
||||||
|
* Add CPython 3.7.17, 3.8.17 and 3.9.17 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2711
|
||||||
|
* Add CPython 3.11.4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2715
|
||||||
|
* Add CPython 3.10.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2714
|
||||||
|
* Add CPython 3.12.0b2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2713
|
||||||
|
|
||||||
|
## Release 2.3.18
|
||||||
|
|
||||||
|
* Fix not showing symlink contents for unselected versions in `pyenv versions` by @native-api in https://github.com/pyenv/pyenv/pull/2675
|
||||||
|
* Correct link in has_tar_xz_support else branch of 3.10.11 and 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2677
|
||||||
|
* Fix #2682: Correct pyenv_user_setup.bash file by @tomschr in https://github.com/pyenv/pyenv/pull/2687
|
||||||
|
* fix: updating heredoc delimiter to be random and unique by @aviadhahami in https://github.com/pyenv/pyenv/pull/2691
|
||||||
|
* Support ksh alternative names by @kpschoedel in https://github.com/pyenv/pyenv/pull/2697
|
||||||
|
* Add CPython 3.12.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2701
|
||||||
|
* Update 3.12-dev and add 3.13-dev by @t0b3 in https://github.com/pyenv/pyenv/pull/2703
|
||||||
|
|
||||||
|
## Release 2.3.17
|
||||||
|
|
||||||
|
* Try locate `readlink` first in pyenv-hooks, fix #2654 by @Harry-Chen in https://github.com/pyenv/pyenv/pull/2655
|
||||||
|
* Add CPython 3.12.0a7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2668
|
||||||
|
* Add CPython 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2671
|
||||||
|
* Add CPython 3.10.11 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2670
|
||||||
|
|
||||||
|
## Release 2.3.16
|
||||||
|
|
||||||
|
* Add Miniforge3-22.11.1-4 by @jlec in https://github.com/pyenv/pyenv/pull/2642
|
||||||
|
* Add Anaconda3-2023.03 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2648
|
||||||
|
|
||||||
|
## Release 2.3.15
|
||||||
|
|
||||||
|
* Add miniconda 23.1.0-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2635
|
||||||
|
* Add CPython 3.12.0a6 by @saaketp in https://github.com/pyenv/pyenv/pull/2638
|
||||||
|
|
||||||
|
## Release 2.3.14
|
||||||
|
|
||||||
|
* Fix indentation by @rafrafek in https://github.com/pyenv/pyenv/pull/2620
|
||||||
|
* Support for "BusyBox version" of "head" by @schuellerf in https://github.com/pyenv/pyenv/pull/2629
|
||||||
|
* bpo-27987 for v3.5.10 and v3.6.15: align by 16bytes on 64bit platforms by @chaimleib in https://github.com/pyenv/pyenv/pull/2630
|
||||||
|
* bpo-36231 for v3.5.10: fix Unsupported MacOS X CPU type in ffi.h by @chaimleib in https://github.com/pyenv/pyenv/pull/2633
|
||||||
|
* README: clarify behavior of `pyenv latest` by @mrienstra in https://github.com/pyenv/pyenv/pull/2634
|
||||||
|
|
||||||
|
## Release 2.3.13
|
||||||
|
|
||||||
|
* Fix pyenv-latest to ignore virtualenvs by @native-api in https://github.com/pyenv/pyenv/pull/2608
|
||||||
|
* Show symlink contents in non-bare `pyenv versions' by @native-api in https://github.com/pyenv/pyenv/pull/2609
|
||||||
|
* Ignore virtualenvs in `pyenv latest' in a clean way by @native-api in https://github.com/pyenv/pyenv/pull/2610
|
||||||
|
* Fix link resolving in pyenv-versions by @laggardkernel in https://github.com/pyenv/pyenv/pull/2612
|
||||||
|
* Add CPython 3.11.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2615
|
||||||
|
* Add CPython 3.10.10 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2616
|
||||||
|
* Add CPython 3.12.0a5 by @Afront in https://github.com/pyenv/pyenv/pull/2614
|
||||||
|
|
||||||
|
## Release 2.3.12
|
||||||
|
|
||||||
|
* Undefined name: do not forget self when accessing flavor by @cclauss in https://github.com/pyenv/pyenv/pull/2595
|
||||||
|
* Fix wrong libpython being linked to in MacOS by @native-api in https://github.com/pyenv/pyenv/pull/2596
|
||||||
|
* Fix `:latest` by @native-api in https://github.com/pyenv/pyenv/pull/2599
|
||||||
|
* Fix `pyenv which` to support auto-resolved prefixes by @native-api in https://github.com/pyenv/pyenv/pull/2601
|
||||||
|
* Add more recent build of nogil Python. by @colesbury in https://github.com/pyenv/pyenv/pull/2602
|
||||||
|
|
||||||
|
## Release 2.3.11
|
||||||
|
|
||||||
|
* Add CPython 3.12.0a4 by @Afront in https://github.com/pyenv/pyenv/pull/2590
|
||||||
|
* Add a script to add the latest miniforge and mambaforge versions by @smcgivern in https://github.com/pyenv/pyenv/pull/2560
|
||||||
|
* Add missing Miniforge/Mambaforge versions (4.10.2-0 - 22.9.0-3) by @smcgivern in https://github.com/pyenv/pyenv/pull/2591
|
||||||
|
* Fix using dependencies from Ports in FreeBSD that are not searched with pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2593
|
||||||
|
* Fix priority for user-supplied configure and make flags by (**_only set --enable-shared if user hasn't supplied --disable-shared_**) @native-api in https://github.com/pyenv/pyenv/pull/2592
|
||||||
|
* Fix a compilation error in 3.8.10+ and 3.9.5+ when linking against Op… by @native-api in https://github.com/pyenv/pyenv/pull/2594
|
||||||
|
|
||||||
|
## Release 2.3.10
|
||||||
|
|
||||||
|
* Remove stray newline after python-build installation by @tklauser in https://github.com/pyenv/pyenv/pull/2566
|
||||||
|
* Allow multiple versions for pyenv-install by @rockandska in https://github.com/pyenv/pyenv/pull/2568
|
||||||
|
* --enable-shared by default by @anton-petrov in https://github.com/pyenv/pyenv/pull/2554
|
||||||
|
* Fix non-bash output while detecting shell by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2561
|
||||||
|
* add pypy 7.3.11 release by @dand-oss in https://github.com/pyenv/pyenv/pull/2576
|
||||||
|
* Mention how to build for maximum performance by @hauntsaninja in https://github.com/pyenv/pyenv/pull/2579
|
||||||
|
* Add miniconda 22.11.1-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2583
|
||||||
|
* Add Fig as autocomplete suggestion by @brendanfalk in https://github.com/pyenv/pyenv/pull/2574
|
||||||
|
* Fix using dependencies from Ports in BSD with no pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2586
|
||||||
|
|
||||||
|
## Release 2.3.9
|
||||||
|
|
||||||
|
* Add -latest suffix to miniforge3 by @nwh in https://github.com/pyenv/pyenv/pull/2551
|
||||||
|
* Add PyPy 7.3.10 by @dand-oss in https://github.com/pyenv/pyenv/pull/2553
|
||||||
|
* Add miniforge3 and mambaforge 22.9.0-2 by @smcgivern in https://github.com/pyenv/pyenv/pull/2559
|
||||||
|
* Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.16 by @lisbethw1130 in https://github.com/pyenv/pyenv/pull/2558
|
||||||
|
* Add `openssl` patches for 3.7.15, 3.7.16, and 3.8.16 by @samdoran in https://github.com/pyenv/pyenv/pull/2564
|
||||||
|
* Add support for Anaconda3-2022.10 by @huypn12 in https://github.com/pyenv/pyenv/pull/2565
|
||||||
|
|
||||||
|
## Release 2.3.8
|
||||||
|
|
||||||
|
* Export detected shell environment in pyenv-init by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2540
|
||||||
|
* Add CPython 3.12.0a3 by @saaketp in https://github.com/pyenv/pyenv/pull/2545
|
||||||
|
* Add CPython 3.11.1 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2549
|
||||||
|
* Add CPython 3.10.9 by @rudisimo in https://github.com/pyenv/pyenv/pull/2544
|
||||||
|
* Add 3.7.16, 3.8.16, 3.9.16 by @chadac in https://github.com/pyenv/pyenv/pull/2550
|
||||||
|
|
||||||
|
## Release 2.3.7
|
||||||
|
|
||||||
|
* Add Python version 3.11 to the macOS build by @jbkkd in https://github.com/pyenv/pyenv/pull/2510
|
||||||
|
* Don't use Zlib from XCode SDK if a custom compiler is used by @native-api in https://github.com/pyenv/pyenv/pull/2516
|
||||||
|
* Change line endings from CRLF to LF by @hoang-himself in https://github.com/pyenv/pyenv/pull/2517
|
||||||
|
* Fix resolution of a name that's a prefix of another name by @native-api in https://github.com/pyenv/pyenv/pull/2521
|
||||||
|
* GitHub Workflows security hardening by @sashashura in https://github.com/pyenv/pyenv/pull/2511
|
||||||
|
* Add nushell to activate list by @theref in https://github.com/pyenv/pyenv/pull/2524
|
||||||
|
* Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.15 and 3.8.15 by @twangboy in https://github.com/pyenv/pyenv/pull/2520
|
||||||
|
* Add simple `.editorconfig` file by @aphedges in https://github.com/pyenv/pyenv/pull/2518
|
||||||
|
* Support `aria2c` being a snap by @native-api in https://github.com/pyenv/pyenv/pull/2528
|
||||||
|
* Add CPython 3.12.0a2 by @saaketp in https://github.com/pyenv/pyenv/pull/2527
|
||||||
|
* Add --no-push-path option by @isaacl in https://github.com/pyenv/pyenv/pull/2526
|
||||||
|
* Fix typo in README.md by @weensy in https://github.com/pyenv/pyenv/pull/2535
|
||||||
|
* Copy auto installer oneliner to readme by @spookyuser in https://github.com/pyenv/pyenv/pull/2538
|
||||||
|
|
||||||
|
## Release 2.3.6
|
||||||
|
|
||||||
|
* Add CPython 3.10.8 (#2480)
|
||||||
|
* Add CPython 3.7.15, 3.8.15, and 3.9.15 (#2482)
|
||||||
|
* Add CPython 3.11.0 (#2493)
|
||||||
|
* Add CPython 3.12.0a1 (#2495)
|
||||||
|
* Add graalpy-22.3.0 (#2497)
|
||||||
|
* Auto-resolve prefixes to the latest version (#2487)
|
||||||
|
* It must be a full prefix -- the actual searched prefix is `<prefix>[-.]`
|
||||||
|
* Other flavors are likely sorted incorrectly atm
|
||||||
|
* Prereleases and versions with some suffixes (`-dev`, `-src`, `-latest`) are not searched
|
||||||
|
* `pyenv uninstall` has been excluded from the resolution feature: deleting a dynamically selected installation could be problematic
|
||||||
|
* Fix OpenSSL 1.1.1q compilation error in MacOS 11+ (#2500)
|
||||||
|
* Link to Tcl/Tk from Homebrew via pkgconfig for 3.11+ (#2501)
|
||||||
|
* Fix syntax error in `pyenv init -` if PYENV_ROOT has spaces (#2506)
|
||||||
|
|
||||||
|
## Release 2.3.5
|
||||||
|
|
||||||
|
* Add CPython 3.10.7 (#2454)
|
||||||
|
* Docs: update Fish PATH update (#2449)
|
||||||
|
* Add CPython 3.7.14, 3.8.14 and 3.9.14 (#2456)
|
||||||
|
* Update miniconda3-3.9-4.12.0 (#2460)
|
||||||
|
* Add CPython 3.11.0rc2 (#2459)
|
||||||
|
* Add patches for 3.7.14 to support Apple Silicon (#2463)
|
||||||
|
* Add ability to skip all use of Homebrew (#2464)
|
||||||
|
* Drop Travis integration (#2468)
|
||||||
|
* Build CPython 3.12+ with --with-dsymutil in MacOS (#2471)
|
||||||
|
* Add Pyston 2.3.5 (#2476)
|
||||||
|
|
||||||
|
## Release 2.3.4
|
||||||
|
|
||||||
|
* Add CPython 3.11.0rc1 (#2434)
|
||||||
|
* Add support for multiple versions in `pyenv uninstall` (#2432)
|
||||||
|
* Add micropython 1.18 and 1.19.1 (#2443)
|
||||||
|
* CI: support Micropython, deleted scripts; build with -v (#2447)
|
||||||
|
* Re-allow paths in .python-version while still preventing CVE-2022-35861 (#2442)
|
||||||
|
* CI: Bump OS versions (#2448)
|
||||||
|
* Add Cinder 3.8 (#2433)
|
||||||
|
|
||||||
## Release 2.3.3
|
## Release 2.3.3
|
||||||
|
|
||||||
|
|||||||
33
COMMANDS.md
33
COMMANDS.md
@@ -20,6 +20,7 @@ The most common subcommands are:
|
|||||||
* [`pyenv exec`](#pyenv-exec)
|
* [`pyenv exec`](#pyenv-exec)
|
||||||
* [`pyenv root`](#pyenv-root)
|
* [`pyenv root`](#pyenv-root)
|
||||||
* [`pyenv prefix`](#pyenv-prefix)
|
* [`pyenv prefix`](#pyenv-prefix)
|
||||||
|
* [`pyenv latest`](#pyenv-latest)
|
||||||
* [`pyenv hooks`](#pyenv-hooks)
|
* [`pyenv hooks`](#pyenv-hooks)
|
||||||
* [`pyenv shims`](#pyenv-shims)
|
* [`pyenv shims`](#pyenv-shims)
|
||||||
* [`pyenv init`](#pyenv-init)
|
* [`pyenv init`](#pyenv-init)
|
||||||
@@ -90,6 +91,10 @@ or, if you prefer 3.3.3 over 2.7.6,
|
|||||||
Python 3.3.3
|
Python 3.3.3
|
||||||
|
|
||||||
|
|
||||||
|
You can use the `-f/--force` flag to force setting versions even if some aren't installed.
|
||||||
|
This is mainly useful in special cases like provisioning scripts.
|
||||||
|
|
||||||
|
|
||||||
## `pyenv global`
|
## `pyenv global`
|
||||||
|
|
||||||
Sets the global version of Python to be used in all shells by writing
|
Sets the global version of Python to be used in all shells by writing
|
||||||
@@ -228,7 +233,13 @@ Then install the desired versions:
|
|||||||
2.6.8
|
2.6.8
|
||||||
* 2.7.6 (set by /home/yyuu/.pyenv/version)
|
* 2.7.6 (set by /home/yyuu/.pyenv/version)
|
||||||
|
|
||||||
To install the latest version of Python without giving a specific version use the `:latest` syntax. For example, to install the latest patch version for Python 3.8 you could do:
|
You can also install the latest version of Python in a specific version line by supplying a prefix instead of a complete name:
|
||||||
|
|
||||||
|
$ pyenv install 3.10
|
||||||
|
|
||||||
|
See the [`pyenv latest` documentation](#pyenv-latest) for details on prefix resolution.
|
||||||
|
|
||||||
|
An older option is to use the `:latest` syntax. For example, to install the latest patch version for Python 3.8 you could do:
|
||||||
|
|
||||||
pyenv install 3.8:latest
|
pyenv install 3.8:latest
|
||||||
|
|
||||||
@@ -238,9 +249,9 @@ To install the latest major release for Python 3 try:
|
|||||||
|
|
||||||
## `pyenv uninstall`
|
## `pyenv uninstall`
|
||||||
|
|
||||||
Uninstall a specific Python version.
|
Uninstall Python versions.
|
||||||
|
|
||||||
Usage: pyenv uninstall [-f|--force] <version>
|
Usage: pyenv uninstall [-f|--force] <version> ...
|
||||||
|
|
||||||
-f Attempt to remove the specified version without prompting
|
-f Attempt to remove the specified version without prompting
|
||||||
for confirmation. If the version does not exist, do not
|
for confirmation. If the version does not exist, do not
|
||||||
@@ -330,6 +341,19 @@ locations of the currently selected versions.
|
|||||||
$ pyenv prefix 3.9.7
|
$ pyenv prefix 3.9.7
|
||||||
/home/user/.pyenv/versions/3.9.7
|
/home/user/.pyenv/versions/3.9.7
|
||||||
|
|
||||||
|
## `pyenv latest`
|
||||||
|
|
||||||
|
Displays the latest installed or known version with the given prefix
|
||||||
|
|
||||||
|
Usage: pyenv latest [-k|--known] [-q|--quiet] <prefix>
|
||||||
|
|
||||||
|
-k/--known Select from all known versions instead of installed
|
||||||
|
-q/--quiet Do not print an error message on resolution failure
|
||||||
|
|
||||||
|
Only full prefixes are searched: in the actual name, the given prefix must be followed by a dot or a dash.
|
||||||
|
|
||||||
|
Prereleases and versions with specific suffixes (e.g. `-src`) are ignored.
|
||||||
|
|
||||||
## `pyenv hooks`
|
## `pyenv hooks`
|
||||||
|
|
||||||
Lists installed hook scripts for a given pyenv command.
|
Lists installed hook scripts for a given pyenv command.
|
||||||
@@ -366,11 +390,12 @@ List existing pyenv shims.
|
|||||||
|
|
||||||
Configure the shell environment for pyenv
|
Configure the shell environment for pyenv
|
||||||
|
|
||||||
Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
|
Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--no-rehash] [<shell>])"
|
||||||
|
|
||||||
- Initialize shims directory, print PYENV_SHELL variable, completions path
|
- Initialize shims directory, print PYENV_SHELL variable, completions path
|
||||||
and shell function
|
and shell function
|
||||||
--path Print shims path
|
--path Print shims path
|
||||||
|
--no-push-path Do not push shim to the start of PATH if they're already there
|
||||||
--no-rehash Add no rehash command to output
|
--no-rehash Add no rehash command to output
|
||||||
|
|
||||||
## `pyenv completions`
|
## `pyenv completions`
|
||||||
|
|||||||
215
CONTRIBUTING.md
215
CONTRIBUTING.md
@@ -1,106 +1,109 @@
|
|||||||
General guidance
|
General guidance
|
||||||
================
|
================
|
||||||
|
|
||||||
* The usual principles of respecting existing conventions and making sure that your changes
|
* The usual principles of respecting existing conventions and making sure that your changes
|
||||||
are in line with the overall product design apply when contributing code to Pyenv.
|
are in line with the overall product design apply when contributing code to Pyenv.
|
||||||
|
|
||||||
* We are limited to Bash 3.2 features
|
* We are limited to Bash 3.2 features
|
||||||
|
|
||||||
That's because that's the version shipped with MacOS.
|
That's because that's the version shipped with MacOS.
|
||||||
(They didn't upgrade past it and switched to Zsh because later versions
|
(They didn't upgrade past it and switched to Zsh because later versions
|
||||||
are covered by GPLv3 which has additional restrictions unacceptable for Apple.)
|
are covered by GPLv3 which has additional restrictions unacceptable for Apple.)
|
||||||
|
|
||||||
* Be extra careful when submitting logic specific for the Apple Silicon platform
|
You can still add performance optimizations etc that take advantage of newer Bash features
|
||||||
|
as long as there is a fallback execution route for Bash 3.
|
||||||
As of this writing, Github Actions do not support it and only one team member has the necessary hardware.
|
|
||||||
So we may be unable to test your changes and may have to take your word for it.
|
* Be extra careful when submitting logic specific for the Apple Silicon platform
|
||||||
|
|
||||||
|
As of this writing, Github Actions do not support it and only one team member has the necessary hardware.
|
||||||
Formatting PRs
|
So we may be unable to test your changes and may have to take your word for it.
|
||||||
==============
|
|
||||||
|
|
||||||
We strive to keep commit history one-concern-per-commit to keep it meaningful and easy to follow.
|
Formatting PRs
|
||||||
If a pull request (PR) addresses a single concern (the typical case), we usually squash commits
|
==============
|
||||||
from it together when merging so its commit history doesn't matter.
|
|
||||||
If however a PR addresses multiple separate concerns, each of them should be presented as a separate commit.
|
We strive to keep commit history one-concern-per-commit to keep it meaningful and easy to follow.
|
||||||
Adding multiple new Python releases of the same flavor is okay with either a single or multiple commits.
|
If a pull request (PR) addresses a single concern (the typical case), we usually squash commits
|
||||||
|
from it together when merging so its commit history doesn't matter.
|
||||||
|
If however a PR addresses multiple separate concerns, each of them should be presented as a separate commit.
|
||||||
Authoring installation scripts
|
Adding multiple new Python releases of the same flavor is okay with either a single or multiple commits.
|
||||||
==============================
|
|
||||||
|
|
||||||
Adding new Python release support
|
Authoring installation scripts
|
||||||
---------------------------------
|
==============================
|
||||||
|
|
||||||
The easiest way to add support for a new Python release is to copy the script from the previous one
|
Adding new Python release support
|
||||||
and adjust it as necessary. In many cases, just changing version numbers, URLs and hashes is enough.
|
---------------------------------
|
||||||
Do pay attention to other "magic numbers" that may be present in a script --
|
|
||||||
e.g. the set of architectures and OS versions supported by a release -- since those change from time to time, too.
|
The easiest way to add support for a new Python release is to copy the script from the previous one
|
||||||
|
and adjust it as necessary. In many cases, just changing version numbers, URLs and hashes is enough.
|
||||||
Make sure to also copy any patches for the previous release that still apply to the new one.
|
Do pay attention to other "magic numbers" that may be present in a script --
|
||||||
Typically, a patch no longer applies if it addresses a problem that's already fixed in the new release.
|
e.g. the set of architectures and OS versions supported by a release -- since those change from time to time, too.
|
||||||
|
|
||||||
For prereleases, we only create an entry for the latest prerelease in a specific version line.
|
Make sure to also copy any patches for the previous release that still apply to the new one.
|
||||||
When submitting a newer prerelease, replace the older one.
|
Typically, a patch no longer applies if it addresses a problem that's already fixed in the new release.
|
||||||
|
|
||||||
|
For prereleases, we only create an entry for the latest prerelease in a specific version line.
|
||||||
Adding version-specific fixes/patches
|
When submitting a newer prerelease, replace the older one.
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
We accept fixes to issues in specific Python releases that prevent users from using them with Pyenv.
|
Adding version-specific fixes/patches
|
||||||
|
-------------------------------------
|
||||||
In the default configuration for a Python release, we strive to provide as close to vanilla experience as practical,
|
|
||||||
to maintain [the principle of the least surprise](https://en.wikipedia.org/wiki/Principle_of_least_astonishment).
|
We accept fixes to issues in specific Python releases that prevent users from using them with Pyenv.
|
||||||
As such, any such fixes:
|
|
||||||
|
In the default configuration for a Python release, we strive to provide as close to vanilla experience as practical,
|
||||||
* Must not break or degrade (e.g. disable features) the build in any of the environments that the release officially supports
|
to maintain [the principle of the least surprise](https://en.wikipedia.org/wiki/Principle_of_least_astonishment).
|
||||||
* Must not introduce incompatibilities with the vanilla release (including binary incompatibilities)
|
As such, any such fixes:
|
||||||
* Should not patch things unnecessarily, to minimize the risk of the aforementioned undesirable side effects.
|
|
||||||
* E.g. if the fix is for a specific environment, its logic ought to only fire in this specific environment and not touch execution paths for other environments.
|
* Must not break or degrade (e.g. disable features) the build in any of the environments that the release officially supports
|
||||||
* As such, it's advisable to briefly explain in the PR what each added patch does and why it is necessary to fix the declared problem
|
* Must not introduce incompatibilities with the vanilla release (including binary incompatibilities)
|
||||||
|
* Should not patch things unnecessarily, to minimize the risk of the aforementioned undesirable side effects.
|
||||||
Generally, version-specific fixes belong in the scripts for the affected releases and/or patches for them -- this guarantees that their effect is limited to only those releases.
|
* E.g. if the fix is for a specific environment, its logic ought to only fire in this specific environment and not touch execution paths for other environments.
|
||||||
|
* As such, it's advisable to briefly explain in the PR what each added patch does and why it is necessary to fix the declared problem
|
||||||
<h3>Backporting upstream patches</h3>
|
|
||||||
|
Generally, version-specific fixes belong in the scripts for the affected releases and/or patches for them -- this guarantees that their effect is limited to only those releases.
|
||||||
Usually, this is the easiest way to backport a fix for a problem that is fixed in a newer release.
|
|
||||||
|
<h3>Backporting upstream patches</h3>
|
||||||
* Clone Python, check out the tag for the appropriate release and create a branch
|
|
||||||
* Apply existing patches if there are any (with either `patch` or `git am`) and commit
|
Usually, this is the easiest way to backport a fix for a problem that is fixed in a newer release.
|
||||||
* Cherry-pick the upstream commit that fixes the problem in a newer release
|
|
||||||
* Commit and `git format-patch`
|
* Clone Python, check out the tag for the appropriate release and create a branch
|
||||||
* Commit the generated patch file into Pyenv, test your changes and submit a PR
|
* Apply existing patches if there are any (with either `patch` or `git am`) and commit
|
||||||
|
* Cherry-pick the upstream commit that fixes the problem in a newer release
|
||||||
|
* Commit and `git format-patch`
|
||||||
Deprecation policy
|
* Commit the generated patch file into Pyenv, test your changes and submit a PR
|
||||||
------------------
|
|
||||||
|
|
||||||
We do not provide official support for EOL releases and environments or otherwise provide any kind of extended support for old Python releases.
|
Deprecation policy
|
||||||
|
------------------
|
||||||
We do however accept fixes from interested parties that would allow running older, including EOL, releases in newer environments.
|
|
||||||
In addition to the above requirements for release-specific fixes,
|
We do not provide official support for EOL releases and environments or otherwise provide any kind of extended support for old Python releases.
|
||||||
|
|
||||||
* Such a fix must not add maintenance burden (e.g. add new logic to `python-build` that has to be kept there indefinitely)
|
We do however accept fixes from interested parties that would allow running older, including EOL, releases in environments that they do not officially support.
|
||||||
* Unless the added logic is useful for both EOL and non-EOL releases. In this case, it will be considered as being primarily an improvement for non-EOL releases.
|
In addition to the above requirements for release-specific fixes,
|
||||||
* Support is provided on a "best effort" basis: we do not maintain these fixes but won't actively break them, either, and accept any corrections.
|
|
||||||
Since old releases never change, it's pretty safe to assume that the fixes will continue to work until a later version
|
* Such a fix must not add maintenance burden (e.g. add new logic to `python-build` that has to be kept there indefinitely)
|
||||||
of an environment introduces further incompatible changes.
|
* Unless the added logic is useful for both EOL and non-EOL releases. In this case, it will be considered as being primarily an improvement for non-EOL releases.
|
||||||
|
* Support is provided on a "best effort" basis: we do not actively maintain these fixes but won't actively break them, either, and will accept any corrections.
|
||||||
|
Since old releases never change, it's pretty safe to assume that the fixes will continue to work until a later version
|
||||||
Advanced changes / adding new Python flavor support
|
of an environment introduces further incompatible changes.
|
||||||
---------------------------------------------------
|
|
||||||
|
|
||||||
An installation script is sourced from `python-build`. All installation scripts are based on the same logic:
|
Advanced changes / adding new Python flavor support
|
||||||
|
---------------------------------------------------
|
||||||
1. Select the source to download and other variable parameters as needed.
|
|
||||||
|
An installation script is sourced from `python-build`. All installation scripts are based on the same logic:
|
||||||
This includes showing an error if the user's environment (OS, architecture) is not supported by the release.
|
|
||||||
Binary releases that only officially support specific distro(s) typically show a warning in other distros instead.
|
1. Select the source to download and other variable parameters as needed.
|
||||||
|
|
||||||
2. Run one of the `install_*` shell functions
|
This includes showing an error if the user's environment (OS, architecture) is not supported by the release.
|
||||||
|
Binary releases that only officially support specific distro(s) typically show a warning in other distros instead.
|
||||||
`install_*` shell functions defined in `python-build` install Python from different kinds of sources -- compressed package (binary or source), upstream installation script, VCS checkout. Pick one that's the most appropriate for your packaging.
|
|
||||||
|
2. Run one of the `install_*` shell functions
|
||||||
Each of them accepts a couple of function-specific arguments which are followed by arguments that constitute the build sequence. Each `<argument>` in the build sequence corresponds to the `install_*_<argument>` function in `python-build`. Check what's available and add any functions with logic specific to your flavor if needed.
|
|
||||||
|
`install_*` shell functions defined in `python-build` install Python from different kinds of sources -- compressed package (binary or source), upstream installation script, VCS checkout. Pick one that's the most appropriate for your packaging.
|
||||||
We strive to keep out of `python-build` parts of build logic that are release-specific and/or tend to change abruptly between releases -- e.g. sets of supported architectures and other software's versions. This results in logic duplication between installation scripts -- but since old releases never change once released, this doesn't really add to the maintenance burden. As a rule of thumb, `python-build` can host parts of logic that are expected to stay the same for an indefinite amount of time -- for an entire Python flavor or release line.
|
|
||||||
|
Each of them accepts a couple of function-specific arguments which are followed by arguments that constitute the build sequence. Each `<argument>` in the build sequence corresponds to the `install_*_<argument>` function in `python-build`. Check what's available and add any functions with logic specific to your flavor if needed.
|
||||||
|
|
||||||
|
We strive to keep out of `python-build` parts of build logic that are release-specific and/or tend to change abruptly between releases -- e.g. sets of supported architectures and other software's versions. This results in logic duplication between installation scripts -- but since old releases never change once released, this doesn't really add to the maintenance burden. As a rule of thumb, `python-build` can host parts of logic that are expected to stay the same for an indefinite amount of time -- for an entire Python flavor or release line.
|
||||||
|
|||||||
17
MAINTENANCE.md
Normal file
17
MAINTENANCE.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Creating a release
|
||||||
|
==================
|
||||||
|
|
||||||
|
The release of the new version of Pyenv is done via GitHub Releases.
|
||||||
|
|
||||||
|
Release checklist:
|
||||||
|
* Start [drafting a new release on GitHub](https://github.com/pyenv/pyenv/releases) to generate a summary of changes.
|
||||||
|
Type the would-be tag name in the "Choose a tag" field and press "Generate release notes"
|
||||||
|
* The summary may need editing. E.g. rephrase entries, delete/merge entries that are too minor or irrelevant to the users (e.g. typo fixes, CI)
|
||||||
|
* Update `CHANGELOG.md` with the new version number and the edited summary (only the changes section)
|
||||||
|
* Push the version number in `libexec/pyenv---version`
|
||||||
|
* Minor version is pushed if there are significant functional changes (not e.g. bugfixes/formula adaptations/supporting niche use cases).
|
||||||
|
* Major version is pushed if there are breaking changes
|
||||||
|
* Commit the changes locally into `master`
|
||||||
|
* Create a new tag locally with the same name as specified in the new release window
|
||||||
|
* Push the changes including the tag
|
||||||
|
* In the still open new release window, press "Publish release". The now-existing tag will be used.
|
||||||
8
Makefile
8
Makefile
@@ -1,11 +1,15 @@
|
|||||||
.PHONY: test test-build
|
.PHONY: test test-build test-unit test-plugin
|
||||||
|
|
||||||
# Do not pass in user flags to build tests.
|
# Do not pass in user flags to build tests.
|
||||||
unexport PYTHON_CFLAGS
|
unexport PYTHON_CFLAGS
|
||||||
unexport PYTHON_CONFIGURE_OPTS
|
unexport PYTHON_CONFIGURE_OPTS
|
||||||
|
|
||||||
test: bats
|
test: test-unit test-plugin
|
||||||
|
|
||||||
|
test-unit: bats
|
||||||
PATH="./bats/bin:$$PATH" test/run
|
PATH="./bats/bin:$$PATH" test/run
|
||||||
|
|
||||||
|
test-plugin: bats
|
||||||
cd plugins/python-build && $(PWD)/bats/bin/bats $${CI:+--tap} test
|
cd plugins/python-build && $(PWD)/bats/bin/bats $${CI:+--tap} test
|
||||||
|
|
||||||
PYTHON_BUILD_ROOT := $(CURDIR)/plugins/python-build
|
PYTHON_BUILD_ROOT := $(CURDIR)/plugins/python-build
|
||||||
|
|||||||
823
README.md
823
README.md
@@ -9,9 +9,6 @@ tools that do one thing well.
|
|||||||
This project was forked from [rbenv](https://github.com/rbenv/rbenv) and
|
This project was forked from [rbenv](https://github.com/rbenv/rbenv) and
|
||||||
[ruby-build](https://github.com/rbenv/ruby-build), and modified for Python.
|
[ruby-build](https://github.com/rbenv/ruby-build), and modified for Python.
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
### What pyenv _does..._
|
### What pyenv _does..._
|
||||||
|
|
||||||
* Lets you **change the global Python version** on a per-user basis.
|
* Lets you **change the global Python version** on a per-user basis.
|
||||||
@@ -32,44 +29,498 @@ This project was forked from [rbenv](https://github.com/rbenv/rbenv) and
|
|||||||
yourself, or [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)
|
yourself, or [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)
|
||||||
to automate the process.
|
to automate the process.
|
||||||
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
|
|
||||||
|
* **[Installation](#installation)**
|
||||||
|
* [Getting Pyenv](#a-getting-pyenv)
|
||||||
|
* [Linux/UNIX](#linuxunix)
|
||||||
|
* [Automatic Installer](#1-automatic-installer-recommended)
|
||||||
|
* [Basic GitHub Checkout](#2-basic-github-checkout)
|
||||||
|
* [MacOS](#macos)
|
||||||
|
* [Homebrew in macOS](#homebrew-in-macos)
|
||||||
|
* [Windows](#windows)
|
||||||
|
* [Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv)
|
||||||
|
* [Restart your shell](#c-restart-your-shell)
|
||||||
|
* [Install Python build dependencies](#d-install-python-build-dependencies)
|
||||||
|
* [Upgrade Notes](#e-upgrade-notes)
|
||||||
|
* **[Usage](#usage)**
|
||||||
|
* [Install additional Python versions](#install-additional-python-versions)
|
||||||
|
* [Prefix auto-resolution to the latest version](#prefix-auto-resolution-to-the-latest-version)
|
||||||
|
* [Switch between Python versions](#switch-between-python-versions)
|
||||||
|
* [Making multiple versions available](#making-multiple-versions-available)
|
||||||
|
* [Uninstall Python versions](#uninstall-python-versions)
|
||||||
|
* [Other operations](#other-operations)
|
||||||
|
* [Upgrading](#upgrading)
|
||||||
|
* [Upgrading with Homebrew](#upgrading-with-homebrew)
|
||||||
|
* [Upgrading with Installer or Git checkout](#upgrading-with-installer-or-git-checkout)
|
||||||
|
* [Uninstalling pyenv](#uninstalling-pyenv)
|
||||||
|
* [Pyenv plugins](#pyenv-plugins)
|
||||||
* **[How It Works](#how-it-works)**
|
* **[How It Works](#how-it-works)**
|
||||||
* [Understanding PATH](#understanding-path)
|
* [Understanding PATH](#understanding-path)
|
||||||
* [Understanding Shims](#understanding-shims)
|
* [Understanding Shims](#understanding-shims)
|
||||||
* [Understanding Python version selection](#understanding-python-version-selection)
|
* [Understanding Python version selection](#understanding-python-version-selection)
|
||||||
* [Locating Pyenv-provided Python Installations](#locating-pyenv-provided-python-installations)
|
* [Locating Pyenv-provided Python Installations](#locating-pyenv-provided-python-installations)
|
||||||
* **[Installation](#installation)**
|
|
||||||
* [Getting Pyenv](#getting-pyenv)
|
|
||||||
* [Homebrew in macOS](#homebrew-in-macos)
|
|
||||||
* [Windows](#windows)
|
|
||||||
* [Automatic installer](#automatic-installer)
|
|
||||||
* [Basic GitHub Checkout](#basic-github-checkout)
|
|
||||||
* [Set up your shell environment for Pyenv](#set-up-your-shell-environment-for-pyenv)
|
|
||||||
* [Restart your shell](#restart-your-shell)
|
|
||||||
* [Install Python build dependencies](#install-python-build-dependencies)
|
|
||||||
* **[Usage](#usage)**
|
|
||||||
* [Install additional Python versions](#install-additional-python-versions)
|
|
||||||
* [Python versions with extended support](#python-versions-with-extended-support)
|
|
||||||
* [Switch between Python versions](#switch-between-python-versions)
|
|
||||||
* [Uninstall Python versions](#uninstall-python-versions)
|
|
||||||
* [Other operations](#other-operations)
|
|
||||||
* [Upgrading](#upgrading)
|
|
||||||
* [Uninstalling pyenv](#uninstalling-pyenv)
|
|
||||||
* [Advanced Configuration](#advanced-configuration)
|
* [Advanced Configuration](#advanced-configuration)
|
||||||
* [Using Pyenv without shims](#using-pyenv-without-shims)
|
* [Using Pyenv without shims](#using-pyenv-without-shims)
|
||||||
* [Environment variables](#environment-variables)
|
* [Environment variables](#environment-variables)
|
||||||
* **[Development](#development)**
|
* **[Development](#development)**
|
||||||
* [Contributing](#contributing)**
|
* [Contributing](#contributing)
|
||||||
* [Version History](#version-history)
|
* [Version History](#version-history)
|
||||||
* [License](#license)
|
* [License](#license)
|
||||||
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### A. Getting Pyenv
|
||||||
|
----
|
||||||
|
#### Linux/Unix
|
||||||
|
<details>
|
||||||
|
|
||||||
|
The Homebrew option from the [MacOS section below](#macos) would also work if you have Homebrew installed.
|
||||||
|
|
||||||
|
##### 1. Automatic installer (Recommended)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://pyenv.run | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details visit our other project:
|
||||||
|
https://github.com/pyenv/pyenv-installer
|
||||||
|
|
||||||
|
|
||||||
|
##### 2. Basic GitHub Checkout
|
||||||
|
|
||||||
|
This will get you going with the latest version of Pyenv and make it
|
||||||
|
easy to fork and contribute any changes back upstream.
|
||||||
|
|
||||||
|
* **Check out Pyenv where you want it installed.**
|
||||||
|
A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else):
|
||||||
|
```
|
||||||
|
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
|
||||||
|
```
|
||||||
|
* Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't
|
||||||
|
worry if it fails; Pyenv will still work normally:
|
||||||
|
```
|
||||||
|
cd ~/.pyenv && src/configure && make -C src
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
#### MacOS
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
The options from the [Linux section above](#linuxunix) also work but Homebrew is recommended for basic usage.
|
||||||
|
|
||||||
|
##### [Homebrew](https://brew.sh) in macOS
|
||||||
|
|
||||||
|
1. Update homebrew and install pyenv:
|
||||||
|
```sh
|
||||||
|
brew update
|
||||||
|
brew install pyenv
|
||||||
|
```
|
||||||
|
If you want to install (and update to) the latest development head of Pyenv
|
||||||
|
rather than the latest release, instead run:
|
||||||
|
```sh
|
||||||
|
brew install pyenv --head
|
||||||
|
```
|
||||||
|
3. Then follow the rest of the post-installation steps, starting with
|
||||||
|
[Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv).
|
||||||
|
|
||||||
|
4. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_
|
||||||
|
|
||||||
|
If you're going to build Homebrew formulae from source that link against Python
|
||||||
|
like Tkinter or NumPy
|
||||||
|
_(This is only generally the case if you are a developer of such a formula,
|
||||||
|
or if you have an EOL version of MacOS for which prebuilt bottles are no longer provided
|
||||||
|
and you are using such a formula)._
|
||||||
|
|
||||||
|
To avoid them accidentally linking against a Pyenv-provided Python,
|
||||||
|
add the following line into your interactive shell's configuration:
|
||||||
|
|
||||||
|
* Bash/Zsh:
|
||||||
|
|
||||||
|
~~~bash
|
||||||
|
alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'
|
||||||
|
~~~
|
||||||
|
|
||||||
|
* Fish:
|
||||||
|
|
||||||
|
~~~fish
|
||||||
|
alias brew="env PATH=(string replace (pyenv root)/shims '' \"\$PATH\") brew"
|
||||||
|
~~~
|
||||||
|
</details>
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
Pyenv does not officially support Windows and does not work in Windows outside
|
||||||
|
the Windows Subsystem for Linux.
|
||||||
|
Moreover, even there, the Pythons it installs are not native Windows versions
|
||||||
|
but rather Linux versions running in a virtual machine --
|
||||||
|
so you won't get Windows-specific functionality.
|
||||||
|
|
||||||
|
If you're in Windows, we recommend using @kirankotari's [`pyenv-win`](https://github.com/pyenv-win/pyenv-win) fork --
|
||||||
|
which does install native Windows Python versions.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### B. Set up your shell environment for Pyenv
|
||||||
|
----
|
||||||
|
|
||||||
|
The below setup should work for the vast majority of users for common use cases.
|
||||||
|
See [Advanced configuration](#advanced-configuration) for details and more configuration options.
|
||||||
|
|
||||||
|
#### Bash
|
||||||
|
<details>
|
||||||
|
|
||||||
|
Stock Bash startup files vary widely between distributions in which of them source
|
||||||
|
which, under what circumstances, in what order and what additional configuration they perform.
|
||||||
|
As such, the most reliable way to get Pyenv in all environments is to append Pyenv
|
||||||
|
configuration commands to both `.bashrc` (for interactive shells)
|
||||||
|
and the profile file that Bash would use (for login shells).
|
||||||
|
|
||||||
|
1. First, add the commands to `~/.bashrc` by running the following in your terminal:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
|
||||||
|
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
|
||||||
|
echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc
|
||||||
|
```
|
||||||
|
2. Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well.
|
||||||
|
If you have none of these, create a `~/.profile` and add the commands there.
|
||||||
|
|
||||||
|
* to add to `~/.profile`:
|
||||||
|
``` bash
|
||||||
|
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
|
||||||
|
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
|
||||||
|
echo 'eval "$(pyenv init - bash)"' >> ~/.profile
|
||||||
|
```
|
||||||
|
* to add to `~/.bash_profile`:
|
||||||
|
```bash
|
||||||
|
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
|
||||||
|
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
|
||||||
|
echo 'eval "$(pyenv init - bash)"' >> ~/.bash_profile
|
||||||
|
```
|
||||||
|
|
||||||
|
**Bash warning**: There are some systems where the `BASH_ENV` variable is configured
|
||||||
|
to point to `.bashrc`. On such systems, you should almost certainly put the
|
||||||
|
`eval "$(pyenv init - bash)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you
|
||||||
|
may observe strange behaviour, such as `pyenv` getting into an infinite loop.
|
||||||
|
See [#264](https://github.com/pyenv/pyenv/issues/264) for details.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
#### Zsh
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
|
||||||
|
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
|
||||||
|
echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc
|
||||||
|
```
|
||||||
|
|
||||||
|
If you wish to get Pyenv in noninteractive login shells as well, also add the commands to `~/.zprofile` or `~/.zlogin`.
|
||||||
|
</details>
|
||||||
|
|
||||||
|
#### Fish
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
1. If you have Fish 3.2.0 or newer, execute this interactively:
|
||||||
|
~~~ fish
|
||||||
|
set -Ux PYENV_ROOT $HOME/.pyenv
|
||||||
|
fish_add_path $PYENV_ROOT/bin
|
||||||
|
~~~
|
||||||
|
|
||||||
|
2. Otherwise, execute the snippet below:
|
||||||
|
~~~ fish
|
||||||
|
set -Ux PYENV_ROOT $HOME/.pyenv
|
||||||
|
set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths
|
||||||
|
~~~
|
||||||
|
|
||||||
|
3. Now, add this to `~/.config/fish/config.fish`:
|
||||||
|
~~~ fish
|
||||||
|
pyenv init - fish | source
|
||||||
|
~~~
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### C. Restart your shell
|
||||||
|
----
|
||||||
|
|
||||||
|
for the `PATH` changes to take effect.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
exec "$SHELL"
|
||||||
|
```
|
||||||
|
|
||||||
|
### D. Install Python build dependencies
|
||||||
|
----
|
||||||
|
|
||||||
|
[**Install Python build dependencies**](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)
|
||||||
|
before attempting to install a new Python version.
|
||||||
|
|
||||||
|
You can now begin using Pyenv.
|
||||||
|
|
||||||
|
### E. Upgrade Notes
|
||||||
|
----
|
||||||
|
|
||||||
|
**if you have upgraded from pyenv version 2.0.x-2.2.x**
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
The startup logic and instructions have been updated for simplicity in 2.3.0.
|
||||||
|
The previous, more complicated configuration scheme for 2.0.0-2.2.5 still works.
|
||||||
|
|
||||||
|
* Define environment variable `PYENV_ROOT` to point to the path where
|
||||||
|
Pyenv will store its data. `$HOME/.pyenv` is the default.
|
||||||
|
If you installed Pyenv via Git checkout, we recommend
|
||||||
|
to set it to the same location as where you cloned it.
|
||||||
|
* Add the `pyenv` executable to your `PATH` if it's not already there
|
||||||
|
* run `eval "$(pyenv init -)"` to install `pyenv` into your shell as a shell function, enable shims and autocompletion
|
||||||
|
* You may run `eval "$(pyenv init --path)"` instead to just enable shims, without shell integration
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Install additional Python versions
|
||||||
|
|
||||||
|
To install additional Python versions, use [`pyenv install`](COMMANDS.md#pyenv-install).
|
||||||
|
|
||||||
|
For example, to download and install Python 3.10.4, run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pyenv install 3.10.4
|
||||||
|
```
|
||||||
|
|
||||||
|
Running `pyenv install -l` gives the list of all available versions.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
<details> <summary> Notes about python releases </summary>
|
||||||
|
|
||||||
|
**NOTE:** Most Pyenv-provided Python releases are source releases and are built
|
||||||
|
from source as part of installation (that's why you need Python build dependencies preinstalled).
|
||||||
|
You can pass options to Python's `configure` and compiler flags to customize the build,
|
||||||
|
see [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables)
|
||||||
|
for details.
|
||||||
|
|
||||||
|
**NOTE:** If you are having trouble installing a Python version,
|
||||||
|
please visit the wiki page about
|
||||||
|
[Common Build Problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems).
|
||||||
|
|
||||||
|
**NOTE:** If you want to use proxy for download, please set the `http_proxy` and `https_proxy`
|
||||||
|
environment variables.
|
||||||
|
|
||||||
|
**NOTE:** If you'd like a faster interpreter at the cost of longer build times,
|
||||||
|
see [_Building for maximum performance_ in Python-Build's README](plugins/python-build/README.md#building-for-maximum-performance).
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
#### Prefix auto-resolution to the latest version
|
||||||
|
|
||||||
|
All Pyenv subcommands except `uninstall` automatically resolve full prefixes to the latest version in the corresponding version line.
|
||||||
|
|
||||||
|
`pyenv install` picks the latest known version, while other subcommands pick the latest installed version.
|
||||||
|
|
||||||
|
E.g. to install and then switch to the latest 3.10 release:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pyenv install 3.10
|
||||||
|
pyenv global 3.10
|
||||||
|
```
|
||||||
|
|
||||||
|
You can run [`pyenv latest -k <prefix>`](COMMANDS.md#pyenv-latest) to see how `pyenv install` would resolve a specific prefix, or [`pyenv latest <prefix>`](COMMANDS.md#pyenv-latest) to see how other subcommands would resolve it.
|
||||||
|
|
||||||
|
See the [`pyenv latest` documentation](COMMANDS.md#pyenv-latest) for details.
|
||||||
|
|
||||||
|
|
||||||
|
<details> <summary> Python versions with extended support </summary>
|
||||||
|
|
||||||
|
For the following Python releases, Pyenv applies user-provided patches that add support for some newer environments.
|
||||||
|
Though we don't actively maintain those patches, since existing releases never change,
|
||||||
|
it's safe to assume that they will continue working until there are further incompatible changes
|
||||||
|
in a later version of those environments.
|
||||||
|
|
||||||
|
* *3.7.8-3.7.15, 3.8.4-3.8.12, 3.9.0-3.9.7* : XCode 13.3
|
||||||
|
* *3.5.10, 3.6.15* : MacOS 11+ and XCode 13.3
|
||||||
|
* *2.7.18* : MacOS 10.15+ and Apple Silicon
|
||||||
|
</details>
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
### Switch between Python versions
|
||||||
|
|
||||||
|
To select a Pyenv-installed Python as the version to use, run one
|
||||||
|
of the following commands:
|
||||||
|
|
||||||
|
* [`pyenv shell <version>`](COMMANDS.md#pyenv-shell) -- select just for current shell session
|
||||||
|
* [`pyenv local <version>`](COMMANDS.md#pyenv-local) -- automatically select whenever you are in the current directory (or its subdirectories)
|
||||||
|
* [`pyenv global <version>`](COMMANDS.md#pyenv-shell) -- select globally for your user account
|
||||||
|
|
||||||
|
E.g. to select the above-mentioned newly-installed Python 3.10.4 as your preferred version to use:
|
||||||
|
|
||||||
|
~~~bash
|
||||||
|
pyenv global 3.10.4
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Now whenever you invoke `python`, `pip` etc., an executable from the Pyenv-provided
|
||||||
|
3.10.4 installation will be run instead of the system Python.
|
||||||
|
|
||||||
|
Using "`system`" as a version name would reset the selection to your system-provided Python.
|
||||||
|
|
||||||
|
See [Understanding shims](#understanding-shims) and
|
||||||
|
[Understanding Python version selection](#understanding-python-version-selection)
|
||||||
|
for more details on how the selection works and more information on its usage.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
#### Making multiple versions available
|
||||||
|
|
||||||
|
You can select multiple Python versions at the same time by specifying multiple arguments.
|
||||||
|
E.g. if you wish to use the latest installed CPython 3.11 and 3.12:
|
||||||
|
|
||||||
|
~~~bash
|
||||||
|
pyenv global 3.11 3.12
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Whenever you run a command provided by a Python installation, these versions will be searched for it in the specified order.
|
||||||
|
[Due to the shims' fall-through behavior]((#understanding-python-version-selection)), `system` is always implicitly searched afterwards.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
### Uninstall Python versions
|
||||||
|
|
||||||
|
As time goes on, you will accumulate Python versions in your
|
||||||
|
`$(pyenv root)/versions` directory.
|
||||||
|
|
||||||
|
To remove old Python versions, use [`pyenv uninstall <versions>`](COMMANDS.md#pyenv-uninstall).
|
||||||
|
|
||||||
|
Alternatively, you can simply `rm -rf` the directory of the version you want
|
||||||
|
to remove. You can find the directory of a particular Python version
|
||||||
|
with the `pyenv prefix` command, e.g. `pyenv prefix 2.6.8`.
|
||||||
|
Note however that plugins may run additional operations on uninstall
|
||||||
|
which you would need to do by hand as well. E.g. Pyenv-Virtualenv also
|
||||||
|
removes any virtual environments linked to the version being uninstalled.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
### Other operations
|
||||||
|
|
||||||
|
Run `pyenv commands` to get a list of all available subcommands.
|
||||||
|
Run a subcommand with `--help` to get help on it, or see the [Commands Reference](COMMANDS.md).
|
||||||
|
|
||||||
|
Note that Pyenv plugins that you install may add their own subcommands.
|
||||||
|
|
||||||
|
|
||||||
|
## Upgrading
|
||||||
|
|
||||||
|
### Upgrading with Homebrew
|
||||||
|
|
||||||
|
If you've installed Pyenv using Homebrew, upgrade using:
|
||||||
|
```sh
|
||||||
|
brew upgrade pyenv
|
||||||
|
```
|
||||||
|
|
||||||
|
To switch from a release to the latest development head of Pyenv, use:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew uninstall pyenv
|
||||||
|
brew install pyenv --head
|
||||||
|
```
|
||||||
|
|
||||||
|
then you can upgrade it with `brew upgrade pyenv` as usual.
|
||||||
|
|
||||||
|
|
||||||
|
### Upgrading with Installer or Git checkout
|
||||||
|
|
||||||
|
If you've installed Pyenv with Pyenv-installer, you likely have the
|
||||||
|
[Pyenv-Update](https://github.com/pyenv/pyenv-update) plugin that would
|
||||||
|
upgrade Pyenv and all installed plugins:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pyenv update
|
||||||
|
```
|
||||||
|
|
||||||
|
If you've installed Pyenv using Pyenv-installer or Git checkout, you can also
|
||||||
|
upgrade your installation at any time using Git.
|
||||||
|
|
||||||
|
To upgrade to the latest development version of pyenv, use `git pull`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd $(pyenv root)
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
To upgrade to a specific release of Pyenv, check out the corresponding tag:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd $(pyenv root)
|
||||||
|
git fetch
|
||||||
|
git tag
|
||||||
|
git checkout v0.1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Uninstalling pyenv
|
||||||
|
|
||||||
|
The simplicity of pyenv makes it easy to temporarily disable it, or
|
||||||
|
uninstall from the system.
|
||||||
|
|
||||||
|
1. To **disable** Pyenv managing your Python versions, simply remove the
|
||||||
|
`pyenv init` invocations from your shell startup configuration. This will
|
||||||
|
remove Pyenv shims directory from `PATH`, and future invocations like
|
||||||
|
`python` will execute the system Python version, as it was before Pyenv.
|
||||||
|
|
||||||
|
`pyenv` will still be accessible on the command line, but your Python
|
||||||
|
apps won't be affected by version switching.
|
||||||
|
|
||||||
|
2. To completely **uninstall** Pyenv, remove _all_ Pyenv configuration lines
|
||||||
|
from your shell startup configuration, and then remove
|
||||||
|
its root directory. This will **delete all Python versions** that were
|
||||||
|
installed under the `` $(pyenv root)/versions/ `` directory:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rm -rf $(pyenv root)
|
||||||
|
```
|
||||||
|
|
||||||
|
If you've installed Pyenv using a package manager, as a final step,
|
||||||
|
perform the Pyenv package removal. For instance, for Homebrew:
|
||||||
|
|
||||||
|
```
|
||||||
|
brew uninstall pyenv
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Pyenv plugins
|
||||||
|
|
||||||
|
Pyenv provides a simple way to extend and customize its functionality with plugins --
|
||||||
|
as simple as creating a plugin directory and dropping a shell script on a certain subpath of it
|
||||||
|
with whatever extra logic you need to be run at certain moments.
|
||||||
|
|
||||||
|
The main idea is that most things that you can put under `$PYENV_ROOT/<whatever>` you can also put
|
||||||
|
under `$PYENV_ROOT/plugins/your_plugin_name/<whatever>`.
|
||||||
|
|
||||||
|
See [_Plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Plugins) on how to install and use plugins
|
||||||
|
as well as a catalog of some useful existing plugins for common needs.
|
||||||
|
|
||||||
|
See [_Authoring plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) on writing your own plugins.
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
@@ -81,7 +532,7 @@ to the correct Python installation.
|
|||||||
|
|
||||||
### Understanding PATH
|
### Understanding PATH
|
||||||
|
|
||||||
When you run a command like `python` or `pip`, your operating system
|
When you run a command like `python` or `pip`, your shell (bash / zshrc / ...)
|
||||||
searches through a list of directories to find an executable file with
|
searches through a list of directories to find an executable file with
|
||||||
that name. This list of directories lives in an environment variable
|
that name. This list of directories lives in an environment variable
|
||||||
called `PATH`, with each directory in the list separated by a colon:
|
called `PATH`, with each directory in the list separated by a colon:
|
||||||
@@ -193,318 +644,6 @@ As far as Pyenv is concerned, version names are simply directories under
|
|||||||
----
|
----
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### Getting Pyenv
|
|
||||||
#### Homebrew in macOS
|
|
||||||
|
|
||||||
1. Consider installing with [Homebrew](https://brew.sh):
|
|
||||||
```sh
|
|
||||||
brew update
|
|
||||||
brew install pyenv
|
|
||||||
```
|
|
||||||
2. Then follow the rest of the post-installation steps, starting with
|
|
||||||
[Set up your shell environment for Pyenv](#set-up-your-shell-environment-for-pyenv).
|
|
||||||
|
|
||||||
3. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_
|
|
||||||
|
|
||||||
If you're going to build Homebrew formulae from source that link against Python
|
|
||||||
like Tkinter or NumPy
|
|
||||||
_(This is only generally the case if you are a developer of such a formula,
|
|
||||||
or if you have an EOL version of MacOS for which prebuilt bottles are no longer provided
|
|
||||||
and you are using such a formula)._
|
|
||||||
|
|
||||||
To avoid them accidentally linking against a Pyenv-provided Python,
|
|
||||||
add the following line into your interactive shell's configuration:
|
|
||||||
|
|
||||||
* Bash/Zsh:
|
|
||||||
|
|
||||||
~~~bash
|
|
||||||
alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew'
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* Fish:
|
|
||||||
|
|
||||||
~~~fish
|
|
||||||
alias brew="env PATH=(string replace (pyenv root)/shims '' \"\$PATH\") brew"
|
|
||||||
~~~
|
|
||||||
|
|
||||||
|
|
||||||
#### Windows
|
|
||||||
|
|
||||||
Pyenv does not officially support Windows and does not work in Windows outside
|
|
||||||
the Windows Subsystem for Linux.
|
|
||||||
Moreover, even there, the Pythons it installs are not native Windows versions
|
|
||||||
but rather Linux versions running in a virtual machine --
|
|
||||||
so you won't get Windows-specific functionality.
|
|
||||||
|
|
||||||
If you're in Windows, we recommend using @kirankotari's [`pyenv-win`](https://github.com/pyenv-win/pyenv-win) fork --
|
|
||||||
which does install native Windows Python versions.
|
|
||||||
|
|
||||||
|
|
||||||
#### Automatic installer
|
|
||||||
|
|
||||||
Visit our other project:
|
|
||||||
https://github.com/pyenv/pyenv-installer
|
|
||||||
|
|
||||||
|
|
||||||
#### Basic GitHub Checkout
|
|
||||||
|
|
||||||
This will get you going with the latest version of Pyenv and make it
|
|
||||||
easy to fork and contribute any changes back upstream.
|
|
||||||
|
|
||||||
* **Check out Pyenv where you want it installed.**
|
|
||||||
A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else):
|
|
||||||
|
|
||||||
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
|
|
||||||
|
|
||||||
* Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't
|
|
||||||
worry if it fails; Pyenv will still work normally:
|
|
||||||
|
|
||||||
cd ~/.pyenv && src/configure && make -C src
|
|
||||||
|
|
||||||
|
|
||||||
### Set up your shell environment for Pyenv
|
|
||||||
|
|
||||||
**Upgrade note:** The startup logic and instructions have been updated for simplicity in 2.3.0.
|
|
||||||
The previous, more complicated configuration scheme for 2.0.0-2.2.5 still works.
|
|
||||||
|
|
||||||
* Define environment variable `PYENV_ROOT` to point to the path where
|
|
||||||
Pyenv will store its data. `$HOME/.pyenv` is the default.
|
|
||||||
If you installed Pyenv via Git checkout, we recommend
|
|
||||||
to set it to the same location as where you cloned it.
|
|
||||||
* Add the `pyenv` executable to your `PATH` if it's not already there
|
|
||||||
* run `eval "$(pyenv init -)"` to install `pyenv` into your shell as a shell function, enable shims and autocompletion
|
|
||||||
* You may run `eval "$(pyenv init --path)"` instead to just enable shims, without shell integration
|
|
||||||
|
|
||||||
The below setup should work for the vast majority of users for common use cases.
|
|
||||||
See [Advanced configuration](#advanced-configuration) for details and more configuration options.
|
|
||||||
|
|
||||||
- For **bash**:
|
|
||||||
|
|
||||||
Stock Bash startup files vary widely between distributions in which of them source
|
|
||||||
which, under what circumstances, in what order and what additional configuration they perform.
|
|
||||||
As such, the most reliable way to get Pyenv in all environments is to append Pyenv
|
|
||||||
configuration commands to both `.bashrc` (for interactive shells)
|
|
||||||
and the profile file that Bash would use (for login shells).
|
|
||||||
|
|
||||||
First, add the commands to `~/.bashrc`:
|
|
||||||
|
|
||||||
~~~ bash
|
|
||||||
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
|
|
||||||
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
|
|
||||||
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well.
|
|
||||||
If you have none of these, add them to `~/.profile`.
|
|
||||||
|
|
||||||
* to add to `~/.profile`:
|
|
||||||
~~~ bash
|
|
||||||
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
|
|
||||||
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
|
|
||||||
echo 'eval "$(pyenv init -)"' >> ~/.profile
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* to add to `~/.bash_profile`:
|
|
||||||
~~~ bash
|
|
||||||
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
|
|
||||||
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
|
|
||||||
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
|
|
||||||
~~~
|
|
||||||
|
|
||||||
- For **Zsh**:
|
|
||||||
~~~ zsh
|
|
||||||
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
|
|
||||||
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
|
|
||||||
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
|
|
||||||
~~~
|
|
||||||
|
|
||||||
If you wish to get Pyenv in noninteractive login shells as well, also add the commands to `~/.zprofile` or `~/.zlogin`.
|
|
||||||
|
|
||||||
- For **Fish shell**:
|
|
||||||
|
|
||||||
Execute this interactively:
|
|
||||||
|
|
||||||
~~~ fish
|
|
||||||
set -Ux PYENV_ROOT $HOME/.pyenv
|
|
||||||
set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths
|
|
||||||
~~~
|
|
||||||
|
|
||||||
And add this to `~/.config/fish/config.fish`:
|
|
||||||
|
|
||||||
~~~ fish
|
|
||||||
pyenv init - | source
|
|
||||||
~~~
|
|
||||||
|
|
||||||
**Bash warning**: There are some systems where the `BASH_ENV` variable is configured
|
|
||||||
to point to `.bashrc`. On such systems, you should almost certainly put the
|
|
||||||
`eval "$(pyenv init -)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you
|
|
||||||
may observe strange behaviour, such as `pyenv` getting into an infinite loop.
|
|
||||||
See [#264](https://github.com/pyenv/pyenv/issues/264) for details.
|
|
||||||
|
|
||||||
**Proxy note**: If you use a proxy, export `http_proxy` and `https_proxy`, too.
|
|
||||||
|
|
||||||
|
|
||||||
### Restart your shell
|
|
||||||
|
|
||||||
for the `PATH` changes to take effect.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
exec "$SHELL"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Install Python build dependencies
|
|
||||||
|
|
||||||
[**Install Python build dependencies**](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)
|
|
||||||
before attempting to install a new Python version.
|
|
||||||
|
|
||||||
You can now begin using Pyenv.
|
|
||||||
|
|
||||||
----
|
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Install additional Python versions
|
|
||||||
|
|
||||||
To install additional Python versions, use [`pyenv install`](COMMANDS.md#pyenv-install).
|
|
||||||
|
|
||||||
For example, to download and install Python 3.10.4, run:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
pyenv install 3.10.4
|
|
||||||
```
|
|
||||||
|
|
||||||
**NOTE:** Most Pyenv-provided Python releases are source releases and are built
|
|
||||||
from source as part of installation (that's why you need Python build dependencies preinstalled).
|
|
||||||
You can pass options to Python's `configure` and compiler flags to customize the build,
|
|
||||||
see [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables)
|
|
||||||
for details.
|
|
||||||
|
|
||||||
**NOTE:** If you want to use proxy for download, please set the `http_proxy` and `https_proxy`
|
|
||||||
environment variables.
|
|
||||||
|
|
||||||
**NOTE:** If you are having trouble installing a Python version,
|
|
||||||
please visit the wiki page about
|
|
||||||
[Common Build Problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems).
|
|
||||||
|
|
||||||
|
|
||||||
#### Python versions with extended support
|
|
||||||
|
|
||||||
For the following Python releases, Pyenv applies user-provided patches that add support for some newer environments.
|
|
||||||
Though we don't actively maintain those patches, since existing releases never change,
|
|
||||||
it's safe to assume that they will continue working until there are further incompatible changes
|
|
||||||
in a later version of those environments.
|
|
||||||
|
|
||||||
* *3.7.8-3.7.13, 3.8.4-3.8.12, 3.9.0-3.9.7* : XCode 13.3
|
|
||||||
* *3.6.15* : MacOS 11+ and XCode 13.3
|
|
||||||
* *2.7.18* : MacOS 10.15+ and Apple Silicon
|
|
||||||
|
|
||||||
|
|
||||||
### Switch between Python versions
|
|
||||||
|
|
||||||
To select a Pyenv-installed Python as the version to use, run one
|
|
||||||
of the following commands:
|
|
||||||
|
|
||||||
* [`pyenv shell <version>`](COMMANDS.md#pyenv-shell) -- select just for current shell session
|
|
||||||
* [`pyenv local <version>`](COMMANDS.md#pyenv-local) -- automatically select whenever you are in the current directory (or its subdirectories)
|
|
||||||
* [`pyenv global <version>`](COMMANDS.md#pyenv-shell) -- select globally for your user account
|
|
||||||
|
|
||||||
E.g. to select the above-mentioned newly-installed Python 3.10.4 as your preferred version to use:
|
|
||||||
|
|
||||||
~~~bash
|
|
||||||
pyenv global 3.10.4
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Now whenever you invoke `python`, `pip` etc., an executable from the Pyenv-provided
|
|
||||||
3.10.4 installation will be run instead of the system Python.
|
|
||||||
|
|
||||||
Using "`system`" as a version name would reset the selection to your system-provided Python.
|
|
||||||
|
|
||||||
See [Understanding shims](#understanding-shims) and
|
|
||||||
[Understanding Python version selection](#understanding-python-version-selection)
|
|
||||||
for more details on how the selection works and more information on its usage.
|
|
||||||
|
|
||||||
|
|
||||||
### Uninstall Python versions
|
|
||||||
|
|
||||||
As time goes on, you will accumulate Python versions in your
|
|
||||||
`$(pyenv root)/versions` directory.
|
|
||||||
|
|
||||||
To remove old Python versions, use [`pyenv uninstall <version>`](COMMANDS.md#pyenv-uninstall).
|
|
||||||
|
|
||||||
Alternatively, you can simply `rm -rf` the directory of the version you want
|
|
||||||
to remove. You can find the directory of a particular Python version
|
|
||||||
with the `pyenv prefix` command, e.g. `pyenv prefix 2.6.8`.
|
|
||||||
Note however that plugins may run additional operations on uninstall
|
|
||||||
which you would need to do by hand as well. E.g. Pyenv-Virtualenv also
|
|
||||||
removes any virtual environments linked to the version being uninstalled.
|
|
||||||
|
|
||||||
|
|
||||||
### Other operations
|
|
||||||
|
|
||||||
Run `pyenv commands` to get a list of all available subcommands.
|
|
||||||
Run a subcommand with `--help` to get help on it, or see the [Commands Reference](COMMANDS.md).
|
|
||||||
|
|
||||||
Note that Pyenv plugins that you install may add their own subcommands.
|
|
||||||
|
|
||||||
|
|
||||||
## Upgrading
|
|
||||||
|
|
||||||
If you've installed Pyenv using Homebrew, upgrade using:
|
|
||||||
```sh
|
|
||||||
brew upgrade pyenv
|
|
||||||
```
|
|
||||||
|
|
||||||
If you've installed Pyenv using Pyenv-installer or Git checkout, you can
|
|
||||||
upgrade your installation at any time using Git.
|
|
||||||
|
|
||||||
To upgrade to the latest development version of pyenv, use `git pull`:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cd $(pyenv root)
|
|
||||||
git pull
|
|
||||||
```
|
|
||||||
|
|
||||||
To upgrade to a specific release of Pyenv, check out the corresponding tag:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cd $(pyenv root)
|
|
||||||
git fetch
|
|
||||||
git tag
|
|
||||||
git checkout v0.1.0
|
|
||||||
```
|
|
||||||
|
|
||||||
## Uninstalling pyenv
|
|
||||||
|
|
||||||
The simplicity of pyenv makes it easy to temporarily disable it, or
|
|
||||||
uninstall from the system.
|
|
||||||
|
|
||||||
1. To **disable** Pyenv managing your Python versions, simply remove the
|
|
||||||
`pyenv init` invocations from your shell startup configuration. This will
|
|
||||||
remove Pyenv shims directory from `PATH`, and future invocations like
|
|
||||||
`python` will execute the system Python version, as it was before Pyenv.
|
|
||||||
|
|
||||||
`pyenv` will still be accessible on the command line, but your Python
|
|
||||||
apps won't be affected by version switching.
|
|
||||||
|
|
||||||
2. To completely **uninstall** Pyenv, remove _all_ Pyenv configuration lines
|
|
||||||
from your shell startup configuration, and then remove
|
|
||||||
its root directory. This will **delete all Python versions** that were
|
|
||||||
installed under the `` $(pyenv root)/versions/ `` directory:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
rm -rf $(pyenv root)
|
|
||||||
```
|
|
||||||
|
|
||||||
If you've installed Pyenv using a package manager, as a final step,
|
|
||||||
perform the Pyenv package removal. For instance, for Homebrew:
|
|
||||||
|
|
||||||
```
|
|
||||||
brew uninstall pyenv
|
|
||||||
```
|
|
||||||
|
|
||||||
## Advanced Configuration
|
## Advanced Configuration
|
||||||
|
|
||||||
Skip this section unless you must know what every line in your shell
|
Skip this section unless you must know what every line in your shell
|
||||||
@@ -517,23 +656,25 @@ for the environment variables that control Pyenv's behavior.
|
|||||||
extra commands into your shell. Coming from RVM, some of you might be
|
extra commands into your shell. Coming from RVM, some of you might be
|
||||||
opposed to this idea. Here's what `eval "$(pyenv init -)"` actually does:
|
opposed to this idea. Here's what `eval "$(pyenv init -)"` actually does:
|
||||||
|
|
||||||
|
1. **Finds current shell.**
|
||||||
|
`pyenv init` figures out what shell you are using, as the exact commands of `eval "$(pyenv init -)"` vary depending on shell. Specifying which shell you are using (e.g. `eval "$(pyenv init - bash)"`) is preferred, because it reduces launch time significantly.
|
||||||
|
|
||||||
1. **Sets up the shims path.** This is what allows Pyenv to intercept
|
2. **Sets up the shims path.** This is what allows Pyenv to intercept
|
||||||
and redirect invocations of `python`, `pip` etc. transparently.
|
and redirect invocations of `python`, `pip` etc. transparently.
|
||||||
It prepends `$(pyenv root)/shims` to your `$PATH`.
|
It prepends `$(pyenv root)/shims` to your `$PATH`.
|
||||||
It also deletes any other instances of `$(pyenv root)/shims` on `PATH`
|
It also deletes any other instances of `$(pyenv root)/shims` on `PATH`
|
||||||
which allows to invoke `eval "$(pyenv init -)"` multiple times without
|
which allows to invoke `eval "$(pyenv init -)"` multiple times without
|
||||||
getting duplicate `PATH` entries.
|
getting duplicate `PATH` entries.
|
||||||
|
|
||||||
2. **Installs autocompletion.** This is entirely optional but pretty
|
3. **Installs autocompletion.** This is entirely optional but pretty
|
||||||
useful. Sourcing `$(pyenv root)/completions/pyenv.bash` will set that
|
useful. Sourcing `<pyenv installation prefix>/completions/pyenv.bash` will set that
|
||||||
up. There are also completions for Zsh and Fish.
|
up. There are also completions for Zsh and Fish.
|
||||||
|
|
||||||
3. **Rehashes shims.** From time to time you'll need to rebuild your
|
4. **Rehashes shims.** From time to time you'll need to rebuild your
|
||||||
shim files. Doing this on init makes sure everything is up to
|
shim files. Doing this on init makes sure everything is up to
|
||||||
date. You can always run `pyenv rehash` manually.
|
date. You can always run `pyenv rehash` manually.
|
||||||
|
|
||||||
4. **Installs `pyenv` into the current shell as a shell function.**
|
5. **Installs `pyenv` into the current shell as a shell function.**
|
||||||
This bit is also optional, but allows
|
This bit is also optional, but allows
|
||||||
pyenv and plugins to change variables in your current shell.
|
pyenv and plugins to change variables in your current shell.
|
||||||
This is required for some commands like `pyenv shell` to work.
|
This is required for some commands like `pyenv shell` to work.
|
||||||
@@ -542,7 +683,7 @@ opposed to this idea. Here's what `eval "$(pyenv init -)"` actually does:
|
|||||||
for some reason you need `pyenv` to be a real script rather than a
|
for some reason you need `pyenv` to be a real script rather than a
|
||||||
shell function, you can safely skip it.
|
shell function, you can safely skip it.
|
||||||
|
|
||||||
`eval "$(pyenv init --path)"` only does items 1 and 3.
|
`eval "$(pyenv init --path)"` only does items 2 and 4.
|
||||||
|
|
||||||
To see exactly what happens under the hood for yourself, run `pyenv init -`
|
To see exactly what happens under the hood for yourself, run `pyenv init -`
|
||||||
or `pyenv init --path`.
|
or `pyenv init --path`.
|
||||||
@@ -590,14 +731,12 @@ name | default | description
|
|||||||
`PYENV_DEBUG` | | Outputs debug information.<br>Also as: `pyenv --debug <subcommand>`
|
`PYENV_DEBUG` | | Outputs debug information.<br>Also as: `pyenv --debug <subcommand>`
|
||||||
`PYENV_HOOK_PATH` | [_see wiki_][hooks] | Colon-separated list of paths searched for pyenv hooks.
|
`PYENV_HOOK_PATH` | [_see wiki_][hooks] | Colon-separated list of paths searched for pyenv hooks.
|
||||||
`PYENV_DIR` | `$PWD` | Directory to start searching for `.python-version` files.
|
`PYENV_DIR` | `$PWD` | Directory to start searching for `.python-version` files.
|
||||||
`PYTHON_BUILD_ARIA2_OPTS` | | Used to pass additional parameters to [`aria2`](https://aria2.github.io/).<br>If the `aria2c` binary is available on `PATH`, pyenv uses `aria2c` instead of `curl` or `wget` to download the Python Source code. If you have an unstable internet connection, you can use this variable to instruct `aria2` to accelerate the download.<br>In most cases, you will only need to use `-x 10 -k 1M` as value to `PYTHON_BUILD_ARIA2_OPTS` environment variable
|
|
||||||
|
|
||||||
See also [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables)
|
See also [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables)
|
||||||
for environment variables that can be used to customize the build.
|
for environment variables that can be used to customize the build.
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
The pyenv source code is [hosted on
|
The pyenv source code is [hosted on
|
||||||
|
|||||||
BIN
install_local_python.gif
Normal file
BIN
install_local_python.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 531 KiB |
@@ -29,7 +29,7 @@ if enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev
|
|||||||
else
|
else
|
||||||
[ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin"
|
[ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin"
|
||||||
|
|
||||||
READLINK=$(type -P greadlink readlink | head -1)
|
READLINK=$(type -P readlink)
|
||||||
[ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?"
|
[ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?"
|
||||||
|
|
||||||
resolve_link() {
|
resolve_link() {
|
||||||
@@ -94,7 +94,7 @@ if [ "${bin_path%/*}" != "$PYENV_ROOT" ]; then
|
|||||||
# Add pyenv's own `pyenv.d` unless pyenv was cloned to PYENV_ROOT
|
# Add pyenv's own `pyenv.d` unless pyenv was cloned to PYENV_ROOT
|
||||||
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${bin_path%/*}/pyenv.d"
|
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${bin_path%/*}/pyenv.d"
|
||||||
fi
|
fi
|
||||||
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks"
|
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:/usr/etc/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks"
|
||||||
for plugin_hook in "${PYENV_ROOT}/plugins/"*/etc/pyenv.d; do
|
for plugin_hook in "${PYENV_ROOT}/plugins/"*/etc/pyenv.d; do
|
||||||
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${plugin_hook}"
|
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${plugin_hook}"
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
version="2.3.3"
|
version="2.5.5"
|
||||||
git_revision=""
|
git_revision=""
|
||||||
|
|
||||||
if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then
|
if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ if [ "$1" = "--complete" ]; then
|
|||||||
exec pyenv-shims --short
|
exec pyenv-shims --short
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PYENV_VERSION="$(pyenv-version-name)"
|
PYENV_VERSION="$(pyenv-version-name -f)"
|
||||||
PYENV_COMMAND="$1"
|
PYENV_COMMAND="$1"
|
||||||
|
|
||||||
if [ -z "$PYENV_COMMAND" ]; then
|
if [ -z "$PYENV_COMMAND" ]; then
|
||||||
@@ -29,9 +29,9 @@ if [ -z "$PYENV_COMMAND" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export PYENV_VERSION
|
|
||||||
PYENV_COMMAND_PATH="$(pyenv-which "$PYENV_COMMAND")"
|
PYENV_COMMAND_PATH="$(pyenv-which "$PYENV_COMMAND")"
|
||||||
PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}"
|
PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}"
|
||||||
|
export PYENV_VERSION
|
||||||
|
|
||||||
OLDIFS="$IFS"
|
OLDIFS="$IFS"
|
||||||
IFS=$'\n' scripts=(`pyenv-hooks exec`)
|
IFS=$'\n' scripts=(`pyenv-hooks exec`)
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ extract_initial_comment_block() {
|
|||||||
collect_documentation() {
|
collect_documentation() {
|
||||||
# `tail` prevents "broken pipe" errors due to `head` closing the pipe without reading everything
|
# `tail` prevents "broken pipe" errors due to `head` closing the pipe without reading everything
|
||||||
# https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error/642932#642932
|
# https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error/642932#642932
|
||||||
$(type -P gawk awk | tail -n +1 | head -1) '
|
$(type -P gawk awk | tail -n +1 | head -n1) '
|
||||||
/^Summary:/ {
|
/^Summary:/ {
|
||||||
summary = substr($0, 10)
|
summary = substr($0, 10)
|
||||||
next
|
next
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; th
|
|||||||
echo "pyenv: failed to load \`realpath' builtin" >&2
|
echo "pyenv: failed to load \`realpath' builtin" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
READLINK=$(type -P greadlink readlink | head -1)
|
READLINK=$(type -P readlink)
|
||||||
if [ -z "$READLINK" ]; then
|
if [ -z "$READLINK" ]; then
|
||||||
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Summary: Configure the shell environment for pyenv
|
# Summary: Configure the shell environment for pyenv
|
||||||
# Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
|
# Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--detect-shell] [--no-rehash] [<shell>])"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
@@ -9,7 +9,9 @@ set -e
|
|||||||
if [ "$1" = "--complete" ]; then
|
if [ "$1" = "--complete" ]; then
|
||||||
echo -
|
echo -
|
||||||
echo --path
|
echo --path
|
||||||
|
echo --no-push-path
|
||||||
echo --no-rehash
|
echo --no-rehash
|
||||||
|
echo --detect-shell
|
||||||
echo bash
|
echo bash
|
||||||
echo fish
|
echo fish
|
||||||
echo ksh
|
echo ksh
|
||||||
@@ -18,26 +20,32 @@ if [ "$1" = "--complete" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
mode="help"
|
mode="help"
|
||||||
no_rehash=""
|
|
||||||
for args in "$@"
|
|
||||||
do
|
|
||||||
if [ "$args" = "-" ]; then
|
|
||||||
mode="print"
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$args" = "--path" ]; then
|
while [ "$#" -gt 0 ]; do
|
||||||
mode="path"
|
case "$1" in
|
||||||
shift
|
-)
|
||||||
fi
|
mode="print"
|
||||||
|
;;
|
||||||
if [ "$args" = "--no-rehash" ]; then
|
--path)
|
||||||
no_rehash=1
|
mode="path"
|
||||||
shift
|
;;
|
||||||
fi
|
--detect-shell)
|
||||||
|
mode="detect-shell"
|
||||||
|
;;
|
||||||
|
--no-push-path)
|
||||||
|
no_push_path=1
|
||||||
|
;;
|
||||||
|
--no-rehash)
|
||||||
|
no_rehash=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
shell="$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
shell="$1"
|
# If shell is not provided, detect it.
|
||||||
if [ -z "$shell" ]; then
|
if [ -z "$shell" ]; then
|
||||||
shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
|
shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
|
||||||
shell="${shell%% *}"
|
shell="${shell%% *}"
|
||||||
@@ -47,8 +55,6 @@ if [ -z "$shell" ]; then
|
|||||||
shell="${shell%%-*}"
|
shell="${shell%%-*}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
root="${0%/*}/.."
|
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
case "$mode" in
|
case "$mode" in
|
||||||
"help")
|
"help")
|
||||||
@@ -69,12 +75,19 @@ function main() {
|
|||||||
print_shell_function
|
print_shell_function
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
|
"detect-shell")
|
||||||
|
detect_profile 1
|
||||||
|
print_detect_shell
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
# should never get here
|
# should never get here
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
|
|
||||||
function help_() {
|
function detect_profile() {
|
||||||
|
local detect_for_detect_shell="$1"
|
||||||
|
|
||||||
case "$shell" in
|
case "$shell" in
|
||||||
bash )
|
bash )
|
||||||
if [ -e '~/.bash_profile' ]; then
|
if [ -e '~/.bash_profile' ]; then
|
||||||
@@ -89,16 +102,35 @@ function help_() {
|
|||||||
profile='~/.zprofile'
|
profile='~/.zprofile'
|
||||||
rc='~/.zshrc'
|
rc='~/.zshrc'
|
||||||
;;
|
;;
|
||||||
ksh )
|
ksh | ksh93 | mksh )
|
||||||
|
# There are two implementations of Korn shell: AT&T (ksh93) and Mir (mksh).
|
||||||
|
# Systems may have them installed under those names, or as ksh, so those
|
||||||
|
# are recognized here. The obsolete ksh88 (subsumed by ksh93) and pdksh
|
||||||
|
# (subsumed by mksh) are not included, since they are unlikely to still
|
||||||
|
# be in use as interactive shells anywhere.
|
||||||
profile='~/.profile'
|
profile='~/.profile'
|
||||||
rc='~/.profile'
|
rc='~/.profile'
|
||||||
;;
|
;;
|
||||||
* )
|
* )
|
||||||
profile='your shell'\''s login startup file'
|
if [ -n "$detect_for_detect_shell" ]; then
|
||||||
rc='your shell'\''s interactive startup file'
|
profile=
|
||||||
|
rc=
|
||||||
|
else
|
||||||
|
profile='your shell'\''s login startup file'
|
||||||
|
rc='your shell'\''s interactive startup file'
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_detect_shell() {
|
||||||
|
echo "PYENV_SHELL_DETECT=$shell"
|
||||||
|
echo "PYENV_PROFILE_DETECT=$profile"
|
||||||
|
echo "PYENV_RC_DETECT=$rc"
|
||||||
|
}
|
||||||
|
|
||||||
|
function help_() {
|
||||||
|
detect_profile
|
||||||
{
|
{
|
||||||
case "$shell" in
|
case "$shell" in
|
||||||
fish )
|
fish )
|
||||||
@@ -111,7 +143,7 @@ function help_() {
|
|||||||
echo "# Load pyenv automatically by appending"
|
echo "# Load pyenv automatically by appending"
|
||||||
echo "# the following to ~/.config/fish/config.fish:"
|
echo "# the following to ~/.config/fish/config.fish:"
|
||||||
echo
|
echo
|
||||||
echo 'pyenv init - | source'
|
echo 'pyenv init - fish | source'
|
||||||
echo
|
echo
|
||||||
;;
|
;;
|
||||||
* )
|
* )
|
||||||
@@ -121,13 +153,13 @@ function help_() {
|
|||||||
echo "$profile :"
|
echo "$profile :"
|
||||||
else
|
else
|
||||||
echo
|
echo
|
||||||
echo "${profile_explain:-$profile} (for login shells)"
|
echo "# ${profile_explain:-$profile} (for login shells)"
|
||||||
echo "and $rc (for interactive shells) :"
|
echo "# and $rc (for interactive shells) :"
|
||||||
fi
|
fi
|
||||||
echo
|
echo
|
||||||
echo 'export PYENV_ROOT="$HOME/.pyenv"'
|
echo 'export PYENV_ROOT="$HOME/.pyenv"'
|
||||||
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"'
|
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"'
|
||||||
echo 'eval "$(pyenv init -)"'
|
echo 'eval "$(pyenv init - '$shell')"'
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
echo
|
echo
|
||||||
@@ -141,24 +173,56 @@ function init_dirs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function print_path() {
|
function print_path() {
|
||||||
case "$shell" in
|
# if no_push_path is set, guard the PATH manipulation with a check on whether
|
||||||
fish )
|
# the shim is already in the PATH.
|
||||||
echo 'while set index (contains -i -- '\'"${PYENV_ROOT}/shims"\'' $PATH)'
|
if [ -n "$no_push_path" ]; then
|
||||||
echo 'set -eg PATH[$index]; end; set -e index'
|
case "$shell" in
|
||||||
echo 'set -gx PATH '\'"${PYENV_ROOT}/shims"\'' $PATH'
|
fish )
|
||||||
;;
|
echo 'if not contains -- "'"${PYENV_ROOT}/shims"'" $PATH'
|
||||||
* )
|
print_path_prepend_shims
|
||||||
# Some distros (notably Debian-based) set Bash's SSH_SOURCE_BASHRC compilation option
|
echo 'end'
|
||||||
# that makes it source `bashrc` under SSH even when not interactive.
|
;;
|
||||||
# This is inhibited by a guard in Debian's stock `bashrc` but some people remove it
|
* )
|
||||||
# in order to get proper environment for noninteractive remote commands
|
echo 'if [[ ":$PATH:" != *'\':"${PYENV_ROOT}"/shims:\''* ]]; then'
|
||||||
# (SSH provides /etc/ssh/sshrc and ~/.ssh/rc for that but no-one seems to use them for some reason).
|
print_path_prepend_shims
|
||||||
# This has caused an infinite `bashrc` execution loop for those people in the below nested Bash invocation (#2367).
|
echo 'fi'
|
||||||
# --norc negates this behavior of such a customized Bash.
|
;;
|
||||||
echo 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); for i in ${!paths[@]}; do if [[ ${paths[i]} == "'\'"${PYENV_ROOT}/shims"\''" ]]; then unset '\'\\\'\''paths[i]'\'\\\'\''; fi; done; echo "${paths[*]}"'\'')"'
|
esac
|
||||||
echo 'export PATH="'"${PYENV_ROOT}"'/shims:${PATH}"'
|
else
|
||||||
;;
|
case "$shell" in
|
||||||
esac
|
fish )
|
||||||
|
echo 'while set pyenv_index (contains -i -- "'"${PYENV_ROOT}/shims"'" $PATH)'
|
||||||
|
echo 'set -eg PATH[$pyenv_index]; end; set -e pyenv_index'
|
||||||
|
print_path_prepend_shims
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
# Some distros (notably Debian-based) set Bash's SSH_SOURCE_BASHRC compilation option
|
||||||
|
# that makes it source `bashrc` under SSH even when not interactive.
|
||||||
|
# This is inhibited by a guard in Debian's stock `bashrc` but some people remove it
|
||||||
|
# in order to get proper environment for noninteractive remote commands
|
||||||
|
# (SSH provides /etc/ssh/sshrc and ~/.ssh/rc for that but no-one seems to use them for some reason).
|
||||||
|
# This has caused an infinite `bashrc` execution loop for those people in the below nested Bash invocation (#2367).
|
||||||
|
# --norc negates this behavior of such a customized Bash.
|
||||||
|
echo 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); '
|
||||||
|
echo 'for i in ${!paths[@]}; do '
|
||||||
|
echo 'if [[ ${paths[i]} == "'\'\'"${PYENV_ROOT}/shims"\'\''" ]]; then unset '\'\\\'\''paths[i]'\'\\\'\''; '
|
||||||
|
echo 'fi; done; '
|
||||||
|
echo 'echo "${paths[*]}"'\'')"'
|
||||||
|
print_path_prepend_shims
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_path_prepend_shims() {
|
||||||
|
case "$shell" in
|
||||||
|
fish )
|
||||||
|
echo 'set -gx PATH '\'"${PYENV_ROOT}/shims"\'' $PATH'
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
echo 'export PATH="'"${PYENV_ROOT}"'/shims:${PATH}"'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
function print_env() {
|
function print_env() {
|
||||||
@@ -173,7 +237,7 @@ function print_env() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function print_completion() {
|
function print_completion() {
|
||||||
completion="${root}/completions/pyenv.${shell}"
|
completion="${0%/*/*}/completions/pyenv.${shell}"
|
||||||
if [ -r "$completion" ]; then
|
if [ -r "$completion" ]; then
|
||||||
echo "source '$completion'"
|
echo "source '$completion'"
|
||||||
fi
|
fi
|
||||||
@@ -189,52 +253,44 @@ function print_shell_function() {
|
|||||||
commands=(`pyenv-commands --sh`)
|
commands=(`pyenv-commands --sh`)
|
||||||
case "$shell" in
|
case "$shell" in
|
||||||
fish )
|
fish )
|
||||||
cat <<EOS
|
echo \
|
||||||
function pyenv
|
'function pyenv
|
||||||
set command \$argv[1]
|
set command $argv[1]
|
||||||
set -e argv[1]
|
set -e argv[1]
|
||||||
|
|
||||||
switch "\$command"
|
switch "$command"
|
||||||
case ${commands[*]}
|
case '"${commands[*]}"'
|
||||||
source (pyenv "sh-\$command" \$argv|psub)
|
source (pyenv "sh-$command" $argv|psub)
|
||||||
case '*'
|
case "*"
|
||||||
command pyenv "\$command" \$argv
|
command pyenv "$command" $argv
|
||||||
end
|
end
|
||||||
end
|
end'
|
||||||
EOS
|
|
||||||
;;
|
;;
|
||||||
ksh )
|
ksh | ksh93 | mksh )
|
||||||
cat <<EOS
|
echo \
|
||||||
function pyenv {
|
'function pyenv {
|
||||||
typeset command
|
typeset command=${1:-}'
|
||||||
EOS
|
|
||||||
;;
|
;;
|
||||||
* )
|
* )
|
||||||
cat <<EOS
|
echo \
|
||||||
pyenv() {
|
'pyenv() {
|
||||||
local command
|
local command=${1:-}'
|
||||||
EOS
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ "$shell" != "fish" ]; then
|
if [ "$shell" != "fish" ]; then
|
||||||
IFS="|"
|
IFS="|"
|
||||||
cat <<EOS
|
echo \
|
||||||
command="\${1:-}"
|
' [ "$#" -gt 0 ] && shift
|
||||||
if [ "\$#" -gt 0 ]; then
|
case "$command" in
|
||||||
shift
|
'"${commands[*]:-/}"')
|
||||||
fi
|
eval "$(pyenv "sh-$command" "$@")"
|
||||||
|
|
||||||
case "\$command" in
|
|
||||||
${commands[*]})
|
|
||||||
eval "\$(pyenv "sh-\$command" "\$@")"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
command pyenv "\$command" "\$@"
|
command pyenv "$command" "$@"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}'
|
||||||
EOS
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
100
libexec/pyenv-latest
Executable file
100
libexec/pyenv-latest
Executable file
@@ -0,0 +1,100 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Summary: Print the latest installed or known version with the given prefix
|
||||||
|
# Usage: pyenv latest [-k|--known] <prefix>
|
||||||
|
#
|
||||||
|
# -k/--known Select from all known versions instead of installed
|
||||||
|
# -b/--bypass (internal) On a resolution failure, do not print an error message
|
||||||
|
# but rather print the argument unchanged
|
||||||
|
# -f/--force (internal) Same as -b but also do not return a failure exit code
|
||||||
|
|
||||||
|
set -e
|
||||||
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-k|--known)
|
||||||
|
FROM_KNOWN=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-b|--bypass)
|
||||||
|
BYPASS=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-f|--force)
|
||||||
|
FORCE=1
|
||||||
|
BYPASS=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
prefix=$1
|
||||||
|
exitcode=0
|
||||||
|
|
||||||
|
IFS=$'\n'
|
||||||
|
|
||||||
|
if [[ -z $FROM_KNOWN ]]; then
|
||||||
|
DEFINITION_CANDIDATES=( $(pyenv-versions --bare --skip-envs) )
|
||||||
|
else
|
||||||
|
DEFINITION_CANDIDATES=( $(python-build --definitions ) )
|
||||||
|
fi
|
||||||
|
|
||||||
|
if printf '%s\n' "${DEFINITION_CANDIDATES[@]}" 2>/dev/null | grep -qxFe "$prefix"; then
|
||||||
|
echo "$prefix"
|
||||||
|
exit $exitcode;
|
||||||
|
fi
|
||||||
|
|
||||||
|
suffix=""
|
||||||
|
if [[ $prefix =~ ^(.*[0-9])t$ ]]; then
|
||||||
|
suffix="t"
|
||||||
|
prefix="${BASH_REMATCH[1]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# https://stackoverflow.com/questions/11856054/is-there-an-easy-way-to-pass-a-raw-string-to-grep/63483807#63483807
|
||||||
|
prefix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$prefix")"
|
||||||
|
suffix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$suffix")"
|
||||||
|
# FIXME: more reliable and readable would probably be to loop over them and transform in pure Bash
|
||||||
|
DEFINITION_CANDIDATES=(\
|
||||||
|
$(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \
|
||||||
|
grep -Ee "^$prefix_re[-.].*$suffix_re\$" || true))
|
||||||
|
|
||||||
|
DEFINITION_CANDIDATES=(\
|
||||||
|
$(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \
|
||||||
|
sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d' \
|
||||||
|
$(if [[ -z $suffix ]]; then echo "-e /[0-9]t\$/d"; fi)
|
||||||
|
));
|
||||||
|
|
||||||
|
# Compose a sorting key, followed by | and original value
|
||||||
|
DEFINITION_CANDIDATES=(\
|
||||||
|
$(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \
|
||||||
|
awk \
|
||||||
|
'{ if (match($0,"^[[:alnum:]]+-"))
|
||||||
|
{ print substr($0,0,RLENGTH-1) "." substr($0,RLENGTH+1) "..|" $0; }
|
||||||
|
else
|
||||||
|
{ print $0 "...|" $0; }
|
||||||
|
}'))
|
||||||
|
DEFINITION_CANDIDATES=(\
|
||||||
|
$(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" \
|
||||||
|
| sort -t. -k1,1r -k 2,2nr -k 3,3nr -k4,4nr \
|
||||||
|
| cut -f2 -d $'|' \
|
||||||
|
|| true))
|
||||||
|
DEFINITION="${DEFINITION_CANDIDATES[0]}"
|
||||||
|
|
||||||
|
if [[ -n "$DEFINITION" ]]; then
|
||||||
|
echo "$DEFINITION"
|
||||||
|
else
|
||||||
|
if [[ -z $BYPASS ]]; then
|
||||||
|
echo "pyenv: no $([[ -z $FROM_KNOWN ]] && echo installed || echo known) versions match the prefix \`$prefix'" >&2
|
||||||
|
else
|
||||||
|
echo "$prefix"
|
||||||
|
fi
|
||||||
|
if [[ -z $FORCE ]]; then
|
||||||
|
exitcode=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $exitcode
|
||||||
@@ -2,9 +2,11 @@
|
|||||||
#
|
#
|
||||||
# Summary: Set or show the local application-specific Python version(s)
|
# Summary: Set or show the local application-specific Python version(s)
|
||||||
#
|
#
|
||||||
# Usage: pyenv local <version> <version2> <..>
|
# Usage: pyenv local [-f|--force] [<version> [...]]
|
||||||
# pyenv local --unset
|
# pyenv local --unset
|
||||||
#
|
#
|
||||||
|
# -f/--force Do not verify that the versions being set exist
|
||||||
|
#
|
||||||
# Sets the local application-specific Python version(s) by writing the
|
# Sets the local application-specific Python version(s) by writing the
|
||||||
# version name to a file named `.python-version'.
|
# version name to a file named `.python-version'.
|
||||||
#
|
#
|
||||||
@@ -36,12 +38,25 @@ if [ "$1" = "--complete" ]; then
|
|||||||
exec pyenv-versions --bare
|
exec pyenv-versions --bare
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-f|--force)
|
||||||
|
FORCE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
versions=("$@")
|
versions=("$@")
|
||||||
|
|
||||||
if [ "$versions" = "--unset" ]; then
|
if [ "$versions" = "--unset" ]; then
|
||||||
rm -f .python-version
|
rm -f .python-version
|
||||||
elif [ -n "$versions" ]; then
|
elif [ -n "$versions" ]; then
|
||||||
pyenv-version-file-write .python-version "${versions[@]}"
|
pyenv-version-file-write ${FORCE:+-f }.python-version "${versions[@]}"
|
||||||
else
|
else
|
||||||
if version_file="$(pyenv-version-file "$PWD")"; then
|
if version_file="$(pyenv-version-file "$PWD")"; then
|
||||||
IFS=: versions=($(pyenv-version-file-read "$version_file"))
|
IFS=: versions=($(pyenv-version-file-read "$version_file"))
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ OLDIFS="$IFS"
|
|||||||
{ IFS=:
|
{ IFS=:
|
||||||
for version in ${PYENV_VERSION}; do
|
for version in ${PYENV_VERSION}; do
|
||||||
if [ "$version" = "system" ]; then
|
if [ "$version" = "system" ]; then
|
||||||
if PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python 2>/dev/null)" || \
|
if PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python --skip-advice 2>/dev/null)" || \
|
||||||
PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python3 2>/dev/null)" || \
|
PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python3 --skip-advice 2>/dev/null)" || \
|
||||||
PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python2 2>/dev/null)"; then
|
PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python2 --skip-advice 2>/dev/null)"; then
|
||||||
shopt -s extglob
|
shopt -s extglob
|
||||||
# In some distros (Arch), Python can be found in sbin as well as bin
|
# In some distros (Arch), Python can be found in sbin as well as bin
|
||||||
PYENV_PREFIX_PATH="${PYTHON_PATH%/?(s)bin/*}"
|
PYENV_PREFIX_PATH="${PYTHON_PATH%/?(s)bin/*}"
|
||||||
@@ -42,6 +42,7 @@ OLDIFS="$IFS"
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
version="$(pyenv-latest -f "$version")"
|
||||||
PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${version}"
|
PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${version}"
|
||||||
fi
|
fi
|
||||||
if [ -d "$PYENV_PREFIX_PATH" ]; then
|
if [ -d "$PYENV_PREFIX_PATH" ]; then
|
||||||
|
|||||||
@@ -5,18 +5,33 @@ set -e
|
|||||||
|
|
||||||
VERSION_FILE="$1"
|
VERSION_FILE="$1"
|
||||||
|
|
||||||
|
function is_version_safe() {
|
||||||
|
# As needed, check that the constructed path exists as a child path of PYENV_ROOT/versions
|
||||||
|
version="$1"
|
||||||
|
if [[ "$version" == ".." || "$version" == */* ]]; then
|
||||||
|
# Sanity check the value of version to prevent malicious path-traversal
|
||||||
|
(
|
||||||
|
cd "$PYENV_ROOT/versions/$version" &>/dev/null || exit 1
|
||||||
|
[[ "$PWD" == "$PYENV_ROOT/versions/"* ]]
|
||||||
|
)
|
||||||
|
return $?
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
if [ -s "$VERSION_FILE" ]; then
|
if [ -s "$VERSION_FILE" ]; then
|
||||||
# Read the first non-whitespace word from the specified version file.
|
# Read the first non-whitespace word from the specified version file.
|
||||||
# Be careful not to load it whole in case there's something crazy in it.
|
# Be careful not to load it whole in case there's something crazy in it.
|
||||||
IFS="${IFS}"$'\r'
|
IFS="$IFS"$'\r'
|
||||||
sep=
|
sep=
|
||||||
while read -n 1024 -r version _ || [[ $version ]]; do
|
while read -n 1024 -r version _ || [[ $version ]]; do
|
||||||
if [[ -z $version || $version == \#* ]]; then
|
if [[ -z "$version" || "$version" == \#* ]]; then
|
||||||
# Skip empty lines and comments
|
# Skip empty lines and comments
|
||||||
continue
|
continue
|
||||||
elif [ "$version" = ".." ] || [[ $version == */* ]]; then
|
elif ! is_version_safe "$version"; then
|
||||||
# The version string is used to construct a path and we skip dubious values.
|
# CVE-2022-35861 allowed arbitrary code execution in some contexts and is mitigated by is_version_safe.
|
||||||
# This prevents issues such as path traversal (CVE-2022-35861).
|
echo "pyenv: invalid version \`$version' ignored in \`$VERSION_FILE'" >&2
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
printf "%s%s" "$sep" "$version"
|
printf "%s%s" "$sep" "$version"
|
||||||
|
|||||||
@@ -1,9 +1,25 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Usage: pyenv version-file-write <file> <version>
|
# Usage: pyenv version-file-write [-f|--force] <file> <version> [...]
|
||||||
|
#
|
||||||
|
# -f/--force Don't verify that the versions exist
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-f|--force)
|
||||||
|
FORCE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
PYENV_VERSION_FILE="$1"
|
PYENV_VERSION_FILE="$1"
|
||||||
shift || true
|
shift || true
|
||||||
versions=("$@")
|
versions=("$@")
|
||||||
@@ -14,7 +30,7 @@ if [ -z "$versions" ] || [ -z "$PYENV_VERSION_FILE" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure the specified version is installed.
|
# Make sure the specified version is installed.
|
||||||
pyenv-prefix "${versions[@]}" >/dev/null
|
[[ -z $FORCE ]] && pyenv-prefix "${versions[@]}" >/dev/null
|
||||||
|
|
||||||
# Write the version out to disk.
|
# Write the version out to disk.
|
||||||
# Create an empty file. Using "rm" might cause a permission error.
|
# Create an empty file. Using "rm" might cause a permission error.
|
||||||
|
|||||||
@@ -1,8 +1,25 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Summary: Show the current Python version
|
# Summary: Show the current Python version
|
||||||
|
#
|
||||||
|
# -f/--force (Internal) If a version doesn't exist, print it as is rather than produce an error
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
-f|--force)
|
||||||
|
FORCE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
if [ -z "$PYENV_VERSION" ]; then
|
if [ -z "$PYENV_VERSION" ]; then
|
||||||
PYENV_VERSION_FILE="$(pyenv-version-file)"
|
PYENV_VERSION_FILE="$(pyenv-version-file)"
|
||||||
PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)"
|
PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)"
|
||||||
@@ -30,13 +47,23 @@ OLDIFS="$IFS"
|
|||||||
{ IFS=:
|
{ IFS=:
|
||||||
any_not_installed=0
|
any_not_installed=0
|
||||||
for version in ${PYENV_VERSION}; do
|
for version in ${PYENV_VERSION}; do
|
||||||
if version_exists "$version" || [ "$version" = "system" ]; then
|
# Remove the explicit 'python-' prefix from versions like 'python-3.12'.
|
||||||
versions=("${versions[@]}" "${version}")
|
normalised_version="${version#python-}"
|
||||||
elif version_exists "${version#python-}"; then
|
if version_exists "${version}" || [ "$version" = "system" ]; then
|
||||||
versions=("${versions[@]}" "${version#python-}")
|
versions+=("${version}")
|
||||||
|
elif version_exists "${normalised_version}"; then
|
||||||
|
versions+=("${normalised_version}")
|
||||||
|
elif resolved_version="$(pyenv-latest -b "${version}")"; then
|
||||||
|
versions+=("${resolved_version}")
|
||||||
|
elif resolved_version="$(pyenv-latest -b "${normalised_version}")"; then
|
||||||
|
versions+=("${resolved_version}")
|
||||||
else
|
else
|
||||||
echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2
|
if [[ -n $FORCE ]]; then
|
||||||
any_not_installed=1
|
versions+=("${normalised_version}")
|
||||||
|
else
|
||||||
|
echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2
|
||||||
|
any_not_installed=1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,23 +1,24 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Summary: List all Python versions available to pyenv
|
# Summary: List all Python versions available to pyenv
|
||||||
# Usage: pyenv versions [--bare] [--skip-aliases]
|
# Usage: pyenv versions [--bare] [--skip-aliases] [--skip-envs]
|
||||||
#
|
#
|
||||||
# Lists all Python versions found in `$PYENV_ROOT/versions/*'.
|
# Lists all Python versions found in `$PYENV_ROOT/versions/*'.
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
unset bare
|
unset bare skip_aliases skip_envs
|
||||||
unset skip_aliases
|
|
||||||
# Provide pyenv completions
|
# Provide pyenv completions
|
||||||
for arg; do
|
for arg; do
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
--complete )
|
--complete )
|
||||||
echo --bare
|
echo --bare
|
||||||
echo --skip-aliases
|
echo --skip-aliases
|
||||||
|
echo --skip-envs
|
||||||
exit ;;
|
exit ;;
|
||||||
--bare ) bare=1 ;;
|
--bare ) bare=1 ;;
|
||||||
--skip-aliases ) skip_aliases=1 ;;
|
--skip-aliases ) skip_aliases=1 ;;
|
||||||
|
--skip-envs ) skip_envs=1 ;;
|
||||||
* )
|
* )
|
||||||
pyenv-help --usage versions >&2
|
pyenv-help --usage versions >&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -33,7 +34,7 @@ if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; th
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
READLINK=$(type -P greadlink readlink | head -1)
|
READLINK=$(type -P readlink)
|
||||||
if [ -z "$READLINK" ]; then
|
if [ -z "$READLINK" ]; then
|
||||||
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -70,8 +71,6 @@ else
|
|||||||
current_versions=()
|
current_versions=()
|
||||||
fi
|
fi
|
||||||
if [ -n "$bare" ]; then
|
if [ -n "$bare" ]; then
|
||||||
hit_prefix=""
|
|
||||||
miss_prefix=""
|
|
||||||
include_system=""
|
include_system=""
|
||||||
else
|
else
|
||||||
hit_prefix="* "
|
hit_prefix="* "
|
||||||
@@ -104,22 +103,35 @@ exists() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
print_version() {
|
print_version() {
|
||||||
if [[ ${BASH_VERSINFO[0]} -ge 4 && ${current_versions["$1"]} ]]; then
|
local version="${1:?}"
|
||||||
echo "${hit_prefix}$1 (set by $(pyenv-version-origin))"
|
if [[ -n $bare ]]; then
|
||||||
elif (( ${BASH_VERSINFO[0]} <= 3 )) && exists "$1" "${current_versions[@]}"; then
|
echo "$version"
|
||||||
echo "${hit_prefix}$1 (set by $(pyenv-version-origin))"
|
return
|
||||||
|
fi
|
||||||
|
local path="${2:?}"
|
||||||
|
if [[ -L "$path" ]]; then
|
||||||
|
# Only resolve the link itself for printing, do not resolve further.
|
||||||
|
# Doing otherwise would misinform the user of what the link contains.
|
||||||
|
version_repr="$version --> $(readlink "$path")"
|
||||||
else
|
else
|
||||||
echo "${miss_prefix}$1"
|
version_repr="$version"
|
||||||
|
fi
|
||||||
|
if [[ ${BASH_VERSINFO[0]} -ge 4 && ${current_versions["$1"]} ]]; then
|
||||||
|
echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))"
|
||||||
|
elif (( ${BASH_VERSINFO[0]} <= 3 )) && exists "$1" "${current_versions[@]}"; then
|
||||||
|
echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))"
|
||||||
|
else
|
||||||
|
echo "${miss_prefix}${version_repr}"
|
||||||
fi
|
fi
|
||||||
num_versions=$((num_versions + 1))
|
num_versions=$((num_versions + 1))
|
||||||
}
|
}
|
||||||
|
|
||||||
# Include "system" in the non-bare output, if it exists
|
# Include "system" in the non-bare output, if it exists
|
||||||
if [ -n "$include_system" ] && \
|
if [ -n "$include_system" ] && \
|
||||||
(PYENV_VERSION=system pyenv-which python >/dev/null 2>&1 || \
|
(PYENV_VERSION=system pyenv-which python --skip-advice >/dev/null 2>&1 || \
|
||||||
PYENV_VERSION=system pyenv-which python3 >/dev/null 2>&1 || \
|
PYENV_VERSION=system pyenv-which python3 --skip-advice >/dev/null 2>&1 || \
|
||||||
PYENV_VERSION=system pyenv-which python2 >/dev/null 2>&1) ; then
|
PYENV_VERSION=system pyenv-which python2 --skip-advice >/dev/null 2>&1) ; then
|
||||||
print_version system
|
print_version system "/"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
shopt -s dotglob nullglob
|
shopt -s dotglob nullglob
|
||||||
@@ -139,16 +151,18 @@ for path in "${versions_dir_entries[@]}"; do
|
|||||||
if [ -d "$path" ]; then
|
if [ -d "$path" ]; then
|
||||||
if [ -n "$skip_aliases" ] && [ -L "$path" ]; then
|
if [ -n "$skip_aliases" ] && [ -L "$path" ]; then
|
||||||
target="$(realpath "$path")"
|
target="$(realpath "$path")"
|
||||||
[ "${target%/*}" != "$versions_dir" ] || continue
|
[ "${target%/*}" == "$versions_dir" ] && continue
|
||||||
[ "${target%/*/envs/*}" != "$versions_dir" ] || continue
|
[ "${target%/*/envs/*}" == "$versions_dir" ] && continue
|
||||||
|
fi
|
||||||
|
print_version "${path##*/}" "$path"
|
||||||
|
# virtual environments created by anaconda/miniconda/pyenv-virtualenv
|
||||||
|
if [[ -z $skip_envs ]]; then
|
||||||
|
for env_path in "${path}/envs/"*; do
|
||||||
|
if [ -d "${env_path}" ]; then
|
||||||
|
print_version "${env_path#${PYENV_ROOT}/versions/}" "${env_path}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
print_version "${path##*/}"
|
|
||||||
# virtual environments created by anaconda/miniconda
|
|
||||||
for env_path in "${path}/envs/"*; do
|
|
||||||
if [ -d "${env_path}" ]; then
|
|
||||||
print_version "${env_path#${PYENV_ROOT}/versions/}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
shopt -u dotglob nullglob
|
shopt -u dotglob nullglob
|
||||||
|
|||||||
@@ -2,13 +2,14 @@
|
|||||||
#
|
#
|
||||||
# Summary: Display the full path to an executable
|
# Summary: Display the full path to an executable
|
||||||
#
|
#
|
||||||
# Usage: pyenv which <command> [--nosystem]
|
# Usage: pyenv which <command> [--nosystem] [--skip-advice]
|
||||||
#
|
#
|
||||||
# Displays the full path to the executable that pyenv will invoke when
|
# Displays the full path to the executable that pyenv will invoke when
|
||||||
# you run the given command.
|
# you run the given command.
|
||||||
# Use --nosystem argument in case when you don't need to search command in the
|
# Use --nosystem argument in case when you don't need to search command in the
|
||||||
# system environment.
|
# system environment.
|
||||||
#
|
# Internal switch --skip-advice used to skip printing an error message on a
|
||||||
|
# failed search.
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
@@ -18,11 +19,27 @@ if [ "$1" = "--complete" ]; then
|
|||||||
exec pyenv-shims --short
|
exec pyenv-shims --short
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$2" = "--nosystem" ]; then
|
system="system"
|
||||||
system=""
|
SKIP_ADVICE=""
|
||||||
else
|
PYENV_COMMAND="$1"
|
||||||
system="system"
|
|
||||||
fi
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
case "$1" in
|
||||||
|
--skip-advice)
|
||||||
|
SKIP_ADVICE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--nosystem)
|
||||||
|
system=""
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
remove_from_path() {
|
remove_from_path() {
|
||||||
local path_to_remove="$1"
|
local path_to_remove="$1"
|
||||||
@@ -36,23 +53,29 @@ remove_from_path() {
|
|||||||
echo "${result#:}"
|
echo "${result#:}"
|
||||||
}
|
}
|
||||||
|
|
||||||
PYENV_COMMAND="$1"
|
|
||||||
|
|
||||||
if [ -z "$PYENV_COMMAND" ]; then
|
if [ -z "$PYENV_COMMAND" ]; then
|
||||||
pyenv-help --usage which >&2
|
pyenv-help --usage which >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
OLDIFS="$IFS"
|
OLDIFS="$IFS"
|
||||||
IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name)})
|
IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name -f)})
|
||||||
IFS="$OLDIFS"
|
IFS="$OLDIFS"
|
||||||
|
|
||||||
|
declare -a nonexistent_versions
|
||||||
|
|
||||||
for version in "${versions[@]}" "$system"; do
|
for version in "${versions[@]}" "$system"; do
|
||||||
if [ "$version" = "system" ]; then
|
if [ "$version" = "system" ]; then
|
||||||
PATH="$(remove_from_path "${PYENV_ROOT}/shims")"
|
PATH="$(remove_from_path "${PYENV_ROOT}/shims")"
|
||||||
PYENV_COMMAND_PATH="$(command -v "$PYENV_COMMAND" || true)"
|
PYENV_COMMAND_PATH="$(command -v "$PYENV_COMMAND" || true)"
|
||||||
else
|
else
|
||||||
PYENV_COMMAND_PATH="${PYENV_ROOT}/versions/${version}/bin/${PYENV_COMMAND}"
|
# $version may be a prefix to be resolved by pyenv-latest
|
||||||
|
version_path="$(pyenv-prefix "${version}" 2>/dev/null)" || \
|
||||||
|
{ nonexistent_versions+=("$version"); continue; }
|
||||||
|
# resolve $version for hooks
|
||||||
|
version="$(basename "$version_path")"
|
||||||
|
PYENV_COMMAND_PATH="$version_path/bin/${PYENV_COMMAND}"
|
||||||
|
unset version_path
|
||||||
fi
|
fi
|
||||||
if [ -x "$PYENV_COMMAND_PATH" ]; then
|
if [ -x "$PYENV_COMMAND_PATH" ]; then
|
||||||
break
|
break
|
||||||
@@ -69,31 +92,24 @@ done
|
|||||||
if [ -x "$PYENV_COMMAND_PATH" ]; then
|
if [ -x "$PYENV_COMMAND_PATH" ]; then
|
||||||
echo "$PYENV_COMMAND_PATH"
|
echo "$PYENV_COMMAND_PATH"
|
||||||
else
|
else
|
||||||
any_not_installed=0
|
if (( ${#nonexistent_versions[@]} )); then
|
||||||
for version in "${versions[@]}"; do
|
for version in "${nonexistent_versions[@]}"; do
|
||||||
if [ "$version" = "system" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if ! [ -d "${PYENV_ROOT}/versions/${version}" ]; then
|
|
||||||
echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2
|
echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2
|
||||||
any_not_installed=1
|
done
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ "$any_not_installed" = 1 ]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "pyenv: $PYENV_COMMAND: command not found" >&2
|
echo "pyenv: $PYENV_COMMAND: command not found" >&2
|
||||||
|
if [ -z "$SKIP_ADVICE" ]; then
|
||||||
versions="$(pyenv-whence "$PYENV_COMMAND" || true)"
|
versions="$(pyenv-whence "$PYENV_COMMAND" || true)"
|
||||||
if [ -n "$versions" ]; then
|
if [ -n "$versions" ]; then
|
||||||
{ echo
|
{ echo
|
||||||
echo "The \`$1' command exists in these Python versions:"
|
echo "The \`$PYENV_COMMAND' command exists in these Python versions:"
|
||||||
echo "$versions" | sed 's/^/ /g'
|
echo "$versions" | sed 's/^/ /g'
|
||||||
echo
|
echo
|
||||||
echo "Note: See 'pyenv help global' for tips on allowing both"
|
echo "Note: See 'pyenv help global' for tips on allowing both"
|
||||||
echo " python2 and python3 to be found."
|
echo " python2 and python3 to be found."
|
||||||
} >&2
|
} >&2
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exit 127
|
exit 127
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
.TH PYENV 1 "12 Dec 2020" "PYENV"
|
.TH PYENV 1 "24 Apr 2023" "PYENV"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
pyenv \- Simple Python version management
|
pyenv \- Simple Python version management
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -12,10 +12,12 @@ pyenv lets you easily switch between multiple versions of Python\. It's simple,
|
|||||||
\fBAppend\fR the following to \fB$HOME/.bashrc\fR
|
\fBAppend\fR the following to \fB$HOME/.bashrc\fR
|
||||||
.P
|
.P
|
||||||
.RS 15
|
.RS 15
|
||||||
source /usr/share/pyenv/pyenv_user_setup.bash
|
.nf
|
||||||
|
if command -v pyenv 1>/dev/null 2>&1; then\n
|
||||||
|
eval "$(pyenv init - bash)" \n
|
||||||
|
fi
|
||||||
|
.fi
|
||||||
.RE
|
.RE
|
||||||
.\"OR
|
|
||||||
.\"\fBsh echo \-e \if command \-v pyenv 1>/dev/null 2>&1; then\en eval "$(pyenv init \-)"\enfi' >> ~/\.bashrc\fR
|
|
||||||
.RS 3
|
.RS 3
|
||||||
.P
|
.P
|
||||||
.nh
|
.nh
|
||||||
@@ -106,7 +108,7 @@ Set or show the shell\-specific Python version
|
|||||||
List existing pyenv shims
|
List existing pyenv shims
|
||||||
.TP
|
.TP
|
||||||
.B uninstall
|
.B uninstall
|
||||||
Uninstall a specific Python version
|
Uninstall Python versions
|
||||||
.TP
|
.TP
|
||||||
.B version
|
.B version
|
||||||
Show the current Python version(s) and its origin
|
Show the current Python version(s) and its origin
|
||||||
@@ -232,6 +234,7 @@ Skip this section unless you must know what every line in your shell profile is
|
|||||||
\fBSets up your shims path\.\fR This is the only requirement for pyenv to function properly\. You can do this by hand by prepending \fB$(pyenv root)/shims\fR to your \fB$PATH\fR\.
|
\fBSets up your shims path\.\fR This is the only requirement for pyenv to function properly\. You can do this by hand by prepending \fB$(pyenv root)/shims\fR to your \fB$PATH\fR\.
|
||||||
.IP "2." 4
|
.IP "2." 4
|
||||||
\fBRehashes shims\.\fR From time to time you'll need to rebuild your shim files\. Doing this on init makes sure everything is up to date\. You can always run \fBpyenv rehash\fR manually\.
|
\fBRehashes shims\.\fR From time to time you'll need to rebuild your shim files\. Doing this on init makes sure everything is up to date\. You can always run \fBpyenv rehash\fR manually\.
|
||||||
|
You can disable this functionality by adding \fB--no-rehash\fR to the end of your \fBpyenv init\fR command line.
|
||||||
.IP "3." 4
|
.IP "3." 4
|
||||||
\fBInstalls the sh dispatcher\.\fR This bit is also optional, but allows pyenv and plugins to change variables in your current shell, making commands like \fBpyenv shell\fR possible\. The sh dispatcher doesn't do anything crazy like override \fBcd\fR or hack your shell prompt, but if for some reason you need \fBpyenv\fR to be a real script rather than a shell function, you can safely skip it\.
|
\fBInstalls the sh dispatcher\.\fR This bit is also optional, but allows pyenv and plugins to change variables in your current shell, making commands like \fBpyenv shell\fR possible\. The sh dispatcher doesn't do anything crazy like override \fBcd\fR or hack your shell prompt, but if for some reason you need \fBpyenv\fR to be a real script rather than a shell function, you can safely skip it\.
|
||||||
.IP "" 0
|
.IP "" 0
|
||||||
@@ -452,10 +455,10 @@ $ pyenv versions
|
|||||||
.fi
|
.fi
|
||||||
.IP "" 0
|
.IP "" 0
|
||||||
.SS "pyenv uninstall"
|
.SS "pyenv uninstall"
|
||||||
Uninstall a specific Python version\.
|
Uninstall Python versions\.
|
||||||
.IP "" 4
|
.IP "" 4
|
||||||
.nf
|
.nf
|
||||||
Usage: pyenv uninstall [\-f|\-\-force] <version>
|
Usage: pyenv uninstall [\-f|\-\-force] <version> ...
|
||||||
|
|
||||||
\-f Attempt to remove the specified version without prompting
|
\-f Attempt to remove the specified version without prompting
|
||||||
for confirmation\. If the version does not exist, do not
|
for confirmation\. If the version does not exist, do not
|
||||||
|
|||||||
1
plugins/.gitignore
vendored
1
plugins/.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
!/.gitignore
|
!/.gitignore
|
||||||
!/version-ext-compat
|
!/version-ext-compat
|
||||||
!/python-build
|
!/python-build
|
||||||
|
/python-build/test/build
|
||||||
|
|||||||
@@ -96,7 +96,53 @@ versions of Python that are not yet supported by python-build.
|
|||||||
See the [python-build built-in definitions](https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build) as a starting point for
|
See the [python-build built-in definitions](https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build) as a starting point for
|
||||||
custom definition files.
|
custom definition files.
|
||||||
|
|
||||||
[definitions]: https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build
|
#### Adding definitions with a Pyenv plugin
|
||||||
|
|
||||||
|
You can add your own definitions with a [Pyenv plugin](https://github.com/pyenv/pyenv?tab=readme-ov-file#pyenv-plugins) by placing them under
|
||||||
|
`$PYENV_ROOT/plugins/your_plugin_name/share/python-build`.
|
||||||
|
|
||||||
|
### Default build configuration
|
||||||
|
|
||||||
|
Without the user customizing the build with environment variables (see below),
|
||||||
|
`python-build` builds Python with mostly default Configure options
|
||||||
|
to maintain the principle of the least surprise.
|
||||||
|
|
||||||
|
The exceptions -- non-default options that are set by default -- are listed below:
|
||||||
|
|
||||||
|
| Option/Behavior | Rationale |
|
||||||
|
|-----------------|-----------|
|
||||||
|
| `--enable-shared` is on by default. Pass `--disable-shared` to Configure options to override | The official CPython Docker image uses it. It's required to embed CPython. |
|
||||||
|
| argument to `--enable-universalsdk` is ignored and set to `/` |
|
||||||
|
| `--with-universal-archs` defaults to `universal2` on ARM64 architecture | the only dual-architecture Macs in use today are Apple Silicon which can only build that one |
|
||||||
|
| argument to `--enable-framework` is ignored and set to a specific value | CPython's build logic requires a very specific argument to avoid installing the `Applications` part globally |
|
||||||
|
| argument to `--enable-unicode` in non-MacOS is overridden to `ucs4` for 2.x-3.3 |
|
||||||
|
| `MACOSX_DEPLOYMENT_TARGET` defaults to the running MacOS version |
|
||||||
|
|
||||||
|
|
||||||
|
#### Integration with 3rd-party package ecosystems
|
||||||
|
|
||||||
|
##### Homebrew
|
||||||
|
|
||||||
|
Homebrew is used to find dependency packages if `brew` is found on `PATH`:
|
||||||
|
* In MacOS, or
|
||||||
|
* If the running Pyenv itself is installed with Homebrew
|
||||||
|
|
||||||
|
Set `PYTHON_BUILD_USE_HOMEBREW` or `PYTHON_BUILD_SKIP_HOMEBREW` to override this default.
|
||||||
|
|
||||||
|
When Homebrew is used, its `include` and `lib` paths are added to compiler search path (the latter is also set as `rpath`),
|
||||||
|
and also Python dependencies that are typically keg-only are searched for in the Homebrew installation and added individually.
|
||||||
|
|
||||||
|
**NOTE:** Homebrew is not used in Linux by default because it's rolling-release which causes a problem.
|
||||||
|
Upgrading a Python dependency in Homebrew to a new major version (that `brew` does without warning)
|
||||||
|
would break all Pyenv-managed installations that depend on it.
|
||||||
|
You can use a [community plugin `fix-version`](https://github.com/pyenv/pyenv/wiki/Plugins#community-plugins)
|
||||||
|
to fix installations in such a case.
|
||||||
|
|
||||||
|
##### Portage
|
||||||
|
|
||||||
|
In FreeBSD, if `pkg` is on PATH, Ports are searched for some dependencies that Configure is known to not search for via `pkg-config`.
|
||||||
|
(Later versions of CPython search for more packages via `pkg-config` so this may eventually become redundant.)
|
||||||
|
|
||||||
|
|
||||||
### Special environment variables
|
### Special environment variables
|
||||||
|
|
||||||
@@ -113,21 +159,24 @@ You can set certain environment variables to control the build process.
|
|||||||
checksum of the file to the mirror URL.
|
checksum of the file to the mirror URL.
|
||||||
* `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from
|
* `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from
|
||||||
their original source URLs instead of using a mirror.
|
their original source URLs instead of using a mirror.
|
||||||
|
* `PYTHON_BUILD_HTTP_CLIENT`, explicitly specify the HTTP client type to use. `aria2`, `curl` and `wget` are the supported values and by default, are searched in that order.
|
||||||
|
* `PYTHON_BUILD_CURL_OPTS`, `PYTHON_BUILD_WGET_OPTS`, `PYTHON_BUILD_ARIA2_OPTS` pass additional parameters to the corresponding HTTP client.
|
||||||
|
* `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew when it would normally will.
|
||||||
|
* `PYTHON_BUILD_USE_HOMEBREW`, if set, will search for libraries installed by Homebrew when it would normally not.
|
||||||
|
* `PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA`, override the Homebrew OpenSSL formula to use.
|
||||||
* `PYTHON_BUILD_ROOT` overrides the default location from where build definitions
|
* `PYTHON_BUILD_ROOT` overrides the default location from where build definitions
|
||||||
in `share/python-build/` are looked up.
|
in `share/python-build/` are looked up.
|
||||||
* `PYTHON_BUILD_DEFINITIONS` can be a list of colon-separated paths that get
|
* `PYTHON_BUILD_DEFINITIONS` can be a list of colon-separated paths that get
|
||||||
additionally searched when looking up build definitions.
|
additionally searched when looking up build definitions.
|
||||||
* `CC` sets the path to the C compiler.
|
* `CC` sets the path to the C compiler.
|
||||||
* `PYTHON_CFLAGS` lets you pass additional options to the default `CFLAGS`. Use
|
|
||||||
this to override, for instance, the `-O3` option.
|
|
||||||
* `CONFIGURE_OPTS` lets you pass additional options to `./configure`.
|
* `CONFIGURE_OPTS` lets you pass additional options to `./configure`.
|
||||||
* `MAKE` lets you override the command to use for `make`. Useful for specifying
|
* `MAKE` lets you override the command to use for `make`. Useful for specifying
|
||||||
GNU make (`gmake`) on some systems.
|
GNU make (`gmake`) on some systems.
|
||||||
* `MAKE_OPTS` (or `MAKEOPTS`) lets you pass additional options to `make`.
|
* `MAKE_OPTS` (or `MAKEOPTS`) lets you pass additional options to `make`.
|
||||||
* `MAKE_INSTALL_OPTS` lets you pass additional options to `make install`.
|
* `MAKE_INSTALL_OPTS` lets you pass additional options to `make install`.
|
||||||
* `PYTHON_CONFIGURE_OPTS` and `PYTHON_MAKE_OPTS` and `PYTHON_MAKE_INSTALL_OPTS` allow
|
* `<PACKAGE>_CFLAGS`, `<PACKAGE>_CPPFLAGS`, `<PACKAGE>_LDFLAGS` let you pass additional options to `CFLAGS`/`CPPFLAGS`/`LDFLAGS` specifically for building `<package>` (Python itself or a dependency library) from source as part of the build script. `<PACKAGE>` should be a capitalized name of the package without version (technically, capitalized first argument to `install_package` without version). E.g. for CPython, it's "`PYTHON`", for Readline, "`READLINE`", for PyPy (only applies when building it from source), "`PYPY`". Check the source of the build script you're using if unsure.
|
||||||
you to specify configure and make options for building CPython. These variables
|
* `<PACKAGE>_CONFIGURE_OPTS`, `<PACKAGE>_MAKE_OPTS`, `<PACKAGE>_MAKE_INSTALL_OPTS`, `<PACKAGE>_MAKE_INSTALL_TARGET` allow
|
||||||
will be passed to Python only, not any dependent packages (e.g. libyaml).
|
you to specify configure and make options for building `<package>` (same as above). "Make install target" would replace "`install`" in the `make install` invocation.
|
||||||
|
|
||||||
### Applying patches to Python before compiling
|
### Applying patches to Python before compiling
|
||||||
|
|
||||||
@@ -149,20 +198,21 @@ $ cat fix1.patch fix2.patch | pyenv install --patch 2.7.10
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Building with `--enable-shared`
|
### Building for maximum performance
|
||||||
|
|
||||||
You can build CPython with `--enable-shared` to install a version with
|
Building CPython with `--enable-optimizations` will result in a faster
|
||||||
shared object.
|
interpreter at the cost of significantly longer build times. Most notably, this
|
||||||
|
enables PGO (profile guided optimization). While your mileage may vary, it is
|
||||||
If `--enable-shared` was found in `PYTHON_CONFIGURE_OPTS` or `CONFIGURE_OPTS`,
|
common for performance improvement from this to be in the ballpark of 30%.
|
||||||
`python-build` will automatically set `RPATH` to the pyenv's prefix directory.
|
|
||||||
This means you don't have to set `LD_LIBRARY_PATH` or `DYLD_LIBRARY_PATH` for
|
|
||||||
the version(s) installed with `--enable-shared`.
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 2.7.9
|
env PYTHON_CONFIGURE_OPTS='--enable-optimizations --with-lto' PYTHON_CFLAGS='-march=native -mtune=native' pyenv install --verbose 3.6.0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can also customize the task used for profile guided optimization by setting
|
||||||
|
the `PROFILE_TASK` environment variable, for instance, `PROFILE_TASK='-m
|
||||||
|
test.regrtest --pgo -j0'` will run much faster than the default task.
|
||||||
|
|
||||||
### Checksum verification
|
### Checksum verification
|
||||||
|
|
||||||
If you have the `shasum`, `openssl`, or `sha256sum` tool installed, python-build will
|
If you have the `shasum`, `openssl`, or `sha256sum` tool installed, python-build will
|
||||||
@@ -175,14 +225,30 @@ definition. (All bundled definitions include checksums.)
|
|||||||
### Package download mirrors
|
### Package download mirrors
|
||||||
|
|
||||||
python-build will first attempt to download package files from a mirror hosted on
|
python-build will first attempt to download package files from a mirror hosted on
|
||||||
GitHub Pages. If a package is not available on the mirror, if the mirror
|
GitHub Pages. If this fails, it will fall back to the
|
||||||
is down, or if the download is corrupt, python-build will fall back to the
|
|
||||||
official URL specified in the definition file.
|
official URL specified in the definition file.
|
||||||
|
|
||||||
You can point python-build to another mirror by specifying the
|
You can point python-build to another mirror by specifying the
|
||||||
`PYTHON_BUILD_MIRROR_URL` environment variable--useful if you'd like to run your
|
`PYTHON_BUILD_MIRROR_URL` environment variable.
|
||||||
own local mirror, for example. Package mirror URLs are constructed by joining
|
|
||||||
this variable with the SHA2 checksum of the package file.
|
Package mirror URLs are constructed by joining
|
||||||
|
`$PYTHON_BUILD_MIRROR_URL` with the SHA2 checksum of the package file as specified in the URL
|
||||||
|
in the installation script (the part after the hash sign). E.g.:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://mycache.example.com/0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have replicated the directory structure of an official site, the easiest way to adapt
|
||||||
|
would be to make symlinks at the mirror's root:
|
||||||
|
|
||||||
|
```
|
||||||
|
0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3 -> 3.10.10/Python-3.10.10.tar.xz
|
||||||
|
```
|
||||||
|
|
||||||
|
The rationale is to abstract away difference between directory structures of sites
|
||||||
|
of various Python flavors and their occasional changes as well as to accomodate
|
||||||
|
people who only wish to cache some select downloads. This also allows to mirror multiple sites at once.
|
||||||
|
|
||||||
If the mirror being used does not have the same checksum (*e.g.* with a
|
If the mirror being used does not have the same checksum (*e.g.* with a
|
||||||
pull-through cache like Artifactory), you can set the
|
pull-through cache like Artifactory), you can set the
|
||||||
@@ -195,15 +261,15 @@ mirror by setting the `PYTHON_BUILD_SKIP_MIRROR` environment variable.
|
|||||||
The official python-build download mirror is provided by
|
The official python-build download mirror is provided by
|
||||||
[GitHub Pages](http://yyuu.github.io/pythons/).
|
[GitHub Pages](http://yyuu.github.io/pythons/).
|
||||||
|
|
||||||
### Package download caching
|
### Package download cache
|
||||||
|
|
||||||
You can instruct python-build to keep a local cache of downloaded package files
|
Python-build will keep a cache of downloaded package files
|
||||||
by setting the `PYTHON_BUILD_CACHE_PATH` environment variable. When set, package
|
at the location specified by the `PYTHON_BUILD_CACHE_PATH` environment variable
|
||||||
files will be kept in this directory after the first successful download and
|
if it exists. The default is `~/.pyenv/cache`, so you can
|
||||||
reused by subsequent invocations of `python-build` and `pyenv install`.
|
enable caching by just creating that directory.
|
||||||
|
|
||||||
The `pyenv install` command defaults this path to `~/.pyenv/cache`, so in most
|
The name of the would-be cached file is reported by Pyenv in the "Downloading <filename>..." message.
|
||||||
cases you can enable download caching simply by creating that directory.
|
It's possible to warm up the cache by manually putting the file there under an appropriate name.
|
||||||
|
|
||||||
### Keeping the build directory after installation
|
### Keeping the build directory after installation
|
||||||
|
|
||||||
@@ -231,7 +297,7 @@ the full build log for build failures.
|
|||||||
|
|
||||||
### Testing new python versions
|
### Testing new python versions
|
||||||
|
|
||||||
If you are contributing a new python version for python-build,
|
If you are contributing a new python version for python-build,
|
||||||
you can test the build in a [docker](https://www.docker.com/) container based on Ubuntu 18.04.
|
you can test the build in a [docker](https://www.docker.com/) container based on Ubuntu 18.04.
|
||||||
|
|
||||||
With docker installed:
|
With docker installed:
|
||||||
@@ -249,7 +315,7 @@ docker run -it my_container
|
|||||||
```
|
```
|
||||||
|
|
||||||
The container will need to be rebuilt whenever you change the repo,
|
The container will need to be rebuilt whenever you change the repo,
|
||||||
but after the first build, this will be very fast,
|
but after the first build, this will be very fast,
|
||||||
as the layer including the build dependencies will be cached.
|
as the layer including the build dependencies will be cached.
|
||||||
|
|
||||||
Changes made inside the container will not be persisted.
|
Changes made inside the container will not be persisted.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Summary: Install a Python version using python-build
|
# Summary: Install a Python version using python-build
|
||||||
#
|
#
|
||||||
# Usage: pyenv install [-f] [-kvp] <version>
|
# Usage: pyenv install [-f] [-kvp] <version>...
|
||||||
# pyenv install [-f] [-kvp] <definition-file>
|
# pyenv install [-f] [-kvp] <definition-file>
|
||||||
# pyenv install -l|--list
|
# pyenv install -l|--list
|
||||||
# pyenv install --version
|
# pyenv install --version
|
||||||
@@ -59,7 +59,7 @@ usage() {
|
|||||||
|
|
||||||
definitions() {
|
definitions() {
|
||||||
local query="$1"
|
local query="$1"
|
||||||
python-build --definitions | $(type -P ggrep grep | head -1) -F "$query" || true
|
python-build --definitions | $(type -P ggrep grep | head -n1) -F "$query" || true
|
||||||
}
|
}
|
||||||
|
|
||||||
indent() {
|
indent() {
|
||||||
@@ -113,17 +113,15 @@ for option in "${OPTIONS[@]}"; do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
[ "${#ARGUMENTS[@]}" -le 1 ] || usage 1 >&2
|
|
||||||
|
|
||||||
unset VERSION_NAME
|
unset VERSION_NAME
|
||||||
|
|
||||||
# The first argument contains the definition to install. If the
|
# The first argument contains the definition to install. If the
|
||||||
# argument is missing, try to install whatever local app-specific
|
# argument is missing, try to install whatever local app-specific
|
||||||
# version is specified by pyenv. Show usage instructions if a local
|
# version is specified by pyenv. Show usage instructions if a local
|
||||||
# version is not specified.
|
# version is not specified.
|
||||||
DEFINITION="${ARGUMENTS[0]}"
|
DEFINITIONS=("${ARGUMENTS[@]}")
|
||||||
[ -n "$DEFINITION" ] || DEFINITION="$(pyenv-local 2>/dev/null || true)"
|
[[ "${#DEFINITIONS[*]}" -eq 0 ]] && DEFINITIONS=($(pyenv-local 2>/dev/null || true))
|
||||||
[ -n "$DEFINITION" ] || usage 1 >&2
|
[[ "${#DEFINITIONS[*]}" -eq 0 ]] && usage 1 >&2
|
||||||
|
|
||||||
# Define `before_install` and `after_install` functions that allow
|
# Define `before_install` and `after_install` functions that allow
|
||||||
# plugin hooks to register a string of code for execution before or
|
# plugin hooks to register a string of code for execution before or
|
||||||
@@ -140,102 +138,6 @@ after_install() {
|
|||||||
after_hooks["${#after_hooks[@]}"]="$hook"
|
after_hooks["${#after_hooks[@]}"]="$hook"
|
||||||
}
|
}
|
||||||
|
|
||||||
OLDIFS="$IFS"
|
|
||||||
IFS=$'\n' scripts=(`pyenv-hooks install`)
|
|
||||||
IFS="$OLDIFS"
|
|
||||||
for script in "${scripts[@]}"; do source "$script"; done
|
|
||||||
|
|
||||||
|
|
||||||
# Set VERSION_NAME from $DEFINITION, if it is not already set. Then
|
|
||||||
# compute the installation prefix.
|
|
||||||
[ -n "$VERSION_NAME" ] || VERSION_NAME="${DEFINITION##*/}"
|
|
||||||
[ -n "$DEBUG" ] && VERSION_NAME="${VERSION_NAME}-debug"
|
|
||||||
PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
|
|
||||||
|
|
||||||
[ -d "${PREFIX}" ] && PREFIX_EXISTS=1
|
|
||||||
|
|
||||||
# If the installation prefix exists, prompt for confirmation unless
|
|
||||||
# the --force option was specified.
|
|
||||||
if [ -d "${PREFIX}/bin" ]; then
|
|
||||||
if [ -z "$FORCE" ] && [ -z "$SKIP_EXISTING" ]; then
|
|
||||||
echo "pyenv: $PREFIX already exists" >&2
|
|
||||||
read -p "continue with installation? (y/N) "
|
|
||||||
|
|
||||||
case "$REPLY" in
|
|
||||||
y | Y | yes | YES ) ;;
|
|
||||||
* ) exit 1 ;;
|
|
||||||
esac
|
|
||||||
elif [ -n "$SKIP_EXISTING" ]; then
|
|
||||||
# Since we know the python version is already installed, and are opting to
|
|
||||||
# not force installation of existing versions, we just `exit 0` here to
|
|
||||||
# leave things happy
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If PYENV_BUILD_ROOT is set, always pass keep options to python-build.
|
|
||||||
if [ -n "${PYENV_BUILD_ROOT}" ]; then
|
|
||||||
export PYTHON_BUILD_BUILD_PATH="${PYENV_BUILD_ROOT}/${VERSION_NAME}"
|
|
||||||
KEEP="-k"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set PYTHON_BUILD_CACHE_PATH to $PYENV_ROOT/cache, if the directory
|
|
||||||
# exists and the variable is not already set.
|
|
||||||
if [ -z "${PYTHON_BUILD_CACHE_PATH}" ] && [ -d "${PYENV_ROOT}/cache" ]; then
|
|
||||||
export PYTHON_BUILD_CACHE_PATH="${PYENV_ROOT}/cache"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "${PYENV_BOOTSTRAP_VERSION}" ]; then
|
|
||||||
case "${VERSION_NAME}" in
|
|
||||||
[23]"."* )
|
|
||||||
# Default PYENV_VERSION to the friendly Python version. (The
|
|
||||||
# CPython installer requires an existing Python installation to run. An
|
|
||||||
# unsatisfied local .python-version file can cause the installer to
|
|
||||||
# fail.)
|
|
||||||
for version_info in "${VERSION_NAME%-dev}" "${VERSION_NAME%.*}" "${VERSION_NAME%%.*}"; do
|
|
||||||
# Anaconda's `curl` doesn't work on platform where `/etc/pki/tls/certs/ca-bundle.crt` isn't available (e.g. Debian)
|
|
||||||
for version in $(pyenv-whence "python${version_info}" 2>/dev/null || true); do
|
|
||||||
if [[ "${version}" != "anaconda"* ]] && [[ "${version}" != "miniconda"* ]]; then
|
|
||||||
PYENV_BOOTSTRAP_VERSION="${version}"
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
"pypy"*"-dev" | "pypy"*"-src" )
|
|
||||||
# PyPy/PyPy3 requires existing Python 2.7 to build
|
|
||||||
if [ -n "${PYENV_RPYTHON_VERSION}" ]; then
|
|
||||||
PYENV_BOOTSTRAP_VERSION="${PYENV_RPYTHON_VERSION}"
|
|
||||||
else
|
|
||||||
for version in $(pyenv-versions --bare | sort -r); do
|
|
||||||
if [[ "${version}" == "2.7"* ]]; then
|
|
||||||
PYENV_BOOTSTRAP_VERSION="$version"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if [ -n "$PYENV_BOOTSTRAP_VERSION" ]; then
|
|
||||||
for dep in curses genc pycparser; do
|
|
||||||
if ! PYENV_VERSION="$PYENV_BOOTSTRAP_VERSION" pyenv-exec python -c "import ${dep}" 1>/dev/null 2>&1; then
|
|
||||||
echo "pyenv-install: $VERSION_NAME: PyPy requires \`${dep}' in $PYENV_BOOTSTRAP_VERSION to build from source." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo "pyenv-install: $VERSION_NAME: PyPy requires Python 2.7 to build from source." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${PYENV_BOOTSTRAP_VERSION}" ]; then
|
|
||||||
export PYENV_VERSION="${PYENV_BOOTSTRAP_VERSION}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Execute `before_install` hooks.
|
|
||||||
for hook in "${before_hooks[@]}"; do eval "$hook"; done
|
|
||||||
|
|
||||||
# Plan cleanup on unsuccessful installation.
|
# Plan cleanup on unsuccessful installation.
|
||||||
cleanup() {
|
cleanup() {
|
||||||
[ -z "${PREFIX_EXISTS}" ] && rm -rf "$PREFIX"
|
[ -z "${PREFIX_EXISTS}" ] && rm -rf "$PREFIX"
|
||||||
@@ -243,43 +145,151 @@ cleanup() {
|
|||||||
|
|
||||||
trap cleanup SIGINT
|
trap cleanup SIGINT
|
||||||
|
|
||||||
# Invoke `python-build` and record the exit status in $STATUS.
|
|
||||||
STATUS=0
|
|
||||||
python-build $KEEP $VERBOSE $HAS_PATCH $DEBUG "$DEFINITION" "$PREFIX" || STATUS="$?"
|
|
||||||
|
|
||||||
# Display a more helpful message if the definition wasn't found.
|
OLDIFS="$IFS"
|
||||||
if [ "$STATUS" == "2" ]; then
|
IFS=$'\n' scripts=(`pyenv-hooks install`)
|
||||||
{ candidates="$(definitions "$DEFINITION")"
|
IFS="$OLDIFS"
|
||||||
here="$(dirname "${0%/*}")/../.."
|
for script in "${scripts[@]}"; do source "$script"; done
|
||||||
if [ -n "$candidates" ]; then
|
|
||||||
|
COMBINED_STATUS=0
|
||||||
|
for DEFINITION in "${DEFINITIONS[@]}"; do
|
||||||
|
STATUS=0
|
||||||
|
|
||||||
|
# Try to resolve a prefix if user indeed gave a prefix.
|
||||||
|
# We install the version under the resolved name
|
||||||
|
# and hooks also see the resolved name
|
||||||
|
DEFINITION="$(pyenv-latest -f -k "$DEFINITION")"
|
||||||
|
|
||||||
|
# Set VERSION_NAME from $DEFINITION. Then compute the installation prefix.
|
||||||
|
VERSION_NAME="${DEFINITION##*/}"
|
||||||
|
[ -n "$DEBUG" ] && VERSION_NAME="${VERSION_NAME}-debug"
|
||||||
|
PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
|
||||||
|
|
||||||
|
[ -d "${PREFIX}" ] && PREFIX_EXISTS=1
|
||||||
|
|
||||||
|
# If the installation prefix exists, prompt for confirmation unless
|
||||||
|
# the --force option was specified.
|
||||||
|
if [ -d "${PREFIX}/bin" ]; then
|
||||||
|
if [ -z "$FORCE" ] && [ -z "$SKIP_EXISTING" ]; then
|
||||||
|
echo "pyenv: $PREFIX already exists" >&2
|
||||||
|
read -p "continue with installation? (y/N) "
|
||||||
|
|
||||||
|
case "$REPLY" in
|
||||||
|
y | Y | yes | YES ) ;;
|
||||||
|
* ) { STATUS=1; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; }; continue ;;
|
||||||
|
esac
|
||||||
|
elif [ -n "$SKIP_EXISTING" ]; then
|
||||||
|
# Since we know the python version is already installed, and are opting to
|
||||||
|
# not force installation of existing versions, we just `exit 0` here to
|
||||||
|
# leave things happy
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If PYENV_BUILD_ROOT is set, always pass keep options to python-build.
|
||||||
|
if [ -n "${PYENV_BUILD_ROOT}" ]; then
|
||||||
|
export PYTHON_BUILD_BUILD_PATH="${PYENV_BUILD_ROOT}/${VERSION_NAME}"
|
||||||
|
KEEP="-k"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set PYTHON_BUILD_CACHE_PATH to $PYENV_ROOT/cache, if the directory
|
||||||
|
# exists and the variable is not already set.
|
||||||
|
if [ -z "${PYTHON_BUILD_CACHE_PATH}" ] && [ -d "${PYENV_ROOT}/cache" ]; then
|
||||||
|
export PYTHON_BUILD_CACHE_PATH="${PYENV_ROOT}/cache"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${PYENV_BOOTSTRAP_VERSION}" ]; then
|
||||||
|
case "${VERSION_NAME}" in
|
||||||
|
[23]"."* )
|
||||||
|
# Default PYENV_VERSION to the friendly Python version. (The
|
||||||
|
# CPython installer requires an existing Python installation to run. An
|
||||||
|
# unsatisfied local .python-version file can cause the installer to
|
||||||
|
# fail.)
|
||||||
|
for version_info in "${VERSION_NAME%-dev}" "${VERSION_NAME%.*}" "${VERSION_NAME%%.*}"; do
|
||||||
|
# Anaconda's `curl` doesn't work on platform where `/etc/pki/tls/certs/ca-bundle.crt` isn't available (e.g. Debian)
|
||||||
|
for version in $(pyenv-whence "python${version_info}" 2>/dev/null || true); do
|
||||||
|
if [[ "${version}" != "anaconda"* ]] && [[ "${version}" != "miniconda"* ]]; then
|
||||||
|
PYENV_BOOTSTRAP_VERSION="${version}"
|
||||||
|
break 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
"pypy"*"-dev" | "pypy"*"-src" )
|
||||||
|
# PyPy/PyPy3 requires existing Python 2.7 to build
|
||||||
|
if [ -n "${PYENV_RPYTHON_VERSION}" ]; then
|
||||||
|
PYENV_BOOTSTRAP_VERSION="${PYENV_RPYTHON_VERSION}"
|
||||||
|
else
|
||||||
|
for version in $(pyenv-versions --bare | sort -r); do
|
||||||
|
if [[ "${version}" == "2.7"* ]]; then
|
||||||
|
PYENV_BOOTSTRAP_VERSION="$version"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [ -n "$PYENV_BOOTSTRAP_VERSION" ]; then
|
||||||
|
for dep in pycparser; do
|
||||||
|
if ! PYENV_VERSION="$PYENV_BOOTSTRAP_VERSION" pyenv-exec python -c "import ${dep}" 1>/dev/null 2>&1; then
|
||||||
|
echo "pyenv-install: $VERSION_NAME: PyPy requires \`${dep}' in $PYENV_BOOTSTRAP_VERSION to build from source." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "pyenv-install: $VERSION_NAME: PyPy requires Python 2.7 to build from source." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${PYENV_BOOTSTRAP_VERSION}" ]; then
|
||||||
|
export PYENV_VERSION="${PYENV_BOOTSTRAP_VERSION}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute `before_install` hooks.
|
||||||
|
for hook in "${before_hooks[@]}"; do eval "$hook"; done
|
||||||
|
|
||||||
|
# Invoke `python-build` and record the exit status in $STATUS.
|
||||||
|
python-build $KEEP $VERBOSE $HAS_PATCH $DEBUG "$DEFINITION" "$PREFIX" || \
|
||||||
|
{ STATUS=$?; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; }
|
||||||
|
|
||||||
|
# Display a more helpful message if the definition wasn't found.
|
||||||
|
if [ "$STATUS" == "2" ]; then
|
||||||
|
{ candidates="$(definitions "$DEFINITION")"
|
||||||
|
here="$(dirname "${0%/*}")/../.."
|
||||||
|
if [ -n "$candidates" ]; then
|
||||||
|
echo
|
||||||
|
echo "The following versions contain \`$DEFINITION' in the name:"
|
||||||
|
echo "$candidates" | indent
|
||||||
|
fi
|
||||||
echo
|
echo
|
||||||
echo "The following versions contain \`$DEFINITION' in the name:"
|
echo "See all available versions with \`pyenv install --list'."
|
||||||
echo "$candidates" | indent
|
echo
|
||||||
fi
|
echo -n "If the version you need is missing, try upgrading pyenv"
|
||||||
echo
|
if [ "$here" != "${here#$(brew --prefix 2>/dev/null)}" ]; then
|
||||||
echo "See all available versions with \`pyenv install --list'."
|
printf ":\n\n"
|
||||||
echo
|
echo " brew update && brew upgrade pyenv"
|
||||||
echo -n "If the version you need is missing, try upgrading pyenv"
|
elif [ -d "${here}/.git" ]; then
|
||||||
if [ "$here" != "${here#$(brew --prefix 2>/dev/null)}" ]; then
|
printf ":\n\n"
|
||||||
printf ":\n\n"
|
echo " cd ${here} && git pull && cd -"
|
||||||
echo " brew update && brew upgrade pyenv"
|
else
|
||||||
elif [ -d "${here}/.git" ]; then
|
printf ".\n"
|
||||||
printf ":\n\n"
|
fi
|
||||||
echo " cd ${here} && git pull && cd -"
|
} >&2
|
||||||
else
|
fi
|
||||||
printf ".\n"
|
|
||||||
fi
|
|
||||||
} >&2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Execute `after_install` hooks.
|
# Execute `after_install` hooks.
|
||||||
for hook in "${after_hooks[@]}"; do eval "$hook"; done
|
for hook in "${after_hooks[@]}"; do eval "$hook"; done
|
||||||
|
|
||||||
# Run `pyenv-rehash` after a successful installation.
|
# Run `pyenv-rehash` after a successful installation.
|
||||||
if [ "$STATUS" == "0" ]; then
|
if [[ $STATUS -eq 0 ]]; then
|
||||||
pyenv-rehash
|
pyenv-rehash
|
||||||
else
|
else
|
||||||
cleanup
|
cleanup
|
||||||
fi
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
exit "$STATUS"
|
done
|
||||||
|
|
||||||
|
|
||||||
|
exit "${COMBINED_STATUS}"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
#
|
||||||
# Summary: Uninstall a specific Python version
|
# Summary: Uninstall Python versions
|
||||||
#
|
#
|
||||||
# Usage: pyenv uninstall [-f|--force] <version>
|
# Usage: pyenv uninstall [-f|--force] <version> ...
|
||||||
#
|
#
|
||||||
# -f Attempt to remove the specified version without prompting
|
# -f Attempt to remove the specified version without prompting
|
||||||
# for confirmation. If the version does not exist, do not
|
# for confirmation. If the version does not exist, do not
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
# See `pyenv versions` for a complete list of installed versions.
|
# See `pyenv versions` for a complete list of installed versions.
|
||||||
#
|
#
|
||||||
set -e
|
set -e
|
||||||
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
# Provide pyenv completions
|
# Provide pyenv completions
|
||||||
if [ "$1" = "--complete" ]; then
|
if [ "$1" = "--complete" ]; then
|
||||||
@@ -33,14 +34,17 @@ if [ "$1" = "-f" ] || [ "$1" = "--force" ]; then
|
|||||||
shift
|
shift
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ "$#" -eq 1 ] || usage 1 >&2
|
[ "$#" -gt 0 ] || usage 1 >&2
|
||||||
|
|
||||||
DEFINITION="$1"
|
versions=("$@")
|
||||||
case "$DEFINITION" in
|
|
||||||
"" | -* )
|
for version in "${versions[@]}"; do
|
||||||
usage 1 >&2
|
case "$version" in
|
||||||
;;
|
"" | -* )
|
||||||
esac
|
usage 1 >&2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
declare -a before_hooks after_hooks
|
declare -a before_hooks after_hooks
|
||||||
|
|
||||||
@@ -59,29 +63,36 @@ IFS=$'\n' scripts=(`pyenv-hooks uninstall`)
|
|||||||
IFS="$OLDIFS"
|
IFS="$OLDIFS"
|
||||||
for script in "${scripts[@]}"; do source "$script"; done
|
for script in "${scripts[@]}"; do source "$script"; done
|
||||||
|
|
||||||
|
uninstall-python() {
|
||||||
|
local DEFINITION="$1"
|
||||||
|
|
||||||
VERSION_NAME="${DEFINITION##*/}"
|
local VERSION_NAME="${DEFINITION##*/}"
|
||||||
PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
|
local PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
|
||||||
|
|
||||||
if [ -z "$FORCE" ]; then
|
if [ -z "$FORCE" ]; then
|
||||||
if [ ! -d "$PREFIX" ]; then
|
if [ ! -d "$PREFIX" ]; then
|
||||||
echo "pyenv: version \`$VERSION_NAME' not installed" >&2
|
echo "pyenv: version \`$VERSION_NAME' not installed" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -p "pyenv: remove $PREFIX? (y/N) "
|
||||||
|
case "$REPLY" in
|
||||||
|
y | Y | yes | YES ) ;;
|
||||||
|
* ) exit 1 ;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
read -p "pyenv: remove $PREFIX? [y|N] "
|
for hook in "${before_hooks[@]}"; do eval "$hook"; done
|
||||||
case "$REPLY" in
|
|
||||||
y | Y | yes | YES ) ;;
|
|
||||||
* ) exit 1 ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for hook in "${before_hooks[@]}"; do eval "$hook"; done
|
if [ -d "$PREFIX" ]; then
|
||||||
|
rm -rf "$PREFIX"
|
||||||
|
pyenv-rehash
|
||||||
|
echo "pyenv: $VERSION_NAME uninstalled"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -d "$PREFIX" ]; then
|
for hook in "${after_hooks[@]}"; do eval "$hook"; done
|
||||||
rm -rf "$PREFIX"
|
}
|
||||||
pyenv-rehash
|
|
||||||
echo "pyenv: $VERSION_NAME uninstalled"
|
|
||||||
fi
|
|
||||||
|
|
||||||
for hook in "${after_hooks[@]}"; do eval "$hook"; done
|
for version in "${versions[@]}"; do
|
||||||
|
uninstall-python "$version"
|
||||||
|
done
|
||||||
|
|||||||
@@ -19,7 +19,11 @@ PYTHON_BUILD_VERSION="20180424"
|
|||||||
OLDIFS="$IFS"
|
OLDIFS="$IFS"
|
||||||
|
|
||||||
set -E
|
set -E
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
shopt -s extglob
|
||||||
|
[ -n "$PYENV_DEBUG" ] && {
|
||||||
|
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
|
||||||
|
set -x
|
||||||
|
}
|
||||||
|
|
||||||
exec 3<&2 # preserve original stderr at fd 3
|
exec 3<&2 # preserve original stderr at fd 3
|
||||||
|
|
||||||
@@ -56,9 +60,14 @@ lib() {
|
|||||||
}
|
}
|
||||||
lib "$1"
|
lib "$1"
|
||||||
|
|
||||||
|
READLINK=$(type -P readlink)
|
||||||
|
if [ -z "$READLINK" ]; then
|
||||||
|
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
resolve_link() {
|
resolve_link() {
|
||||||
$(type -P greadlink readlink | head -1) "$1"
|
$READLINK "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
abs_dirname() {
|
abs_dirname() {
|
||||||
@@ -102,7 +111,7 @@ os_information() {
|
|||||||
source /etc/os-release
|
source /etc/os-release
|
||||||
echo "$NAME" $VERSION_ID
|
echo "$NAME" $VERSION_ID
|
||||||
else
|
else
|
||||||
local os="$(cat /etc/{centos,redhat,fedora,system}-release /etc/debian_version 2>/dev/null | head -1)"
|
local os="$(cat /etc/{centos,redhat,fedora,system}-release /etc/debian_version 2>/dev/null | head -n1)"
|
||||||
echo "${os:-$(uname -sr)}"
|
echo "${os:-$(uname -sr)}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -112,6 +121,20 @@ is_mac() {
|
|||||||
[ $# -eq 0 ] || [ "$(osx_version)" "$@" ]
|
[ $# -eq 0 ] || [ "$(osx_version)" "$@" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
can_use_homebrew() {
|
||||||
|
[[ -n "$PYTHON_BUILD_USE_HOMEBREW" && -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && {
|
||||||
|
echo "error: mutually exclusive environment variables PYTHON_BUILD_USE_HOMEBREW and PYTHON_BUILD_SKIP_HOMEBREW are set" >&3
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
[[ -n "$PYTHON_BUILD_USE_HOMEBREW" ]] && return 0
|
||||||
|
[[ -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && return 1
|
||||||
|
is_mac && return 0
|
||||||
|
# In Linux, if Pyenv itself is installed with Homebrew,
|
||||||
|
# we assume the user wants to take dependencies from there as well by default
|
||||||
|
command -v brew &>/dev/null && [[ $(abs_dirname "${BASH_SOURCE}") == "$(abs_dirname "$(brew --prefix 2>/dev/null ||true)")"/* ]] && return 0
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
# 9.1 -> 901
|
# 9.1 -> 901
|
||||||
# 10.9 -> 1009
|
# 10.9 -> 1009
|
||||||
# 10.10 -> 1010
|
# 10.10 -> 1010
|
||||||
@@ -228,9 +251,7 @@ install_package_using() {
|
|||||||
make_package "${make_args[@]}"
|
make_package "${make_args[@]}"
|
||||||
popd >&4
|
popd >&4
|
||||||
|
|
||||||
{ echo "Installed ${package_name} to ${PREFIX_PATH}"
|
echo "Installed ${package_name} to ${PREFIX_PATH}" >&2
|
||||||
echo
|
|
||||||
} >&2
|
|
||||||
}
|
}
|
||||||
|
|
||||||
make_package() {
|
make_package() {
|
||||||
@@ -253,7 +274,7 @@ compute_sha2() {
|
|||||||
output="$(shasum -a 256 -b)" || return 1
|
output="$(shasum -a 256 -b)" || return 1
|
||||||
echo "${output% *}"
|
echo "${output% *}"
|
||||||
elif type openssl &>/dev/null; then
|
elif type openssl &>/dev/null; then
|
||||||
local openssl="$(command -v "$(brew --prefix openssl 2>/dev/null || true)"/bin/openssl openssl | head -1)"
|
local openssl="$(command -v "$(brew --prefix openssl 2>/dev/null || true)"/bin/openssl openssl | head -n1)"
|
||||||
output="$("$openssl" dgst -sha256 2>/dev/null)" || return 1
|
output="$("$openssl" dgst -sha256 2>/dev/null)" || return 1
|
||||||
echo "${output##* }"
|
echo "${output##* }"
|
||||||
elif type sha256sum &>/dev/null; then
|
elif type sha256sum &>/dev/null; then
|
||||||
@@ -355,12 +376,38 @@ http_head_aria2c() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
http_get_aria2c() {
|
http_get_aria2c() {
|
||||||
local out="${2:-$(mktemp "out.XXXXXX")}"
|
# aria2c always treats -o argument as a relative path
|
||||||
if aria2c --allow-overwrite=true --no-conf=true -o "${out}" ${ARIA2_OPTS} "$1" >&4; then
|
local out dir_out;
|
||||||
[ -n "$2" ] || cat "${out}"
|
if [[ -n "$2" ]]; then
|
||||||
|
out="$(basename $2)";
|
||||||
|
dir_out="$(dirname $2)";
|
||||||
|
else
|
||||||
|
out="$(mktemp "out.XXXXXX")";
|
||||||
|
dir_out="$TMPDIR";
|
||||||
|
fi
|
||||||
|
|
||||||
|
# In Ubuntu, aria2c is only available as a snap. Snaps cannot read or write /tmp
|
||||||
|
# (files cannot be found, any write result is silently discarded).
|
||||||
|
local aria2c_is_snap;
|
||||||
|
if [[ $(command -v aria2c) == "/snap/"* ]]; then aria2c_is_snap=1; fi
|
||||||
|
|
||||||
|
if [[ -n $aria2c_is_snap ]]; then
|
||||||
|
local real_dir_out="$dir_out"
|
||||||
|
# presumably, snaps can always write to under $HOME
|
||||||
|
dir_out="$HOME"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if aria2c --allow-overwrite=true --no-conf=true -d "${dir_out}" -o "${out}" ${ARIA2_OPTS} "$1" >&4; then
|
||||||
|
[ -n "$2" ] || cat "${dir_out:-.}/${out}"
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
fi
|
fi
|
||||||
|
ret=$?
|
||||||
|
|
||||||
|
if [[ -n "$2" && -n $aria2c_is_snap ]]; then
|
||||||
|
mv "$dir_out/$out" "$real_dir_out/$out"
|
||||||
|
fi
|
||||||
|
return "$ret"
|
||||||
}
|
}
|
||||||
|
|
||||||
http_head_curl() {
|
http_head_curl() {
|
||||||
@@ -511,7 +558,7 @@ download_tarball() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
has_tar_xz_support() {
|
has_tar_xz_support() {
|
||||||
tar Jcf - /dev/null 1>/dev/null 2>&1
|
[[ -z $_PYTHON_BUILD_FORCE_SKIP_XZ ]] && tar Jcf - /dev/null 1>/dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
fetch_git() {
|
fetch_git() {
|
||||||
@@ -709,7 +756,7 @@ build_package() {
|
|||||||
|
|
||||||
echo "Installing ${package_name}..." >&2
|
echo "Installing ${package_name}..." >&2
|
||||||
|
|
||||||
[ -n "$HAS_PATCH" ] && apply_python_patch "$package_name"
|
[ -n "$HAS_PATCH" ] && apply_patch "$package_name" <(cat "${package_name}.patch")
|
||||||
|
|
||||||
for command in $commands; do
|
for command in $commands; do
|
||||||
"build_package_${command}" "$package_name"
|
"build_package_${command}" "$package_name"
|
||||||
@@ -764,29 +811,40 @@ build_package_standard_build() {
|
|||||||
local PACKAGE_MAKE_OPTS="${package_var_name}_MAKE_OPTS"
|
local PACKAGE_MAKE_OPTS="${package_var_name}_MAKE_OPTS"
|
||||||
local PACKAGE_MAKE_OPTS_ARRAY="${package_var_name}_MAKE_OPTS_ARRAY[@]"
|
local PACKAGE_MAKE_OPTS_ARRAY="${package_var_name}_MAKE_OPTS_ARRAY[@]"
|
||||||
local PACKAGE_CFLAGS="${package_var_name}_CFLAGS"
|
local PACKAGE_CFLAGS="${package_var_name}_CFLAGS"
|
||||||
|
local PACKAGE_CPPFLAGS="${package_var_name}_CPPFLAGS"
|
||||||
|
local PACKAGE_LDFLAGS="${package_var_name}_LDFLAGS"
|
||||||
|
|
||||||
if [ "$package_var_name" = "PYTHON" ]; then
|
if [ "$package_var_name" = "PYTHON" ]; then
|
||||||
use_homebrew || true
|
use_homebrew || true
|
||||||
use_tcltk || true
|
use_custom_tcltk || use_homebrew_tcltk || true
|
||||||
use_homebrew_readline || use_freebsd_pkg || true
|
use_homebrew_readline || use_freebsd_pkg || true
|
||||||
|
use_homebrew_ncurses || true
|
||||||
if is_mac -ge 1014; then
|
if is_mac -ge 1014; then
|
||||||
use_xcode_sdk_zlib || use_homebrew_zlib || true
|
use_xcode_sdk_zlib || use_homebrew_zlib || true
|
||||||
else
|
else
|
||||||
use_homebrew_zlib || true
|
use_homebrew_zlib || true
|
||||||
fi
|
fi
|
||||||
|
use_dsymutil || true
|
||||||
|
use_free_threading || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
( if [ "${CFLAGS+defined}" ] || [ "${!PACKAGE_CFLAGS+defined}" ]; then
|
( if [[ -n "${!PACKAGE_CFLAGS}" ]]; then
|
||||||
export CFLAGS="$CFLAGS ${!PACKAGE_CFLAGS}"
|
export CFLAGS="${CFLAGS:+$CFLAGS }${!PACKAGE_CFLAGS}"
|
||||||
|
fi
|
||||||
|
if [[ -n "${!PACKAGE_CPPFLAGS}" ]]; then
|
||||||
|
export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }${!PACKAGE_CPPFLAGS}"
|
||||||
|
fi
|
||||||
|
if [[ -n "${!PACKAGE_LDFLAGS}" ]]; then
|
||||||
|
export LDFLAGS="${LDFLAGS:+$LDFLAGS }${!PACKAGE_LDFLAGS}"
|
||||||
fi
|
fi
|
||||||
if [ -z "$CC" ] && is_mac -ge 1010; then
|
if [ -z "$CC" ] && is_mac -ge 1010; then
|
||||||
export CC=clang
|
export CC=clang
|
||||||
fi
|
fi
|
||||||
${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \
|
${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \
|
||||||
$CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1
|
"${!PACKAGE_CONFIGURE_OPTS_ARRAY}" $CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} || return 1
|
||||||
) >&4 2>&1
|
) >&4 2>&1
|
||||||
|
|
||||||
{ "$MAKE" $MAKE_OPTS ${!PACKAGE_MAKE_OPTS} "${!PACKAGE_MAKE_OPTS_ARRAY}"
|
{ "$MAKE" "${!PACKAGE_MAKE_OPTS_ARRAY}" $MAKE_OPTS ${!PACKAGE_MAKE_OPTS}
|
||||||
} >&4 2>&1
|
} >&4 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -837,7 +895,7 @@ build_package_jython() {
|
|||||||
fix_jython_shebangs() {
|
fix_jython_shebangs() {
|
||||||
# Workaround for Jython 2.7+ (#458)
|
# Workaround for Jython 2.7+ (#458)
|
||||||
for file in "${PREFIX_PATH}/bin"/*; do
|
for file in "${PREFIX_PATH}/bin"/*; do
|
||||||
case "$(head -1 "${file}")" in
|
case "$(head -n1 "${file}")" in
|
||||||
"#!"*"/bin/jython" )
|
"#!"*"/bin/jython" )
|
||||||
sed -i.bak "1 s:.*:#\!${PREFIX_PATH}\/bin\/jython:" "${file}"
|
sed -i.bak "1 s:.*:#\!${PREFIX_PATH}\/bin\/jython:" "${file}"
|
||||||
;;
|
;;
|
||||||
@@ -889,7 +947,13 @@ build_package_ironpython_builder() {
|
|||||||
( cd "Stage/Release/IronPython-"* && build_package_ironpython )
|
( cd "Stage/Release/IronPython-"* && build_package_ironpython )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
build_package_micropython_1_9() {
|
||||||
|
# supported version 1.9.3 and 1.9.4
|
||||||
|
build_package_micropython "with_axtls"
|
||||||
|
}
|
||||||
|
|
||||||
build_package_micropython() {
|
build_package_micropython() {
|
||||||
|
# supported version 1.10 and higher
|
||||||
if [ "${MAKEOPTS+defined}" ]; then
|
if [ "${MAKEOPTS+defined}" ]; then
|
||||||
MAKE_OPTS="$MAKEOPTS"
|
MAKE_OPTS="$MAKEOPTS"
|
||||||
elif [ -z "${MAKE_OPTS+defined}" ]; then
|
elif [ -z "${MAKE_OPTS+defined}" ]; then
|
||||||
@@ -898,8 +962,8 @@ build_package_micropython() {
|
|||||||
{ cd mpy-cross
|
{ cd mpy-cross
|
||||||
"$MAKE" $MAKE_OPTS
|
"$MAKE" $MAKE_OPTS
|
||||||
cd ../ports/unix
|
cd ../ports/unix
|
||||||
"$MAKE" $MAKE_OPTS axtls
|
[ "$1" = "with_axtls" ] && "$MAKE" $MAKE_OPTS axtls
|
||||||
"$MAKE" $MAKE_OPTS CFLAGS_EXTRA="-DMICROPY_PY_SYS_PATH_DEFAULT='\"${PREFIX_PATH}/lib/micropython\"' $CFLAGS_EXTRA"
|
"$MAKE" $MAKE_OPTS CFLAGS_EXTRA="-DMICROPY_PY_SYS_PATH_DEFAULT='\".frozen:${PREFIX_PATH}/lib/micropython\"' $CFLAGS_EXTRA"
|
||||||
"$MAKE" install $MAKE_INSTALL_OPTS PREFIX="${PREFIX_PATH}"
|
"$MAKE" install $MAKE_INSTALL_OPTS PREFIX="${PREFIX_PATH}"
|
||||||
ln -fs micropython "${PREFIX_PATH}/bin/python"
|
ln -fs micropython "${PREFIX_PATH}/bin/python"
|
||||||
mkdir -p "${PREFIX_PATH}/lib/micropython"
|
mkdir -p "${PREFIX_PATH}/lib/micropython"
|
||||||
@@ -908,7 +972,13 @@ build_package_micropython() {
|
|||||||
|
|
||||||
pypy_architecture() {
|
pypy_architecture() {
|
||||||
case "$(uname -s)" in
|
case "$(uname -s)" in
|
||||||
"Darwin" ) echo "osx64" ;;
|
"Darwin" )
|
||||||
|
case "$(uname -m)" in
|
||||||
|
"arm64" ) echo "osarm64" ;;
|
||||||
|
"x86_64" ) echo "osx64" ;;
|
||||||
|
* ) return 1 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
"Linux" )
|
"Linux" )
|
||||||
case "$(uname -m)" in
|
case "$(uname -m)" in
|
||||||
"armel" ) echo "linux-armel" ;;
|
"armel" ) echo "linux-armel" ;;
|
||||||
@@ -932,10 +1002,30 @@ pypy_architecture() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
graalpy_architecture() {
|
||||||
|
case "$(uname -s)" in
|
||||||
|
"Darwin" )
|
||||||
|
case "$(uname -m)" in
|
||||||
|
"x86_64" ) echo "macos-amd64" ;;
|
||||||
|
"arm64" ) echo "macos-aarch64" ;;
|
||||||
|
* ) return 1 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
"Linux" )
|
||||||
|
case "$(uname -m)" in
|
||||||
|
"x86_64" ) echo "linux-amd64" ;;
|
||||||
|
"aarch64" ) echo "linux-aarch64" ;;
|
||||||
|
* ) return 1 ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
pyston_architecture() {
|
pyston_architecture() {
|
||||||
pypy_architecture
|
pypy_architecture
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Note: not used by graalpy >= 23.3.0 anymore
|
||||||
build_package_graalpython() {
|
build_package_graalpython() {
|
||||||
build_package_copy
|
build_package_copy
|
||||||
ln -fs "${PREFIX_PATH}/bin/graalpython" "${PREFIX_PATH}/bin/python"
|
ln -fs "${PREFIX_PATH}/bin/graalpython" "${PREFIX_PATH}/bin/python"
|
||||||
@@ -1065,13 +1155,13 @@ setup_builtin_patches() {
|
|||||||
local package_name="$1"
|
local package_name="$1"
|
||||||
local package_patch_path="${DEFINITION_PATH%/*}/patches/${DEFINITION_PATH##*/}/${package_name}"
|
local package_patch_path="${DEFINITION_PATH%/*}/patches/${DEFINITION_PATH##*/}/${package_name}"
|
||||||
|
|
||||||
ORIG_HAS_PATCH="$HAS_PATCH"
|
|
||||||
# Apply built-in patches if patch was not given from stdin
|
# Apply built-in patches if patch was not given from stdin
|
||||||
if [ -z "$HAS_PATCH" ] && [ -d "${package_patch_path}" ]; then
|
if [[ -n "$HAS_STDIN_PATCH" ]] && package_is_python "${package_name}"; then
|
||||||
|
cat >"${package_name}.patch"
|
||||||
|
HAS_PATCH=true
|
||||||
|
elif [[ -d "${package_patch_path}" ]]; then
|
||||||
{ find "${package_patch_path}" -maxdepth 1 -type f
|
{ find "${package_patch_path}" -maxdepth 1 -type f
|
||||||
} 2>/dev/null | sort | xargs cat 1>"${package_name}.patch"
|
} 2>/dev/null | sort | xargs cat 1>"${package_name}.patch"
|
||||||
exec <&-
|
|
||||||
exec <"${package_name}.patch"
|
|
||||||
HAS_PATCH=true
|
HAS_PATCH=true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -1079,7 +1169,7 @@ setup_builtin_patches() {
|
|||||||
cleanup_builtin_patches() {
|
cleanup_builtin_patches() {
|
||||||
local package_name="$1"
|
local package_name="$1"
|
||||||
rm -f "${package_name}.patch"
|
rm -f "${package_name}.patch"
|
||||||
HAS_PATCH="$ORIG_HAS_PATCH"
|
unset HAS_PATCH
|
||||||
}
|
}
|
||||||
|
|
||||||
fix_directory_permissions() {
|
fix_directory_permissions() {
|
||||||
@@ -1088,7 +1178,7 @@ fix_directory_permissions() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
require_java7() {
|
require_java7() {
|
||||||
local version="$(java -version 2>&1 | grep '\(java\|openjdk\) version' | head -1)"
|
local version="$(java -version 2>&1 | grep '\(java\|openjdk\) version' | head -n1)"
|
||||||
if [[ $version != *[789]* ]]; then
|
if [[ $version != *[789]* ]]; then
|
||||||
colorize 1 "ERROR" >&3
|
colorize 1 "ERROR" >&3
|
||||||
echo ": Java 7 required. Please install a 1.7-compatible JRE." >&3
|
echo ": Java 7 required. Please install a 1.7-compatible JRE." >&3
|
||||||
@@ -1143,7 +1233,7 @@ require_gcc() {
|
|||||||
|
|
||||||
export CC="$gcc"
|
export CC="$gcc"
|
||||||
if is_mac -ge 1010; then
|
if is_mac -ge 1010; then
|
||||||
export MACOSX_DEPLOYMENT_TARGET=10.9
|
export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-10.9}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1321,19 +1411,29 @@ configured_with_package_dir() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# `python-config` ignores LDFLAGS envvar. Adding to LIBS is the only way to add extra stuff
|
||||||
|
# to `python-config --ldflags` output
|
||||||
|
append_ldflags_libs() {
|
||||||
|
local args="$1"
|
||||||
|
export LDFLAGS="${LDFLAGS:+$LDFLAGS }$args"
|
||||||
|
export LIBS="${LIBS:+${LIBS% } }$args"
|
||||||
|
}
|
||||||
|
prepend_ldflags_libs() {
|
||||||
|
local args="$1"
|
||||||
|
export LDFLAGS="$args${LDFLAGS:+ $LDFLAGS}"
|
||||||
|
export LIBS="$args${LIBS:+ $LIBS}"
|
||||||
|
}
|
||||||
|
|
||||||
use_homebrew() {
|
use_homebrew() {
|
||||||
is_mac || return 1
|
can_use_homebrew || return 1
|
||||||
# unless Homebrew is at the default /usr/local, need to add its paths to
|
# unless Homebrew is at the default /usr/local, need to add its paths to
|
||||||
# compiler search to be able to use non-keg-only deps from there
|
# compiler search to be able to use non-keg-only deps from there
|
||||||
if is_mac && command -v brew &>/dev/null; then
|
if command -v brew &>/dev/null; then
|
||||||
local brew_prefix="$(brew --prefix 2>/dev/null || true)"
|
local brew_prefix="$(brew --prefix 2>/dev/null || true)"
|
||||||
# /usr/local/lib:/usr/lib is the default library search path
|
# /usr/local/lib:/usr/lib is the default library search path
|
||||||
if [[ -n $brew_prefix && $brew_prefix != "/usr" && $brew_prefix != "/usr/local" ]]; then
|
if [[ -n $brew_prefix && $brew_prefix != "/usr" && $brew_prefix != "/usr/local" ]]; then
|
||||||
export CPPFLAGS="${CPPFLAGS:+${CPPFLAGS% } }-I${brew_prefix}/include"
|
export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I${brew_prefix}/include"
|
||||||
export LDFLAGS="${LDFLAGS:+${LDFLAGS% } }-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib"
|
append_ldflags_libs "-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib"
|
||||||
# `python-config` ignores LDFLAGS envvar. Adding to LIBS is the only way to add extra stuff
|
|
||||||
# to `python-config --ldflags` output
|
|
||||||
export LIBS="${LIBS:+${LIBS% } }-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib"
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -1344,12 +1444,12 @@ needs_yaml() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
use_homebrew_yaml() {
|
use_homebrew_yaml() {
|
||||||
is_mac || return 1
|
can_use_homebrew || return 1
|
||||||
local libdir="$(brew --prefix libyaml 2>/dev/null || true)"
|
local libdir="$(brew --prefix libyaml 2>/dev/null || true)"
|
||||||
if [ -d "$libdir" ]; then
|
if [ -d "$libdir" ]; then
|
||||||
echo "python-build: use libyaml from homebrew"
|
echo "python-build: use libyaml from homebrew"
|
||||||
export CPPFLAGS="-I$libdir/include ${CPPFLAGS}"
|
export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
export LDFLAGS="-L$libdir/lib ${LDFLAGS}"
|
export LDFLAGS="-L$libdir/lib${LDFLAGS:+ ${LDFLAGS% }}"
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
@@ -1359,21 +1459,27 @@ use_freebsd_pkg() {
|
|||||||
# check if FreeBSD
|
# check if FreeBSD
|
||||||
if [ "FreeBSD" = "$(uname -s)" ]; then
|
if [ "FreeBSD" = "$(uname -s)" ]; then
|
||||||
# use openssl if installed from Ports Collection
|
# use openssl if installed from Ports Collection
|
||||||
if [ -f /usr/local/include/openssl/ssl.h ]; then
|
if pkg info -e openssl; then
|
||||||
package_option ruby configure --with-openssl-dir="/usr/local"
|
package_option python configure --with-openssl="/usr/local"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# check if 11-R or later
|
# check if 11-R or later
|
||||||
release="$(uname -r)"
|
release="$(uname -r)"
|
||||||
if [ "${release%%.*}" -ge 11 ]; then
|
if [ "${release%%.*}" -ge 11 ]; then
|
||||||
# prefers readline to compile most of ruby versions
|
# Use packages from Ports Collection.
|
||||||
if pkg info -e readline > /dev/null; then
|
#
|
||||||
# use readline from Ports Collection
|
# Unlike Linux, BSD's cc does not look in /usr/local by default
|
||||||
package_option ruby configure --with-readline-dir="/usr/local"
|
# where Ports-installed packages are, but they are available via pkg-config.
|
||||||
elif pkg info -e libedit > /dev/null; then
|
# Surprisingly, CPython's Configure only uses pkg-config
|
||||||
# use libedit from Ports Collection
|
# to locate some of the dependencies and not others.
|
||||||
package_option ruby configure --enable-libedit
|
# Here we detect those that are (as of this writing) known
|
||||||
package_option ruby configure --with-libedit-dir="/usr/local"
|
# to not be searched via pkg-config.
|
||||||
|
#
|
||||||
|
# XXX: As a side effect, this would pick up any other libs from Ports
|
||||||
|
# that are searched via compiler
|
||||||
|
if pkg info -e readline || pkg info -e sqlite3; then
|
||||||
|
export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I/usr/local/include"
|
||||||
|
export LDFLAGS="${LDFLAGS:+$LDFLAGS }-L/usr/local/lib -Wl,-rpath,/usr/local/lib"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -1388,32 +1494,50 @@ has_broken_mac_readline() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
use_homebrew_readline() {
|
use_homebrew_readline() {
|
||||||
is_mac || return 1
|
can_use_homebrew || return 1
|
||||||
if ! configured_with_package_dir "python" "readline/rlconf.h"; then
|
if ! configured_with_package_dir "python" "readline/rlconf.h"; then
|
||||||
local libdir="$(brew --prefix readline 2>/dev/null || true)"
|
local libdir="$(brew --prefix readline 2>/dev/null || true)"
|
||||||
if [ -d "$libdir" ]; then
|
if [ -d "$libdir" ]; then
|
||||||
echo "python-build: use readline from homebrew"
|
echo "python-build: use readline from homebrew"
|
||||||
export CPPFLAGS="-I$libdir/include ${CPPFLAGS}"
|
export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
export LDFLAGS="-L$libdir/lib ${LDFLAGS}"
|
export LDFLAGS="-L$libdir/lib${LDFLAGS:+ $LDFLAGS}"
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use_homebrew_ncurses() {
|
||||||
|
can_use_homebrew || return 1
|
||||||
|
local libdir="$(brew --prefix ncurses 2>/dev/null || true)"
|
||||||
|
if [ -d "$libdir" ]; then
|
||||||
|
echo "python-build: use ncurses from homebrew"
|
||||||
|
export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
|
export LDFLAGS="-L$libdir/lib${LDFLAGS:+ $LDFLAGS}"
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
prefer_openssl11() {
|
prefer_openssl11() {
|
||||||
# Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326)
|
# Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326)
|
||||||
PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@1.1 openssl}"
|
PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@1.1 openssl}"
|
||||||
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA
|
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prefer_openssl3() {
|
||||||
|
# Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326)
|
||||||
|
PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@3 openssl@1.1 openssl}"
|
||||||
|
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA
|
||||||
|
}
|
||||||
|
|
||||||
build_package_mac_readline() {
|
build_package_mac_readline() {
|
||||||
# Install to a subdirectory since we don't want shims for bin/readline.
|
# Install to a subdirectory since we don't want shims for bin/readline.
|
||||||
READLINE_PREFIX_PATH="${PREFIX_PATH}/readline"
|
READLINE_PREFIX_PATH="${PREFIX_PATH}/readline"
|
||||||
|
|
||||||
# Tell Python to use this readline for its extension.
|
# Tell Python to use this readline for its extension.
|
||||||
export CPPFLAGS="-I${READLINE_PREFIX_PATH}/include ${CPPFLAGS}"
|
export CPPFLAGS="-I${READLINE_PREFIX_PATH}/include${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
export LDFLAGS="-L${READLINE_PREFIX_PATH}/lib ${LDFLAGS}"
|
export LDFLAGS="-L${READLINE_PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}"
|
||||||
|
|
||||||
# Make sure pkg-config finds our build first.
|
# Make sure pkg-config finds our build first.
|
||||||
export PKG_CONFIG_PATH="${READLINE_PREFIX_PATH}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
|
export PKG_CONFIG_PATH="${READLINE_PREFIX_PATH}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
|
||||||
@@ -1429,7 +1553,7 @@ has_broken_mac_openssl() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
use_homebrew_openssl() {
|
use_homebrew_openssl() {
|
||||||
is_mac || return 1
|
can_use_homebrew || return 1
|
||||||
command -v brew >/dev/null || return 1
|
command -v brew >/dev/null || return 1
|
||||||
for openssl in ${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl}; do
|
for openssl in ${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl}; do
|
||||||
local ssldir="$(brew --prefix "${openssl}" || true)"
|
local ssldir="$(brew --prefix "${openssl}" || true)"
|
||||||
@@ -1440,8 +1564,8 @@ use_homebrew_openssl() {
|
|||||||
# https://bugs.python.org/issue21541
|
# https://bugs.python.org/issue21541
|
||||||
package_option python configure --with-openssl="${ssldir}"
|
package_option python configure --with-openssl="${ssldir}"
|
||||||
else
|
else
|
||||||
export CPPFLAGS="-I$ssldir/include ${CPPFLAGS}"
|
export CPPFLAGS="-I$ssldir/include ${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
export LDFLAGS="-L$ssldir/lib ${LDFLAGS}"
|
export LDFLAGS="-L$ssldir/lib${LDFLAGS:+ $LDFLAGS}"
|
||||||
fi
|
fi
|
||||||
export PKG_CONFIG_PATH="$ssldir/lib/pkgconfig/:${PKG_CONFIG_PATH}"
|
export PKG_CONFIG_PATH="$ssldir/lib/pkgconfig/:${PKG_CONFIG_PATH}"
|
||||||
return
|
return
|
||||||
@@ -1463,8 +1587,8 @@ build_package_mac_openssl() {
|
|||||||
# https://bugs.python.org/issue21541
|
# https://bugs.python.org/issue21541
|
||||||
package_option python configure --with-openssl="${OPENSSL_PREFIX_PATH}"
|
package_option python configure --with-openssl="${OPENSSL_PREFIX_PATH}"
|
||||||
else
|
else
|
||||||
export CPPFLAGS="-I${OPENSSL_PREFIX_PATH}/include ${CPPFLAGS}"
|
export CPPFLAGS="-I${OPENSSL_PREFIX_PATH}/include ${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
export LDFLAGS="-L${OPENSSL_PREFIX_PATH}/lib ${LDFLAGS}"
|
export LDFLAGS="-L${OPENSSL_PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure pkg-config finds our build first.
|
# Make sure pkg-config finds our build first.
|
||||||
@@ -1476,13 +1600,13 @@ build_package_mac_openssl() {
|
|||||||
|
|
||||||
local nokerberos
|
local nokerberos
|
||||||
[[ "$1" != openssl-1.0.* ]] || nokerberos=1
|
[[ "$1" != openssl-1.0.* ]] || nokerberos=1
|
||||||
|
|
||||||
|
# switches introduced in OpenSSL 3.2
|
||||||
|
local extra_no_features
|
||||||
|
[[ $(openssl_version $1) -ge 30200 ]] && extra_no_features=1
|
||||||
|
|
||||||
# Compile a shared lib with zlib dynamically linked.
|
# Compile a shared lib with zlib dynamically linked.
|
||||||
package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5}
|
package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5} ${extra_no_features:+no-docs no-apps} no-tests
|
||||||
|
|
||||||
# Default MAKE_OPTS are -j 2 which can confuse the build. Thankfully, make
|
|
||||||
# gives precedence to the last -j option, so we can override that.
|
|
||||||
package_option openssl make -j 1
|
|
||||||
|
|
||||||
build_package_standard "$@"
|
build_package_standard "$@"
|
||||||
|
|
||||||
@@ -1492,6 +1616,16 @@ build_package_mac_openssl() {
|
|||||||
security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$pem_file"
|
security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$pem_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# openssl-1.0.1k -> 10001
|
||||||
|
# openssl-3.2.1 -> 30201
|
||||||
|
openssl_version() {
|
||||||
|
local -a ver
|
||||||
|
IFS=- ver=( ${1:?} )
|
||||||
|
IFS=. ver=( ${ver[1]} )
|
||||||
|
[[ ${ver[2]} =~ ^([[:digit:]]+)[[:alpha:]]$ ]] && ver[2]="${BASH_REMATCH[1]}"
|
||||||
|
echo $(( ${ver[0]}*10000 + ${ver[1]}*100 + ${ver[2]} ))
|
||||||
|
}
|
||||||
|
|
||||||
# Post-install check that the openssl extension was built.
|
# Post-install check that the openssl extension was built.
|
||||||
build_package_verify_openssl() {
|
build_package_verify_openssl() {
|
||||||
"$RUBY_BIN" -e '
|
"$RUBY_BIN" -e '
|
||||||
@@ -1525,11 +1659,11 @@ build_package_verify_openssl() {
|
|||||||
RbConfig::CONFIG.fetch("configure_args").shellsplit.each { |arg| $stderr.puts " #{arg}" }
|
RbConfig::CONFIG.fetch("configure_args").shellsplit.each { |arg| $stderr.puts " #{arg}" }
|
||||||
exit 1
|
exit 1
|
||||||
end
|
end
|
||||||
' "$(basename "$(type -P yum apt-get | head -1)")" >&4 2>&1
|
' "$(basename "$(type -P yum apt-get | head -n1)")" >&4 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
use_homebrew_zlib() {
|
use_homebrew_zlib() {
|
||||||
is_mac || return 1
|
can_use_homebrew || return 1
|
||||||
local brew_zlib="$(brew --prefix zlib 2>/dev/null || true)"
|
local brew_zlib="$(brew --prefix zlib 2>/dev/null || true)"
|
||||||
if [ -d "$brew_zlib" ]; then
|
if [ -d "$brew_zlib" ]; then
|
||||||
echo "python-build: use zlib from homebrew"
|
echo "python-build: use zlib from homebrew"
|
||||||
@@ -1538,32 +1672,60 @@ use_homebrew_zlib() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
use_xcode_sdk_zlib() {
|
use_xcode_sdk_zlib() {
|
||||||
|
# If a custom compiler is used, including XCode SDK will likely break it
|
||||||
|
[[ "${CC:-clang}" != "clang" || "$(command -v clang 2>/dev/null || true)" != "/usr/bin/clang" ]] && return 1
|
||||||
local xc_sdk_path="$(xcrun --show-sdk-path 2>/dev/null || true)"
|
local xc_sdk_path="$(xcrun --show-sdk-path 2>/dev/null || true)"
|
||||||
if [ -d "$xc_sdk_path" ]; then
|
if [ -d "$xc_sdk_path" ]; then
|
||||||
echo "python-build: use zlib from xcode sdk"
|
echo "python-build: use zlib from xcode sdk"
|
||||||
export CFLAGS="-I${xc_sdk_path}/usr/include ${CFLAGS}"
|
# Even though SDK's compiler uses the SDK dirs implicitly,
|
||||||
|
# CPython's setup.py has to have nonstandard paths specified explicitly
|
||||||
|
# to search for zlib.h in them
|
||||||
|
export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I${xc_sdk_path}/usr/include"
|
||||||
if is_mac -ge 1100; then
|
if is_mac -ge 1100; then
|
||||||
export LDFLAGS="${LDFLAGS} -L${xc_sdk_path}/usr/lib"
|
export LDFLAGS="${LDFLAGS:+$LDFLAGS }-L${xc_sdk_path}/usr/lib"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
use_homebrew_tcltk() {
|
use_homebrew_tcltk() {
|
||||||
is_mac || return 1
|
can_use_homebrew || return 1
|
||||||
# get the version from the folder that homebrew versions
|
# Since https://github.com/Homebrew/homebrew-core/commit/f10e88617b41555193c22fdcba6109fe82155ee2 (10.11.2024),
|
||||||
local tcltk_libdir="$(brew --prefix tcl-tk 2>/dev/null || true)"
|
# tcl-tk is 9.0 which is not compatible with CPython as of this writing
|
||||||
if [ -d "$tcltk_libdir" ]; then
|
# but we'll keep it as backup for cases like non-updated Homebrew
|
||||||
echo "python-build: use tcl-tk from homebrew"
|
local tcltk
|
||||||
local tcltk_version="$(sh -c '. '"$tcltk_libdir"'/lib/tclConfig.sh; echo $TCL_VERSION')"
|
for tcltk in "tcl-tk@8" "tcl-tk"; do
|
||||||
package_option python configure --with-tcltk-libs="-L$tcltk_libdir/lib -ltcl$tcltk_version -ltk$tcltk_version"
|
local tcltk_libdir="$(brew --prefix "${tcltk}" 2>/dev/null || true)"
|
||||||
package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include"
|
if [ -d "$tcltk_libdir" ]; then
|
||||||
fi
|
echo "python-build: use tcl-tk from homebrew"
|
||||||
|
if [[ -z "$PYTHON_BUILD_TCLTK_USE_PKGCONFIG" ]]; then
|
||||||
|
local tcltk_version="$(sh -c '. '"$tcltk_libdir"'/lib/tclConfig.sh; echo $TCL_VERSION')"
|
||||||
|
package_option python configure --with-tcltk-libs="-L$tcltk_libdir/lib -ltcl$tcltk_version -ltk$tcltk_version"
|
||||||
|
# In Homebrew Tcl/Tk 8.6.13, headers have been moved to the 'tcl-tk' subdir.
|
||||||
|
# We're not using tclConfig.sh here 'cuz it produces the version-specific path to <brew prefix>/Cellar
|
||||||
|
# and we'd rather have rpath set to <brew prefix>/opt/<...> to allow micro release upgrades without rebuilding
|
||||||
|
# XXX: do use tclConfig.sh and translate the paths if more path shenanigans appear in later releases
|
||||||
|
if [ -d "$tcltk_libdir/include/tcl-tk" ]; then
|
||||||
|
package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include/tcl-tk"
|
||||||
|
else
|
||||||
|
package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
export PKG_CONFIG_PATH="${tcltk_libdir}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# FIXME: this function is a workaround for #1125
|
# FIXME: this function is a workaround for #1125
|
||||||
# once fixed, it should be removed.
|
# once fixed, it should be removed.
|
||||||
|
# if tcltk_ops_flag is in PYTHON_CONFIGURE_OPTS, use user provided tcltk
|
||||||
use_custom_tcltk() {
|
use_custom_tcltk() {
|
||||||
local tcltk_ops="$1"
|
local tcltk_ops="$(get_tcltk_flag_from "$PYTHON_CONFIGURE_OPTS")"
|
||||||
|
|
||||||
|
if [[ -z "$tcltk_ops" ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
local tcltk_ops_flag="--with-tcltk-libs="
|
local tcltk_ops_flag="--with-tcltk-libs="
|
||||||
# get tcltk libs
|
# get tcltk libs
|
||||||
local tcltk_libs="${tcltk_ops//$tcltk_ops_flag/}"
|
local tcltk_libs="${tcltk_ops//$tcltk_ops_flag/}"
|
||||||
@@ -1591,13 +1753,13 @@ use_custom_tcltk() {
|
|||||||
get_tcltk_flag_from() {
|
get_tcltk_flag_from() {
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
# parse input string into array
|
# parse input string into array
|
||||||
local opts_arr=( $(xargs -n1 <<<"$1") )
|
local opts_arr=( $(xargs -n1 <<<"$1") )
|
||||||
|
|
||||||
# iterate through `opts_arr`, break if `--with-tcltk-libs=` was found.
|
# iterate through `opts_arr`, break if `--with-tcltk-libs=` was found.
|
||||||
for opts in ${opts_arr[@]}; do
|
for opts in ${opts_arr[@]}; do
|
||||||
# `--with-tcltk-libs=` must be the prefix.
|
# `--with-tcltk-libs=` must be the prefix.
|
||||||
if [[ "$opts" == "--with-tcltk-libs="* ]]; then
|
if [[ "$opts" == "--with-tcltk-libs="* ]]; then
|
||||||
# return
|
# return
|
||||||
echo "$opts"
|
echo "$opts"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
@@ -1606,18 +1768,19 @@ get_tcltk_flag_from() {
|
|||||||
IFS="$OLDIFS"
|
IFS="$OLDIFS"
|
||||||
}
|
}
|
||||||
|
|
||||||
use_tcltk() {
|
# Since 3.12, CPython can add DWARF debug information in MacOS
|
||||||
if is_mac; then
|
# using Apple's nonstandard way, `dsymutil', that creates a "dSYM bundle"
|
||||||
local tcltk_libdir="$(brew --prefix tcl-tk 2>/dev/null || true)"
|
# that's supposed to be installed alongside executables
|
||||||
|
# (https://github.com/python/cpython/issues/95973).
|
||||||
|
use_dsymutil() {
|
||||||
|
if [[ -n "$PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL" ]] && is_mac; then
|
||||||
|
package_option python configure --with-dsymutil
|
||||||
fi
|
fi
|
||||||
local tcl_tk_libs="$(get_tcltk_flag_from "$PYTHON_CONFIGURE_OPTS")"
|
}
|
||||||
|
|
||||||
# if tcltk_ops_flag is in PYTHON_CONFIGURE_OPTS, use user provided tcltk
|
use_free_threading() {
|
||||||
# otherwise default to homebrew-installed tcl-tk, if installed
|
if [[ -n "$PYTHON_BUILD_FREE_THREADING" ]]; then
|
||||||
if [[ -n "$tcl_tk_libs" ]]; then
|
package_option python configure --disable-gil
|
||||||
use_custom_tcltk "$tcl_tk_libs"
|
|
||||||
elif [ -d "$tcltk_libdir" ]; then
|
|
||||||
use_homebrew_tcltk
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1629,7 +1792,7 @@ build_package_auto_tcltk() {
|
|||||||
if is_mac && [ ! -d /usr/include/X11 ]; then
|
if is_mac && [ ! -d /usr/include/X11 ]; then
|
||||||
if [ -d /opt/X11/include ]; then
|
if [ -d /opt/X11/include ]; then
|
||||||
if [[ "$CPPFLAGS" != *-I/opt/X11/include* ]]; then
|
if [[ "$CPPFLAGS" != *-I/opt/X11/include* ]]; then
|
||||||
export CPPFLAGS="-I/opt/X11/include $CPPFLAGS"
|
export CPPFLAGS="-I/opt/X11/include${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
package_option python configure --without-tk
|
package_option python configure --without-tk
|
||||||
@@ -1637,35 +1800,31 @@ build_package_auto_tcltk() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# extglob must be set at parse time, not at runtime
|
package_is_python() {
|
||||||
# https://stackoverflow.com/questions/49283740/bash-script-throws-syntax-errors-when-the-extglob-option-is-set-inside-a-subsh
|
|
||||||
#
|
|
||||||
# The function is *parsed* with "extglob" only if an outer `shopt -s exglob`
|
|
||||||
# exists; at *runtime* you still need to activate it *within* the function.
|
|
||||||
#
|
|
||||||
shopt -s extglob
|
|
||||||
apply_python_patch() {
|
|
||||||
local patchfile
|
|
||||||
# needed at runtime
|
|
||||||
shopt -s extglob
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
Python-* | jython-* | pypy-* | pypy[0-9].+([0-9])-* | stackless-* )
|
Python-* | jython-* | pypy-* | pypy[0-9].+([0-9])-* | stackless-* )
|
||||||
patchfile="$(mktemp "${TMP}/python-patch.XXXXXX")"
|
return 0
|
||||||
cat "${2:--}" >"$patchfile"
|
;;
|
||||||
|
|
||||||
local striplevel=0
|
|
||||||
grep -q '^diff --git a/' "$patchfile" && striplevel=1
|
|
||||||
patch -p$striplevel --force -i "$patchfile"
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
shopt -u extglob
|
return 1
|
||||||
}
|
}
|
||||||
shopt -u extglob
|
|
||||||
|
apply_patch() {
|
||||||
|
local package_name="$1"
|
||||||
|
local patchfile
|
||||||
|
patchfile="$(mktemp "${TMP}/python-patch.XXXXXX")"
|
||||||
|
cat "${2:--}" >"$patchfile"
|
||||||
|
|
||||||
|
local striplevel=0
|
||||||
|
grep -q '^diff --git a/' "$patchfile" && striplevel=1
|
||||||
|
patch -p$striplevel --force -i "$patchfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
build_package_symlink_version_suffix() {
|
build_package_symlink_version_suffix() {
|
||||||
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
|
if [[ "${PYTHON_CONFIGURE_OPTS_ARRAY[*]} $CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
|
||||||
if [ -e "${PREFIX_PATH}/bin" ]; then
|
if [ -e "${PREFIX_PATH}/bin" ]; then
|
||||||
# Always create `bin` as symlink to framework path if the version was built with `--enable-frameowrk` (#590)
|
# Always create `bin` as symlink to framework path if the version was built with `--enable-framework` (#590)
|
||||||
rm -rf "${PREFIX_PATH}/bin.orig"
|
rm -rf "${PREFIX_PATH}/bin.orig"
|
||||||
mv -f "${PREFIX_PATH}/bin" "${PREFIX_PATH}/bin.orig"
|
mv -f "${PREFIX_PATH}/bin" "${PREFIX_PATH}/bin.orig"
|
||||||
fi
|
fi
|
||||||
@@ -1719,7 +1878,7 @@ verify_python() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try_python_module() {
|
try_python_module() {
|
||||||
if ! "$PYTHON_BIN" -c "import $1" 1>/dev/null 2>&1; then
|
if ! "$PYTHON_BIN" -c "import $1"; then
|
||||||
{ colorize 1 "WARNING"
|
{ colorize 1 "WARNING"
|
||||||
echo ": The Python $1 extension was not compiled${3:+ $3}. Missing the ${2:-$1}?"
|
echo ": The Python $1 extension was not compiled${3:+ $3}. Missing the ${2:-$1}?"
|
||||||
return 0
|
return 0
|
||||||
@@ -1728,7 +1887,7 @@ try_python_module() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
verify_python_module() {
|
verify_python_module() {
|
||||||
if ! "$PYTHON_BIN" -c "import $1" 1>/dev/null 2>&1; then
|
if ! "$PYTHON_BIN" -c "import $1"; then
|
||||||
{ colorize 1 "ERROR"
|
{ colorize 1 "ERROR"
|
||||||
echo ": The Python $1 extension was not compiled. Missing the ${2:-$1}?"
|
echo ": The Python $1 extension was not compiled. Missing the ${2:-$1}?"
|
||||||
echo
|
echo
|
||||||
@@ -1874,6 +2033,16 @@ build_package_verify_py312() {
|
|||||||
build_package_verify_py311 "$1" "${2:-3.12}"
|
build_package_verify_py311 "$1" "${2:-3.12}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Post-install check for Python 3.13.x
|
||||||
|
build_package_verify_py313() {
|
||||||
|
build_package_verify_py312 "$1" "${2:-3.13}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Post-install check for Python 3.14.x
|
||||||
|
build_package_verify_py314() {
|
||||||
|
build_package_verify_py313 "$1" "${2:-3.13}"
|
||||||
|
}
|
||||||
|
|
||||||
# Post-install check for Python 3.x rolling release scripts
|
# Post-install check for Python 3.x rolling release scripts
|
||||||
# XXX: Will need splitting into project-specific ones if there emerge
|
# XXX: Will need splitting into project-specific ones if there emerge
|
||||||
# multiple rolling-release scripts with different checks needed
|
# multiple rolling-release scripts with different checks needed
|
||||||
@@ -1929,14 +2098,23 @@ build_package_get_pip() {
|
|||||||
build_package_symlink_version_suffix
|
build_package_symlink_version_suffix
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Pip <21 (in 2.7 and derivatives like PyPy-2.7) doesn't support -I
|
||||||
|
build_package_ensurepip_lt21() {
|
||||||
|
build_package_ensurepip lt21
|
||||||
|
}
|
||||||
|
|
||||||
build_package_ensurepip() {
|
build_package_ensurepip() {
|
||||||
|
local mode="$1"
|
||||||
local ensurepip_opts
|
local ensurepip_opts
|
||||||
# Install as `--altinstall` if the Python is installed as `altinstall` (#255)
|
# Install as `--altinstall` if the Python is installed as `altinstall` (#255)
|
||||||
if [[ "$PYTHON_MAKE_INSTALL_TARGET" == *"altinstall"* ]]; then
|
if [[ "$PYTHON_MAKE_INSTALL_TARGET" == *"altinstall"* ]]; then
|
||||||
ensurepip_opts="--altinstall"
|
ensurepip_opts="--altinstall"
|
||||||
fi
|
fi
|
||||||
|
local python_opts="-I"
|
||||||
|
if [[ $mode == "lt21" ]]; then python_opts="-s"; fi
|
||||||
|
|
||||||
# FIXME: `--altinstall` with `get-pip.py`
|
# FIXME: `--altinstall` with `get-pip.py`
|
||||||
"$PYTHON_BIN" -s -m ensurepip ${ensurepip_opts} 1>/dev/null 2>&1 || build_package_get_pip "$@" || return 1
|
"$PYTHON_BIN" $python_opts -m ensurepip ${ensurepip_opts} 1>/dev/null 2>&1 || build_package_get_pip "$@" || return 1
|
||||||
build_package_symlink_version_suffix
|
build_package_symlink_version_suffix
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2000,7 +2178,7 @@ for option in "${OPTIONS[@]}"; do
|
|||||||
VERBOSE=true
|
VERBOSE=true
|
||||||
;;
|
;;
|
||||||
"p" | "patch" )
|
"p" | "patch" )
|
||||||
HAS_PATCH=true
|
HAS_STDIN_PATCH=true
|
||||||
;;
|
;;
|
||||||
"g" | "debug" )
|
"g" | "debug" )
|
||||||
DEBUG=true
|
DEBUG=true
|
||||||
@@ -2119,26 +2297,30 @@ if [ -n "$DEBUG" ]; then
|
|||||||
package_option python configure --with-pydebug
|
package_option python configure --with-pydebug
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--enable-framework"* && "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--disable-shared"* ]]; then
|
||||||
|
package_option python configure --enable-shared
|
||||||
|
fi
|
||||||
|
|
||||||
# python-build: Specify `--libdir` on configure to fix build on openSUSE (#36)
|
# python-build: Specify `--libdir` on configure to fix build on openSUSE (#36)
|
||||||
package_option python configure --libdir="${PREFIX_PATH}/lib"
|
package_option python configure --libdir="${PREFIX_PATH}/lib"
|
||||||
|
|
||||||
# python-build: Set `RPATH` if `--enable-shared` was given (#65, #66, #82)
|
# python-build: Set `RPATH` if `--enable-shared` was given (#65, #66, #82)
|
||||||
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-shared"* ]]; then
|
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS ${PYTHON_CONFIGURE_OPTS_ARRAY[@]}" == *"--enable-shared"* ]]; then
|
||||||
# The ld on Darwin embeds the full paths to each dylib by default
|
# The ld on Darwin embeds the full paths to each dylib by default
|
||||||
if [[ "$LDFLAGS" != *"-rpath="* ]] && ! is_mac; then
|
if [[ "$LDFLAGS" != *"-rpath="* ]] ; then
|
||||||
export LDFLAGS="-Wl,-rpath=${PREFIX_PATH}/lib ${LDFLAGS}"
|
prepend_ldflags_libs "-Wl,-rpath,${PREFIX_PATH}/lib"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# python-build: Set `RPATH` if --shared` was given for PyPy (#244)
|
# python-build: Set `RPATH` if --shared` was given for PyPy (#244)
|
||||||
if [[ "$PYPY_OPTS" == *"--shared"* ]]; then
|
if [[ "$PYPY_OPTS" == *"--shared"* ]]; then
|
||||||
export LDFLAGS="-Wl,-rpath=${PREFIX_PATH}/lib ${LDFLAGS}"
|
prepend_ldflags_libs "-Wl,-rpath=${PREFIX_PATH}/lib"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Add support for framework installation (`--enable-framework`) of CPython (#55, #99)
|
# Add support for framework installation (`--enable-framework`) of CPython (#55, #99)
|
||||||
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
|
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
|
||||||
if ! is_mac; then
|
if ! is_mac; then
|
||||||
echo "python-build: framework installation is not supported." >&2
|
echo "python-build: framework installation is not supported outside of MacOS." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
create_framework_dirs() {
|
create_framework_dirs() {
|
||||||
@@ -2154,15 +2336,27 @@ if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; the
|
|||||||
create_framework_dirs "${DEFINITION_PATH##*/}"
|
create_framework_dirs "${DEFINITION_PATH##*/}"
|
||||||
# the `/Library/Frameworks` suffix makes CPython build install apps under prefix rather than into /Applications (#1003)
|
# the `/Library/Frameworks` suffix makes CPython build install apps under prefix rather than into /Applications (#1003)
|
||||||
package_option python configure --enable-framework="${PREFIX_PATH}/Library/Frameworks"
|
package_option python configure --enable-framework="${PREFIX_PATH}/Library/Frameworks"
|
||||||
|
|
||||||
|
#FIXME: doesn't properly handle paths with spaces. Fix by parsing *OPTS into arrays.
|
||||||
|
CONFIGURE_OPTS="${CONFIGURE_OPTS//--enable-framework?(=*([^ ]))?( )/}";
|
||||||
|
CONFIGURE_OPTS="${CONFIGURE_OPTS% }"
|
||||||
|
PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//--enable-framework?(=*([^ ]))?( )/}";
|
||||||
|
PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS% }"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Build against universal SDK
|
# Build against universal SDK
|
||||||
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; then
|
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; then
|
||||||
if ! is_mac; then
|
if ! is_mac; then
|
||||||
echo "python-build: universal installation is not supported." >&2
|
echo "python-build: universal installation is not supported outside of MacOS." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
package_option python configure --enable-universalsdk=/
|
package_option python configure --enable-universalsdk=/
|
||||||
|
#FIXME: doesn't properly handle paths with spaces. Fix by parsing *OPTS into arrays.
|
||||||
|
CONFIGURE_OPTS="${CONFIGURE_OPTS//--enable-universalsdk?(=*([^ ]))?( )/}"
|
||||||
|
CONFIGURE_OPTS="${CONFIGURE_OPTS% }"
|
||||||
|
PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//--enable-universalsdk?(=*([^ ]))?( )/}"
|
||||||
|
PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS% }"
|
||||||
|
|
||||||
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--with-universal-archs"* ]]; then
|
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--with-universal-archs"* ]]; then
|
||||||
# in CPython's configure.ac, --with-universal-archs defaults to 'intel' which means i386 + x86_64
|
# in CPython's configure.ac, --with-universal-archs defaults to 'intel' which means i386 + x86_64
|
||||||
# since 2.7.5 and 3.3.0 -- i.e. in all non-EOL versions
|
# since 2.7.5 and 3.3.0 -- i.e. in all non-EOL versions
|
||||||
@@ -2222,7 +2416,7 @@ if [ -z "${GET_PIP_URL}" ]; then
|
|||||||
2.6 | 2.6.* )
|
2.6 | 2.6.* )
|
||||||
GET_PIP_URL="https://bootstrap.pypa.io/pip/2.6/get-pip.py"
|
GET_PIP_URL="https://bootstrap.pypa.io/pip/2.6/get-pip.py"
|
||||||
;;
|
;;
|
||||||
2.7 | 2.7.* )
|
2.7 | 2.7.* | pypy2.7 | pypy2.7-* )
|
||||||
GET_PIP_URL="https://bootstrap.pypa.io/pip/2.7/get-pip.py"
|
GET_PIP_URL="https://bootstrap.pypa.io/pip/2.7/get-pip.py"
|
||||||
;;
|
;;
|
||||||
3.2 | 3.2.* )
|
3.2 | 3.2.* )
|
||||||
@@ -2234,10 +2428,10 @@ if [ -z "${GET_PIP_URL}" ]; then
|
|||||||
3.4 | 3.4.* )
|
3.4 | 3.4.* )
|
||||||
GET_PIP_URL="https://bootstrap.pypa.io/pip/3.4/get-pip.py"
|
GET_PIP_URL="https://bootstrap.pypa.io/pip/3.4/get-pip.py"
|
||||||
;;
|
;;
|
||||||
3.5 | 3.5.* )
|
3.5 | 3.5.* | pypy3.5 | pypy3.5-* )
|
||||||
GET_PIP_URL="https://bootstrap.pypa.io/pip/3.5/get-pip.py"
|
GET_PIP_URL="https://bootstrap.pypa.io/pip/3.5/get-pip.py"
|
||||||
;;
|
;;
|
||||||
3.6 | 3.6.* )
|
3.6 | 3.6.* | pypy3.6 | pypy3.6-* )
|
||||||
GET_PIP_URL="https://bootstrap.pypa.io/pip/3.6/get-pip.py"
|
GET_PIP_URL="https://bootstrap.pypa.io/pip/3.6/get-pip.py"
|
||||||
;;
|
;;
|
||||||
* )
|
* )
|
||||||
@@ -2266,6 +2460,7 @@ python_bin_suffix() {
|
|||||||
version_name="${version_name%-dev}"
|
version_name="${version_name%-dev}"
|
||||||
version_name="${version_name%-rc*}"
|
version_name="${version_name%-rc*}"
|
||||||
version_name="${version_name%rc*}"
|
version_name="${version_name%rc*}"
|
||||||
|
version_name="${version_name%%*([^0-9])}"
|
||||||
version_info=(${version_name//./ })
|
version_info=(${version_name//./ })
|
||||||
echo "${version_info[0]}.${version_info[1]}"
|
echo "${version_info[0]}.${version_info[1]}"
|
||||||
;;
|
;;
|
||||||
@@ -2298,8 +2493,8 @@ if [ -n "$VERBOSE" ]; then
|
|||||||
trap "kill $TAIL_PID" SIGINT SIGTERM EXIT
|
trap "kill $TAIL_PID" SIGINT SIGTERM EXIT
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export LDFLAGS="-L${PREFIX_PATH}/lib ${LDFLAGS}"
|
prepend_ldflags_libs "-L${PREFIX_PATH}/lib"
|
||||||
export CPPFLAGS="-I${PREFIX_PATH}/include ${CPPFLAGS}"
|
export CPPFLAGS="-I${PREFIX_PATH}/include${CPPFLAGS:+ $CPPFLAGS}"
|
||||||
|
|
||||||
unset PYTHONHOME
|
unset PYTHONHOME
|
||||||
unset PYTHONPATH
|
unset PYTHONPATH
|
||||||
|
|||||||
@@ -11,15 +11,18 @@ Also ignores sub-patch releases if that major.minor.patch already exists,
|
|||||||
but otherwise, takes the latest sub-patch release for given OS/arch.
|
but otherwise, takes the latest sub-patch release for given OS/arch.
|
||||||
Assumes all miniconda3 releases < 4.7 default to python 3.6, and anything else 3.7.
|
Assumes all miniconda3 releases < 4.7 default to python 3.6, and anything else 3.7.
|
||||||
"""
|
"""
|
||||||
|
import logging
|
||||||
|
import re
|
||||||
|
import string
|
||||||
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from dataclasses import dataclass
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from functools import total_ordering
|
from functools import total_ordering
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import NamedTuple, List, Optional, DefaultDict, Dict
|
from typing import NamedTuple, List, Optional, DefaultDict, Dict
|
||||||
import logging
|
|
||||||
import string
|
|
||||||
|
|
||||||
import requests_html
|
import requests_html
|
||||||
|
|
||||||
@@ -90,7 +93,7 @@ class Flavor(StrEnum):
|
|||||||
ANACONDA = "anaconda"
|
ANACONDA = "anaconda"
|
||||||
MINICONDA = "miniconda"
|
MINICONDA = "miniconda"
|
||||||
|
|
||||||
|
|
||||||
class TFlavor(StrEnum):
|
class TFlavor(StrEnum):
|
||||||
ANACONDA = "Anaconda"
|
ANACONDA = "Anaconda"
|
||||||
MINICONDA = "Miniconda"
|
MINICONDA = "Miniconda"
|
||||||
@@ -102,25 +105,43 @@ class Suffix(StrEnum):
|
|||||||
NONE = ""
|
NONE = ""
|
||||||
|
|
||||||
|
|
||||||
class PyVersion(StrEnum):
|
PyVersion = None
|
||||||
PY27 = "py27"
|
class PyVersionMeta(type):
|
||||||
PY36 = "py36"
|
def __getattr__(self, name):
|
||||||
PY37 = "py37"
|
"""Generate PyVersion.PYXXX on demand to future-proof it"""
|
||||||
PY38 = "py38"
|
if PyVersion is not None:
|
||||||
PY39 = "py39"
|
return PyVersion(name.lower())
|
||||||
|
return super(PyVersionMeta,self).__getattr__(self, name)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class PyVersion(metaclass=PyVersionMeta):
|
||||||
|
major: str
|
||||||
|
minor: str
|
||||||
|
|
||||||
|
def __init__(self, value):
|
||||||
|
(major, minor) = re.match(r"py(\d)(\d+)", value).groups()
|
||||||
|
object.__setattr__(self, "major", major)
|
||||||
|
object.__setattr__(self, "minor", minor)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def value(self):
|
||||||
|
return f"py{self.major}{self.minor}"
|
||||||
|
|
||||||
def version(self):
|
def version(self):
|
||||||
first, *others = self.value[2:]
|
return f"{self.major}.{self.minor}"
|
||||||
return f"{first}.{''.join(others)}"
|
|
||||||
|
|
||||||
def version_info(self):
|
def version_info(self):
|
||||||
return tuple(int(n) for n in self.version().split("."))
|
return (self.major, self.minor)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
@total_ordering
|
@total_ordering
|
||||||
class VersionStr(str):
|
class VersionStr(str):
|
||||||
def info(self):
|
def info(self):
|
||||||
return tuple(int(n) for n in self.split("."))
|
return tuple(int(n) for n in self.replace("-", ".").split("."))
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return str(self) == str(other)
|
return str(self) == str(other)
|
||||||
@@ -149,20 +170,23 @@ class CondaVersion(NamedTuple):
|
|||||||
"""
|
"""
|
||||||
Convert a string of the form "miniconda_n-ver" or "miniconda_n-py_ver-ver" to a :class:`CondaVersion` object.
|
Convert a string of the form "miniconda_n-ver" or "miniconda_n-py_ver-ver" to a :class:`CondaVersion` object.
|
||||||
"""
|
"""
|
||||||
components = s.split("-")
|
miniconda_n, _, remainder = s.partition("-")
|
||||||
if len(components) == 3:
|
|
||||||
miniconda_n, py_ver, ver = components
|
|
||||||
py_ver = PyVersion(f"py{py_ver.replace('.', '')}")
|
|
||||||
else:
|
|
||||||
miniconda_n, ver = components
|
|
||||||
py_ver = None
|
|
||||||
|
|
||||||
suffix = miniconda_n[-1]
|
suffix = miniconda_n[-1]
|
||||||
if suffix in string.digits:
|
if suffix in string.digits:
|
||||||
flavor = miniconda_n[:-1]
|
flavor = miniconda_n[:-1]
|
||||||
else:
|
else:
|
||||||
flavor = miniconda_n
|
flavor = miniconda_n
|
||||||
suffix = ""
|
suffix = ""
|
||||||
|
|
||||||
|
components = remainder.split("-")
|
||||||
|
if flavor == Flavor.MINICONDA and len(components) >= 2:
|
||||||
|
py_ver, *ver_parts = components
|
||||||
|
py_ver = PyVersion(f"py{py_ver.replace('.', '')}")
|
||||||
|
ver = "-".join(ver_parts)
|
||||||
|
else:
|
||||||
|
ver = "-".join(components)
|
||||||
|
py_ver = None
|
||||||
|
|
||||||
return CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver)
|
return CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver)
|
||||||
|
|
||||||
def to_filename(self):
|
def to_filename(self):
|
||||||
@@ -185,10 +209,19 @@ class CondaVersion(NamedTuple):
|
|||||||
# https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html
|
# https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html
|
||||||
if v < (4, 7):
|
if v < (4, 7):
|
||||||
return PyVersion.PY36
|
return PyVersion.PY36
|
||||||
else:
|
if v < (4, 8):
|
||||||
return PyVersion.PY37
|
return PyVersion.PY37
|
||||||
|
else:
|
||||||
|
# since 4.8, Miniconda specifies versions explicitly in the file name
|
||||||
|
raise ValueError("Miniconda 4.8+ is supposed to specify a Python version explicitly")
|
||||||
if self.flavor == "anaconda":
|
if self.flavor == "anaconda":
|
||||||
# https://docs.anaconda.com/anaconda/reference/release-notes/
|
# https://docs.anaconda.com/free/anaconda/reference/release-notes/
|
||||||
|
if v >= (2024,6):
|
||||||
|
return PyVersion.PY312
|
||||||
|
if v >= (2023,7):
|
||||||
|
return PyVersion.PY311
|
||||||
|
if v >= (2023,3):
|
||||||
|
return PyVersion.PY310
|
||||||
if v >= (2021,11):
|
if v >= (2021,11):
|
||||||
return PyVersion.PY39
|
return PyVersion.PY39
|
||||||
if v >= (2020,7):
|
if v >= (2020,7):
|
||||||
@@ -199,7 +232,7 @@ class CondaVersion(NamedTuple):
|
|||||||
return PyVersion.PY37
|
return PyVersion.PY37
|
||||||
return PyVersion.PY36
|
return PyVersion.PY36
|
||||||
|
|
||||||
raise ValueError(flavor)
|
raise ValueError(self.flavor)
|
||||||
|
|
||||||
|
|
||||||
class CondaSpec(NamedTuple):
|
class CondaSpec(NamedTuple):
|
||||||
@@ -213,7 +246,10 @@ class CondaSpec(NamedTuple):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_filestem(cls, stem, md5, repo, py_version=None):
|
def from_filestem(cls, stem, md5, repo, py_version=None):
|
||||||
miniconda_n, ver, os, arch = stem.split("-")
|
# The `*vers` captures the new trailing `-1` in some file names (a build number?)
|
||||||
|
# so they can be processed properly.
|
||||||
|
miniconda_n, *vers, os, arch = stem.split("-")
|
||||||
|
ver = "-".join(vers)
|
||||||
suffix = miniconda_n[-1]
|
suffix = miniconda_n[-1]
|
||||||
if suffix in string.digits:
|
if suffix in string.digits:
|
||||||
tflavor = miniconda_n[:-1]
|
tflavor = miniconda_n[:-1]
|
||||||
@@ -234,8 +270,9 @@ class CondaSpec(NamedTuple):
|
|||||||
SupportedArch(arch),
|
SupportedArch(arch),
|
||||||
md5,
|
md5,
|
||||||
repo,
|
repo,
|
||||||
|
py_ver
|
||||||
)
|
)
|
||||||
if py_version is None:
|
if py_version is None and py_ver is None and ver != "latest":
|
||||||
spec = spec.with_py_version(spec.version.default_py_version())
|
spec = spec.with_py_version(spec.version.default_py_version())
|
||||||
return spec
|
return spec
|
||||||
|
|
||||||
@@ -284,8 +321,8 @@ def get_existing_condas(name):
|
|||||||
if v.version_str != "latest":
|
if v.version_str != "latest":
|
||||||
logger.debug("Found existing %(name)s version %(v)s", locals())
|
logger.debug("Found existing %(name)s version %(v)s", locals())
|
||||||
yield v
|
yield v
|
||||||
except ValueError:
|
except ValueError as e:
|
||||||
pass
|
logger.error("Unable to parse existing version %s: %s", entry_name, e)
|
||||||
|
|
||||||
|
|
||||||
def get_available_condas(name, repo):
|
def get_available_condas(name, repo):
|
||||||
@@ -336,19 +373,12 @@ if __name__ == "__main__":
|
|||||||
help="Do not write scripts, just report them to stdout",
|
help="Do not write scripts, just report them to stdout",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-v", "--verbose", action="count", default=0,
|
"-v", "--verbose", action="store_true", default=0,
|
||||||
help="Increase verbosity of logging",
|
help="Increase verbosity of logging",
|
||||||
)
|
)
|
||||||
parsed = parser.parse_args()
|
parsed = parser.parse_args()
|
||||||
|
|
||||||
log_level = {
|
logging.basicConfig(level=logging.DEBUG if parsed.verbose else logging.INFO)
|
||||||
0: logging.WARNING,
|
|
||||||
1: logging.INFO,
|
|
||||||
2: logging.DEBUG,
|
|
||||||
}.get(parsed.verbose, logging.DEBUG)
|
|
||||||
logging.basicConfig(level=log_level)
|
|
||||||
if parsed.verbose < 3:
|
|
||||||
logging.getLogger("requests").setLevel(logging.WARNING)
|
|
||||||
|
|
||||||
existing_versions = set()
|
existing_versions = set()
|
||||||
available_specs = set()
|
available_specs = set()
|
||||||
@@ -365,15 +395,15 @@ if __name__ == "__main__":
|
|||||||
for s in sorted(available_specs, key=key_fn):
|
for s in sorted(available_specs, key=key_fn):
|
||||||
key = s.version
|
key = s.version
|
||||||
vv = key.version_str.info()
|
vv = key.version_str.info()
|
||||||
|
|
||||||
reason = None
|
reason = None
|
||||||
if key in existing_versions:
|
if key in existing_versions:
|
||||||
reason = "already exists"
|
reason = "already exists"
|
||||||
elif key.version_str.info() <= (4, 3, 30):
|
elif key.version_str.info() <= (4, 3, 30):
|
||||||
reason = "too old"
|
reason = "too old"
|
||||||
elif len(key.version_str.info()) >= 4:
|
elif len(key.version_str.info()) >= 4 and "-" not in key.version_str:
|
||||||
reason = "ignoring hotfix releases"
|
reason = "ignoring hotfix releases"
|
||||||
|
|
||||||
if reason:
|
if reason:
|
||||||
logger.debug("Ignoring version %(s)s (%(reason)s)", locals())
|
logger.debug("Ignoring version %(s)s (%(reason)s)", locals())
|
||||||
continue
|
continue
|
||||||
|
|||||||
134
plugins/python-build/scripts/add_miniforge.py
Executable file
134
plugins/python-build/scripts/add_miniforge.py
Executable file
@@ -0,0 +1,134 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
'Adds the latest miniforge and mambaforge releases.'
|
||||||
|
from pathlib import Path
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import string
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
logging.basicConfig(level=os.environ.get('LOGLEVEL', 'INFO'))
|
||||||
|
|
||||||
|
MINIFORGE_REPO = 'conda-forge/miniforge'
|
||||||
|
DISTRIBUTIONS = ['miniforge', 'mambaforge']
|
||||||
|
|
||||||
|
SKIPPED_RELEASES = [
|
||||||
|
'4.13.0-0', #has no Mambaforge. We already generated scripts for Miniforge
|
||||||
|
'22.11.1-0', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403)
|
||||||
|
'22.11.1-1', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403)
|
||||||
|
'22.11.1-2', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403)
|
||||||
|
]
|
||||||
|
|
||||||
|
install_script_fmt = """
|
||||||
|
case "$(anaconda_architecture 2>/dev/null || true)" in
|
||||||
|
{install_lines}
|
||||||
|
* )
|
||||||
|
{{ echo
|
||||||
|
colorize 1 "ERROR"
|
||||||
|
echo ": The binary distribution of {flavor} is not available for $(anaconda_architecture 2>/dev/null || true)."
|
||||||
|
echo
|
||||||
|
}} >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
""".lstrip()
|
||||||
|
|
||||||
|
install_line_fmt = """
|
||||||
|
"{os}-{arch}" )
|
||||||
|
install_script "{filename}" "{url}#{sha}" "miniconda" verify_py{py_version}
|
||||||
|
;;
|
||||||
|
""".strip()
|
||||||
|
|
||||||
|
here = Path(__file__).resolve()
|
||||||
|
out_dir: Path = here.parent.parent / "share" / "python-build"
|
||||||
|
|
||||||
|
def download_sha(url):
|
||||||
|
logger.info('Downloading SHA file %(url)s', locals())
|
||||||
|
tup = tuple(reversed(requests.get(url).text.replace('./', '').rstrip().split()))
|
||||||
|
logger.debug('Got %(tup)s', locals())
|
||||||
|
return tup
|
||||||
|
|
||||||
|
def create_spec(filename, sha, url):
|
||||||
|
flavor_with_suffix, version, subversion, os, arch = filename.replace('.sh', '').split('-')
|
||||||
|
suffix = flavor_with_suffix[-1]
|
||||||
|
|
||||||
|
if suffix in string.digits:
|
||||||
|
flavor = flavor_with_suffix[:-1]
|
||||||
|
else:
|
||||||
|
flavor = flavor_with_suffix
|
||||||
|
|
||||||
|
spec = {
|
||||||
|
'filename': filename,
|
||||||
|
'sha': sha,
|
||||||
|
'url': url,
|
||||||
|
'py_version': py_version(version),
|
||||||
|
'flavor': flavor,
|
||||||
|
'os': os,
|
||||||
|
'arch': arch,
|
||||||
|
'installer_filename': f'{flavor_with_suffix.lower()}-{version}-{subversion}',
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug('Created spec %(spec)s', locals())
|
||||||
|
|
||||||
|
return spec
|
||||||
|
|
||||||
|
def py_version(release):
|
||||||
|
"""Suffix for `verify_pyXXX` to call in the generated build script"""
|
||||||
|
release_line = tuple(int(part) for part in release.split(".")[:2])
|
||||||
|
# current version: mentioned under https://github.com/conda-forge/miniforge?tab=readme-ov-file#miniforge3
|
||||||
|
# transition points:
|
||||||
|
# https://github.com/conda-forge/miniforge/blame/main/Miniforge3/construct.yaml
|
||||||
|
# look for "- python <version>" in non-pypy branch and which tag the commit is first in
|
||||||
|
if release_line >= (24,5):
|
||||||
|
# yes, they jumped from 3.10 directly to 3.12
|
||||||
|
# https://github.com/conda-forge/miniforge/commit/bddad0baf22b37cfe079e47fd1680fdfb2183590
|
||||||
|
return "312"
|
||||||
|
if release_line >= (4,14):
|
||||||
|
return "310"
|
||||||
|
raise ValueError("Bundled Python version unknown for release `%s'"%release)
|
||||||
|
|
||||||
|
def supported(filename):
|
||||||
|
return ('pypy' not in filename) and ('Windows' not in filename)
|
||||||
|
|
||||||
|
def add_version(release):
|
||||||
|
tag_name = release['tag_name']
|
||||||
|
download_urls = { f['name']: f['browser_download_url'] for f in release['assets'] }
|
||||||
|
# can assume that sha files are named similar to release files so can also check supported(on their names)
|
||||||
|
shas = dict([download_sha(url) for (name, url) in download_urls.items() if name.endswith('.sha256') and supported(os.path.basename(name)) and tag_name in name])
|
||||||
|
specs = [create_spec(filename, sha, download_urls[filename]) for (filename, sha) in shas.items() if supported(filename)]
|
||||||
|
|
||||||
|
for distribution in DISTRIBUTIONS:
|
||||||
|
distribution_specs = [spec for spec in specs if distribution in spec['flavor'].lower()]
|
||||||
|
count = len(distribution_specs)
|
||||||
|
|
||||||
|
if count > 0:
|
||||||
|
output_file = out_dir / distribution_specs[0]['installer_filename']
|
||||||
|
|
||||||
|
logger.info('Writing %(count)d specs for %(distribution)s to %(output_file)s', locals())
|
||||||
|
|
||||||
|
script_str = install_script_fmt.format(
|
||||||
|
install_lines="\n".join([install_line_fmt.format_map(s) for s in distribution_specs]),
|
||||||
|
flavor=distribution_specs[0]['flavor'],
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(output_file, 'w') as f:
|
||||||
|
f.write(script_str)
|
||||||
|
else:
|
||||||
|
logger.info('Did not find specs for %(distribution)s', locals())
|
||||||
|
|
||||||
|
for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/releases').json():
|
||||||
|
version = release['tag_name']
|
||||||
|
|
||||||
|
logger.info('Looking for %(version)s in %(out_dir)s', locals())
|
||||||
|
|
||||||
|
# This release has no mambaforge artifacts which causes the next check to always trigger.
|
||||||
|
# Build scripts for miniforge3-4.13.0-0 have already been generated.
|
||||||
|
# Assuming this was a fluke, we don't yet need to implement proactively checking all releases for contents
|
||||||
|
# or ignoring a release if _any_ of the flavors is already present in Pyenv.
|
||||||
|
if version in SKIPPED_RELEASES:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if any(not list(out_dir.glob(f'{distribution}*-{version}')) for distribution in DISTRIBUTIONS):
|
||||||
|
logger.info('Downloading %(version)s', locals())
|
||||||
|
add_version(release)
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="openssl@1.1 openssl@1.0 openssl"
|
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="openssl@1.1 openssl@1.0 openssl"
|
||||||
install_package "openssl-1.0.2q" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2q.tar.gz#5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1v" "https://www.openssl.org/source/openssl-1.1.1v.tar.gz" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
if has_tar_xz_support; then
|
if has_tar_xz_support; then
|
||||||
install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz#b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43" standard verify_py27 copy_python_gdb ensurepip
|
install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz#b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43" standard verify_py27 copy_python_gdb ensurepip_lt21
|
||||||
else
|
else
|
||||||
install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz#da3080e3b488f648a3d7a4560ddee895284c3380b11d6de75edb986526b9a814" standard verify_py27 copy_python_gdb ensurepip
|
install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz#da3080e3b488f648a3d7a4560ddee895284c3380b11d6de75edb986526b9a814" standard verify_py27 copy_python_gdb ensurepip_lt21
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
9
plugins/python-build/share/python-build/3.10.10
Normal file
9
plugins/python-build/share/python-build/3.10.10
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.10" "https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tar.xz#0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.10" "https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tgz#fba64559dde21ebdc953e4565e731573bb61159de8e4d4cedee70fb1196f610d" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.11
Normal file
9
plugins/python-build/share/python-build/3.10.11
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.11" "https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tar.xz#3c3bc3048303721c904a03eb8326b631e921f11cc3be2988456a42f115daf04c" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.11" "https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz#f3db31b668efa983508bd67b5712898aa4247899a346f2eb745734699ccd3859" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.12
Normal file
9
plugins/python-build/share/python-build/3.10.12
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.12" "https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tar.xz#afb74bf19130e7a47d10312c8f5e784f24e0527981eab68e20546cfb865830b8" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.12" "https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz#a43cd383f3999a6f4a7db2062b2fc9594fefa73e175b3aedafa295a51a7bb65c" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.13
Normal file
9
plugins/python-build/share/python-build/3.10.13
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.13" "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz#5c88848668640d3e152b35b4536ef1c23b2ca4bd2c957ef1ecbb053f571dd3f6" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.13" "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz#698ec55234c1363bd813b460ed53b0f108877c7a133d48bde9a50a1eb57b7e65" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.14
Normal file
9
plugins/python-build/share/python-build/3.10.14
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tar.xz#9c50481faa8c2832329ba0fc8868d0a606a680fc4f60ec48d26ce8e076751fda" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz#cefea32d3be89c02436711c95a45c7f8e880105514b78680c14fe76f5709a0f6" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.15
Normal file
9
plugins/python-build/share/python-build/3.10.15
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tar.xz#aab0950817735172601879872d937c1e4928a57c409ae02369ec3d91dccebe79" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tgz#a27864e5ba2a4474f8f6c58ab92ff52767ac8b66f1646923355a53fe3ef15074" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.16
Normal file
9
plugins/python-build/share/python-build/3.10.16
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tar.xz#bfb249609990220491a1b92850a07135ed0831e41738cf681d63cf01b2a8fbd1" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tgz#f2e22ed965a93cfeb642378ed6e6cdbc127682664b24123679f3d013fafe9cd0" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.17
Normal file
9
plugins/python-build/share/python-build/3.10.17
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tar.xz#4c68050f049d1b4ac5aadd0df5f27941c0350d2a9e7ab0907ee5eb5225d9d6b0" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tgz#8fcda0fbdc131859a4a4223abb925fd522a77e3fb3b52c46cea5f3bc2ae0cd9f" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
|||||||
9
plugins/python-build/share/python-build/3.10.7
Normal file
9
plugins/python-build/share/python-build/3.10.7
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.7" "https://www.python.org/ftp/python/3.10.7/Python-3.10.7.tar.xz#6eed8415b7516fb2f260906db5d48dd4c06acc0cb24a7d6cc15296a604dcdc48" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.7" "https://www.python.org/ftp/python/3.10.7/Python-3.10.7.tgz#1b2e4e2df697c52d36731666979e648beeda5941d0f95740aafbf4163e5cc126" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.8
Normal file
9
plugins/python-build/share/python-build/3.10.8
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.8" "https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tar.xz#6a30ecde59c47048013eb5a658c9b5dec277203d2793667f578df7671f7f03f3" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.8" "https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tgz#f400c3fb394b8bef1292f6dc1292c5fadc3533039a5bc0c3e885f3e16738029a" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.10.9
Normal file
9
plugins/python-build/share/python-build/3.10.9
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.10.9" "https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tar.xz#5ae03e308260164baba39921fdb4dbf8e6d03d8235a939d4582b33f0b5e46a83" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.10.9" "https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz#4ccd7e46c8898f4c7862910a1703aa0e63525913a519abb2f55e26220a914d88" standard verify_py310 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl
|
install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
install_git "Python-3.11-dev" "https://github.com/python/cpython" 3.11 standard verify_py311 copy_python_gdb ensurepip
|
install_git "Python-3.11-dev" "https://github.com/python/cpython" 3.11 standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
|||||||
10
plugins/python-build/share/python-build/3.11.0
Normal file
10
plugins/python-build/share/python-build/3.11.0
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.0" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tar.xz#a57dc82d77358617ba65b9841cee1e3b441f386c3789ddc0676eca077f2951c3" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.0" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz#64424e96e2457abbac899b90f9530985b51eef2905951febd935f0e73414caeb" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
prefer_openssl11
|
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
|
||||||
install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl
|
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
|
||||||
if has_tar_xz_support; then
|
|
||||||
install_package "Python-3.11.0b5" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0b5.tar.xz#3810bd22f7dc34a99c2a2eb4b85264a4df4f05ef59c4e0ccc2ea82ee9c491698" standard verify_py311 copy_python_gdb ensurepip
|
|
||||||
else
|
|
||||||
install_package "Python-3.11.0b5" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0b5.tgz#3f7d1a4ab0e64425f4ffd92d49de192ad2ee1c62bc52e3877e9f7b254c702e60" standard verify_py311 copy_python_gdb ensurepip
|
|
||||||
fi
|
|
||||||
10
plugins/python-build/share/python-build/3.11.1
Normal file
10
plugins/python-build/share/python-build/3.11.1
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.1" "https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tar.xz#85879192f2cffd56cb16c092905949ebf3e5e394b7f764723529637901dfb58f" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.1" "https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tgz#baed518e26b337d4d8105679caf68c5c32630d702614fc174e98cb95c46bdfa4" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.10
Normal file
10
plugins/python-build/share/python-build/3.11.10
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tar.xz#07a4356e912900e61a15cb0949a06c4a05012e213ecd6b4e84d0f67aabbee372" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz#92f2faf242681bfa406d53a51e17d42c5373affe23a130cd9697e132ef574706" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.11
Normal file
10
plugins/python-build/share/python-build/3.11.11
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tar.xz#2a9920c7a0cd236de33644ed980a13cbbc21058bfdc528febb6081575ed73be3" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tgz#883bddee3c92fcb91cf9c09c5343196953cbb9ced826213545849693970868ed" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.12
Normal file
10
plugins/python-build/share/python-build/3.11.12
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tar.xz#849da87af4df137710c1796e276a955f7a85c9f971081067c8f565d15c352a09" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tgz#379c9929a989a9d65a1f5d854e011f4872b142259f4fc0a8c4062d2815ed7fba" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.2
Normal file
10
plugins/python-build/share/python-build/3.11.2
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.2" "https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tar.xz#29e4b8f5f1658542a8c13e2dd277358c9c48f2b2f7318652ef1675e402b9d2af" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.2" "https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tgz#2411c74bda5bbcfcddaf4531f66d1adc73f247f529aee981b029513aefdbf849" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.3
Normal file
10
plugins/python-build/share/python-build/3.11.3
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.3" "https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz#8a5db99c961a7ecf27c75956189c9602c968751f11dbeae2b900dbff1c085b5e" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.3" "https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz#1a79f3df32265d9e6625f1a0b31c28eb1594df911403d11f3320ee1da1b3e048" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.4
Normal file
10
plugins/python-build/share/python-build/3.11.4
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.4" "https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz#2f0e409df2ab57aa9fc4cbddfb976af44e4e55bf6f619eee6bc5c2297264a7f6" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.4" "https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz#85c37a265e5c9dd9f75b35f954e31fbfc10383162417285e30ad25cc073a0d63" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.5
Normal file
10
plugins/python-build/share/python-build/3.11.5
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.5" "https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tar.xz#85cd12e9cf1d6d5a45f17f7afe1cebe7ee628d3282281c492e86adf636defa3f" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.5" "https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tgz#a12a0a013a30b846c786c010f2c19dd36b7298d888f7c4bd1581d90ce18b5e58" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.6
Normal file
10
plugins/python-build/share/python-build/3.11.6
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tar.xz#0fab78fa7f133f4f38210c6260d90d7c0d5c7198446419ce057ec7ac2e6f5f38" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tgz#c049bf317e877cbf9fce8c3af902436774ecef5249a29d10984ca3a37f7f4736" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.7
Normal file
10
plugins/python-build/share/python-build/3.11.7
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz#18e1aa7e66ff3a58423d59ed22815a6954e53342122c45df20c96877c062b9b7" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tgz#068c05f82262e57641bd93458dfa883128858f5f4997aad7a36fd25b13b29209" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.8
Normal file
10
plugins/python-build/share/python-build/3.11.8
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz#9e06008c8901924395bc1da303eac567a729ae012baa182ab39269f650383bb3" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz#d3019a613b9e8761d260d9ebe3bd4df63976de30464e5c0189566e1ae3f61889" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
10
plugins/python-build/share/python-build/3.11.9
Normal file
10
plugins/python-build/share/python-build/3.11.9
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz#9b1e896523fc510691126c864406d9360a3d1e986acbda59cda57b5abda45b87" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz#e7de3240a8bc2b1e1ba5c81bf943f06861ff494b69fda990ce2722a504c6153d" standard verify_py311 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
prefer_openssl11
|
prefer_openssl3
|
||||||
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1
|
||||||
|
install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl
|
||||||
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
install_git "Python-3.12-dev" "https://github.com/python/cpython" main standard verify_py312 copy_python_gdb ensurepip
|
install_git "Python-3.12-dev" "https://github.com/python/cpython" 3.12 standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
|||||||
9
plugins/python-build/share/python-build/3.12.0
Normal file
9
plugins/python-build/share/python-build/3.12.0
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz#795c34f44df45a0e9b9710c8c71c15c671871524cd412ca14def212e8ccb155d" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz#51412956d24a1ef7c97f1cb5f70e185c13e3de1f50d131c0aac6338080687afb" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.1
Normal file
9
plugins/python-build/share/python-build/3.12.1
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.xz#8dfb8f426fcd226657f9e2bd5f1e96e53264965176fa17d32658e873591aeb21" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz#d01ec6a33bc10009b09c17da95cc2759af5a580a7316b3a446eb4190e13f97b2" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.10
Normal file
9
plugins/python-build/share/python-build/3.12.10
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.3.3" "https://github.com/openssl/openssl/releases/download/openssl-3.3.3/openssl-3.3.3.tar.gz#712590fd20aaa60ec75d778fe5b810d6b829ca7fb1e530577917a131f9105539" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tar.xz#07ab697474595e06f06647417d3c7fa97ded07afc1a7e4454c5639919b46eaea" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tgz#15d9c623abfd2165fe816ea1fb385d6ed8cf3c664661ab357f1782e3036a6dac" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.2
Normal file
9
plugins/python-build/share/python-build/3.12.2
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz#be28112dac813d2053545c14bf13a16401a21877f1a69eb6ea5d84c4a0f3d870" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz#a7c4f6a9dc423d8c328003254ab0c9338b83037bd787d680826a5bf84308116e" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.3
Normal file
9
plugins/python-build/share/python-build/3.12.3
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz#56bfef1fdfc1221ce6720e43a661e3eb41785dd914ce99698d8c7896af4bdaa1" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz#a6b9459f45a6ebbbc1af44f5762623fa355a0c87208ed417628b379d762dddb0" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.4
Normal file
9
plugins/python-build/share/python-build/3.12.4
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.2.2" "https://www.openssl.org/source/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tar.xz#f6d419a6d8743ab26700801b4908d26d97e8b986e14f95de31b32de2b0e79554" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz#01b3c1c082196f3b33168d344a9c85fb07bfe0e7ecfe77fee4443420d1ce2ad9" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.5
Normal file
9
plugins/python-build/share/python-build/3.12.5
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz#fa8a2e12c5e620b09f53e65bcd87550d2e5a1e2e04bf8ba991dcc55113876397" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tgz#38dc4e2c261d49c661196066edbfb70fdb16be4a79cc8220c224dfeb5636d405" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.6
Normal file
9
plugins/python-build/share/python-build/3.12.6
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tar.xz#1999658298cf2fb837dffed8ff3c033ef0c98ef20cf73c5d5f66bed5ab89697c" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tgz#85a4c1be906d20e5c5a69f2466b00da769c221d6a684acfd3a514dbf5bf10a66" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.7
Normal file
9
plugins/python-build/share/python-build/3.12.7
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tar.xz#24887b92e2afd4a2ac602419ad4b596372f67ac9b077190f459aba390faf5550" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz#73ac8fe780227bf371add8373c3079f42a0dc62deff8d612cd15a618082ab623" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.8
Normal file
9
plugins/python-build/share/python-build/3.12.8
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tar.xz#c909157bb25ec114e5869124cc2a9c4a4d4c1e957ca4ff553f1edc692101154e" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tgz#5978435c479a376648cb02854df3b892ace9ed7d32b1fead652712bee9d03a45" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.12.9
Normal file
9
plugins/python-build/share/python-build/3.12.9
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tar.xz#7220835d9f90b37c006e9842a8dff4580aaca4318674f947302b8d28f3f81112" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tgz#45313e4c5f0e8acdec9580161d565cf5fea578e3eabf25df7cc6355bf4afa1ee" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
7
plugins/python-build/share/python-build/3.13-dev
Normal file
7
plugins/python-build/share/python-build/3.13-dev
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1
|
||||||
|
install_package "openssl-3.3.0" "https://www.openssl.org/source/openssl-3.3.0.tar.gz#53e66b043322a606abf0087e7699a0e033a37fa13feb9742df35c3a33b18fb02" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
install_git "Python-3.13-dev" "https://github.com/python/cpython" 3.13 standard verify_py313 copy_python_gdb ensurepip
|
||||||
9
plugins/python-build/share/python-build/3.13.0
Normal file
9
plugins/python-build/share/python-build/3.13.0
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tar.xz#086de5882e3cb310d4dca48457522e2e48018ecd43da9cdf827f6a0759efb07d" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz#12445c7b3db3126c41190bfdc1c8239c39c719404e844babbd015a1bc3fafcd4" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
2
plugins/python-build/share/python-build/3.13.0t
Normal file
2
plugins/python-build/share/python-build/3.13.0t
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export PYTHON_BUILD_FREE_THREADING=1
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0
|
||||||
9
plugins/python-build/share/python-build/3.13.1
Normal file
9
plugins/python-build/share/python-build/3.13.1
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tar.xz#9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tgz#1513925a9f255ef0793dbf2f78bb4533c9f184bdd0ad19763fd7f47a400a7c55" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
2
plugins/python-build/share/python-build/3.13.1t
Normal file
2
plugins/python-build/share/python-build/3.13.1t
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export PYTHON_BUILD_FREE_THREADING=1
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")"/3.13.1
|
||||||
9
plugins/python-build/share/python-build/3.13.2
Normal file
9
plugins/python-build/share/python-build/3.13.2
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz#d984bcc57cd67caab26f7def42e523b1c015bbc5dc07836cf4f0b63fa159eb56" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tgz#b8d79530e3b7c96a5cb2d40d431ddb512af4a563e863728d8713039aa50203f9" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
2
plugins/python-build/share/python-build/3.13.2t
Normal file
2
plugins/python-build/share/python-build/3.13.2t
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export PYTHON_BUILD_FREE_THREADING=1
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")"/3.13.2
|
||||||
9
plugins/python-build/share/python-build/3.13.3
Normal file
9
plugins/python-build/share/python-build/3.13.3
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz#40f868bcbdeb8149a3149580bb9bfd407b3321cd48f0be631af955ac92c0e041" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tgz#988d735a6d33568cbaff1384a65cb22a1fb18a9ecb73d43ef868000193ce23ed" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
2
plugins/python-build/share/python-build/3.13.3t
Normal file
2
plugins/python-build/share/python-build/3.13.3t
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export PYTHON_BUILD_FREE_THREADING=1
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")"/3.13.3
|
||||||
2
plugins/python-build/share/python-build/3.13t-dev
Normal file
2
plugins/python-build/share/python-build/3.13t-dev
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export PYTHON_BUILD_FREE_THREADING=1
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")"/3.13-dev
|
||||||
7
plugins/python-build/share/python-build/3.14-dev
Normal file
7
plugins/python-build/share/python-build/3.14-dev
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1
|
||||||
|
install_package "openssl-3.3.0" "https://www.openssl.org/source/openssl-3.3.0.tar.gz#53e66b043322a606abf0087e7699a0e033a37fa13feb9742df35c3a33b18fb02" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
|
||||||
|
install_git "Python-3.14-dev" "https://github.com/python/cpython" main standard verify_py314 copy_python_gdb ensurepip
|
||||||
9
plugins/python-build/share/python-build/3.14.0a7
Normal file
9
plugins/python-build/share/python-build/3.14.0a7
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl3
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
|
||||||
|
install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl
|
||||||
|
install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline
|
||||||
|
if has_tar_xz_support; then
|
||||||
|
install_package "Python-3.14.0a7" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a7.tar.xz#71adbcec3ac9edf93308e55cfb4184f2eb4b16fda2bb0a5a382929ed29c8386d" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.14.0a7" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a7.tgz#381cc699c1dff5153ab76bff4c6d1f916069be39d0231ee20390f42785b9c046" standard verify_py313 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
2
plugins/python-build/share/python-build/3.14.0a7t
Normal file
2
plugins/python-build/share/python-build/3.14.0a7t
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export PYTHON_BUILD_FREE_THREADING=1
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a7
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user