relenv 0.21.2__py3-none-any.whl → 0.22.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. relenv/__init__.py +14 -2
  2. relenv/__main__.py +12 -6
  3. relenv/_resources/xz/config.h +148 -0
  4. relenv/_resources/xz/readme.md +4 -0
  5. relenv/build/__init__.py +28 -30
  6. relenv/build/common/__init__.py +50 -0
  7. relenv/build/common/_sysconfigdata_template.py +72 -0
  8. relenv/build/common/builder.py +907 -0
  9. relenv/build/common/builders.py +163 -0
  10. relenv/build/common/download.py +324 -0
  11. relenv/build/common/install.py +609 -0
  12. relenv/build/common/ui.py +432 -0
  13. relenv/build/darwin.py +128 -14
  14. relenv/build/linux.py +292 -74
  15. relenv/build/windows.py +123 -169
  16. relenv/buildenv.py +48 -17
  17. relenv/check.py +10 -5
  18. relenv/common.py +489 -165
  19. relenv/create.py +147 -7
  20. relenv/fetch.py +16 -4
  21. relenv/manifest.py +15 -7
  22. relenv/python-versions.json +329 -0
  23. relenv/pyversions.py +817 -30
  24. relenv/relocate.py +101 -55
  25. relenv/runtime.py +452 -282
  26. relenv/toolchain.py +9 -3
  27. {relenv-0.21.2.dist-info → relenv-0.22.0.dist-info}/METADATA +1 -1
  28. relenv-0.22.0.dist-info/RECORD +48 -0
  29. tests/__init__.py +2 -0
  30. tests/_pytest_typing.py +45 -0
  31. tests/conftest.py +42 -36
  32. tests/test_build.py +426 -9
  33. tests/test_common.py +311 -48
  34. tests/test_create.py +149 -6
  35. tests/test_downloads.py +19 -15
  36. tests/test_fips_photon.py +6 -3
  37. tests/test_module_imports.py +44 -0
  38. tests/test_pyversions_runtime.py +177 -0
  39. tests/test_relocate.py +45 -39
  40. tests/test_relocate_module.py +257 -0
  41. tests/test_runtime.py +1802 -6
  42. tests/test_verify_build.py +477 -34
  43. relenv/build/common.py +0 -1707
  44. relenv-0.21.2.dist-info/RECORD +0 -35
  45. {relenv-0.21.2.dist-info → relenv-0.22.0.dist-info}/WHEEL +0 -0
  46. {relenv-0.21.2.dist-info → relenv-0.22.0.dist-info}/entry_points.txt +0 -0
  47. {relenv-0.21.2.dist-info → relenv-0.22.0.dist-info}/licenses/LICENSE.md +0 -0
  48. {relenv-0.21.2.dist-info → relenv-0.22.0.dist-info}/licenses/NOTICE +0 -0
  49. {relenv-0.21.2.dist-info → relenv-0.22.0.dist-info}/top_level.txt +0 -0
relenv/create.py CHANGED
@@ -1,20 +1,33 @@
1
1
  # Copyright 2022-2025 Broadcom.
2
- # SPDX-License-Identifier: Apache-2
2
+ # SPDX-License-Identifier: Apache-2.0
3
3
  """
4
4
  The ``relenv create`` command.
5
5
  """
6
6
 
7
+ from __future__ import annotations
8
+
9
+ import argparse
7
10
  import contextlib
8
11
  import os
9
12
  import pathlib
13
+ import shutil
10
14
  import sys
11
15
  import tarfile
16
+ from collections.abc import Iterator
12
17
 
13
- from .common import RelenvException, arches, archived_build, build_arch
18
+ from .common import (
19
+ RelenvException,
20
+ arches,
21
+ archived_build,
22
+ build_arch,
23
+ format_shebang,
24
+ relative_interpreter,
25
+ )
26
+ from .pyversions import Version, python_versions
14
27
 
15
28
 
16
29
  @contextlib.contextmanager
17
- def chdir(path):
30
+ def chdir(path: str | os.PathLike[str]) -> Iterator[None]:
18
31
  """
19
32
  Context manager that changes to the specified directory and back.
20
33
 
@@ -35,7 +48,9 @@ class CreateException(RelenvException):
35
48
  """
36
49
 
37
50
 
38
- def setup_parser(subparsers):
51
+ def setup_parser(
52
+ subparsers: argparse._SubParsersAction[argparse.ArgumentParser],
53
+ ) -> None:
39
54
  """
40
55
  Setup the subparser for the ``create`` command.
41
56
 
@@ -66,7 +81,12 @@ def setup_parser(subparsers):
66
81
  )
67
82
 
68
83
 
69
- def create(name, dest=None, arch=None, version=None):
84
+ def create(
85
+ name: str,
86
+ dest: str | os.PathLike[str] | None = None,
87
+ arch: str | None = None,
88
+ version: str | None = None,
89
+ ) -> None:
70
90
  """
71
91
  Create a relenv environment.
72
92
 
@@ -122,9 +142,105 @@ def create(name, dest=None, arch=None, version=None):
122
142
  with tarfile.open(tar, "r:xz") as fp:
123
143
  for f in fp:
124
144
  fp.extract(f, writeto)
145
+ _sync_relenv_package(writeto, version)
146
+ _repair_script_shebangs(writeto, version)
147
+
148
+
149
+ def _site_packages_dir(root: pathlib.Path, version: str) -> pathlib.Path:
150
+ """
151
+ Return the site-packages directory within the created environment.
152
+ """
153
+ major_minor = ".".join(version.split(".")[:2])
154
+ if sys.platform == "win32":
155
+ return root / "Lib" / "site-packages"
156
+ return root / "lib" / f"python{major_minor}" / "site-packages"
157
+
158
+
159
+ def _sync_relenv_package(root: pathlib.Path, version: str) -> None:
160
+ """
161
+ Ensure the relenv package within the created environment matches this CLI.
162
+ """
163
+ target_site = _site_packages_dir(root, version)
164
+ if not target_site.exists():
165
+ return
166
+ target = target_site / "relenv"
167
+ source = pathlib.Path(__file__).resolve().parent
168
+ if target.exists():
169
+ shutil.rmtree(target)
170
+ shutil.copytree(
171
+ source,
172
+ target,
173
+ dirs_exist_ok=True,
174
+ ignore=shutil.ignore_patterns("__pycache__", "*.pyc", "*.pyo"),
175
+ )
176
+
177
+
178
+ def _repair_script_shebangs(root: pathlib.Path, version: str) -> None:
179
+ """
180
+ Update legacy shell-wrapped entry points to the current shebang format.
125
181
 
182
+ Older archives shipped scripts that started with the ``"true" ''''`` preamble.
183
+ Those files break when executed directly under Python (the parser sees the
184
+ unmatched triple-quoted literal). Patch any remaining copies to the new
185
+ `format_shebang` layout so fresh installs do not inherit stale loaders.
186
+ """
187
+ if sys.platform == "win32":
188
+ return
189
+
190
+ scripts_dir = root / "bin"
191
+ if not scripts_dir.is_dir():
192
+ return
193
+
194
+ major_minor = ".".join(version.split(".")[:2])
195
+ interpreter_candidates = [
196
+ scripts_dir / f"python{major_minor}",
197
+ scripts_dir / f"python{major_minor.split('.')[0]}",
198
+ scripts_dir / "python3",
199
+ scripts_dir / "python",
200
+ ]
201
+ interpreter_path: pathlib.Path | None = None
202
+ for candidate in interpreter_candidates:
203
+ if candidate.exists():
204
+ interpreter_path = candidate
205
+ break
206
+ if interpreter_path is None:
207
+ return
208
+
209
+ try:
210
+ rel_interpreter = relative_interpreter(root, scripts_dir, interpreter_path)
211
+ except ValueError:
212
+ # Paths are not relative to the install root; abandon the rewrite.
213
+ return
214
+
215
+ try:
216
+ shebang = format_shebang(str(pathlib.PurePosixPath("/") / rel_interpreter))
217
+ except Exception:
218
+ return
126
219
 
127
- def main(args):
220
+ legacy_prefix = "#!/bin/sh\n\"true\" ''''\n"
221
+ marker = "\n'''"
222
+ for script in scripts_dir.iterdir():
223
+ if not script.is_file():
224
+ continue
225
+ try:
226
+ text = script.read_text(encoding="utf-8")
227
+ except (OSError, UnicodeDecodeError):
228
+ continue
229
+ if not text.startswith(legacy_prefix):
230
+ continue
231
+ idx = text.find(marker)
232
+ if idx == -1:
233
+ continue
234
+ idy = idx + len(marker)
235
+ rest = text[idy:]
236
+ updated = shebang + rest.lstrip("\n")
237
+ try:
238
+ script.write_text(updated, encoding="utf-8")
239
+ except OSError:
240
+ continue
241
+
242
+
243
+ def main(args: argparse.Namespace) -> None:
128
244
  """
129
245
  The entrypoint into the ``relenv create`` command.
130
246
 
@@ -136,8 +252,32 @@ def main(args):
136
252
  print(
137
253
  "Warning: Cross compilation support is experimental and is not fully tested or working!"
138
254
  )
255
+
256
+ # Resolve version (support minor version like "3.12" or full version like "3.12.7")
257
+ requested = Version(args.python)
258
+
259
+ if requested.micro:
260
+ # Full version specified (e.g., "3.12.7")
261
+ pyversions = python_versions()
262
+ if requested not in pyversions:
263
+ print(f"Unknown version {requested}")
264
+ strversions = "\n".join([str(_) for _ in pyversions])
265
+ print(f"Known versions are:\n{strversions}")
266
+ sys.exit(1)
267
+ create_version = requested
268
+ else:
269
+ # Minor version specified (e.g., "3.12"), resolve to latest
270
+ pyversions = python_versions(args.python)
271
+ if not pyversions:
272
+ print(f"Unknown minor version {requested}")
273
+ all_versions = python_versions()
274
+ strversions = "\n".join([str(_) for _ in all_versions])
275
+ print(f"Known versions are:\n{strversions}")
276
+ sys.exit(1)
277
+ create_version = sorted(list(pyversions.keys()))[-1]
278
+
139
279
  try:
140
- create(name, arch=args.arch, version=args.python)
280
+ create(name, arch=args.arch, version=str(create_version))
141
281
  except CreateException as exc:
142
282
  print(exc)
143
283
  sys.exit(1)
relenv/fetch.py CHANGED
@@ -1,11 +1,16 @@
1
1
  # Copyright 2022-2025 Broadcom.
2
- # SPDX-License-Identifier: Apache-2
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ # mypy: ignore-errors
3
4
  """
4
5
  The ``relenv fetch`` command.
5
6
  """
6
7
 
8
+ from __future__ import annotations
9
+
10
+ import argparse
7
11
  import os
8
12
  import sys
13
+ from collections.abc import Sequence
9
14
 
10
15
  from .build import platform_module
11
16
  from .common import (
@@ -21,7 +26,9 @@ from .common import (
21
26
  )
22
27
 
23
28
 
24
- def setup_parser(subparsers):
29
+ def setup_parser(
30
+ subparsers: argparse._SubParsersAction[argparse.ArgumentParser],
31
+ ) -> None:
25
32
  """
26
33
  Setup the subparser for the ``fetch`` command.
27
34
 
@@ -46,7 +53,12 @@ def setup_parser(subparsers):
46
53
  )
47
54
 
48
55
 
49
- def fetch(version, triplet, python, check_hosts=CHECK_HOSTS):
56
+ def fetch(
57
+ version: str,
58
+ triplet: str,
59
+ python: str,
60
+ check_hosts: Sequence[str] = CHECK_HOSTS,
61
+ ) -> None:
50
62
  """
51
63
  Fetch the specified python build.
52
64
  """
@@ -66,7 +78,7 @@ def fetch(version, triplet, python, check_hosts=CHECK_HOSTS):
66
78
  download_url(url, builddir)
67
79
 
68
80
 
69
- def main(args):
81
+ def main(args: argparse.Namespace) -> None:
70
82
  """
71
83
  The entrypoint into the ``relenv fetch`` command.
72
84
 
relenv/manifest.py CHANGED
@@ -1,25 +1,33 @@
1
- # Copyright 2025 Broadcom.
1
+ # Copyright 2022-2025 Broadcom.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  """
5
5
  Relenv manifest.
6
6
  """
7
+ from __future__ import annotations
8
+
7
9
  import hashlib
8
10
  import os
11
+ import pathlib
9
12
  import sys
10
13
 
11
14
 
12
- def manifest(root=None):
15
+ def manifest(root: str | os.PathLike[str] | None = None) -> None:
13
16
  """
14
17
  List all the file in a relenv and their hashes.
15
18
  """
16
- if root is None:
17
- root = getattr(sys, "RELENV", os.getcwd())
18
- for root, dirs, files in os.walk(root):
19
+ base = (
20
+ pathlib.Path(root)
21
+ if root is not None
22
+ else pathlib.Path(getattr(sys, "RELENV", os.getcwd()))
23
+ )
24
+ for dirpath, _dirs, files in os.walk(base):
25
+ directory = pathlib.Path(dirpath)
19
26
  for file in files:
20
27
  hsh = hashlib.sha256()
28
+ file_path = directory / file
21
29
  try:
22
- with open(root + os.path.sep + file, "rb") as fp:
30
+ with open(file_path, "rb") as fp:
23
31
  while True:
24
32
  chunk = fp.read(9062)
25
33
  if not chunk:
@@ -27,7 +35,7 @@ def manifest(root=None):
27
35
  hsh.update(chunk)
28
36
  except OSError:
29
37
  pass
30
- print(f"{root + os.path.sep + file} => {hsh.hexdigest()}")
38
+ print(f"{file_path} => {hsh.hexdigest()}")
31
39
 
32
40
 
33
41
  if __name__ == "__main__":
@@ -0,0 +1,329 @@
1
+ {
2
+ "python": {
3
+ "3.13.7": "dc08d8b8154ff9e132c1db5d089079136273dc90",
4
+ "3.13.6": "6e69138f7e2e95244f7780ba3d5664dda80551e7",
5
+ "3.13.5": "dbf3aed444cbb2221eabfb52688aa371423aa0ba",
6
+ "3.13.4": "c288ab7716f3633f8927a5fe75f46d65cb712415",
7
+ "3.13.3": "f26085cf12daef7b60b8a6fe93ef988b9a094aea",
8
+ "3.13.2": "e4949d999f28d6ad941e766b7dac09a74efbc912",
9
+ "3.13.1": "4b0c2a49a848c3c5d611416099636262a0b9090f",
10
+ "3.13.0": "0f71dce4a3251460985a944bbd1d1b7db1660a91",
11
+ "3.12.11": "603f20426ba4942552a38493bb987c9b832ee321",
12
+ "3.12.10": "7dbdb09971278d93d387f2e045ee04c83d9f7bfa",
13
+ "3.12.9": "465d8a664e63dc5aa1f0d90cd1d0000a970ee2fb",
14
+ "3.12.8": "8872c7a124c6970833e0bde4f25d6d7d61c6af6e",
15
+ "3.12.7": "5a760bbc42c67f1a0aef5bcf7c329348fb88448b",
16
+ "3.12.6": "6d2bbe1603b01764c541608938766233bf56f780",
17
+ "3.12.5": "d9b83c17a717e1cbd3ab6bd14cfe3e508e6d87b2",
18
+ "3.12.4": "c221421f3ba734daaf013dbdc7b48aa725cea18e",
19
+ "3.12.3": "3df73004a9b224d021fd397724e8bd4f9b6cc824",
20
+ "3.12.2": "040eac171c17062253042f7faafea830b03bf07b",
21
+ "3.12.1": "5b11c58ea58cd6b8e1943c7e9b5f6e0997ca3632",
22
+ "3.12.0": "bb2792439baa2014f11652f3ce44d354d0d59a76",
23
+ "3.11.13": "fec9a494efd3520f7efe6f822111f22249549d0a",
24
+ "3.11.12": "85370474d7d0268c46ba5cf0d1473e3d06c17dd6",
25
+ "3.11.11": "acf539109b024d3c5f1fc63d6e7f08cd294ba56d",
26
+ "3.11.10": "eb0ee5c84407445809a556592008cfc1867a39bc",
27
+ "3.11.9": "926cd6a577b2e8dcbb17671b30eda04019328ada",
28
+ "3.11.8": "a368aeed7a3325e47b55168452c356a8eb27ab50",
29
+ "3.11.7": "f2534d591121f3845388fbdd6a121b96dfe305a6",
30
+ "3.11.6": "932f9833ee6d70a530a21d7c12c490a42c8b1574",
31
+ "3.11.5": "b13ec58fa6ebf5b0f7178555c5506e135cb7d785",
32
+ "3.11.4": "413b3715d919a7b473281529ab91eeea5c82e632",
33
+ "3.11.3": "baea3ce79cf35e53b4155a5f700516abcd14f49d",
34
+ "3.11.2": "ae1c199ecb7a969588b15354e19e7b60cb65d1b9",
35
+ "3.11.1": "89ee31611b73dc0c32c178d15aa208734b462c5a",
36
+ "3.11.0": "474838615eab658fc15c87d4bee6bf85a02b424d",
37
+ "3.10.18": "2b59becca67037125c08a82519beccfdb98a48cc",
38
+ "3.10.17": "d31d548cd2c5ca2ae713bebe346ba15e8406633a",
39
+ "3.10.16": "401e6a504a956c8f0aab76c4f3ad9df601a83eb1",
40
+ "3.10.15": "f498fd8921e3c37e6aded9acb11ed23c8daa0bbe",
41
+ "3.10.14": "9103b4716dff30b40fd0239982f3a2d851143a46",
42
+ "3.10.13": "fa66c061cba1acee5e9fe69b7d22cca744a6ecda",
43
+ "3.10.12": "85e043a6cd30835bdf95e3db2d1b4b15e142d067",
44
+ "3.10.11": "53eddc7bf687c4678dc594b2dc74126b48a4fa29",
45
+ "3.10.10": "5d250cd5d492df838a4d5279df40a90ace720b0c",
46
+ "3.10.9": "a6ab44fa6c7dc31506ee262b2f6ad10735ffe750",
47
+ "3.10.8": "49ca7a5be7f13375e863442fbd9ead893ace3238",
48
+ "3.10.7": "e1d4c71059170ba841af310a04e0b4d7c38cb844",
49
+ "3.10.6": "b5a3c74b281ab2e8e56779bbb9aeead1d92fed02",
50
+ "3.10.5": "b80b9c13bb6ba5eb8762ca0d2b888c404582a405",
51
+ "3.10.4": "8f684863b92bf43936b16dbb867e392f10e8ffc7",
52
+ "3.10.3": "5cd4ef548b1649a9a4fd78f5b7c5a86acdbd5001",
53
+ "3.10.2": "e618946549cca1eb0d6d4cdf516003fec3975003",
54
+ "3.10.1": "1a534e99b95db0d30dacc8f10418cc5758b04df7",
55
+ "3.10.0": "c6114b411b7e6d26fc9887c11c0800d9625f1ade",
56
+ "3.9.23": "73d07237b70b19e4cd530bbc204cccd668ec05d4",
57
+ "3.9.22": "898d81887f0f36f2a71677b657d8400fd526fd55",
58
+ "3.9.21": "d968a953f19c6fc3bf54b5ded5c06852197ebddc",
59
+ "3.9.20": "52902dd820d2d41c47ef927ecebb24a96a51cc4b",
60
+ "3.9.19": "57d08ec0b329a78923b486abae906d4fa12fadb7",
61
+ "3.9.18": "abe4a20dcc11798495b17611ef9f8f33d6975722",
62
+ "3.9.17": "34a6d24cef87fbf22b943d4fe22100a9bf0b3782",
63
+ "3.9.16": "19acd6a341e4f2d7ff97c10c2eada258e9898624",
64
+ "3.9.15": "0ffa1114d627ddb4f61f3041880e43b478552883",
65
+ "3.9.14": "fa48bd60aee6abf2d41aafb273ebf9fb6b790458",
66
+ "3.9.13": "d57e5c8b94fe42e2b403e6eced02b25ed47ca8da",
67
+ "3.9.12": "8c2e3a45febf695cbb4d1f02dc1e9d84c5224e52",
68
+ "3.9.11": "10af2f3c3b5fb4f7247d43d176ffc8ef448b31c9",
69
+ "3.9.10": "936fc25ac4e1b482a0cefa82dd6092a0c6b575e6",
70
+ "3.9.9": "6274e5631c520d75bf1f0a046640fd3996fe99f0",
71
+ "3.9.8": "8113655a4341a1008fe7388cbdf24aa9c7c6ae20",
72
+ "3.9.7": "5208c1d1e0e859f42a9bdbb110efd0855ec4ecf1",
73
+ "3.9.6": "05826c93a178872958f6685094ee3514e53ba653",
74
+ "3.9.5": "edc80e5e33fc3d3fae53e6b95ae4ca9277809b9b",
75
+ "3.9.4": "cfaa95ec3a15994b04c9c7ef1df1319056427e8d",
76
+ "3.9.2": "110ca5bca7989f9558a54ee6762e6774a4b9644a",
77
+ "3.9.1": "77f4105846f6740297e50d7535a42c02d6b8e7db",
78
+ "3.9.0": "ff1fc8c37d5d4b09ec3bf0d84f3e5b97745c6704",
79
+ "3.8.20": "88832fd164f0a7d1d0f4677b06960bb5ff15ff1d",
80
+ "3.8.19": "eaadca9b5f89767b83c89266049042902681d029",
81
+ "3.8.18": "4c5b3bdbfd5e899972d3ee06375fd96fe664dfe3",
82
+ "3.8.17": "7bf662823ba44b56bbc1c4f3f802c0cdf3fbbfe5",
83
+ "3.8.16": "006869b0011174fc0ce695c454010c21637b09bf",
84
+ "3.8.15": "8fe5b42bc09df600d0cec750415b27f7802ae5e4",
85
+ "3.8.14": "dced5c6d2a402eb79dddf3346210db23990b1ad0",
86
+ "3.8.13": "fb46587353f092d91caeddb07f82bb66a5115468",
87
+ "3.8.12": "7643eccc15f5606bd0dc04affc7ea901e417165d",
88
+ "3.8.11": "1561060627fd171de19c53eb374cd92d2f297bff",
89
+ "3.8.10": "f6579351d42a81c77b55aa4ca8b1280b4f5b37f9",
90
+ "3.8.9": "ea40651135adc4126a60a45093d100722610f4de",
91
+ "3.8.8": "d7dd8ef51ebe7ddd8ec41e39a607ac26d1834a8f",
92
+ "3.8.7": "1b1525811ea4bcf237622e5f1751a4dfc429e3a3",
93
+ "3.8.6": "6ee446eaacf901a3305565bd6569e2de135168e3",
94
+ "3.8.5": "68d6c7f948801cc755905162f5ee7589595edee4",
95
+ "3.8.4": "996c56496f4ddd8f18f388a3bd584b74d2b43928",
96
+ "3.8.3": "3bafa40df1cd069c112761c388a9f2e94b5d33dd",
97
+ "3.8.2": "5ae54baf26628a7ed74206650a31192e6d5c6f93",
98
+ "3.8.1": "a48fd28a037c0bcd7b7fc4d914c023f584e910ed",
99
+ "3.8.0": "7720e0384558c598107cf046c48165fd7e1f5b2c",
100
+ "3.7.17": "7a08649e47214de75a6ecec91260286fdd94daf5",
101
+ "3.7.16": "0cc857e03dbc91971190d170df48e4a64ce8941a",
102
+ "3.7.15": "5ed83fdc6d4705090bd39d4b9f5424e37aac780d",
103
+ "3.7.14": "86d51dea42675ccfe4a9d8d41e87c33757e91c64",
104
+ "3.7.13": "2dfb44e36bfb9d93894fd9051952190441da47db",
105
+ "3.7.12": "ea7ed19e3a7cb3867e32c602e25da0b2689a3e31",
106
+ "3.7.11": "671e3fed4f3bb5a6663da0ae6691f0f8e9399427",
107
+ "3.7.10": "847305e6b25f83b80096314fdfdfa7a8cc07016e",
108
+ "3.7.9": "e1de02779a89a94000c0ed340ec126de25825f2f",
109
+ "3.7.8": "ecfc1d291ab35bb7cc3a352dd9451450266f5974",
110
+ "3.7.7": "7b6f9eec148c583a22a0666fe8eb5ec963ac57c4",
111
+ "3.7.6": "93e76be2d874b6ad0abd57c15bab8debc211226a",
112
+ "3.7.5": "860f88886809ae8bfc86afa462536811c347a2a1",
113
+ "3.7.4": "a862c5a58626fdad02d2047a57771ede2783fcef",
114
+ "3.7.3": "e3584650a06ae2765da0678176deae9d133f1b3d",
115
+ "3.7.2": "c3dc6928516bcb934cf4740461044c79c7c35494",
116
+ "3.7.1": "da290d6d24c68faeba502251cba111a1c8a5a9b2",
117
+ "3.7.0": "653cffa5b9f2a28150afe4705600d2e55d89b564",
118
+ "3.6.15": "fc7c36957c2cd228cc217bb5df4f580f1fdcd602",
119
+ "3.6.14": "980845d74f9ca6a57999ac90c2ddb1fdffb7933a",
120
+ "3.6.13": "4fa72f749446e907a5b80c0ae47ab03d890f14c8",
121
+ "3.6.12": "e6a28b1ab47f079a659e24a40e4c416f52828682",
122
+ "3.6.11": "0840e6b726446fccaef483dad84cce8fdc683077",
123
+ "3.6.10": "781072e4726ff0c6dc9370dbfb9dd781d87987dc",
124
+ "3.6.9": "3cd8b0e814b753fcce4fdf7edc823d8fb0da9208",
125
+ "3.6.8": "ee55acedef049268307633cbc9c7ff0610d1244f",
126
+ "3.6.7": "dd2b0a8bf9b9617c57a0070b53065286c2142994",
127
+ "3.6.6": "5731cf379838023fc8c55491b4068c4404d0e34f",
128
+ "3.6.5": "5a7a833a36f1006257d298787f4c38493c5d1689",
129
+ "3.6.4": "36a90695cda9298a0663e667c12909246c358851",
130
+ "3.6.3": "6c71b14bdbc4d8aa0cfd59d4b6dc356d46abfdf5",
131
+ "3.6.2": "4f92a045de9231b93dfbed50c66bb12cf03ac59a",
132
+ "3.6.1": "91d880a2a9fcfc6753cbfa132bf47a47e17e7b16",
133
+ "3.6.0": "18ebf7d726782967d967dc00e3aa08b334fbdd5c",
134
+ "3.5.10": "25c31d42fb8f8755de9358a53816ce4567b6bca9",
135
+ "3.5.9": "4b62a14d8821e5761ef6b76876f45b50b85caa95",
136
+ "3.5.8": "10d313aeb7f58e464528aa1b1f0104175841ca4d",
137
+ "3.5.7": "743044e357e96ed8e49d709b502f1a9b815be763",
138
+ "3.5.6": "05548da58ec75a7af316c4a4cb8fc667ac6ac8f9",
139
+ "3.5.5": "66c4cfc0f64b545ee5a7725f26a2fd834cdf1682",
140
+ "3.5.4": "4aacbd09ca6988255de84a98ab9e4630f584efba",
141
+ "3.5.3": "127121fdca11e735b3686e300d66f73aba663e93",
142
+ "3.5.2": "4843aabacec5bc0cdd3e1f778faa926e532794d2",
143
+ "3.5.1": "0186da436db76776196612b98bb9c2f76acfe90e",
144
+ "3.5.0": "871a06df9ab70984b7398ac53047fe125c757a70",
145
+ "3.4.10": "68fe143c56d438343d4142a4953d607124e85ca2",
146
+ "3.4.9": "83ea4018f6e5f1db87c4e54c8a48ba6a8350abd4",
147
+ "3.4.8": "65d62d3f62ade072a84eb64eca4490b940c73542",
148
+ "3.4.7": "7b05bf099f3f311ba568232d0d03d64e67da9908",
149
+ "3.4.6": "ef7dbec63d45760701534990511d686e3acbbe4f",
150
+ "3.4.5": "882e83e0286b253ee651aa3f9a5d27ebc46e6632",
151
+ "3.4.4": "0e4c9265a2ab0004ac51f0010d47c22ef4c1640c",
152
+ "3.4.3": "7ca5cd664598bea96eec105aa6453223bb6b4456",
153
+ "3.4.2": "0727d8a8498733baabe6f51632b9bab0cbaa9ada",
154
+ "3.4.1": "143e098efe7ee7bec8a4904ec4b322f28a067a03",
155
+ "3.4.0": "f54d7cf6af5dbd9bddbe31cf4772f39711381dbe",
156
+ "3.3.7": "efb00940efd558b9350a79fd9fd70551cdb35b20",
157
+ "3.3.6": "0a86ae9e877467a62faed7ece208c0d6899b0991",
158
+ "3.3.5": "6683b26dd2cfd23af852abfcf1aedf25bbd44839",
159
+ "3.3.4": "2c9586eeb4b6e45e9ebc28372c0856c709d9a522",
160
+ "3.3.3": "af4e75a34bd538c79b9871227c2e7f56569ac107",
161
+ "3.3.2": "87009d0c156c6e1354dfec5c98c328cae93950ad",
162
+ "3.3.1": "393d7302c48bc911cd7faa7fa9b5fbcb9919bddc",
163
+ "3.3.0": "833d73565e1b665f1878504081dc985a5a06e46a",
164
+ "3.2.6": "3fb8bf10e4df50629efd747adbc324e0084df9bb",
165
+ "3.2.5": "616516c707e81f6e498e83b50a2b0f41b9dd3fe1",
166
+ "3.2.4": "d5788113afaf9425d5c15f1a4b76f731553ec040",
167
+ "3.2.3": "3d607dbcfdf100dd659978195ccf3ade9d221823",
168
+ "3.2.2": "5e654dbd48476193ccdef4d604ed4f45b48c6769",
169
+ "3.2.1": "ab5cf4a4c21abe590dea87473a1dee6820699d79",
170
+ "3.2.0": "55a3a9d39f31563370d0c494373bb6d38e4d1a00",
171
+ "3.1.5": "3fa78edeefd892a50b5f41bab018b51ecad0b56f",
172
+ "3.1.4": "e5767a4fc92433816451de75c8721f2e1a81f6ea",
173
+ "3.1.3": "eadb89fa63194167c6a80d49617d79491b21857b",
174
+ "3.1.2": "130186b84e8bafce7f25dccdd6f9ab4929f5f474",
175
+ "3.1.1": "499d77bc67f739880663f3aeab67dd973344a3dd",
176
+ "3.1.0": "8590b685654367e3eba70dc00df7e45e88c21da4",
177
+ "3.0.1": "9cde3918c0449f59e90b2e71f46a734ee84ae81e",
178
+ "3.0.0": "c002b8ed67d9df8aaf9a391b3cfcd442dcff3334",
179
+ "3.13.8": "00cb0597d6559f79ca24e1abf902aed81e6a13b3",
180
+ "3.12.12": "dbe6dc34a132b1035c121583a9f37ba87458d0f5",
181
+ "3.11.14": "dd6254e3a92978cb506e6303d1bb0db4dfff5b7f",
182
+ "3.10.19": "a5606a32a67421dc62dd0f5b6d00d35c93bbdae4",
183
+ "3.9.24": "32438f848084bf03a25d8514c9a396582f66e7be"
184
+ },
185
+ "dependencies": {
186
+ "openssl": {
187
+ "3.5.4": {
188
+ "url": "https://github.com/openssl/openssl/releases/download/openssl-{version}/openssl-{version}.tar.gz",
189
+ "sha256": "",
190
+ "platforms": [
191
+ "linux",
192
+ "darwin"
193
+ ]
194
+ },
195
+ "3.6.0": {
196
+ "url": "https://github.com/openssl/openssl/releases/download/openssl-{version}/openssl-{version}.tar.gz",
197
+ "sha256": "b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9",
198
+ "platforms": [
199
+ "linux",
200
+ "darwin"
201
+ ]
202
+ }
203
+ },
204
+ "sqlite": {
205
+ "3.50.4.0": {
206
+ "url": "https://sqlite.org/2025/sqlite-autoconf-{version}.tar.gz",
207
+ "sha256": "a3db587a1b92ee5ddac2f66b3edb41b26f9c867275782d46c3a088977d6a5b18",
208
+ "sqliteversion": "3500400",
209
+ "platforms": [
210
+ "linux",
211
+ "darwin",
212
+ "win32"
213
+ ]
214
+ }
215
+ },
216
+ "xz": {
217
+ "5.8.1": {
218
+ "url": "http://tukaani.org/xz/xz-{version}.tar.gz",
219
+ "sha256": "507825b599356c10dca1cd720c9d0d0c9d5400b9de300af00e4d1ea150795543",
220
+ "platforms": [
221
+ "linux",
222
+ "darwin"
223
+ ]
224
+ }
225
+ },
226
+ "libffi": {
227
+ "3.5.2": {
228
+ "url": "https://github.com/libffi/libffi/releases/download/v{version}/libffi-{version}.tar.gz",
229
+ "sha256": "f3a3082a23b37c293a4fcd1053147b371f2ff91fa7ea1b2a52e335676bac82dc",
230
+ "platforms": [
231
+ "linux"
232
+ ]
233
+ }
234
+ },
235
+ "zlib": {
236
+ "1.3.1": {
237
+ "url": "https://zlib.net/fossils/zlib-{version}.tar.gz",
238
+ "sha256": "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23",
239
+ "platforms": [
240
+ "linux"
241
+ ]
242
+ }
243
+ },
244
+ "ncurses": {
245
+ "6.5": {
246
+ "url": "https://mirrors.ocf.berkeley.edu/gnu/ncurses/ncurses-{version}.tar.gz",
247
+ "sha256": "136d91bc269a9a5785e5f9e980bc76ab57428f604ce3e5a5a90cebc767971cc6",
248
+ "platforms": [
249
+ "linux"
250
+ ]
251
+ }
252
+ },
253
+ "readline": {
254
+ "8.3": {
255
+ "url": "https://mirrors.ocf.berkeley.edu/gnu/readline/readline-{version}.tar.gz",
256
+ "sha256": "fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc",
257
+ "platforms": [
258
+ "linux"
259
+ ]
260
+ }
261
+ },
262
+ "gdbm": {
263
+ "1.26": {
264
+ "url": "https://mirrors.ocf.berkeley.edu/gnu/gdbm/gdbm-{version}.tar.gz",
265
+ "sha256": "6a24504a14de4a744103dcb936be976df6fbe88ccff26065e54c1c47946f4a5e",
266
+ "platforms": [
267
+ "linux"
268
+ ]
269
+ }
270
+ },
271
+ "libxcrypt": {
272
+ "4.4.38": {
273
+ "url": "https://github.com/besser82/libxcrypt/releases/download/v{version}/libxcrypt-{version}.tar.xz",
274
+ "sha256": "80304b9c306ea799327f01d9a7549bdb28317789182631f1b54f4511b4206dd6",
275
+ "platforms": [
276
+ "linux"
277
+ ]
278
+ }
279
+ },
280
+ "krb5": {
281
+ "1.22": {
282
+ "url": "https://kerberos.org/dist/krb5/{version}/krb5-{version}.tar.gz",
283
+ "sha256": "652be617b4647f3c5dcac21547d47c7097101aad4e306f1778fb48e17b220ba3",
284
+ "platforms": [
285
+ "linux"
286
+ ]
287
+ }
288
+ },
289
+ "bzip2": {
290
+ "1.0.8": {
291
+ "url": "https://sourceware.org/pub/bzip2/bzip2-{version}.tar.gz",
292
+ "sha256": "ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269",
293
+ "platforms": [
294
+ "linux",
295
+ "darwin"
296
+ ]
297
+ }
298
+ },
299
+ "uuid": {
300
+ "1.0.3": {
301
+ "url": "https://sourceforge.net/projects/libuuid/files/libuuid-{version}.tar.gz",
302
+ "sha256": "46af3275291091009ad7f1b899de3d0cea0252737550e7919d17237997db5644",
303
+ "platforms": [
304
+ "linux"
305
+ ]
306
+ }
307
+ },
308
+ "tirpc": {
309
+ "1.3.7": {
310
+ "url": "https://sourceforge.net/projects/libtirpc/files/libtirpc-{version}.tar.bz2",
311
+ "sha256": "b47d3ac19d3549e54a05d0019a6c400674da716123858cfdb6d3bdd70a66c702",
312
+ "platforms": [
313
+ "linux"
314
+ ]
315
+ }
316
+ },
317
+ "expat": {
318
+ "2.7.3": {
319
+ "url": "https://github.com/libexpat/libexpat/releases/download/R_2_7_3/expat-2.7.3.tar.xz",
320
+ "sha256": "71df8f40706a7bb0a80a5367079ea75d91da4f8c65c58ec59bcdfbf7decdab9f",
321
+ "platforms": [
322
+ "linux",
323
+ "darwin",
324
+ "win32"
325
+ ]
326
+ }
327
+ }
328
+ }
329
+ }