Nuitka-winsvc 2.6__cp311-cp311-win_amd64.whl → 2.6.5__cp311-cp311-win_amd64.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.
Potentially problematic release.
This version of Nuitka-winsvc might be problematic. Click here for more details.
- {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/METADATA +1 -1
- {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/RECORD +65 -61
- nuitka/BytecodeCaching.py +14 -3
- nuitka/ModuleRegistry.py +18 -3
- nuitka/Options.py +92 -66
- nuitka/PythonFlavors.py +15 -0
- nuitka/Version.py +1 -1
- nuitka/build/SconsCompilerSettings.py +3 -4
- nuitka/build/SconsInterface.py +2 -2
- nuitka/build/include/nuitka/compiled_frame.h +1 -1
- nuitka/build/include/nuitka/exceptions.h +1 -1
- nuitka/build/include/nuitka/type_aliases.h +1 -1
- nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
- nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
- nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
- nuitka/build/static_src/CompiledAsyncgenType.c +2 -11
- nuitka/build/static_src/CompiledCodeHelpers.c +4 -2
- nuitka/build/static_src/CompiledCoroutineType.c +5 -13
- nuitka/build/static_src/CompiledGeneratorType.c +0 -10
- nuitka/build/static_src/HelpersConsole.c +1 -1
- nuitka/build/static_src/HelpersTypes.c +4 -4
- nuitka/build/static_src/MainProgram.c +24 -0
- nuitka/build/static_src/MetaPathBasedLoader.c +17 -10
- nuitka/build/static_src/OnefileBootstrap.c +3 -1
- nuitka/code_generation/TypeAliasCodes.py +3 -2
- nuitka/freezer/DllDependenciesMacOS.py +7 -2
- nuitka/freezer/DllDependenciesPosix.py +22 -3
- nuitka/freezer/DllDependenciesWin32.py +1 -0
- nuitka/freezer/IncludedDataFiles.py +1 -1
- nuitka/freezer/IncludedEntryPoints.py +8 -0
- nuitka/freezer/Standalone.py +11 -2
- nuitka/importing/Importing.py +2 -1
- nuitka/nodes/ChildrenHavingMixins.py +13 -13
- nuitka/nodes/FunctionNodes.py +7 -0
- nuitka/nodes/ModuleNodes.py +21 -7
- nuitka/nodes/PackageMetadataNodes.py +3 -1
- nuitka/nodes/TypeNodes.py +3 -3
- nuitka/plugins/PluginBase.py +67 -13
- nuitka/plugins/Plugins.py +1 -1
- nuitka/plugins/standard/AntiBloatPlugin.py +136 -65
- nuitka/plugins/standard/ImplicitImports.py +3 -2
- nuitka/plugins/standard/PySidePyQtPlugin.py +13 -0
- nuitka/plugins/standard/standard.nuitka-package.config.yml +151 -53
- nuitka/reports/Reports.py +25 -2
- nuitka/tools/general/find_module/FindModuleCode.py +4 -1
- nuitka/tools/scanning/DisplayPackageDLLs.py +5 -6
- nuitka/tools/watch/__main__.py +7 -2
- nuitka/tree/Building.py +4 -6
- nuitka/tree/FutureSpecState.py +71 -0
- nuitka/tree/ReformulationAssignmentStatements.py +2 -2
- nuitka/tree/ReformulationDictionaryCreation.py +2 -2
- nuitka/tree/ReformulationFunctionStatements.py +1 -1
- nuitka/tree/ReformulationImportStatements.py +4 -51
- nuitka/tree/ReformulationMultidist.py +1 -1
- nuitka/tree/ReformulationNamespacePackages.py +27 -5
- nuitka/tree/SourceHandling.py +56 -17
- nuitka/utils/Distributions.py +26 -6
- nuitka/utils/FileOperations.py +18 -6
- nuitka/utils/StaticLibraries.py +4 -0
- {Nuitka_winsvc-2.6.data → Nuitka_winsvc-2.6.5.data}/scripts/nuitka-run.cmd +0 -0
- {Nuitka_winsvc-2.6.data → Nuitka_winsvc-2.6.5.data}/scripts/nuitka.cmd +0 -0
- {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/LICENSE.txt +0 -0
- {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/WHEEL +0 -0
- {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/entry_points.txt +0 -0
- {Nuitka_winsvc-2.6.dist-info → Nuitka_winsvc-2.6.5.dist-info}/top_level.txt +0 -0
|
@@ -87,7 +87,7 @@ def buildDictionaryNode(provider, node, source_ref):
|
|
|
87
87
|
|
|
88
88
|
|
|
89
89
|
@once_decorator
|
|
90
|
-
def
|
|
90
|
+
def _getDictUnpackingHelper():
|
|
91
91
|
helper_name = "_unpack_dict"
|
|
92
92
|
|
|
93
93
|
result = makeInternalHelperFunctionBody(
|
|
@@ -272,7 +272,7 @@ def buildDictionaryUnpacking(provider, keys, values, source_ref):
|
|
|
272
272
|
result = makeExpressionFunctionCall(
|
|
273
273
|
function=makeExpressionFunctionCreation(
|
|
274
274
|
function_ref=ExpressionFunctionRef(
|
|
275
|
-
function_body=
|
|
275
|
+
function_body=_getDictUnpackingHelper(), source_ref=source_ref
|
|
276
276
|
),
|
|
277
277
|
defaults=(),
|
|
278
278
|
kw_defaults=None,
|
|
@@ -54,8 +54,8 @@ from nuitka.plugins.Plugins import Plugins, hasActivePlugin
|
|
|
54
54
|
from nuitka.PythonVersions import python_version
|
|
55
55
|
from nuitka.specs.ParameterSpecs import ParameterSpec
|
|
56
56
|
|
|
57
|
+
from .FutureSpecState import getFutureSpec
|
|
57
58
|
from .ReformulationExecStatements import wrapEvalGlobalsAndLocals
|
|
58
|
-
from .ReformulationImportStatements import getFutureSpec
|
|
59
59
|
from .ReformulationTryFinallyStatements import (
|
|
60
60
|
makeTryFinallyReleaseStatement,
|
|
61
61
|
makeTryFinallyStatement,
|
|
@@ -12,7 +12,6 @@ source code comments with Developer Manual sections.
|
|
|
12
12
|
|
|
13
13
|
from nuitka.importing.ImportResolving import resolveModuleName
|
|
14
14
|
from nuitka.nodes.ConstantRefNodes import makeConstantRefNode
|
|
15
|
-
from nuitka.nodes.FutureSpecs import FutureSpec
|
|
16
15
|
from nuitka.nodes.GlobalsLocalsNodes import ExpressionBuiltinGlobals
|
|
17
16
|
from nuitka.nodes.ImportNodes import (
|
|
18
17
|
ExpressionBuiltinImport,
|
|
@@ -25,10 +24,10 @@ from nuitka.nodes.StatementNodes import StatementsSequence
|
|
|
25
24
|
from nuitka.nodes.VariableAssignNodes import makeStatementAssignmentVariable
|
|
26
25
|
from nuitka.nodes.VariableNameNodes import StatementAssignmentVariableName
|
|
27
26
|
from nuitka.nodes.VariableRefNodes import ExpressionTempVariableRef
|
|
28
|
-
from nuitka.plugins.Plugins import Plugins
|
|
29
27
|
from nuitka.PythonVersions import python_version
|
|
30
28
|
from nuitka.utils.ModuleNames import ModuleName
|
|
31
29
|
|
|
30
|
+
from .FutureSpecState import enableFutureFeature, getFutureSpec
|
|
32
31
|
from .ReformulationTryFinallyStatements import makeTryFinallyReleaseStatement
|
|
33
32
|
from .SyntaxErrors import raiseSyntaxError
|
|
34
33
|
from .TreeHelpers import makeStatementsSequenceOrStatement, mangleName
|
|
@@ -66,7 +65,7 @@ from __future__ imports must occur at the beginning of the file""",
|
|
|
66
65
|
for import_desc in node.names:
|
|
67
66
|
object_name, _local_name = import_desc.name, import_desc.asname
|
|
68
67
|
|
|
69
|
-
|
|
68
|
+
enableFutureFeature(node=node, object_name=object_name, source_ref=source_ref)
|
|
70
69
|
|
|
71
70
|
# Remember it for checks to be applied once module is complete, e.g. if
|
|
72
71
|
# they are all at module start.
|
|
@@ -74,52 +73,6 @@ from __future__ imports must occur at the beginning of the file""",
|
|
|
74
73
|
_future_import_nodes.append(node)
|
|
75
74
|
|
|
76
75
|
|
|
77
|
-
_future_specs = []
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def pushFutureSpec(module_name):
|
|
81
|
-
_future_specs.append(
|
|
82
|
-
FutureSpec(use_annotations=Plugins.decideAnnotations(module_name))
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def getFutureSpec():
|
|
87
|
-
return _future_specs[-1]
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def popFutureSpec():
|
|
91
|
-
del _future_specs[-1]
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def _enableFutureFeature(node, object_name, source_ref):
|
|
95
|
-
future_spec = _future_specs[-1]
|
|
96
|
-
|
|
97
|
-
if object_name == "unicode_literals":
|
|
98
|
-
future_spec.enableUnicodeLiterals()
|
|
99
|
-
elif object_name == "absolute_import":
|
|
100
|
-
future_spec.enableAbsoluteImport()
|
|
101
|
-
elif object_name == "division":
|
|
102
|
-
future_spec.enableFutureDivision()
|
|
103
|
-
elif object_name == "print_function":
|
|
104
|
-
future_spec.enableFuturePrint()
|
|
105
|
-
elif object_name == "barry_as_FLUFL" and python_version >= 0x300:
|
|
106
|
-
future_spec.enableBarry()
|
|
107
|
-
elif object_name == "generator_stop":
|
|
108
|
-
future_spec.enableGeneratorStop()
|
|
109
|
-
elif object_name == "braces":
|
|
110
|
-
raiseSyntaxError("not a chance", source_ref.atColumnNumber(node.col_offset))
|
|
111
|
-
elif object_name in ("nested_scopes", "generators", "with_statement"):
|
|
112
|
-
# These are enabled in all cases already.
|
|
113
|
-
pass
|
|
114
|
-
elif object_name == "annotations" and python_version >= 0x370:
|
|
115
|
-
future_spec.enableFutureAnnotations()
|
|
116
|
-
else:
|
|
117
|
-
raiseSyntaxError(
|
|
118
|
-
"future feature %s is not defined" % object_name,
|
|
119
|
-
source_ref.atColumnNumber(node.col_offset),
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
|
|
123
76
|
def _resolveImportModuleName(module_name):
|
|
124
77
|
if module_name:
|
|
125
78
|
module_name = resolveModuleName(ModuleName(module_name)).asString()
|
|
@@ -142,7 +95,7 @@ def buildImportFromNode(provider, node, source_ref):
|
|
|
142
95
|
# Use default level under some circumstances.
|
|
143
96
|
if level == -1:
|
|
144
97
|
level = None
|
|
145
|
-
elif level == 0 and not
|
|
98
|
+
elif level == 0 and not getFutureSpec().isAbsoluteImport():
|
|
146
99
|
level = None
|
|
147
100
|
|
|
148
101
|
if level is not None:
|
|
@@ -311,7 +264,7 @@ def buildImportModulesNode(provider, node, source_ref):
|
|
|
311
264
|
# imports.
|
|
312
265
|
level = (
|
|
313
266
|
makeConstantRefNode(0, source_ref, True)
|
|
314
|
-
if
|
|
267
|
+
if getFutureSpec().isAbsoluteImport()
|
|
315
268
|
else None
|
|
316
269
|
)
|
|
317
270
|
|
|
@@ -36,7 +36,7 @@ def createMultidistMainSourceCode():
|
|
|
36
36
|
source_code = renderTemplateFromString(
|
|
37
37
|
r"""
|
|
38
38
|
import sys, re, os
|
|
39
|
-
main_basename = re.sub(r'(.pyw?|\.exe|\.bin)?$', '', os.path.normcase(os.path.basename(
|
|
39
|
+
main_basename = re.sub(r'(.pyw?|\.exe|\.bin)?$', '', os.path.normcase(os.path.basename(__compiled__.original_argv0)))
|
|
40
40
|
{% for main_module_name, main_basename in zip(main_module_names, main_basenames) %}
|
|
41
41
|
if main_basename == "{{main_basename}}":
|
|
42
42
|
__import__("{{main_module_name.asString()}}")
|
|
@@ -28,7 +28,12 @@ from nuitka.nodes.VariableNameNodes import StatementAssignmentVariableName
|
|
|
28
28
|
from nuitka.Options import getFileReferenceMode
|
|
29
29
|
from nuitka.PythonVersions import python_version
|
|
30
30
|
|
|
31
|
-
from .
|
|
31
|
+
from .FutureSpecState import popFutureSpec, pushFutureSpec
|
|
32
|
+
from .TreeHelpers import (
|
|
33
|
+
buildNode,
|
|
34
|
+
makeStatementsSequenceFromStatement,
|
|
35
|
+
parseSourceCodeToAst,
|
|
36
|
+
)
|
|
32
37
|
from .VariableClosure import completeVariableClosures
|
|
33
38
|
|
|
34
39
|
|
|
@@ -51,7 +56,7 @@ def _makeCall(module_name, import_name, attribute_name, source_ref, *args):
|
|
|
51
56
|
)
|
|
52
57
|
|
|
53
58
|
|
|
54
|
-
def
|
|
59
|
+
def _getNameSpacePathExpression(package, source_ref):
|
|
55
60
|
"""Create the __path__ expression for a package."""
|
|
56
61
|
|
|
57
62
|
reference_mode = getFileReferenceMode()
|
|
@@ -135,12 +140,29 @@ def createPathAssignment(package, source_ref):
|
|
|
135
140
|
return StatementAssignmentVariableName(
|
|
136
141
|
provider=package,
|
|
137
142
|
variable_name="__path__",
|
|
138
|
-
source=
|
|
143
|
+
source=_getNameSpacePathExpression(package=package, source_ref=source_ref),
|
|
139
144
|
source_ref=source_ref,
|
|
140
145
|
)
|
|
141
146
|
|
|
142
147
|
|
|
148
|
+
def _getPathFinderFunction(package, source_ref):
|
|
149
|
+
# TODO: This could be a shared helper function, but we currently cannot do these.
|
|
150
|
+
ast_tree = parseSourceCodeToAst(
|
|
151
|
+
source_code="_path_finder = lambda *args, **kw: None",
|
|
152
|
+
module_name=package.getFullName(),
|
|
153
|
+
filename=source_ref.getFilename(),
|
|
154
|
+
line_offset=0,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
pushFutureSpec(package.getFullName())
|
|
158
|
+
statement = buildNode(package, ast_tree.body[0], source_ref)
|
|
159
|
+
popFutureSpec()
|
|
160
|
+
|
|
161
|
+
return statement.subnode_source
|
|
162
|
+
|
|
163
|
+
|
|
143
164
|
def createPython3NamespacePath(package, source_ref):
|
|
165
|
+
|
|
144
166
|
module_name = (
|
|
145
167
|
"_frozen_importlib" if python_version < 0x350 else "_frozen_importlib_external"
|
|
146
168
|
)
|
|
@@ -167,8 +189,8 @@ def createPython3NamespacePath(package, source_ref):
|
|
|
167
189
|
user_provided=True,
|
|
168
190
|
source_ref=source_ref,
|
|
169
191
|
),
|
|
170
|
-
|
|
171
|
-
|
|
192
|
+
_getNameSpacePathExpression(package=package, source_ref=source_ref),
|
|
193
|
+
_getPathFinderFunction(package=package, source_ref=source_ref),
|
|
172
194
|
),
|
|
173
195
|
user_provided=True,
|
|
174
196
|
source_ref=source_ref,
|
nuitka/tree/SourceHandling.py
CHANGED
|
@@ -16,8 +16,9 @@ from nuitka.__past__ import unicode
|
|
|
16
16
|
from nuitka.containers.OrderedSets import OrderedSet
|
|
17
17
|
from nuitka.plugins.Plugins import Plugins
|
|
18
18
|
from nuitka.PythonVersions import python_version, python_version_str
|
|
19
|
-
from nuitka.Tracing import general, my_print
|
|
20
|
-
from nuitka.utils.FileOperations import putTextFileContents
|
|
19
|
+
from nuitka.Tracing import general, inclusion_logger, my_print
|
|
20
|
+
from nuitka.utils.FileOperations import getReportPath, putTextFileContents
|
|
21
|
+
from nuitka.utils.ModuleNames import ModuleName, checkModuleName
|
|
21
22
|
from nuitka.utils.Shebang import getShebangFromSource, parseShebang
|
|
22
23
|
from nuitka.utils.Utils import isWin32OrPosixWindows
|
|
23
24
|
|
|
@@ -310,7 +311,23 @@ def writeSourceCode(filename, source_code):
|
|
|
310
311
|
putTextFileContents(filename=filename, contents=source_code, encoding="latin1")
|
|
311
312
|
|
|
312
313
|
|
|
313
|
-
def
|
|
314
|
+
def _checkAndAddModuleName(pyi_deps, pyi_filename, line_number, candidate):
|
|
315
|
+
if type(candidate) is not ModuleName:
|
|
316
|
+
if (
|
|
317
|
+
not checkModuleName(candidate)
|
|
318
|
+
or candidate.startswith(" ")
|
|
319
|
+
or candidate.endswith(" ")
|
|
320
|
+
):
|
|
321
|
+
inclusion_logger.warning(
|
|
322
|
+
"Encountered wrong '.pyi' parsing result in '%s:%d' giving illegal module name '%s'."
|
|
323
|
+
% (getReportPath(pyi_filename), line_number, candidate)
|
|
324
|
+
)
|
|
325
|
+
return None
|
|
326
|
+
|
|
327
|
+
pyi_deps.add(ModuleName(candidate))
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def parsePyIFile(module_name, package_name, pyi_filename):
|
|
314
331
|
"""Parse a pyi file for the given module name and extract imports made."""
|
|
315
332
|
|
|
316
333
|
# Complex stuff, pylint: disable=too-many-branches,too-many-statements
|
|
@@ -329,7 +346,7 @@ def parsePyIFile(module_name, pyi_filename):
|
|
|
329
346
|
source_filename=pyi_filename,
|
|
330
347
|
)
|
|
331
348
|
|
|
332
|
-
for line in pyi_contents.splitlines():
|
|
349
|
+
for line_number, line in enumerate(pyi_contents.splitlines(), start=1):
|
|
333
350
|
line = line.strip()
|
|
334
351
|
|
|
335
352
|
if in_quote:
|
|
@@ -338,19 +355,22 @@ def parsePyIFile(module_name, pyi_filename):
|
|
|
338
355
|
|
|
339
356
|
continue
|
|
340
357
|
|
|
341
|
-
if line.startswith('"""'):
|
|
358
|
+
if line.startswith('"""') and not line.endswith('"""'):
|
|
342
359
|
in_quote = '"""'
|
|
343
360
|
continue
|
|
344
361
|
|
|
345
|
-
if line.startswith("'''"):
|
|
362
|
+
if line.startswith("'''") and not line.endswith("'''"):
|
|
346
363
|
in_quote = "'''"
|
|
347
364
|
continue
|
|
348
365
|
|
|
349
366
|
if not in_import:
|
|
350
367
|
if line.startswith("import "):
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
368
|
+
_checkAndAddModuleName(
|
|
369
|
+
pyi_deps=pyi_deps,
|
|
370
|
+
pyi_filename=pyi_filename,
|
|
371
|
+
line_number=line_number,
|
|
372
|
+
candidate=line[7:].split("#", 1)[0].strip(),
|
|
373
|
+
)
|
|
354
374
|
elif line.startswith("from "):
|
|
355
375
|
parts = line.split(None, 3)
|
|
356
376
|
assert parts[0] == "from"
|
|
@@ -364,7 +384,7 @@ def parsePyIFile(module_name, pyi_filename):
|
|
|
364
384
|
continue
|
|
365
385
|
|
|
366
386
|
if origin_name == ".":
|
|
367
|
-
origin_name =
|
|
387
|
+
origin_name = package_name
|
|
368
388
|
else:
|
|
369
389
|
dot_count = 0
|
|
370
390
|
while origin_name.startswith("."):
|
|
@@ -373,18 +393,23 @@ def parsePyIFile(module_name, pyi_filename):
|
|
|
373
393
|
|
|
374
394
|
if dot_count > 0:
|
|
375
395
|
if origin_name:
|
|
376
|
-
origin_name =
|
|
396
|
+
origin_name = package_name.getRelativePackageName(
|
|
377
397
|
level=dot_count - 1
|
|
378
398
|
).getChildNamed(origin_name)
|
|
379
399
|
else:
|
|
380
|
-
origin_name =
|
|
400
|
+
origin_name = package_name.getRelativePackageName(
|
|
381
401
|
level=dot_count - 1
|
|
382
402
|
)
|
|
383
403
|
|
|
384
404
|
if origin_name != module_name:
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
405
|
+
_checkAndAddModuleName(
|
|
406
|
+
pyi_deps=pyi_deps,
|
|
407
|
+
pyi_filename=pyi_filename,
|
|
408
|
+
line_number=line_number,
|
|
409
|
+
candidate=origin_name,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
imported = parts[3].split("#", 1)[0].strip()
|
|
388
413
|
if imported.startswith("("):
|
|
389
414
|
# Handle multiline imports
|
|
390
415
|
if not imported.endswith(")"):
|
|
@@ -405,7 +430,12 @@ def parsePyIFile(module_name, pyi_filename):
|
|
|
405
430
|
for name in imported.split(","):
|
|
406
431
|
if name:
|
|
407
432
|
name = name.strip()
|
|
408
|
-
|
|
433
|
+
_checkAndAddModuleName(
|
|
434
|
+
pyi_deps=pyi_deps,
|
|
435
|
+
pyi_filename=pyi_filename,
|
|
436
|
+
line_number=line_number,
|
|
437
|
+
candidate=origin_name + "." + name,
|
|
438
|
+
)
|
|
409
439
|
|
|
410
440
|
else: # In import
|
|
411
441
|
imported = line
|
|
@@ -416,7 +446,16 @@ def parsePyIFile(module_name, pyi_filename):
|
|
|
416
446
|
for name in imported.split(","):
|
|
417
447
|
name = name.strip()
|
|
418
448
|
if name:
|
|
419
|
-
|
|
449
|
+
_checkAndAddModuleName(
|
|
450
|
+
pyi_deps=pyi_deps,
|
|
451
|
+
pyi_filename=pyi_filename,
|
|
452
|
+
line_number=line_number,
|
|
453
|
+
candidate=in_import_part + "." + name,
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
# Rejected module names have become None.
|
|
457
|
+
if None in pyi_deps:
|
|
458
|
+
pyi_deps.remove(None)
|
|
420
459
|
|
|
421
460
|
return pyi_deps
|
|
422
461
|
|
nuitka/utils/Distributions.py
CHANGED
|
@@ -118,8 +118,9 @@ is typically caused by corruption of its installation."""
|
|
|
118
118
|
def _getDistributionMetadataRecordData(distribution):
|
|
119
119
|
record_data = _getDistributionMetadataFileContents(distribution, "RECORD")
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
if record_data is not None:
|
|
122
|
+
for line in record_data.splitlines():
|
|
123
|
+
yield line.split(",")
|
|
123
124
|
|
|
124
125
|
|
|
125
126
|
def _readChunks(file_handle):
|
|
@@ -133,10 +134,15 @@ def _readChunks(file_handle):
|
|
|
133
134
|
def _makeRecordData(filename):
|
|
134
135
|
h = hashlib.sha256()
|
|
135
136
|
length = 0
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
with open(filename, "rb") as file_handle:
|
|
140
|
+
for block in _readChunks(file_handle):
|
|
141
|
+
length += len(block)
|
|
142
|
+
h.update(block)
|
|
143
|
+
except IOError:
|
|
144
|
+
pass
|
|
145
|
+
|
|
140
146
|
digest = "sha256=" + base64.urlsafe_b64encode(h.digest()).decode("latin1").rstrip(
|
|
141
147
|
"="
|
|
142
148
|
)
|
|
@@ -462,6 +468,20 @@ def isDistributionCondaPackage(distribution_name):
|
|
|
462
468
|
return getDistributionInstallerName(distribution_name) == "conda"
|
|
463
469
|
|
|
464
470
|
|
|
471
|
+
def isDistributionVendored(distribution_name):
|
|
472
|
+
# Only observed case with setuptools so far.
|
|
473
|
+
if getDistributionInstallerName(distribution_name) == "uv":
|
|
474
|
+
path = _getDistributionPath(getDistribution(distribution_name))
|
|
475
|
+
|
|
476
|
+
if path is not None:
|
|
477
|
+
if os.path.dirname(path).endswith(
|
|
478
|
+
(r"setuptools\_vendor", "setuptools/vendor")
|
|
479
|
+
):
|
|
480
|
+
return True
|
|
481
|
+
|
|
482
|
+
return False
|
|
483
|
+
|
|
484
|
+
|
|
465
485
|
def isDistributionMsys2Package(distribution_name):
|
|
466
486
|
if not isAnacondaPython():
|
|
467
487
|
return False
|
nuitka/utils/FileOperations.py
CHANGED
|
@@ -690,6 +690,12 @@ def changeFilenameExtension(path, extension):
|
|
|
690
690
|
return os.path.splitext(path)[0] + extension
|
|
691
691
|
|
|
692
692
|
|
|
693
|
+
def switchFilenameExtension(path, old_extension, new_extension):
|
|
694
|
+
"""Switch the filename extension specified to another one."""
|
|
695
|
+
assert path.endswith(old_extension)
|
|
696
|
+
return path[: -len(old_extension)] + new_extension
|
|
697
|
+
|
|
698
|
+
|
|
693
699
|
def hasFilenameExtension(path, extensions):
|
|
694
700
|
"""Has a filename one of the given extensions.
|
|
695
701
|
|
|
@@ -999,6 +1005,17 @@ def copyTree(source_path, dest_path):
|
|
|
999
1005
|
return copy_tree(source_path, dest_path)
|
|
1000
1006
|
|
|
1001
1007
|
|
|
1008
|
+
def resolveSymlink(path):
|
|
1009
|
+
"""Resolve a symlink, to a relative path."""
|
|
1010
|
+
link_source_abs = os.path.abspath(path)
|
|
1011
|
+
link_target_abs = os.path.abspath(
|
|
1012
|
+
os.path.join(os.path.dirname(path), os.readlink(path))
|
|
1013
|
+
)
|
|
1014
|
+
link_target_rel = relpath(link_target_abs, os.path.dirname(link_source_abs))
|
|
1015
|
+
|
|
1016
|
+
return link_target_rel
|
|
1017
|
+
|
|
1018
|
+
|
|
1002
1019
|
def copyFileWithPermissions(source_path, dest_path, dist_dir):
|
|
1003
1020
|
"""Improved version of shutil.copy2 for putting things to dist folder
|
|
1004
1021
|
|
|
@@ -1007,12 +1024,7 @@ def copyFileWithPermissions(source_path, dest_path, dist_dir):
|
|
|
1007
1024
|
"""
|
|
1008
1025
|
|
|
1009
1026
|
if os.path.islink(source_path) and not isWin32Windows():
|
|
1010
|
-
|
|
1011
|
-
link_target_abs = os.path.abspath(
|
|
1012
|
-
os.path.join(os.path.dirname(source_path), os.readlink(source_path))
|
|
1013
|
-
)
|
|
1014
|
-
|
|
1015
|
-
link_target_rel = relpath(link_target_abs, os.path.dirname(link_source_abs))
|
|
1027
|
+
link_target_rel = resolveSymlink(source_path)
|
|
1016
1028
|
|
|
1017
1029
|
if isFilenameBelowPath(
|
|
1018
1030
|
path=dist_dir,
|
nuitka/utils/StaticLibraries.py
CHANGED
|
@@ -14,6 +14,7 @@ from nuitka.PythonFlavors import (
|
|
|
14
14
|
isNuitkaPython,
|
|
15
15
|
isRyePython,
|
|
16
16
|
isSelfCompiledPythonUninstalled,
|
|
17
|
+
isUvPython,
|
|
17
18
|
)
|
|
18
19
|
from nuitka.PythonVersions import (
|
|
19
20
|
getPythonABI,
|
|
@@ -157,6 +158,9 @@ def _getSystemStaticLibPythonPath():
|
|
|
157
158
|
if isMacOS() and isRyePython():
|
|
158
159
|
return None
|
|
159
160
|
|
|
161
|
+
if isUvPython():
|
|
162
|
+
return None
|
|
163
|
+
|
|
160
164
|
if isSelfCompiledPythonUninstalled():
|
|
161
165
|
candidate = os.path.join(sys_prefix, "libpython" + python_abi_version + ".a")
|
|
162
166
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|