portable-python 1.10.2__py3-none-any.whl → 2.0.1__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.
- portable_python/__init__.py +10 -4
- portable_python/config.py +1 -1
- portable_python/cpython.py +30 -3
- portable_python/external/__init__.py +1 -0
- portable_python/external/_inspect.py +1 -0
- portable_python/external/xcpython.py +101 -8
- portable_python/external/xtkinter.py +6 -1
- portable_python/inspector.py +1 -1
- portable_python/versions.py +4 -4
- {portable_python-1.10.2.dist-info → portable_python-2.0.1.dist-info}/METADATA +70 -28
- portable_python-2.0.1.dist-info/RECORD +20 -0
- {portable_python-1.10.2.dist-info → portable_python-2.0.1.dist-info}/WHEEL +1 -1
- portable_python-2.0.1.dist-info/scm_file_list.json +93 -0
- portable_python-2.0.1.dist-info/scm_version.json +8 -0
- portable_python-1.10.2.dist-info/RECORD +0 -18
- {portable_python-1.10.2.dist-info → portable_python-2.0.1.dist-info}/entry_points.txt +0 -0
- {portable_python-1.10.2.dist-info → portable_python-2.0.1.dist-info}/licenses/LICENSE +0 -0
- {portable_python-1.10.2.dist-info → portable_python-2.0.1.dist-info}/top_level.txt +0 -0
portable_python/__init__.py
CHANGED
|
@@ -222,7 +222,9 @@ class BuildSetup:
|
|
|
222
222
|
runez.abort("Please provide full desired version: %s is not good enough" % runez.red(python_spec))
|
|
223
223
|
|
|
224
224
|
self.python_spec = python_spec
|
|
225
|
-
self.folders = PPG.get_folders(
|
|
225
|
+
self.folders = PPG.get_folders(
|
|
226
|
+
base=os.getcwd(), family=python_spec.family, version=python_spec.version, abi_suffix=python_spec.abi_suffix
|
|
227
|
+
)
|
|
226
228
|
self.desired_modules = modules
|
|
227
229
|
prefix = self.folders.formatted(prefix)
|
|
228
230
|
self.prefix = prefix
|
|
@@ -237,7 +239,9 @@ class BuildSetup:
|
|
|
237
239
|
self.tarball_name = PPG.target.composed_basename(dest, extension=ext)
|
|
238
240
|
|
|
239
241
|
else:
|
|
240
|
-
self.tarball_name = PPG.target.composed_basename(
|
|
242
|
+
self.tarball_name = PPG.target.composed_basename(
|
|
243
|
+
python_spec.family, python_spec.version, abi_suffix=python_spec.abi_suffix, extension=ext
|
|
244
|
+
)
|
|
241
245
|
|
|
242
246
|
builder = PPG.family(python_spec.family).get_builder()
|
|
243
247
|
self.python_builder = builder(self) # type: PythonBuilder
|
|
@@ -605,10 +609,12 @@ class ModuleBuilder:
|
|
|
605
609
|
|
|
606
610
|
def run_make(self, *args, program="make", cpu_count=None):
|
|
607
611
|
cmd = program.split()
|
|
608
|
-
if cpu_count
|
|
612
|
+
if cpu_count is None:
|
|
609
613
|
available = multiprocessing.cpu_count()
|
|
614
|
+
# If we can't retrieve the number of cores, leave cpu_count as None
|
|
615
|
+
# and we'll omit -j below.
|
|
610
616
|
if available and available > 0:
|
|
611
|
-
cpu_count
|
|
617
|
+
cpu_count = available
|
|
612
618
|
|
|
613
619
|
if cpu_count and cpu_count > 1:
|
|
614
620
|
cmd.append("-j%s" % cpu_count)
|
portable_python/config.py
CHANGED
portable_python/cpython.py
CHANGED
|
@@ -8,7 +8,7 @@ import yaml
|
|
|
8
8
|
from runez.pyenv import Version
|
|
9
9
|
|
|
10
10
|
from portable_python import LOG, patch_file, patch_folder, PPG, PythonBuilder
|
|
11
|
-
from portable_python.external.xcpython import Bdb, Bzip2, Gdbm, LibFFI, Openssl, Readline, Sqlite, Uuid, Xz, Zlib
|
|
11
|
+
from portable_python.external.xcpython import Bdb, Bzip2, Gdbm, LibFFI, Mpdec, Openssl, Readline, Sqlite, Uuid, Xz, Zlib, Zstd
|
|
12
12
|
from portable_python.external.xtkinter import TkInter
|
|
13
13
|
from portable_python.inspector import LibAutoCorrect, PythonInspector
|
|
14
14
|
|
|
@@ -96,7 +96,7 @@ class Cpython(PythonBuilder):
|
|
|
96
96
|
|
|
97
97
|
@classmethod
|
|
98
98
|
def candidate_modules(cls):
|
|
99
|
-
return [LibFFI, Zlib, Xz, Bzip2, Readline, Openssl, Sqlite, Bdb, Gdbm, Uuid, TkInter]
|
|
99
|
+
return [LibFFI, Zlib, Zstd, Xz, Bzip2, Readline, Openssl, Sqlite, Bdb, Gdbm, Uuid, TkInter, Mpdec]
|
|
100
100
|
|
|
101
101
|
@property
|
|
102
102
|
def url(self):
|
|
@@ -172,10 +172,37 @@ class Cpython(PythonBuilder):
|
|
|
172
172
|
yield f"-ltcl{version.mm}"
|
|
173
173
|
yield f"-ltk{version.mm}"
|
|
174
174
|
|
|
175
|
+
if self.setup.python_spec.freethreading:
|
|
176
|
+
yield "--disable-gil"
|
|
177
|
+
|
|
178
|
+
def xenv_LIBZSTD_CFLAGS(self):
|
|
179
|
+
if self.version >= "3.14" and PPG.target.is_macos:
|
|
180
|
+
# Normally ./configure will autodetect using pkg-config, but
|
|
181
|
+
# this doesn't typically work on Mac (the pkg-config binary is
|
|
182
|
+
# in homebrew, which we omit from path) so we have to provide
|
|
183
|
+
# some hints about how to staticly include it.
|
|
184
|
+
yield f"-I{self.deps}/include"
|
|
185
|
+
|
|
186
|
+
def xenv_LIBZSTD_LIBS(self):
|
|
187
|
+
if self.version >= "3.14" and PPG.target.is_macos:
|
|
188
|
+
yield f"{self.deps_lib_dir}/libzstd.a"
|
|
189
|
+
|
|
190
|
+
def xenv_LIBMPDEC_CFLAGS(self):
|
|
191
|
+
if self.version >= "3.14" and PPG.target.is_macos:
|
|
192
|
+
# Normally ./configure will autodetect using pkg-config, but
|
|
193
|
+
# this doesn't typically work on Mac (the pkg-config binary is
|
|
194
|
+
# in homebrew, which we omit from path) so we have to provide
|
|
195
|
+
# some hints about how to staticly include it.
|
|
196
|
+
yield f"-I{self.deps}/include"
|
|
197
|
+
|
|
198
|
+
def xenv_LIBMPDEC_LIBS(self):
|
|
199
|
+
if self.version >= "3.14" and PPG.target.is_macos:
|
|
200
|
+
yield f"{self.deps_lib_dir}/libmpdec.a"
|
|
201
|
+
|
|
175
202
|
@runez.cached_property
|
|
176
203
|
def prefix_lib_folder(self):
|
|
177
204
|
"""Path to <prefix>/lib/pythonM.m folder"""
|
|
178
|
-
return self.install_folder / f"lib/python{self.version.mm}"
|
|
205
|
+
return self.install_folder / f"lib/python{self.version.mm}{self.setup.python_spec.abi_suffix}"
|
|
179
206
|
|
|
180
207
|
@runez.cached_property
|
|
181
208
|
def prefix_config_folder(self):
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os.path
|
|
1
2
|
from typing import ClassVar
|
|
2
3
|
|
|
3
4
|
import runez
|
|
@@ -25,6 +26,8 @@ class Bdb(ModuleBuilder):
|
|
|
25
26
|
|
|
26
27
|
@property
|
|
27
28
|
def version(self):
|
|
29
|
+
# Oracle stopped releasing new versions in May 2020 (18.1.40 was last under AGPL)
|
|
30
|
+
# Check https://www.oracle.com/database/technologies/related/berkeleydb-downloads.html
|
|
28
31
|
return self.cfg_version("6.2.32")
|
|
29
32
|
|
|
30
33
|
def c_configure_args(self):
|
|
@@ -60,6 +63,8 @@ class Bzip2(ModuleBuilder):
|
|
|
60
63
|
|
|
61
64
|
@property
|
|
62
65
|
def version(self):
|
|
66
|
+
# Last release was 1.0.8 in 2019, project has very infrequent updates
|
|
67
|
+
# Check https://sourceware.org/bzip2/downloads.html
|
|
63
68
|
return self.cfg_version("1.0.8")
|
|
64
69
|
|
|
65
70
|
def _do_linux_compile(self):
|
|
@@ -84,6 +89,7 @@ class Gdbm(ModuleBuilder):
|
|
|
84
89
|
|
|
85
90
|
@property
|
|
86
91
|
def version(self):
|
|
92
|
+
# Check https://www.gnu.org.ua/software/gdbm/
|
|
87
93
|
return self.cfg_version("1.26")
|
|
88
94
|
|
|
89
95
|
def c_configure_args(self):
|
|
@@ -130,6 +136,7 @@ class LibFFI(ModuleBuilder):
|
|
|
130
136
|
|
|
131
137
|
@property
|
|
132
138
|
def version(self):
|
|
139
|
+
# Check https://github.com/libffi/libffi/releases
|
|
133
140
|
return self.cfg_version("3.5.2")
|
|
134
141
|
|
|
135
142
|
def c_configure_args(self):
|
|
@@ -175,9 +182,10 @@ class Openssl(ModuleBuilder):
|
|
|
175
182
|
|
|
176
183
|
@property
|
|
177
184
|
def version(self):
|
|
178
|
-
#
|
|
179
|
-
#
|
|
180
|
-
|
|
185
|
+
# 3.5 is LTS, supported until Apr 2030 (3.0 EOL Sept 2026)
|
|
186
|
+
# Stay on the 3.5 LTS line for now: 3.6 / 4.0 not yet verified for cpython builds
|
|
187
|
+
# Check https://github.com/openssl/openssl/releases and https://endoflife.date/openssl
|
|
188
|
+
return self.cfg_version("3.5.7")
|
|
181
189
|
|
|
182
190
|
def c_configure_args(self):
|
|
183
191
|
if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
|
|
@@ -206,7 +214,8 @@ class Ncurses(ModuleBuilder):
|
|
|
206
214
|
|
|
207
215
|
@property
|
|
208
216
|
def version(self):
|
|
209
|
-
|
|
217
|
+
# Check https://invisible-island.net/ncurses/announce.html
|
|
218
|
+
return self.cfg_version("6.6")
|
|
210
219
|
|
|
211
220
|
def c_configure_args(self):
|
|
212
221
|
if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
|
|
@@ -263,7 +272,9 @@ class Readline(ModuleBuilder):
|
|
|
263
272
|
|
|
264
273
|
@property
|
|
265
274
|
def version(self):
|
|
266
|
-
|
|
275
|
+
# Patched tarballs (e.g. "8.2.13") are available on the GNU FTP when patches accumulate
|
|
276
|
+
# Check https://ftpmirror.gnu.org/gnu/readline/ for available tarballs
|
|
277
|
+
return self.cfg_version("8.3")
|
|
267
278
|
|
|
268
279
|
def c_configure_args(self):
|
|
269
280
|
if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
|
|
@@ -307,7 +318,8 @@ class Sqlite(ModuleBuilder):
|
|
|
307
318
|
|
|
308
319
|
@property
|
|
309
320
|
def version(self):
|
|
310
|
-
|
|
321
|
+
# Keep current; check https://sqlite.org/changes.html (avoid withdrawn releases like 3.52.0)
|
|
322
|
+
return self.cfg_version("3.53.2")
|
|
311
323
|
|
|
312
324
|
def c_configure_args(self):
|
|
313
325
|
if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
|
|
@@ -342,6 +354,8 @@ class Uuid(ModuleBuilder):
|
|
|
342
354
|
|
|
343
355
|
@property
|
|
344
356
|
def version(self):
|
|
357
|
+
# Standalone libuuid (not util-linux), project is mostly dormant
|
|
358
|
+
# Check https://sourceforge.net/projects/libuuid/files/
|
|
345
359
|
return self.cfg_version("1.0.3")
|
|
346
360
|
|
|
347
361
|
def c_configure_args(self):
|
|
@@ -372,7 +386,8 @@ class Xz(ModuleBuilder):
|
|
|
372
386
|
|
|
373
387
|
@property
|
|
374
388
|
def version(self):
|
|
375
|
-
|
|
389
|
+
# Check https://github.com/tukaani-project/xz/releases
|
|
390
|
+
return self.cfg_version("5.8.3")
|
|
376
391
|
|
|
377
392
|
def c_configure_args(self):
|
|
378
393
|
if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
|
|
@@ -415,7 +430,8 @@ class Zlib(ModuleBuilder):
|
|
|
415
430
|
|
|
416
431
|
@property
|
|
417
432
|
def version(self):
|
|
418
|
-
|
|
433
|
+
# Check https://zlib.net/ and https://github.com/madler/zlib/releases
|
|
434
|
+
return self.cfg_version("1.3.2")
|
|
419
435
|
|
|
420
436
|
def c_configure_args(self):
|
|
421
437
|
if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
|
|
@@ -428,3 +444,80 @@ class Zlib(ModuleBuilder):
|
|
|
428
444
|
self.run_configure("./configure", self.c_configure_args())
|
|
429
445
|
self.run_make()
|
|
430
446
|
self.run_make("install")
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
class Zstd(ModuleBuilder):
|
|
450
|
+
"""
|
|
451
|
+
Newer compression format present in most 3.14+ builds
|
|
452
|
+
"""
|
|
453
|
+
|
|
454
|
+
m_debian = "!libzstd-dev"
|
|
455
|
+
m_telltale = "{include}/zstd.h"
|
|
456
|
+
|
|
457
|
+
xenv_CFLAGS = "-fPIC"
|
|
458
|
+
|
|
459
|
+
def auto_select_reason(self):
|
|
460
|
+
if self.setup.python_spec.version >= "3.14":
|
|
461
|
+
if PPG.target.is_macos:
|
|
462
|
+
return "Required for 3.14 and up" # Well, "expected" anyway
|
|
463
|
+
if not self.resolved_telltale:
|
|
464
|
+
return "Required for 3.14 and up"
|
|
465
|
+
|
|
466
|
+
@property
|
|
467
|
+
def url(self):
|
|
468
|
+
return (
|
|
469
|
+
self.cfg_url(self.version) or f"https://github.com/facebook/zstd/releases/download/v{self.version}/zstd-{self.version}.tar.gz"
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
@property
|
|
473
|
+
def version(self):
|
|
474
|
+
# Check https://github.com/facebook/zstd/releases
|
|
475
|
+
return self.cfg_version("1.5.7")
|
|
476
|
+
|
|
477
|
+
def _do_linux_compile(self):
|
|
478
|
+
# Notably, this does not build when given a relative path.
|
|
479
|
+
self.run_make(f"prefix={os.path.abspath(self.deps)}")
|
|
480
|
+
# the libdir on the resulting .dylib on Mac is wrong, but as long as we
|
|
481
|
+
# staticly compile this doesn't need a fixup. I got as far as:
|
|
482
|
+
# "libdir=\\$(executable_path)/../lib")
|
|
483
|
+
self.run_make("install", f"prefix={os.path.abspath(self.deps)}")
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
class Mpdec(ModuleBuilder):
|
|
487
|
+
"""
|
|
488
|
+
Prevent falling back to bundled libmpdec (deprecated and scheduled for removal in Python 3.16)
|
|
489
|
+
"""
|
|
490
|
+
|
|
491
|
+
m_debian = "!libmpdec-dev"
|
|
492
|
+
m_telltale = "{include}/mpdecimal.h"
|
|
493
|
+
|
|
494
|
+
xenv_CFLAGS = "-fPIC"
|
|
495
|
+
|
|
496
|
+
def auto_select_reason(self):
|
|
497
|
+
if self.setup.python_spec.version >= "3.16":
|
|
498
|
+
if PPG.target.is_macos:
|
|
499
|
+
return "Required for 3.16 and up"
|
|
500
|
+
if not self.resolved_telltale:
|
|
501
|
+
return "Required for 3.16 and up"
|
|
502
|
+
|
|
503
|
+
@property
|
|
504
|
+
def url(self):
|
|
505
|
+
return self.cfg_url(self.version) or f"https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-{self.version}.tar.gz"
|
|
506
|
+
|
|
507
|
+
@property
|
|
508
|
+
def version(self):
|
|
509
|
+
# Check https://www.bytereef.org/mpdecimal/download.html
|
|
510
|
+
return self.cfg_version("4.0.1")
|
|
511
|
+
|
|
512
|
+
def c_configure_args(self):
|
|
513
|
+
if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
|
|
514
|
+
yield config_args
|
|
515
|
+
|
|
516
|
+
else:
|
|
517
|
+
pass # yield "--static"
|
|
518
|
+
yield "--disable-cxx"
|
|
519
|
+
|
|
520
|
+
def _do_linux_compile(self):
|
|
521
|
+
self.run_configure("./configure", self.c_configure_args())
|
|
522
|
+
self.run_make()
|
|
523
|
+
self.run_make("install")
|
|
@@ -77,6 +77,8 @@ class Tix(ModuleBuilder):
|
|
|
77
77
|
|
|
78
78
|
@property
|
|
79
79
|
def version(self):
|
|
80
|
+
# Effectively dead project, no updates expected
|
|
81
|
+
# Check https://github.com/python/cpython-source-deps (tix-* tags)
|
|
80
82
|
return self.cfg_version("8.4.3.6")
|
|
81
83
|
|
|
82
84
|
# noinspection PyPep8Naming
|
|
@@ -116,4 +118,7 @@ class TkInter(ModuleBuilder):
|
|
|
116
118
|
|
|
117
119
|
@property
|
|
118
120
|
def version(self):
|
|
119
|
-
|
|
121
|
+
# This is the Tcl/Tk version used by Tcl, Tk, and Tix sub-modules
|
|
122
|
+
# Staying on 8.6.x branch (9.0+ is a major rewrite)
|
|
123
|
+
# Check https://www.tcl-lang.org/software/tcltk/8.6.html
|
|
124
|
+
return self.cfg_version("8.6.18")
|
portable_python/inspector.py
CHANGED
|
@@ -397,7 +397,7 @@ def get_lib_type(install_folder, path, basename):
|
|
|
397
397
|
|
|
398
398
|
|
|
399
399
|
class PythonInspector:
|
|
400
|
-
default = "_bz2,_ctypes,_curses,_decimal,_dbm,_gdbm,_lzma,_tkinter,_sqlite3,_ssl,_uuid,pip,readline,pyexpat,setuptools,zlib"
|
|
400
|
+
default = "_bz2,_ctypes,_curses,_decimal,_dbm,_gdbm,_lzma,_tkinter,_sqlite3,_ssl,_uuid,_zstd,pip,readline,pyexpat,setuptools,zlib"
|
|
401
401
|
additional = "_asyncio,_functools,_tracemalloc,dbm.gnu,ensurepip,ossaudiodev,spwd,sys,tkinter,venv,wheel"
|
|
402
402
|
|
|
403
403
|
def __init__(self, spec, modules=None):
|
portable_python/versions.py
CHANGED
|
@@ -117,13 +117,13 @@ class CPythonFamily(VersionFamily):
|
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
class Folders:
|
|
120
|
-
def __init__(self, config: Config, base=None, family=None, version=None):
|
|
120
|
+
def __init__(self, config: Config, base=None, family=None, version=None, abi_suffix=None):
|
|
121
121
|
self.config = config
|
|
122
122
|
self.base_folder = runez.resolved_path(base)
|
|
123
123
|
self.family = family
|
|
124
124
|
self.version = Version.from_object(version)
|
|
125
125
|
self.mm = self.version and self.version.mm
|
|
126
|
-
self.completions = config.completions(family=family, version=version, mm=self.mm)
|
|
126
|
+
self.completions = config.completions(family=family, version=version, mm=self.mm, abi_suffix=abi_suffix or "")
|
|
127
127
|
self.build_folder = self._get_path("build")
|
|
128
128
|
self.completions["build"] = self.build_folder
|
|
129
129
|
self.components = self.build_folder / "components"
|
|
@@ -197,9 +197,9 @@ class PPG:
|
|
|
197
197
|
cls.target = cls.config.target
|
|
198
198
|
|
|
199
199
|
@classmethod
|
|
200
|
-
def get_folders(cls, base=None, family="cpython", version=None):
|
|
200
|
+
def get_folders(cls, base=None, family="cpython", version=None, abi_suffix=None):
|
|
201
201
|
config = cls.config or Config()
|
|
202
|
-
return Folders(config, base=base, family=family, version=version)
|
|
202
|
+
return Folders(config, base=base, family=family, version=version, abi_suffix=abi_suffix)
|
|
203
203
|
|
|
204
204
|
@classmethod
|
|
205
205
|
def family(cls, family_name, fatal=True) -> VersionFamily:
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: portable-python
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: Portable python binaries
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Author-email: zoran@simicweb.com
|
|
8
|
-
License: MIT
|
|
9
|
-
Project-URL: Documentation, https://github.com/codrsquad/portable-python/wiki
|
|
10
|
-
Project-URL: Release notes, https://github.com/codrsquad/portable-python/wiki/Release-notes
|
|
5
|
+
Author-email: Zoran Simic <zoran@simicweb.com>
|
|
6
|
+
License-Expression: MIT
|
|
11
7
|
Project-URL: Source, https://github.com/codrsquad/portable-python
|
|
12
8
|
Keywords: python,portable,binary
|
|
13
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
@@ -18,37 +14,25 @@ Classifier: Operating System :: POSIX
|
|
|
18
14
|
Classifier: Operating System :: Unix
|
|
19
15
|
Classifier: Programming Language :: Python
|
|
20
16
|
Classifier: Programming Language :: Python :: 3
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
22
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
23
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
24
19
|
Classifier: Programming Language :: Python :: 3.12
|
|
25
20
|
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
26
22
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
27
23
|
Classifier: Topic :: Software Development :: Build Tools
|
|
28
24
|
Classifier: Topic :: System :: Installation/Setup
|
|
29
25
|
Classifier: Topic :: System :: Software Distribution
|
|
30
26
|
Classifier: Topic :: Utilities
|
|
31
|
-
Requires-Python: >=3.
|
|
27
|
+
Requires-Python: >=3.10
|
|
32
28
|
Description-Content-Type: text/x-rst
|
|
33
29
|
License-File: LICENSE
|
|
34
|
-
Requires-Dist: click
|
|
35
|
-
Requires-Dist: pyyaml
|
|
36
|
-
Requires-Dist: requests<3
|
|
37
|
-
Requires-Dist: runez
|
|
38
|
-
Requires-Dist: urllib3
|
|
39
|
-
Dynamic: author
|
|
40
|
-
Dynamic: author-email
|
|
41
|
-
Dynamic: classifier
|
|
42
|
-
Dynamic: description
|
|
43
|
-
Dynamic: description-content-type
|
|
44
|
-
Dynamic: home-page
|
|
45
|
-
Dynamic: keywords
|
|
46
|
-
Dynamic: license
|
|
30
|
+
Requires-Dist: click<9
|
|
31
|
+
Requires-Dist: pyyaml<7
|
|
32
|
+
Requires-Dist: requests<3
|
|
33
|
+
Requires-Dist: runez<6
|
|
34
|
+
Requires-Dist: urllib3<3
|
|
47
35
|
Dynamic: license-file
|
|
48
|
-
Dynamic: project-url
|
|
49
|
-
Dynamic: requires-dist
|
|
50
|
-
Dynamic: requires-python
|
|
51
|
-
Dynamic: summary
|
|
52
36
|
|
|
53
37
|
Portable python binaries
|
|
54
38
|
========================
|
|
@@ -61,8 +45,8 @@ Portable python binaries
|
|
|
61
45
|
:target: https://github.com/codrsquad/portable-python/actions
|
|
62
46
|
:alt: Tested with Github Actions
|
|
63
47
|
|
|
64
|
-
.. image:: https://
|
|
65
|
-
:target: https://
|
|
48
|
+
.. image:: https://coveralls.io/repos/github/codrsquad/portable-python/badge.svg?branch=main
|
|
49
|
+
:target: https://coveralls.io/github/codrsquad/portable-python?branch=main
|
|
66
50
|
:alt: Test coverage
|
|
67
51
|
|
|
68
52
|
.. image:: https://img.shields.io/pypi/pyversions/portable-python.svg
|
|
@@ -180,6 +164,64 @@ Note that you can use ``--dryrun`` mode to inspect what would be done without do
|
|
|
180
164
|
Would tar build/3.9.7 -> dist/cpython-3.9.7-macos-x86_64.tar.gz
|
|
181
165
|
|
|
182
166
|
|
|
167
|
+
CLI reference
|
|
168
|
+
-------------
|
|
169
|
+
|
|
170
|
+
Main entry point::
|
|
171
|
+
|
|
172
|
+
portable-python [OPTIONS] COMMAND [ARGS]
|
|
173
|
+
|
|
174
|
+
**Global options**:
|
|
175
|
+
|
|
176
|
+
- ``--config PATH``: Config file (default: ``portable-python.yml``)
|
|
177
|
+
- ``--quiet``: Turn off DEBUG logging
|
|
178
|
+
- ``--dryrun`` / ``-n``: Show what would be done
|
|
179
|
+
- ``--target PLATFORM``: Override detected platform (for testing)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
**build** ``<PYTHON_SPEC>`` - Build a portable Python binary::
|
|
183
|
+
|
|
184
|
+
portable-python build 3.13.2 -m openssl,zlib
|
|
185
|
+
|
|
186
|
+
- ``--modules, -m CSV``: External modules to include
|
|
187
|
+
- ``--prefix, -p PATH``: Use ``--prefix`` (non-portable)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
**build-report** ``[PYTHON_SPEC]`` - Show module status and what will be compiled:
|
|
191
|
+
|
|
192
|
+
- ``--modules, -m CSV``: Specific modules to check
|
|
193
|
+
- Validates that modules can be built
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
**inspect** ``<PATH>`` - Check if a Python installation is portable::
|
|
197
|
+
|
|
198
|
+
portable-python inspect /usr/bin/python3
|
|
199
|
+
|
|
200
|
+
- ``--modules, -m MODULES``: Which modules to inspect
|
|
201
|
+
- ``--verbose, -v``: Show full ``.so`` report
|
|
202
|
+
- ``--prefix, -p``: Built with ``--prefix`` (not portable)
|
|
203
|
+
- ``--skip-so, -s``: Don't check all ``.so`` files
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
**list** ``[FAMILY]`` - List available versions (default: cpython)::
|
|
207
|
+
|
|
208
|
+
portable-python list cpython
|
|
209
|
+
|
|
210
|
+
- ``--json``: Output as JSON
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
**diagnostics** - Show system diagnostics
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
**recompress** ``<PATH> <EXT>`` - Re-compress existing binary tarball (for comparing compression sizes)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
**lib-auto-correct** ``<PATH>`` - Auto-correct exes/libs to use relative paths:
|
|
220
|
+
|
|
221
|
+
- ``--commit``: Actually perform changes (dryrun by default)
|
|
222
|
+
- ``--prefix, -p PATH``: Expected ``--prefix`` from build
|
|
223
|
+
|
|
224
|
+
|
|
183
225
|
Library
|
|
184
226
|
-------
|
|
185
227
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
portable_python/__init__.py,sha256=bVZVIcF1oq_-Lb5pZm665bd12oDmyIbFfM48NyZvL8U,31601
|
|
2
|
+
portable_python/__main__.py,sha256=fjtkudRFxLSLTSqzkWYnQLMGRG0BRUc6GeqY201taCE,149
|
|
3
|
+
portable_python/cli.py,sha256=hml834t9RMjQ1s5-DwiEJhdjI8IfsObTLzU8jMbhze0,7610
|
|
4
|
+
portable_python/config.py,sha256=D-Fr1VV-KKFMHzhrqselEMujHoErSYZ_zWmK_TKsua4,13726
|
|
5
|
+
portable_python/cpython.py,sha256=V0_B2nWv0H8enXGdU38yRgZyO7d-JkC0DWlTMsI9K9M,18214
|
|
6
|
+
portable_python/inspector.py,sha256=LvGhat2rqwgse0r90dZxEExRYWSW4TrxsMXxYScrF3k,21355
|
|
7
|
+
portable_python/tracking.py,sha256=308K--adSivstOqnD9oczlY77FZV_cgNy7xL8BS9ROg,1978
|
|
8
|
+
portable_python/versions.py,sha256=BTxYrH6xGFQIXZ8Xv8rHMpVT76TKmE_J7AXOepCE5Tc,7171
|
|
9
|
+
portable_python/external/__init__.py,sha256=jQCp0sEgj7ZjuWYc2zJ3Bm_W5qdT0OPNAe4JIPaQLY8,801
|
|
10
|
+
portable_python/external/_inspect.py,sha256=ASminI7HBuHAuFcvX3mkBYf7lCDILqiPrKkhKkQ8w94,3744
|
|
11
|
+
portable_python/external/xcpython.py,sha256=AnelZlU5_Z08dp0Itej3AZ9KLcIE07Fidlrp3WWs87k,16744
|
|
12
|
+
portable_python/external/xtkinter.py,sha256=rvIHeaUmp2O7fJeYxu4FH2tzFA8Ajw55Nhqg2yFOt8I,3832
|
|
13
|
+
portable_python-2.0.1.dist-info/licenses/LICENSE,sha256=BB27gUWIcmc-bauY_M6COCMtiy4hN2mou1RdadlbXbs,1068
|
|
14
|
+
portable_python-2.0.1.dist-info/METADATA,sha256=KXL6TT3WrqOGEcmfrOcaGOOQXENK8PXve4UBPIaUOJ4,9850
|
|
15
|
+
portable_python-2.0.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
16
|
+
portable_python-2.0.1.dist-info/entry_points.txt,sha256=Zo8HR39evgAgm4e2UhenD7kkpJvEXp_VB4aIrL_3_VY,66
|
|
17
|
+
portable_python-2.0.1.dist-info/scm_file_list.json,sha256=JEWL2bgKhM5MfDey6Ck0z28f5QpCpC_rsqh4pXnOQHo,2862
|
|
18
|
+
portable_python-2.0.1.dist-info/scm_version.json,sha256=NLVXUR8TKaY95dqXtJYGWJutY6pngwPq1sEo-b8In2Y,160
|
|
19
|
+
portable_python-2.0.1.dist-info/top_level.txt,sha256=S203pfaAC8FDZvrHsCWWua_9ZfSDEDCD1w90zzYFhOU,16
|
|
20
|
+
portable_python-2.0.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": [
|
|
3
|
+
"tox.ini",
|
|
4
|
+
"Dockerfile",
|
|
5
|
+
"LICENSE",
|
|
6
|
+
"pyproject.toml",
|
|
7
|
+
"lock-deps.sh",
|
|
8
|
+
"requirements.txt",
|
|
9
|
+
"portable-python.yml",
|
|
10
|
+
"SECURITY.md",
|
|
11
|
+
"README.rst",
|
|
12
|
+
".dockerignore",
|
|
13
|
+
"CLAUDE.md",
|
|
14
|
+
"MANIFEST.in",
|
|
15
|
+
".gitignore",
|
|
16
|
+
"scripts/portable-python.sh",
|
|
17
|
+
"scripts/bashrc.sh",
|
|
18
|
+
"scripts/check_okf.py",
|
|
19
|
+
"docs/overview.md",
|
|
20
|
+
"docs/log.md",
|
|
21
|
+
"docs/changelog.md",
|
|
22
|
+
"docs/release.md",
|
|
23
|
+
"docs/index.md",
|
|
24
|
+
"docs/configuration/portable-python-yml.md",
|
|
25
|
+
"docs/configuration/index.md",
|
|
26
|
+
"docs/architecture/cpython.md",
|
|
27
|
+
"docs/architecture/config.md",
|
|
28
|
+
"docs/architecture/python-builder.md",
|
|
29
|
+
"docs/architecture/ppg.md",
|
|
30
|
+
"docs/architecture/build-setup.md",
|
|
31
|
+
"docs/architecture/python-inspector.md",
|
|
32
|
+
"docs/architecture/module-builder.md",
|
|
33
|
+
"docs/architecture/index.md",
|
|
34
|
+
"docs/modules/external-modules.md",
|
|
35
|
+
"docs/modules/index.md",
|
|
36
|
+
"docs/guides/bump-python-support.md",
|
|
37
|
+
"docs/guides/local-development.md",
|
|
38
|
+
"docs/guides/ci-cd.md",
|
|
39
|
+
"docs/guides/fix-a-portability-issue.md",
|
|
40
|
+
"docs/guides/add-an-external-module.md",
|
|
41
|
+
"docs/guides/bump-components.md",
|
|
42
|
+
"docs/guides/index.md",
|
|
43
|
+
"docs/guides/add-a-config-option.md",
|
|
44
|
+
"docs/guides/build-a-portable-python.md",
|
|
45
|
+
"docs/concepts/ppp-marker.md",
|
|
46
|
+
"docs/concepts/folder-masking.md",
|
|
47
|
+
"docs/concepts/build-layout.md",
|
|
48
|
+
"docs/concepts/portability.md",
|
|
49
|
+
"docs/concepts/telltale-detection.md",
|
|
50
|
+
"docs/concepts/index.md",
|
|
51
|
+
"docs/concepts/static-linking.md",
|
|
52
|
+
"docs/cli/lib-auto-correct.md",
|
|
53
|
+
"docs/cli/diagnostics.md",
|
|
54
|
+
"docs/cli/inspect.md",
|
|
55
|
+
"docs/cli/list.md",
|
|
56
|
+
"docs/cli/recompress.md",
|
|
57
|
+
"docs/cli/build.md",
|
|
58
|
+
"docs/cli/index.md",
|
|
59
|
+
"docs/cli/build-report.md",
|
|
60
|
+
"src/portable_python/__init__.py",
|
|
61
|
+
"src/portable_python/versions.py",
|
|
62
|
+
"src/portable_python/config.py",
|
|
63
|
+
"src/portable_python/cpython.py",
|
|
64
|
+
"src/portable_python/inspector.py",
|
|
65
|
+
"src/portable_python/tracking.py",
|
|
66
|
+
"src/portable_python/cli.py",
|
|
67
|
+
"src/portable_python/__main__.py",
|
|
68
|
+
"src/portable_python/external/__init__.py",
|
|
69
|
+
"src/portable_python/external/xtkinter.py",
|
|
70
|
+
"src/portable_python/external/xcpython.py",
|
|
71
|
+
"src/portable_python/external/_inspect.py",
|
|
72
|
+
"retired/README.md",
|
|
73
|
+
"retired/toolchain.py",
|
|
74
|
+
".claude/settings.json",
|
|
75
|
+
"tests/test_failed.py",
|
|
76
|
+
"tests/__init__.py",
|
|
77
|
+
"tests/sample-config2.yml",
|
|
78
|
+
"tests/test_prefix.py",
|
|
79
|
+
"tests/test_cleanup.py",
|
|
80
|
+
"tests/test_build.py",
|
|
81
|
+
"tests/test_recompress.py",
|
|
82
|
+
"tests/test_setup.py",
|
|
83
|
+
"tests/sample-config1.yml",
|
|
84
|
+
"tests/test_invoker.py",
|
|
85
|
+
"tests/test_report.py",
|
|
86
|
+
"tests/conftest.py",
|
|
87
|
+
"tests/test_list.py",
|
|
88
|
+
"tests/sample-incomplete.yml",
|
|
89
|
+
"tests/test_inspector.py",
|
|
90
|
+
".github/workflows/release.yml",
|
|
91
|
+
".github/workflows/tests.yml"
|
|
92
|
+
]
|
|
93
|
+
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
portable_python/__init__.py,sha256=ffdX5dFrePz_3Uvvn5zwz8RGvLlPxsJaBsTqHx5Nrmc,31371
|
|
2
|
-
portable_python/__main__.py,sha256=fjtkudRFxLSLTSqzkWYnQLMGRG0BRUc6GeqY201taCE,149
|
|
3
|
-
portable_python/cli.py,sha256=hml834t9RMjQ1s5-DwiEJhdjI8IfsObTLzU8jMbhze0,7610
|
|
4
|
-
portable_python/config.py,sha256=9mo4uCJ77-mXZNc9tvOngPlCu6gcMMEbVDmeiKi0W2Y,13714
|
|
5
|
-
portable_python/cpython.py,sha256=GH99cTgrC9V5WoDw6OtT9X2dEiBu9i6QclLfQq70Cd8,16940
|
|
6
|
-
portable_python/inspector.py,sha256=4nyGuTFbY1X3wfj9TPTQe69ABzshMvY4RjUat4y_9BU,21349
|
|
7
|
-
portable_python/tracking.py,sha256=308K--adSivstOqnD9oczlY77FZV_cgNy7xL8BS9ROg,1978
|
|
8
|
-
portable_python/versions.py,sha256=oHFbo_eWbr1yQuVUER2VTVTo7nvVC8qqLD_DcrKfRyg,7085
|
|
9
|
-
portable_python/external/__init__.py,sha256=3KgdTIZG1x-Sm0nPMKl4c3elCtBy6spD6qASpvdR8ZI,729
|
|
10
|
-
portable_python/external/_inspect.py,sha256=Z1WKcYB-m-fx7nW3n1tvpEgZ02ajCyC-_MfY6Bb_7SE,3715
|
|
11
|
-
portable_python/external/xcpython.py,sha256=_WL_Tn5v4VxQn8ODLdvryLj2cyQdMQp1BfjtZ0Xr8Ys,13076
|
|
12
|
-
portable_python/external/xtkinter.py,sha256=KlhFUvIXWy7gX6FrZBieekrULx4kF12H2Q010GZEj20,3502
|
|
13
|
-
portable_python-1.10.2.dist-info/licenses/LICENSE,sha256=BB27gUWIcmc-bauY_M6COCMtiy4hN2mou1RdadlbXbs,1068
|
|
14
|
-
portable_python-1.10.2.dist-info/METADATA,sha256=qxtdoNzDiwV5787vF5j7p-YDgG7z223tQhEQ4PEI3Ik,8758
|
|
15
|
-
portable_python-1.10.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
16
|
-
portable_python-1.10.2.dist-info/entry_points.txt,sha256=Zo8HR39evgAgm4e2UhenD7kkpJvEXp_VB4aIrL_3_VY,66
|
|
17
|
-
portable_python-1.10.2.dist-info/top_level.txt,sha256=S203pfaAC8FDZvrHsCWWua_9ZfSDEDCD1w90zzYFhOU,16
|
|
18
|
-
portable_python-1.10.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|