Nuitka-winsvc 2.7.7__cp313-cp313-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/Builtins.py +259 -0
- nuitka/BytecodeCaching.py +184 -0
- nuitka/Bytecodes.py +109 -0
- nuitka/CacheCleanup.py +54 -0
- nuitka/Constants.py +425 -0
- nuitka/Errors.py +93 -0
- nuitka/HardImportRegistry.py +408 -0
- nuitka/MainControl.py +1201 -0
- nuitka/ModuleRegistry.py +364 -0
- nuitka/OptionParsing.py +2473 -0
- nuitka/Options.py +2948 -0
- nuitka/OutputDirectories.py +201 -0
- nuitka/PostProcessing.py +551 -0
- nuitka/Progress.py +252 -0
- nuitka/PythonFlavors.py +426 -0
- nuitka/PythonOperators.py +146 -0
- nuitka/PythonVersions.py +513 -0
- nuitka/Serialization.py +291 -0
- nuitka/SourceCodeReferences.py +176 -0
- nuitka/Tracing.py +579 -0
- nuitka/TreeXML.py +141 -0
- nuitka/Variables.py +515 -0
- nuitka/Version.py +88 -0
- nuitka/__init__.py +19 -0
- nuitka/__main__.py +224 -0
- nuitka/__past__.py +217 -0
- nuitka/build/Backend.scons +1111 -0
- nuitka/build/CCompilerVersion.scons +281 -0
- nuitka/build/DataComposerInterface.py +116 -0
- nuitka/build/Offsets.scons +626 -0
- nuitka/build/Onefile.scons +564 -0
- nuitka/build/SconsCaching.py +451 -0
- nuitka/build/SconsCompilerSettings.py +1133 -0
- nuitka/build/SconsHacks.py +215 -0
- nuitka/build/SconsInterface.py +664 -0
- nuitka/build/SconsProgress.py +100 -0
- nuitka/build/SconsSpawn.py +436 -0
- nuitka/build/SconsUtils.py +939 -0
- nuitka/build/__init__.py +19 -0
- nuitka/build/include/nuitka/allocator.h +450 -0
- nuitka/build/include/nuitka/builtins.h +97 -0
- nuitka/build/include/nuitka/calling.h +123 -0
- nuitka/build/include/nuitka/checkers.h +39 -0
- nuitka/build/include/nuitka/checksum_tools.h +28 -0
- nuitka/build/include/nuitka/compiled_asyncgen.h +281 -0
- nuitka/build/include/nuitka/compiled_cell.h +64 -0
- nuitka/build/include/nuitka/compiled_coroutine.h +271 -0
- nuitka/build/include/nuitka/compiled_frame.h +502 -0
- nuitka/build/include/nuitka/compiled_function.h +170 -0
- nuitka/build/include/nuitka/compiled_generator.h +287 -0
- nuitka/build/include/nuitka/compiled_method.h +54 -0
- nuitka/build/include/nuitka/constants.h +251 -0
- nuitka/build/include/nuitka/constants_blob.h +34 -0
- nuitka/build/include/nuitka/debug_settings.h +60 -0
- nuitka/build/include/nuitka/environment_variables.h +30 -0
- nuitka/build/include/nuitka/environment_variables_system.h +51 -0
- nuitka/build/include/nuitka/exception_groups.h +167 -0
- nuitka/build/include/nuitka/exceptions.h +1458 -0
- nuitka/build/include/nuitka/filesystem_paths.h +117 -0
- nuitka/build/include/nuitka/freelists.h +92 -0
- nuitka/build/include/nuitka/hedley.h +1774 -0
- nuitka/build/include/nuitka/helper/attributes.h +90 -0
- nuitka/build/include/nuitka/helper/boolean.h +86 -0
- nuitka/build/include/nuitka/helper/bytearrays.h +34 -0
- nuitka/build/include/nuitka/helper/bytes.h +28 -0
- nuitka/build/include/nuitka/helper/calling_generated.h +132 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
- nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
- nuitka/build/include/nuitka/helper/comparisons_eq.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_ge.h +197 -0
- nuitka/build/include/nuitka/helper/comparisons_gt.h +197 -0
- nuitka/build/include/nuitka/helper/comparisons_le.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_lt.h +247 -0
- nuitka/build/include/nuitka/helper/comparisons_ne.h +197 -0
- nuitka/build/include/nuitka/helper/complex.h +46 -0
- nuitka/build/include/nuitka/helper/dictionaries.h +481 -0
- nuitka/build/include/nuitka/helper/floats.h +32 -0
- nuitka/build/include/nuitka/helper/import_hard.h +121 -0
- nuitka/build/include/nuitka/helper/indexes.h +47 -0
- nuitka/build/include/nuitka/helper/ints.h +165 -0
- nuitka/build/include/nuitka/helper/iterators.h +376 -0
- nuitka/build/include/nuitka/helper/lists.h +94 -0
- nuitka/build/include/nuitka/helper/lists_generated.h +36 -0
- nuitka/build/include/nuitka/helper/mappings.h +39 -0
- nuitka/build/include/nuitka/helper/operations.h +114 -0
- nuitka/build/include/nuitka/helper/operations_binary_add.h +240 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitand.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitor.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +108 -0
- nuitka/build/include/nuitka/helper/operations_binary_divmod.h +103 -0
- nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
- nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +103 -0
- nuitka/build/include/nuitka/helper/operations_binary_lshift.h +99 -0
- nuitka/build/include/nuitka/helper/operations_binary_matmult.h +60 -0
- nuitka/build/include/nuitka/helper/operations_binary_mod.h +304 -0
- nuitka/build/include/nuitka/helper/operations_binary_mult.h +247 -0
- nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +125 -0
- nuitka/build/include/nuitka/helper/operations_binary_pow.h +90 -0
- nuitka/build/include/nuitka/helper/operations_binary_rshift.h +99 -0
- nuitka/build/include/nuitka/helper/operations_binary_sub.h +117 -0
- nuitka/build/include/nuitka/helper/operations_binary_truediv.h +103 -0
- nuitka/build/include/nuitka/helper/operations_builtin_types.h +247 -0
- nuitka/build/include/nuitka/helper/operations_inplace_add.h +173 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +76 -0
- nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +95 -0
- nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +62 -0
- nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +60 -0
- nuitka/build/include/nuitka/helper/operations_inplace_mod.h +218 -0
- nuitka/build/include/nuitka/helper/operations_inplace_mult.h +184 -0
- nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +115 -0
- nuitka/build/include/nuitka/helper/operations_inplace_pow.h +87 -0
- nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +62 -0
- nuitka/build/include/nuitka/helper/operations_inplace_sub.h +102 -0
- nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +95 -0
- nuitka/build/include/nuitka/helper/raising.h +114 -0
- nuitka/build/include/nuitka/helper/rangeobjects.h +66 -0
- nuitka/build/include/nuitka/helper/richcomparisons.h +35 -0
- nuitka/build/include/nuitka/helper/sequences.h +33 -0
- nuitka/build/include/nuitka/helper/sets.h +25 -0
- nuitka/build/include/nuitka/helper/slices.h +314 -0
- nuitka/build/include/nuitka/helper/strings.h +30 -0
- nuitka/build/include/nuitka/helper/subscripts.h +390 -0
- nuitka/build/include/nuitka/helper/tuples.h +187 -0
- nuitka/build/include/nuitka/helpers.h +417 -0
- nuitka/build/include/nuitka/importing.h +149 -0
- nuitka/build/include/nuitka/incbin.h +402 -0
- nuitka/build/include/nuitka/jit_sources.h +25 -0
- nuitka/build/include/nuitka/prelude.h +626 -0
- nuitka/build/include/nuitka/printing.h +84 -0
- nuitka/build/include/nuitka/python_pgo.h +57 -0
- nuitka/build/include/nuitka/safe_string_ops.h +57 -0
- nuitka/build/include/nuitka/threading.h +142 -0
- nuitka/build/include/nuitka/tracing.h +82 -0
- nuitka/build/include/nuitka/type_aliases.h +30 -0
- nuitka/build/include/nuitka/unfreezing.h +91 -0
- nuitka/build/inline_copy/appdirs/LICENSE.txt +23 -0
- nuitka/build/inline_copy/appdirs/appdirs.py +611 -0
- nuitka/build/inline_copy/atomicwrites/LICENSE +19 -0
- nuitka/build/inline_copy/atomicwrites/atomicwrites.py +226 -0
- nuitka/build/inline_copy/bin/scons.py +58 -0
- nuitka/build/inline_copy/clcache/clcache/LICENSE +30 -0
- nuitka/build/inline_copy/clcache/clcache/__init__.py +4 -0
- nuitka/build/inline_copy/clcache/clcache/caching.py +2008 -0
- nuitka/build/inline_copy/colorama/LICENSE.txt +27 -0
- nuitka/build/inline_copy/colorama/colorama/__init__.py +6 -0
- nuitka/build/inline_copy/colorama/colorama/ansi.py +102 -0
- nuitka/build/inline_copy/colorama/colorama/ansitowin32.py +258 -0
- nuitka/build/inline_copy/colorama/colorama/initialise.py +80 -0
- nuitka/build/inline_copy/colorama/colorama/win32.py +152 -0
- nuitka/build/inline_copy/colorama/colorama/winterm.py +169 -0
- nuitka/build/inline_copy/glob2/LICENSE +27 -0
- nuitka/build/inline_copy/glob2/glob2/__init__.py +5 -0
- nuitka/build/inline_copy/glob2/glob2/compat.py +167 -0
- nuitka/build/inline_copy/glob2/glob2/fnmatch.py +141 -0
- nuitka/build/inline_copy/glob2/glob2/impl.py +216 -0
- nuitka/build/inline_copy/jinja2/LICENSE.rst +28 -0
- nuitka/build/inline_copy/jinja2/README.rst +2 -0
- nuitka/build/inline_copy/jinja2/jinja2/__init__.py +72 -0
- nuitka/build/inline_copy/jinja2/jinja2/_compat.py +105 -0
- nuitka/build/inline_copy/jinja2/jinja2/_identifier.py +2 -0
- nuitka/build/inline_copy/jinja2/jinja2/bccache.py +361 -0
- nuitka/build/inline_copy/jinja2/jinja2/compiler.py +1721 -0
- nuitka/build/inline_copy/jinja2/jinja2/constants.py +32 -0
- nuitka/build/inline_copy/jinja2/jinja2/debug.py +378 -0
- nuitka/build/inline_copy/jinja2/jinja2/defaults.py +56 -0
- nuitka/build/inline_copy/jinja2/jinja2/environment.py +1276 -0
- nuitka/build/inline_copy/jinja2/jinja2/exceptions.py +146 -0
- nuitka/build/inline_copy/jinja2/jinja2/ext.py +627 -0
- nuitka/build/inline_copy/jinja2/jinja2/filters.py +1190 -0
- nuitka/build/inline_copy/jinja2/jinja2/idtracking.py +286 -0
- nuitka/build/inline_copy/jinja2/jinja2/lexer.py +739 -0
- nuitka/build/inline_copy/jinja2/jinja2/loaders.py +483 -0
- nuitka/build/inline_copy/jinja2/jinja2/meta.py +106 -0
- nuitka/build/inline_copy/jinja2/jinja2/nativetypes.py +220 -0
- nuitka/build/inline_copy/jinja2/jinja2/nodes.py +999 -0
- nuitka/build/inline_copy/jinja2/jinja2/optimizer.py +49 -0
- nuitka/build/inline_copy/jinja2/jinja2/parser.py +903 -0
- nuitka/build/inline_copy/jinja2/jinja2/runtime.py +808 -0
- nuitka/build/inline_copy/jinja2/jinja2/sandbox.py +488 -0
- nuitka/build/inline_copy/jinja2/jinja2/tests.py +174 -0
- nuitka/build/inline_copy/jinja2/jinja2/utils.py +642 -0
- nuitka/build/inline_copy/jinja2/jinja2/visitor.py +87 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Action.py +1475 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Builder.py +905 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/CacheDir.py +314 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Conftest.py +805 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Debug.py +251 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Defaults.py +646 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Environment.py +2561 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/EnvironmentValues.py +119 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Errors.py +222 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Executor.py +660 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Job.py +439 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Memoize.py +242 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Alias.py +176 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/FS.py +3861 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Python.py +195 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/__init__.py +1784 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/PathList.py +224 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/__init__.py +341 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/aix.py +81 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/cygwin.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/darwin.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/hpux.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/irix.py +41 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/mingw.py +33 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/os2.py +55 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/posix.py +124 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/sunos.py +47 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/virtualenv.py +115 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/win32.py +429 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConf.py +1119 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConsign.py +453 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/C.py +226 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Dir.py +131 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Prog.py +114 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/RC.py +57 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/__init__.py +436 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Interactive.py +372 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Main.py +1469 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConsOptions.py +1071 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConscript.py +686 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/__init__.py +425 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Subst.py +979 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Taskmaster.py +1062 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/386asm.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/GettextCommon.py +429 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/__init__.py +52 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/arch.py +66 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/common.py +371 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/netframework.py +83 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/sdk.py +411 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vc.py +994 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vs.py +608 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/PharLapCommon.py +116 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/__init__.py +882 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixc++.py +43 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcc.py +74 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcxx.py +77 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixlink.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/applelink.py +209 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ar.py +63 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/as.py +49 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/asm.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/bcc32.py +81 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/c++.py +44 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cc.py +105 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clang.py +91 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangCommon/__init__.py +18 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangxx.py +99 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cxx.py +95 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cyglink.py +212 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/default.py +50 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/filesystem.py +98 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/g++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gas.py +56 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gcc.py +110 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gettext_tool.py +69 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gnulink.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gxx.py +78 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpc++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcc.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcxx.py +88 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hplink.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icc.py +59 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icl.py +52 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink.py +55 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink32.py +60 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/install.py +510 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/intelc.py +617 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/link.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/LoadableModule.py +131 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/SharedLibrary.py +218 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/__init__.py +171 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkloc.py +112 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/m4.py +63 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/masm.py +77 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mingw.py +232 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgfmt.py +132 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msginit.py +137 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgmerge.py +125 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslib.py +73 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslink.py +339 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mssdk.py +50 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvc.py +325 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvs.py +2116 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwcc.py +207 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwld.py +108 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/nasm.py +72 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rmic.py +139 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rpcgen.py +70 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgiar.py +68 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgic++.py +43 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicc.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicxx.py +61 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgilink.py +59 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunar.py +64 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunc++.py +45 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncc.py +58 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncxx.py +153 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunlink.py +79 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tar.py +73 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/textfile.py +198 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tlib.py +53 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/wix.py +104 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/xgettext.py +337 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/zip.py +120 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Util.py +2134 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/ConfigureCache.py +171 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/__init__.py +0 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/sconsign.py +494 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/BoolVariable.py +96 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/EnumVariable.py +110 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +152 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PackageVariable.py +107 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PathVariable.py +158 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/__init__.py +334 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Warnings.py +238 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/__init__.py +9 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/__init__.py +104 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/_scons_dbm.py +42 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/win32.py +101 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/cpp.py +640 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/dblite.py +295 -0
- nuitka/build/inline_copy/lib/scons-4.3.0/SCons/exitfuncs.py +59 -0
- nuitka/build/inline_copy/markupsafe/LICENSE.rst +28 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/__init__.py +327 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_compat.py +33 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_constants.py +264 -0
- nuitka/build/inline_copy/markupsafe/markupsafe/_native.py +69 -0
- nuitka/build/inline_copy/pefile/LICENSE.txt +21 -0
- 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/inline_copy/pefile/pefile.py +8034 -0
- nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +3272 -0
- nuitka/build/inline_copy/pkg_resources/pkg_resources/py31compat.py +21 -0
- nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
- nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
- nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
- nuitka/build/inline_copy/stubgen/six.py +998 -0
- nuitka/build/inline_copy/stubgen/stubgen.py +484 -0
- nuitka/build/inline_copy/tqdm/tqdm/__init__.py +40 -0
- nuitka/build/inline_copy/tqdm/tqdm/_main.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +97 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_notebook.py +9 -0
- nuitka/build/inline_copy/tqdm/tqdm/_tqdm_pandas.py +24 -0
- nuitka/build/inline_copy/tqdm/tqdm/_utils.py +12 -0
- nuitka/build/inline_copy/tqdm/tqdm/auto.py +44 -0
- nuitka/build/inline_copy/tqdm/tqdm/autonotebook.py +28 -0
- nuitka/build/inline_copy/tqdm/tqdm/dask.py +46 -0
- nuitka/build/inline_copy/tqdm/tqdm/notebook.py +316 -0
- nuitka/build/inline_copy/tqdm/tqdm/std.py +1524 -0
- nuitka/build/inline_copy/tqdm/tqdm/tk.py +207 -0
- nuitka/build/inline_copy/tqdm/tqdm/utils.py +351 -0
- nuitka/build/inline_copy/tqdm/tqdm/version.py +2 -0
- nuitka/build/inline_copy/yaml/LICENSE +20 -0
- nuitka/build/inline_copy/yaml/yaml/__init__.py +427 -0
- nuitka/build/inline_copy/yaml/yaml/composer.py +139 -0
- nuitka/build/inline_copy/yaml/yaml/constructor.py +748 -0
- nuitka/build/inline_copy/yaml/yaml/cyaml.py +101 -0
- nuitka/build/inline_copy/yaml/yaml/dumper.py +62 -0
- nuitka/build/inline_copy/yaml/yaml/emitter.py +1137 -0
- nuitka/build/inline_copy/yaml/yaml/error.py +75 -0
- nuitka/build/inline_copy/yaml/yaml/events.py +86 -0
- nuitka/build/inline_copy/yaml/yaml/loader.py +63 -0
- nuitka/build/inline_copy/yaml/yaml/nodes.py +49 -0
- nuitka/build/inline_copy/yaml/yaml/parser.py +589 -0
- nuitka/build/inline_copy/yaml/yaml/reader.py +185 -0
- nuitka/build/inline_copy/yaml/yaml/representer.py +389 -0
- nuitka/build/inline_copy/yaml/yaml/resolver.py +227 -0
- nuitka/build/inline_copy/yaml/yaml/scanner.py +1435 -0
- nuitka/build/inline_copy/yaml/yaml/serializer.py +111 -0
- nuitka/build/inline_copy/yaml/yaml/tokens.py +104 -0
- nuitka/build/inline_copy/zlib/LICENSE +22 -0
- nuitka/build/inline_copy/zlib/crc32.c +1049 -0
- nuitka/build/inline_copy/zlib/crc32.h +9446 -0
- nuitka/build/inline_copy/zlib/zconf.h +551 -0
- nuitka/build/inline_copy/zlib/zlib.h +1938 -0
- nuitka/build/inline_copy/zlib/zutil.h +275 -0
- nuitka/build/inline_copy/zstd/LICENSE.txt +30 -0
- nuitka/build/inline_copy/zstd/common/bitstream.h +463 -0
- nuitka/build/inline_copy/zstd/common/compiler.h +288 -0
- nuitka/build/inline_copy/zstd/common/cpu.h +213 -0
- nuitka/build/inline_copy/zstd/common/debug.h +107 -0
- nuitka/build/inline_copy/zstd/common/entropy_common.c +360 -0
- nuitka/build/inline_copy/zstd/common/error_private.c +56 -0
- nuitka/build/inline_copy/zstd/common/error_private.h +80 -0
- nuitka/build/inline_copy/zstd/common/fse.h +715 -0
- nuitka/build/inline_copy/zstd/common/fse_decompress.c +393 -0
- nuitka/build/inline_copy/zstd/common/huf.h +361 -0
- nuitka/build/inline_copy/zstd/common/mem.h +426 -0
- nuitka/build/inline_copy/zstd/common/xxhash.c +826 -0
- nuitka/build/inline_copy/zstd/common/xxhash.h +285 -0
- nuitka/build/inline_copy/zstd/common/zstd_common.c +83 -0
- nuitka/build/inline_copy/zstd/common/zstd_deps.h +111 -0
- nuitka/build/inline_copy/zstd/common/zstd_errors.h +95 -0
- nuitka/build/inline_copy/zstd/common/zstd_internal.h +478 -0
- nuitka/build/inline_copy/zstd/decompress/huf_decompress.c +1350 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_ddict.c +244 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_ddict.h +44 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress.c +1930 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.c +1540 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.h +62 -0
- nuitka/build/inline_copy/zstd/decompress/zstd_decompress_internal.h +190 -0
- nuitka/build/inline_copy/zstd/zstd.h +2391 -0
- nuitka/build/static_src/CompiledAsyncgenType.c +2211 -0
- nuitka/build/static_src/CompiledCellType.c +300 -0
- nuitka/build/static_src/CompiledCodeHelpers.c +2160 -0
- nuitka/build/static_src/CompiledCoroutineType.c +1946 -0
- nuitka/build/static_src/CompiledFrameType.c +1337 -0
- nuitka/build/static_src/CompiledFunctionType.c +3320 -0
- nuitka/build/static_src/CompiledGeneratorType.c +1997 -0
- nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +2117 -0
- nuitka/build/static_src/CompiledMethodType.c +614 -0
- nuitka/build/static_src/GenerateHeadersMain.c +30 -0
- nuitka/build/static_src/HelpersAllocator.c +939 -0
- nuitka/build/static_src/HelpersAttributes.c +1241 -0
- nuitka/build/static_src/HelpersBuiltin.c +901 -0
- nuitka/build/static_src/HelpersBuiltinTypeMethods.c +3594 -0
- nuitka/build/static_src/HelpersBytes.c +107 -0
- nuitka/build/static_src/HelpersCalling.c +397 -0
- nuitka/build/static_src/HelpersCallingGenerated.c +14361 -0
- nuitka/build/static_src/HelpersChecksumTools.c +59 -0
- nuitka/build/static_src/HelpersClasses.c +91 -0
- nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
- nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
- nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
- nuitka/build/static_src/HelpersComparisonEq.c +12070 -0
- nuitka/build/static_src/HelpersComparisonEqUtils.c +169 -0
- nuitka/build/static_src/HelpersComparisonGe.c +11871 -0
- nuitka/build/static_src/HelpersComparisonGt.c +11855 -0
- nuitka/build/static_src/HelpersComparisonLe.c +11957 -0
- nuitka/build/static_src/HelpersComparisonLt.c +11941 -0
- nuitka/build/static_src/HelpersComparisonNe.c +11979 -0
- nuitka/build/static_src/HelpersConsole.c +124 -0
- nuitka/build/static_src/HelpersConstantsBlob.c +1487 -0
- nuitka/build/static_src/HelpersDeepcopy.c +636 -0
- nuitka/build/static_src/HelpersDictionaries.c +1739 -0
- nuitka/build/static_src/HelpersDictionariesGenerated.c +738 -0
- nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
- nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
- nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +97 -0
- nuitka/build/static_src/HelpersExceptions.c +298 -0
- nuitka/build/static_src/HelpersFiles.c +353 -0
- nuitka/build/static_src/HelpersFilesystemPaths.c +1322 -0
- nuitka/build/static_src/HelpersFloats.c +92 -0
- nuitka/build/static_src/HelpersHeapStorage.c +68 -0
- nuitka/build/static_src/HelpersImport.c +506 -0
- nuitka/build/static_src/HelpersImportHard.c +526 -0
- nuitka/build/static_src/HelpersJitSources.c +48 -0
- nuitka/build/static_src/HelpersLists.c +899 -0
- nuitka/build/static_src/HelpersListsGenerated.c +564 -0
- nuitka/build/static_src/HelpersMappings.c +46 -0
- nuitka/build/static_src/HelpersMatching.c +192 -0
- nuitka/build/static_src/HelpersOperationBinaryAdd.c +6477 -0
- nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +703 -0
- nuitka/build/static_src/HelpersOperationBinaryBitand.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryBitor.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryBitxor.c +2738 -0
- nuitka/build/static_src/HelpersOperationBinaryDivmod.c +2406 -0
- nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +33 -0
- nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
- nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +2422 -0
- nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +220 -0
- nuitka/build/static_src/HelpersOperationBinaryLshift.c +2846 -0
- nuitka/build/static_src/HelpersOperationBinaryMatmult.c +453 -0
- nuitka/build/static_src/HelpersOperationBinaryMod.c +6549 -0
- nuitka/build/static_src/HelpersOperationBinaryMult.c +6438 -0
- nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +125 -0
- nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +2355 -0
- nuitka/build/static_src/HelpersOperationBinaryPow.c +2743 -0
- nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +26 -0
- nuitka/build/static_src/HelpersOperationBinaryRshift.c +2706 -0
- nuitka/build/static_src/HelpersOperationBinarySub.c +2649 -0
- nuitka/build/static_src/HelpersOperationBinaryTruediv.c +2415 -0
- nuitka/build/static_src/HelpersOperationInplaceAdd.c +5211 -0
- nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +144 -0
- nuitka/build/static_src/HelpersOperationInplaceBitand.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceBitor.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceBitxor.c +1826 -0
- nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +2605 -0
- nuitka/build/static_src/HelpersOperationInplaceLshift.c +1594 -0
- nuitka/build/static_src/HelpersOperationInplaceMatmult.c +603 -0
- nuitka/build/static_src/HelpersOperationInplaceMod.c +4762 -0
- nuitka/build/static_src/HelpersOperationInplaceMult.c +4689 -0
- nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +2553 -0
- nuitka/build/static_src/HelpersOperationInplacePow.c +2807 -0
- nuitka/build/static_src/HelpersOperationInplaceRshift.c +1534 -0
- nuitka/build/static_src/HelpersOperationInplaceSub.c +2894 -0
- nuitka/build/static_src/HelpersOperationInplaceTruediv.c +2612 -0
- nuitka/build/static_src/HelpersProfiling.c +104 -0
- nuitka/build/static_src/HelpersPythonPgo.c +113 -0
- nuitka/build/static_src/HelpersRaising.c +447 -0
- nuitka/build/static_src/HelpersSafeStrings.c +185 -0
- nuitka/build/static_src/HelpersSequences.c +134 -0
- nuitka/build/static_src/HelpersSlices.c +73 -0
- nuitka/build/static_src/HelpersStrings.c +998 -0
- nuitka/build/static_src/HelpersTuples.c +148 -0
- nuitka/build/static_src/HelpersTypes.c +329 -0
- nuitka/build/static_src/InspectPatcher.c +439 -0
- nuitka/build/static_src/MainProgram.c +2060 -0
- nuitka/build/static_src/MetaPathBasedLoader.c +2290 -0
- nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +125 -0
- nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +158 -0
- nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +785 -0
- nuitka/build/static_src/OnefileBootstrap.c +1580 -0
- nuitka/build/static_src/OnefileSplashScreen.cpp +275 -0
- nuitka/code_generation/AsyncgenCodes.py +186 -0
- nuitka/code_generation/AttributeCodes.py +357 -0
- nuitka/code_generation/BinaryOperationHelperDefinitions.py +720 -0
- nuitka/code_generation/BranchCodes.py +67 -0
- nuitka/code_generation/BuiltinCodes.py +529 -0
- nuitka/code_generation/CallCodes.py +1186 -0
- nuitka/code_generation/ClassCodes.py +156 -0
- nuitka/code_generation/CodeGeneration.py +1078 -0
- nuitka/code_generation/CodeHelperSelection.py +81 -0
- nuitka/code_generation/CodeHelpers.py +455 -0
- nuitka/code_generation/CodeObjectCodes.py +165 -0
- nuitka/code_generation/ComparisonCodes.py +569 -0
- nuitka/code_generation/ComparisonHelperDefinitions.py +146 -0
- nuitka/code_generation/ConditionalCodes.py +236 -0
- nuitka/code_generation/ConstantCodes.py +243 -0
- nuitka/code_generation/Contexts.py +1248 -0
- nuitka/code_generation/CoroutineCodes.py +253 -0
- nuitka/code_generation/CtypesCodes.py +46 -0
- nuitka/code_generation/DictCodes.py +918 -0
- nuitka/code_generation/Emission.py +75 -0
- nuitka/code_generation/ErrorCodes.py +281 -0
- nuitka/code_generation/EvalCodes.py +444 -0
- nuitka/code_generation/ExceptionCodes.py +337 -0
- nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +227 -0
- nuitka/code_generation/ExpressionCodes.py +61 -0
- nuitka/code_generation/FrameCodes.py +518 -0
- nuitka/code_generation/FunctionCodes.py +858 -0
- nuitka/code_generation/GeneratorCodes.py +218 -0
- nuitka/code_generation/GlobalConstants.py +249 -0
- nuitka/code_generation/GlobalsLocalsCodes.py +211 -0
- nuitka/code_generation/IdCodes.py +53 -0
- nuitka/code_generation/ImportCodes.py +468 -0
- nuitka/code_generation/Indentation.py +45 -0
- nuitka/code_generation/IndexCodes.py +50 -0
- nuitka/code_generation/InjectCCodes.py +28 -0
- nuitka/code_generation/IntegerCodes.py +110 -0
- nuitka/code_generation/IteratorCodes.py +378 -0
- nuitka/code_generation/JitCodes.py +44 -0
- nuitka/code_generation/LabelCodes.py +68 -0
- nuitka/code_generation/LineNumberCodes.py +91 -0
- nuitka/code_generation/ListCodes.py +502 -0
- nuitka/code_generation/LoaderCodes.py +193 -0
- nuitka/code_generation/LocalsDictCodes.py +359 -0
- nuitka/code_generation/LoopCodes.py +88 -0
- nuitka/code_generation/MatchCodes.py +67 -0
- nuitka/code_generation/ModuleCodes.py +247 -0
- nuitka/code_generation/Namify.py +260 -0
- nuitka/code_generation/NetworkxCodes.py +51 -0
- nuitka/code_generation/OperationCodes.py +398 -0
- nuitka/code_generation/PackageResourceCodes.py +986 -0
- nuitka/code_generation/PrintCodes.py +93 -0
- nuitka/code_generation/PythonAPICodes.py +215 -0
- nuitka/code_generation/RaisingCodes.py +481 -0
- nuitka/code_generation/Reports.py +115 -0
- nuitka/code_generation/ReturnCodes.py +143 -0
- nuitka/code_generation/SetCodes.py +196 -0
- nuitka/code_generation/SliceCodes.py +465 -0
- nuitka/code_generation/StringCodes.py +303 -0
- nuitka/code_generation/SubscriptCodes.py +263 -0
- nuitka/code_generation/TensorflowCodes.py +54 -0
- nuitka/code_generation/TryCodes.py +326 -0
- nuitka/code_generation/TupleCodes.py +115 -0
- nuitka/code_generation/TypeAliasCodes.py +120 -0
- nuitka/code_generation/VariableCodes.py +519 -0
- nuitka/code_generation/VariableDeclarations.py +279 -0
- nuitka/code_generation/YieldCodes.py +253 -0
- nuitka/code_generation/__init__.py +19 -0
- nuitka/code_generation/c_types/CTypeBases.py +177 -0
- nuitka/code_generation/c_types/CTypeBooleans.py +104 -0
- nuitka/code_generation/c_types/CTypeCFloats.py +57 -0
- nuitka/code_generation/c_types/CTypeCLongs.py +45 -0
- nuitka/code_generation/c_types/CTypeModuleDictVariables.py +109 -0
- nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +150 -0
- nuitka/code_generation/c_types/CTypeNuitkaInts.py +200 -0
- nuitka/code_generation/c_types/CTypeNuitkaVoids.py +107 -0
- nuitka/code_generation/c_types/CTypePyObjectPointers.py +572 -0
- nuitka/code_generation/c_types/CTypeVoids.py +92 -0
- nuitka/code_generation/c_types/__init__.py +19 -0
- nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +106 -0
- nuitka/code_generation/templates/CodeTemplatesConstants.py +296 -0
- nuitka/code_generation/templates/CodeTemplatesCoroutines.py +109 -0
- nuitka/code_generation/templates/CodeTemplatesExceptions.py +84 -0
- nuitka/code_generation/templates/CodeTemplatesFrames.py +235 -0
- nuitka/code_generation/templates/CodeTemplatesFunction.py +117 -0
- nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +130 -0
- nuitka/code_generation/templates/CodeTemplatesIterators.py +40 -0
- nuitka/code_generation/templates/CodeTemplatesLoader.py +180 -0
- nuitka/code_generation/templates/CodeTemplatesModules.py +710 -0
- nuitka/code_generation/templates/CodeTemplatesVariables.py +388 -0
- nuitka/code_generation/templates/TemplateDebugWrapper.py +80 -0
- nuitka/code_generation/templates/__init__.py +19 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +321 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +143 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +677 -0
- nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +165 -0
- nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +38 -0
- nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +41 -0
- nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +53 -0
- nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +364 -0
- nuitka/code_generation/templates_c/HelperImportHard.c.j2 +37 -0
- nuitka/code_generation/templates_c/HelperLongTools.c.j2 +53 -0
- nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +20 -0
- nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +148 -0
- nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +352 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +31 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +32 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +112 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +157 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +99 -0
- nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +115 -0
- nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +281 -0
- nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +420 -0
- nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +51 -0
- nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +71 -0
- nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +327 -0
- nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +411 -0
- nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +59 -0
- nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +229 -0
- nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +47 -0
- nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +55 -0
- nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +58 -0
- nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +62 -0
- nuitka/containers/Namedtuples.py +51 -0
- nuitka/containers/OrderedDicts.py +191 -0
- nuitka/containers/OrderedSets.py +123 -0
- nuitka/containers/OrderedSetsFallback.py +139 -0
- nuitka/containers/__init__.py +19 -0
- nuitka/distutils/Build.py +76 -0
- nuitka/distutils/DistutilCommands.py +438 -0
- nuitka/distutils/__init__.py +19 -0
- nuitka/finalizations/Finalization.py +35 -0
- nuitka/finalizations/FinalizeMarkups.py +136 -0
- nuitka/finalizations/__init__.py +19 -0
- nuitka/freezer/DependsExe.py +257 -0
- nuitka/freezer/DllDependenciesCommon.py +97 -0
- nuitka/freezer/DllDependenciesMacOS.py +444 -0
- nuitka/freezer/DllDependenciesPosix.py +242 -0
- nuitka/freezer/DllDependenciesWin32.py +315 -0
- nuitka/freezer/ImportDetection.py +359 -0
- nuitka/freezer/IncludedDataFiles.py +689 -0
- nuitka/freezer/IncludedEntryPoints.py +376 -0
- nuitka/freezer/Onefile.py +296 -0
- nuitka/freezer/Standalone.py +520 -0
- nuitka/freezer/__init__.py +19 -0
- nuitka/importing/IgnoreListing.py +449 -0
- nuitka/importing/ImportCache.py +95 -0
- nuitka/importing/ImportResolving.py +186 -0
- nuitka/importing/Importing.py +1200 -0
- nuitka/importing/PreloadedPackages.py +164 -0
- nuitka/importing/Recursion.py +611 -0
- nuitka/importing/StandardLibrary.py +429 -0
- nuitka/importing/__init__.py +19 -0
- nuitka/nodes/AsyncgenNodes.py +107 -0
- nuitka/nodes/AttributeLookupNodes.py +124 -0
- nuitka/nodes/AttributeNodes.py +386 -0
- nuitka/nodes/AttributeNodesGenerated.py +10734 -0
- nuitka/nodes/BuiltinAllNodes.py +115 -0
- nuitka/nodes/BuiltinAnyNodes.py +124 -0
- nuitka/nodes/BuiltinComplexNodes.py +83 -0
- nuitka/nodes/BuiltinDecodingNodes.py +52 -0
- nuitka/nodes/BuiltinDecoratorNodes.py +85 -0
- nuitka/nodes/BuiltinDictNodes.py +140 -0
- nuitka/nodes/BuiltinFormatNodes.py +159 -0
- nuitka/nodes/BuiltinHashNodes.py +63 -0
- nuitka/nodes/BuiltinInputNodes.py +39 -0
- nuitka/nodes/BuiltinIntegerNodes.py +170 -0
- nuitka/nodes/BuiltinIteratorNodes.py +391 -0
- nuitka/nodes/BuiltinLenNodes.py +61 -0
- nuitka/nodes/BuiltinNextNodes.py +111 -0
- nuitka/nodes/BuiltinOpenNodes.py +148 -0
- nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +7367 -0
- nuitka/nodes/BuiltinRangeNodes.py +690 -0
- nuitka/nodes/BuiltinRefNodes.py +314 -0
- nuitka/nodes/BuiltinSumNodes.py +104 -0
- nuitka/nodes/BuiltinTypeNodes.py +454 -0
- nuitka/nodes/BuiltinVarsNodes.py +44 -0
- nuitka/nodes/BytesNodes.py +829 -0
- nuitka/nodes/CallNodes.py +217 -0
- nuitka/nodes/Checkers.py +55 -0
- nuitka/nodes/ChildrenHavingMixins.py +21576 -0
- nuitka/nodes/ClassNodes.py +286 -0
- nuitka/nodes/CodeObjectSpecs.py +230 -0
- nuitka/nodes/ComparisonNodes.py +687 -0
- nuitka/nodes/ConditionalNodes.py +884 -0
- nuitka/nodes/ConstantRefNodes.py +1717 -0
- nuitka/nodes/ContainerMakingNodes.py +408 -0
- nuitka/nodes/ContainerOperationNodes.py +87 -0
- nuitka/nodes/CoroutineNodes.py +144 -0
- nuitka/nodes/CtypesNodes.py +51 -0
- nuitka/nodes/DictionaryNodes.py +1513 -0
- nuitka/nodes/ExceptionNodes.py +393 -0
- nuitka/nodes/ExecEvalNodes.py +229 -0
- nuitka/nodes/ExpressionBases.py +1301 -0
- nuitka/nodes/ExpressionBasesGenerated.py +2103 -0
- nuitka/nodes/ExpressionShapeMixins.py +886 -0
- nuitka/nodes/FrameNodes.py +413 -0
- nuitka/nodes/FunctionAttributeNodes.py +102 -0
- nuitka/nodes/FunctionNodes.py +1303 -0
- nuitka/nodes/FutureSpecs.py +224 -0
- nuitka/nodes/GeneratorNodes.py +201 -0
- nuitka/nodes/GlobalsLocalsNodes.py +209 -0
- nuitka/nodes/HardImportNodesGenerated.py +3599 -0
- nuitka/nodes/ImportHardNodes.py +185 -0
- nuitka/nodes/ImportNodes.py +1366 -0
- nuitka/nodes/IndicatorMixins.py +79 -0
- nuitka/nodes/InjectCNodes.py +51 -0
- nuitka/nodes/IterationHandles.py +407 -0
- nuitka/nodes/KeyValuePairNodes.py +378 -0
- nuitka/nodes/ListOperationNodes.py +525 -0
- nuitka/nodes/LocalsDictNodes.py +717 -0
- nuitka/nodes/LocalsScopes.py +505 -0
- nuitka/nodes/LoopNodes.py +445 -0
- nuitka/nodes/MatchNodes.py +60 -0
- nuitka/nodes/ModuleAttributeNodes.py +180 -0
- nuitka/nodes/ModuleNodes.py +1137 -0
- nuitka/nodes/NetworkxNodes.py +45 -0
- nuitka/nodes/NodeBases.py +890 -0
- nuitka/nodes/NodeMakingHelpers.py +481 -0
- nuitka/nodes/NodeMetaClasses.py +172 -0
- nuitka/nodes/OperatorNodes.py +944 -0
- nuitka/nodes/OperatorNodesUnary.py +403 -0
- nuitka/nodes/OsSysNodes.py +215 -0
- nuitka/nodes/OutlineNodes.py +372 -0
- nuitka/nodes/PackageMetadataNodes.py +982 -0
- nuitka/nodes/PackageResourceNodes.py +424 -0
- nuitka/nodes/PrintNodes.py +105 -0
- nuitka/nodes/ReturnNodes.py +255 -0
- nuitka/nodes/SideEffectNodes.py +139 -0
- nuitka/nodes/SliceNodes.py +386 -0
- nuitka/nodes/StatementBasesGenerated.py +3419 -0
- nuitka/nodes/StatementNodes.py +316 -0
- nuitka/nodes/StrNodes.py +919 -0
- nuitka/nodes/StringConcatenationNodes.py +103 -0
- nuitka/nodes/SubscriptNodes.py +245 -0
- nuitka/nodes/TensorflowNodes.py +38 -0
- nuitka/nodes/TryNodes.py +519 -0
- nuitka/nodes/TypeMatchNodes.py +65 -0
- nuitka/nodes/TypeNodes.py +390 -0
- nuitka/nodes/VariableAssignNodes.py +1177 -0
- nuitka/nodes/VariableDelNodes.py +320 -0
- nuitka/nodes/VariableNameNodes.py +153 -0
- nuitka/nodes/VariableRefNodes.py +895 -0
- nuitka/nodes/VariableReleaseNodes.py +153 -0
- nuitka/nodes/YieldNodes.py +121 -0
- nuitka/nodes/__init__.py +19 -0
- nuitka/nodes/shapes/BuiltinTypeShapes.py +4290 -0
- nuitka/nodes/shapes/ControlFlowDescriptions.py +199 -0
- nuitka/nodes/shapes/IteratorShapes.py +71 -0
- nuitka/nodes/shapes/ShapeMixins.py +255 -0
- nuitka/nodes/shapes/StandardShapes.py +1384 -0
- nuitka/nodes/shapes/__init__.py +19 -0
- nuitka/optimizations/BytecodeDemotion.py +105 -0
- nuitka/optimizations/FunctionInlining.py +110 -0
- nuitka/optimizations/Graphs.py +70 -0
- nuitka/optimizations/Optimization.py +363 -0
- nuitka/optimizations/OptimizeBuiltinCalls.py +1582 -0
- nuitka/optimizations/Tags.py +76 -0
- nuitka/optimizations/TraceCollections.py +1257 -0
- nuitka/optimizations/ValueTraces.py +980 -0
- nuitka/optimizations/__init__.py +19 -0
- nuitka/pgo/PGO.py +160 -0
- nuitka/pgo/__init__.py +19 -0
- nuitka/plugins/PluginBase.py +1924 -0
- nuitka/plugins/Plugins.py +2007 -0
- nuitka/plugins/YamlPluginBase.py +121 -0
- nuitka/plugins/__init__.py +19 -0
- nuitka/plugins/standard/AntiBloatPlugin.py +1024 -0
- nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +95 -0
- nuitka/plugins/standard/DataFilesPlugin.py +311 -0
- nuitka/plugins/standard/DelvewheelPlugin.py +150 -0
- nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
- nuitka/plugins/standard/DillPlugin/cloudpickle-postLoad.py +67 -0
- nuitka/plugins/standard/DillPlugin/dill-postLoad.py +223 -0
- nuitka/plugins/standard/DillPlugin.py +137 -0
- nuitka/plugins/standard/DllFilesPlugin.py +527 -0
- nuitka/plugins/standard/EnumPlugin.py +64 -0
- nuitka/plugins/standard/EventletPlugin.py +57 -0
- nuitka/plugins/standard/GeventPlugin.py +64 -0
- nuitka/plugins/standard/GiPlugin.py +118 -0
- nuitka/plugins/standard/GlfwPlugin.py +138 -0
- nuitka/plugins/standard/ImplicitImports.py +845 -0
- nuitka/plugins/standard/KivyPlugin.py +141 -0
- nuitka/plugins/standard/MatplotlibPlugin.py +256 -0
- nuitka/plugins/standard/MultiprocessingPlugin.py +199 -0
- nuitka/plugins/standard/NumpyPlugin.py +35 -0
- nuitka/plugins/standard/OptionsNannyPlugin.py +158 -0
- nuitka/plugins/standard/PbrPlugin.py +62 -0
- nuitka/plugins/standard/PkgResourcesPlugin.py +162 -0
- nuitka/plugins/standard/PlaywrightPlugin.py +179 -0
- nuitka/plugins/standard/PmwPlugin.py +248 -0
- nuitka/plugins/standard/PySidePyQtPlugin.py +1666 -0
- nuitka/plugins/standard/PywebViewPlugin.py +81 -0
- nuitka/plugins/standard/SpacyPlugin.py +137 -0
- nuitka/plugins/standard/TensorflowPlugin.py +35 -0
- nuitka/plugins/standard/TkinterPlugin.py +416 -0
- nuitka/plugins/standard/TorchPlugin.py +35 -0
- nuitka/plugins/standard/TransformersPlugin.py +121 -0
- nuitka/plugins/standard/TrioPlugin.py +33 -0
- nuitka/plugins/standard/UpxPlugin.py +174 -0
- nuitka/plugins/standard/__init__.py +19 -0
- nuitka/plugins/standard/standard.nuitka-package.config.yml +9313 -0
- nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +78 -0
- nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +468 -0
- nuitka/reports/CompilationReportReader.py +83 -0
- nuitka/reports/LicenseReport.rst.j2 +41 -0
- nuitka/reports/Reports.py +961 -0
- nuitka/reports/__init__.py +19 -0
- nuitka/specs/BuiltinBytesOperationSpecs.py +180 -0
- nuitka/specs/BuiltinDictOperationSpecs.py +82 -0
- nuitka/specs/BuiltinListOperationSpecs.py +80 -0
- nuitka/specs/BuiltinParameterSpecs.py +831 -0
- nuitka/specs/BuiltinStrOperationSpecs.py +181 -0
- nuitka/specs/BuiltinTypeOperationSpecs.py +34 -0
- nuitka/specs/BuiltinUnicodeOperationSpecs.py +123 -0
- nuitka/specs/HardImportSpecs.py +236 -0
- nuitka/specs/ParameterSpecs.py +630 -0
- nuitka/specs/__init__.py +19 -0
- nuitka/tools/Basics.py +55 -0
- nuitka/tools/__init__.py +19 -0
- nuitka/tools/commercial/__init__.py +21 -0
- nuitka/tools/data_composer/DataComposer.py +593 -0
- nuitka/tools/data_composer/__init__.py +19 -0
- nuitka/tools/data_composer/__main__.py +41 -0
- nuitka/tools/environments/CreateEnvironment.py +69 -0
- nuitka/tools/environments/Virtualenv.py +158 -0
- nuitka/tools/environments/__init__.py +19 -0
- nuitka/tools/general/__init__.py +19 -0
- nuitka/tools/general/dll_report/__init__.py +19 -0
- nuitka/tools/general/dll_report/__main__.py +83 -0
- nuitka/tools/general/find_module/FindModuleCode.py +127 -0
- nuitka/tools/general/find_module/__init__.py +19 -0
- nuitka/tools/general/generate_header/GenerateHeader.py +73 -0
- nuitka/tools/general/generate_header/__init__.py +19 -0
- nuitka/tools/onefile_compressor/OnefileCompressor.py +390 -0
- nuitka/tools/onefile_compressor/__init__.py +19 -0
- nuitka/tools/onefile_compressor/__main__.py +41 -0
- nuitka/tools/podman/Podman.py +55 -0
- nuitka/tools/podman/__init__.py +19 -0
- nuitka/tools/podman/__main__.py +425 -0
- nuitka/tools/profiler/__init__.py +19 -0
- nuitka/tools/profiler/__main__.py +93 -0
- nuitka/tools/scanning/DisplayDistributions.py +39 -0
- nuitka/tools/scanning/DisplayPackageDLLs.py +151 -0
- nuitka/tools/scanning/DisplayPackageData.py +73 -0
- nuitka/tools/scanning/__init__.py +19 -0
- nuitka/tools/specialize/CTypeDescriptions.py +1928 -0
- nuitka/tools/specialize/Common.py +380 -0
- nuitka/tools/specialize/SpecializeC.py +1483 -0
- nuitka/tools/specialize/SpecializePython.py +1151 -0
- nuitka/tools/specialize/__init__.py +19 -0
- nuitka/tools/testing/Common.py +2007 -0
- nuitka/tools/testing/Constructs.py +53 -0
- nuitka/tools/testing/DocTests.py +156 -0
- nuitka/tools/testing/OutputComparison.py +313 -0
- nuitka/tools/testing/Pythons.py +34 -0
- nuitka/tools/testing/RuntimeTracing.py +260 -0
- nuitka/tools/testing/SearchModes.py +208 -0
- nuitka/tools/testing/Valgrind.py +103 -0
- nuitka/tools/testing/__init__.py +19 -0
- nuitka/tools/testing/check_reference_counts/__init__.py +19 -0
- nuitka/tools/testing/check_reference_counts/__main__.py +107 -0
- nuitka/tools/testing/compare_with_cpython/__init__.py +19 -0
- nuitka/tools/testing/compare_with_cpython/__main__.py +942 -0
- nuitka/tools/testing/find_sxs_modules/__init__.py +19 -0
- nuitka/tools/testing/find_sxs_modules/__main__.py +73 -0
- nuitka/tools/testing/measure_construct_performance/__init__.py +19 -0
- nuitka/tools/testing/measure_construct_performance/__main__.py +288 -0
- nuitka/tools/testing/run_nuitka_tests/__init__.py +19 -0
- nuitka/tools/testing/run_nuitka_tests/__main__.py +1091 -0
- nuitka/tools/watch/AutoStage.py +145 -0
- nuitka/tools/watch/Common.py +55 -0
- nuitka/tools/watch/Conda.py +125 -0
- nuitka/tools/watch/GitHub.py +113 -0
- nuitka/tools/watch/Pacman.py +73 -0
- nuitka/tools/watch/Pipenv.py +145 -0
- nuitka/tools/watch/__init__.py +19 -0
- nuitka/tools/watch/__main__.py +615 -0
- nuitka/tree/Building.py +1459 -0
- nuitka/tree/ComplexCallHelperFunctions.py +2150 -0
- nuitka/tree/Extractions.py +48 -0
- nuitka/tree/FutureSpecState.py +71 -0
- nuitka/tree/InternalModule.py +96 -0
- nuitka/tree/Operations.py +45 -0
- nuitka/tree/ReformulationAssertStatements.py +97 -0
- nuitka/tree/ReformulationAssignmentStatements.py +1260 -0
- nuitka/tree/ReformulationBooleanExpressions.py +97 -0
- nuitka/tree/ReformulationCallExpressions.py +314 -0
- nuitka/tree/ReformulationClasses.py +407 -0
- nuitka/tree/ReformulationClasses3.py +1149 -0
- nuitka/tree/ReformulationComparisonExpressions.py +174 -0
- nuitka/tree/ReformulationContractionExpressions.py +676 -0
- nuitka/tree/ReformulationDictionaryCreation.py +304 -0
- nuitka/tree/ReformulationExecStatements.py +386 -0
- nuitka/tree/ReformulationForLoopStatements.py +215 -0
- nuitka/tree/ReformulationFunctionStatements.py +931 -0
- nuitka/tree/ReformulationImportStatements.py +333 -0
- nuitka/tree/ReformulationLambdaExpressions.py +185 -0
- nuitka/tree/ReformulationMatchStatements.py +797 -0
- nuitka/tree/ReformulationMultidist.py +80 -0
- nuitka/tree/ReformulationNamespacePackages.py +239 -0
- nuitka/tree/ReformulationPrintStatements.py +127 -0
- nuitka/tree/ReformulationSequenceCreation.py +438 -0
- nuitka/tree/ReformulationSubscriptExpressions.py +123 -0
- nuitka/tree/ReformulationTryExceptStatements.py +418 -0
- nuitka/tree/ReformulationTryFinallyStatements.py +239 -0
- nuitka/tree/ReformulationWhileLoopStatements.py +160 -0
- nuitka/tree/ReformulationWithStatements.py +382 -0
- nuitka/tree/ReformulationYieldExpressions.py +133 -0
- nuitka/tree/SourceHandling.py +476 -0
- nuitka/tree/SyntaxErrors.py +143 -0
- nuitka/tree/TreeHelpers.py +720 -0
- nuitka/tree/VariableClosure.py +483 -0
- nuitka/tree/__init__.py +19 -0
- nuitka/utils/AppDirs.py +104 -0
- nuitka/utils/CStrings.py +208 -0
- nuitka/utils/CommandLineOptions.py +207 -0
- nuitka/utils/Distributions.py +728 -0
- nuitka/utils/Download.py +217 -0
- nuitka/utils/Execution.py +517 -0
- nuitka/utils/FileOperations.py +1587 -0
- nuitka/utils/Hashing.py +137 -0
- nuitka/utils/Images.py +79 -0
- nuitka/utils/Importing.py +335 -0
- nuitka/utils/InlineCopies.py +52 -0
- nuitka/utils/InstalledPythons.py +254 -0
- nuitka/utils/InstanceCounters.py +86 -0
- nuitka/utils/Jinja2.py +158 -0
- nuitka/utils/Json.py +40 -0
- nuitka/utils/MacOSApp.py +134 -0
- nuitka/utils/MemoryUsage.py +165 -0
- nuitka/utils/ModuleNames.py +317 -0
- nuitka/utils/PackageResources.py +44 -0
- nuitka/utils/ReExecute.py +152 -0
- nuitka/utils/Rest.py +60 -0
- nuitka/utils/SharedLibraries.py +1014 -0
- nuitka/utils/Shebang.py +113 -0
- nuitka/utils/Signing.py +144 -0
- nuitka/utils/SlotMetaClasses.py +57 -0
- nuitka/utils/StaticLibraries.py +260 -0
- nuitka/utils/ThreadedExecutor.py +87 -0
- nuitka/utils/Timing.py +102 -0
- nuitka/utils/Utils.py +483 -0
- nuitka/utils/WindowsFileUsage.py +337 -0
- nuitka/utils/WindowsResources.py +652 -0
- nuitka/utils/Yaml.py +247 -0
- nuitka/utils/__init__.py +19 -0
- nuitka_winsvc-2.7.7.data/scripts/nuitka-run.cmd +24 -0
- nuitka_winsvc-2.7.7.data/scripts/nuitka.cmd +30 -0
- nuitka_winsvc-2.7.7.dist-info/METADATA +115 -0
- nuitka_winsvc-2.7.7.dist-info/RECORD +995 -0
- nuitka_winsvc-2.7.7.dist-info/WHEEL +5 -0
- nuitka_winsvc-2.7.7.dist-info/entry_points.txt +7 -0
- nuitka_winsvc-2.7.7.dist-info/licenses/LICENSE.txt +202 -0
- nuitka_winsvc-2.7.7.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,2007 @@
|
|
|
1
|
+
# Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
Plugins: Welcome to Nuitka! This is your shortest way to become part of it.
|
|
7
|
+
|
|
8
|
+
This is to provide the base class for all plugins. Some of which are part of
|
|
9
|
+
proper Nuitka, and some of which are waiting to be created and submitted for
|
|
10
|
+
inclusion by you.
|
|
11
|
+
|
|
12
|
+
The base class in PluginBase will serve as documentation of available.
|
|
13
|
+
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import inspect
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
import traceback
|
|
20
|
+
from contextlib import contextmanager
|
|
21
|
+
from optparse import OptionConflictError
|
|
22
|
+
|
|
23
|
+
from nuitka import Options, OutputDirectories
|
|
24
|
+
from nuitka.__past__ import basestring, iter_modules
|
|
25
|
+
from nuitka.build.DataComposerInterface import deriveModuleConstantsBlobName
|
|
26
|
+
from nuitka.containers.OrderedDicts import OrderedDict
|
|
27
|
+
from nuitka.containers.OrderedSets import OrderedSet
|
|
28
|
+
from nuitka.Errors import NuitkaSyntaxError
|
|
29
|
+
from nuitka.freezer.IncludedDataFiles import IncludedDataFile
|
|
30
|
+
from nuitka.freezer.IncludedEntryPoints import IncludedEntryPoint
|
|
31
|
+
from nuitka.ModuleRegistry import addUsedModule
|
|
32
|
+
from nuitka.PythonVersions import python_version
|
|
33
|
+
from nuitka.Tracing import plugins_logger, printLine
|
|
34
|
+
from nuitka.utils.CommandLineOptions import OurOptionGroup
|
|
35
|
+
from nuitka.utils.FileOperations import (
|
|
36
|
+
getDllBasename,
|
|
37
|
+
getNormalizedPath,
|
|
38
|
+
makePath,
|
|
39
|
+
putTextFileContents,
|
|
40
|
+
)
|
|
41
|
+
from nuitka.utils.Importing import importFileAsModule
|
|
42
|
+
from nuitka.utils.ModuleNames import (
|
|
43
|
+
ModuleName,
|
|
44
|
+
checkModuleName,
|
|
45
|
+
makeTriggerModuleName,
|
|
46
|
+
post_module_load_trigger_name,
|
|
47
|
+
pre_module_load_trigger_name,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
from .PluginBase import NuitkaPluginBase, control_tags
|
|
51
|
+
|
|
52
|
+
# Maps plugin name to plugin instances.
|
|
53
|
+
active_plugins = OrderedDict()
|
|
54
|
+
plugin_name2plugin_classes = {}
|
|
55
|
+
plugin_options = OrderedDict()
|
|
56
|
+
plugin_values = {}
|
|
57
|
+
user_plugins = OrderedSet()
|
|
58
|
+
|
|
59
|
+
# Trigger modules
|
|
60
|
+
pre_modules = {}
|
|
61
|
+
pre_modules_reasons = {}
|
|
62
|
+
post_modules = {}
|
|
63
|
+
post_modules_reasons = {}
|
|
64
|
+
fake_modules = {}
|
|
65
|
+
has_active_gui_toolkit_plugin = False
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@contextmanager
|
|
69
|
+
def withPluginProblemReporting(plugin, template, args):
|
|
70
|
+
try:
|
|
71
|
+
yield
|
|
72
|
+
except Exception: # Catch all the things, pylint: disable=broad-except
|
|
73
|
+
message = """\
|
|
74
|
+
Plugin issue while working on '%s'. Please report the bug with the above \
|
|
75
|
+
traceback included.""" % (
|
|
76
|
+
template % args
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
if Options.is_debug:
|
|
80
|
+
plugin.warning(message)
|
|
81
|
+
raise
|
|
82
|
+
|
|
83
|
+
traceback.print_exception(*sys.exc_info())
|
|
84
|
+
|
|
85
|
+
plugin.sysexit(message)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def withPluginModuleNameProblemReporting(plugin, module_name):
|
|
89
|
+
return withPluginProblemReporting(plugin, "module '%s'", module_name.asString())
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def withPluginModuleProblemReporting(plugin, module):
|
|
93
|
+
return withPluginModuleNameProblemReporting(plugin, module.getFullName())
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _addActivePlugin(plugin_class, args, force=False):
|
|
97
|
+
plugin_name = plugin_class.plugin_name
|
|
98
|
+
|
|
99
|
+
# No duplicates please.
|
|
100
|
+
if not force:
|
|
101
|
+
assert plugin_name not in active_plugins.keys(), (
|
|
102
|
+
plugin_name,
|
|
103
|
+
active_plugins[plugin_name],
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
if args:
|
|
107
|
+
plugin_args = getPluginOptions(plugin_name)
|
|
108
|
+
else:
|
|
109
|
+
plugin_args = {}
|
|
110
|
+
|
|
111
|
+
with withPluginProblemReporting(plugin_class, "plugin initialization", ()):
|
|
112
|
+
plugin_instance = plugin_class(**plugin_args)
|
|
113
|
+
|
|
114
|
+
assert isinstance(plugin_instance, NuitkaPluginBase), plugin_instance
|
|
115
|
+
|
|
116
|
+
active_plugins[plugin_name] = plugin_instance
|
|
117
|
+
|
|
118
|
+
is_gui_toolkit_plugin = getattr(plugin_class, "plugin_gui_toolkit", False)
|
|
119
|
+
|
|
120
|
+
# Singleton, pylint: disable=global-statement
|
|
121
|
+
global has_active_gui_toolkit_plugin
|
|
122
|
+
has_active_gui_toolkit_plugin = (
|
|
123
|
+
has_active_gui_toolkit_plugin or is_gui_toolkit_plugin
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# Do GUI toolkit exclusion control tags generically. You may have two of
|
|
127
|
+
# them and we don't want them to override each other.
|
|
128
|
+
if is_gui_toolkit_plugin:
|
|
129
|
+
for binding_name in getGUIBindingNames():
|
|
130
|
+
is_matching = binding_name.lower() == plugin_class.binding_name.lower()
|
|
131
|
+
|
|
132
|
+
tag_name = "use_%s" % binding_name.lower()
|
|
133
|
+
|
|
134
|
+
# Set if matching, set to False only if not matching and not already set.
|
|
135
|
+
if is_matching:
|
|
136
|
+
control_tags[tag_name] = True
|
|
137
|
+
elif is_matching not in control_tags:
|
|
138
|
+
control_tags[tag_name] = False
|
|
139
|
+
|
|
140
|
+
control_tags.update(plugin_instance.getEvaluationConditionControlTags())
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def getActivePlugins():
|
|
144
|
+
"""Return list of active plugins.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
list of plugins
|
|
148
|
+
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
return active_plugins.values()
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def getActiveQtPlugin():
|
|
155
|
+
"""Get active Qt plugin name."""
|
|
156
|
+
for plugin_name in getQtPluginNames():
|
|
157
|
+
if hasActivePlugin(plugin_name):
|
|
158
|
+
if hasActivePlugin(plugin_name):
|
|
159
|
+
return plugin_name
|
|
160
|
+
|
|
161
|
+
return None
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def getActiveQtPluginBindingName():
|
|
165
|
+
"""Get active Qt plugin binding name."""
|
|
166
|
+
plugin_name = getActiveQtPlugin()
|
|
167
|
+
|
|
168
|
+
if plugin_name is None:
|
|
169
|
+
return None
|
|
170
|
+
else:
|
|
171
|
+
return getPluginClass(plugin_name).binding_name
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def getQtBindingNames():
|
|
175
|
+
return ("PySide", "PySide2", "PySide6", "PyQt4", "PyQt5", "PyQt6")
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def getOtherGUIBindingNames():
|
|
179
|
+
return ("wx", "tkinter", "Tkinter")
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def getGUIBindingNames():
|
|
183
|
+
return getQtBindingNames() + getOtherGUIBindingNames()
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def getQtPluginNames():
|
|
187
|
+
return tuple(qt_binding_name.lower() for qt_binding_name in getQtBindingNames())
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def getOtherGuiPluginNames():
|
|
191
|
+
return ("tk-inter",)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def getGuiPluginNames():
|
|
195
|
+
return getQtPluginNames() + getOtherGuiPluginNames()
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def hasActiveGuiPluginForBinding(binding_name):
|
|
199
|
+
if binding_name in ("tkinter", "Tkinter"):
|
|
200
|
+
return hasActivePlugin("tk-inter")
|
|
201
|
+
elif binding_name in getQtBindingNames():
|
|
202
|
+
return hasActivePlugin(binding_name.lower())
|
|
203
|
+
else:
|
|
204
|
+
# For wx, we do not have a plugin right now, it just works, but
|
|
205
|
+
# also means it cannot be picked.
|
|
206
|
+
return False
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def hasActivePlugin(plugin_name):
|
|
210
|
+
"""Decide if a plugin is active.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
plugin_name - name of the plugin
|
|
214
|
+
|
|
215
|
+
Notes:
|
|
216
|
+
Detectors do not count as an active plugin and ignored.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
bool - plugin is loaded
|
|
220
|
+
|
|
221
|
+
"""
|
|
222
|
+
if plugin_name not in active_plugins:
|
|
223
|
+
return False
|
|
224
|
+
|
|
225
|
+
# Detectors do not count.
|
|
226
|
+
plugin_instance = active_plugins.get(plugin_name)
|
|
227
|
+
return not hasattr(plugin_instance, "detector_for")
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def getUserActivatedPluginNames():
|
|
231
|
+
for plugin_name, plugin_instance in active_plugins.items():
|
|
232
|
+
# Detectors do not count.
|
|
233
|
+
if hasattr(plugin_instance, "detector_for"):
|
|
234
|
+
continue
|
|
235
|
+
|
|
236
|
+
# Always activated does not count either
|
|
237
|
+
if plugin_instance.isAlwaysEnabled():
|
|
238
|
+
continue
|
|
239
|
+
|
|
240
|
+
yield plugin_name
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def getPluginClass(plugin_name):
|
|
244
|
+
# First, load plugin classes, to know what we are talking about.
|
|
245
|
+
loadPlugins()
|
|
246
|
+
|
|
247
|
+
# Backward compatibility.
|
|
248
|
+
plugin_name = Options.getPluginNameConsideringRenames(plugin_name)
|
|
249
|
+
|
|
250
|
+
if plugin_name not in plugin_name2plugin_classes:
|
|
251
|
+
for plugin_name2 in plugin_name2plugin_classes:
|
|
252
|
+
if plugin_name.lower() == plugin_name2.lower():
|
|
253
|
+
plugins_logger.sysexit(
|
|
254
|
+
"""\
|
|
255
|
+
Error, unknown plug-in '%s' in wrong case referenced, use '%s' instead."""
|
|
256
|
+
% (plugin_name, plugin_name2)
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
plugins_logger.sysexit("Error, unknown plug-in '%s' referenced." % plugin_name)
|
|
260
|
+
|
|
261
|
+
return plugin_name2plugin_classes[plugin_name][0]
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def hasPluginName(plugin_name):
|
|
265
|
+
# First, load plugin classes, to know what we are talking about.
|
|
266
|
+
loadPlugins()
|
|
267
|
+
|
|
268
|
+
# Backward compatibility.
|
|
269
|
+
plugin_name = Options.getPluginNameConsideringRenames(plugin_name)
|
|
270
|
+
|
|
271
|
+
return plugin_name in plugin_name2plugin_classes
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def _addPluginClass(plugin_class, detector):
|
|
275
|
+
plugin_name = plugin_class.plugin_name
|
|
276
|
+
|
|
277
|
+
if plugin_name in plugin_name2plugin_classes:
|
|
278
|
+
plugins_logger.sysexit(
|
|
279
|
+
"Error, plugins collide by name %s: %s <-> %s"
|
|
280
|
+
% (plugin_name, plugin_class, plugin_name2plugin_classes[plugin_name])
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
plugin_name2plugin_classes[plugin_name] = (
|
|
284
|
+
plugin_class,
|
|
285
|
+
detector,
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def _loadPluginClassesFromPackage(scan_package):
|
|
290
|
+
scan_path = scan_package.__path__
|
|
291
|
+
|
|
292
|
+
for item in iter_modules(scan_path):
|
|
293
|
+
if item.ispkg: # spell-checker: ignore ispkg
|
|
294
|
+
continue
|
|
295
|
+
|
|
296
|
+
if python_version < 0x3C0:
|
|
297
|
+
module_loader = item.module_finder.find_module(item.name)
|
|
298
|
+
else:
|
|
299
|
+
module_loader = item.module_finder.find_spec(item.name).loader
|
|
300
|
+
|
|
301
|
+
# Ignore bytecode only left overs.
|
|
302
|
+
try:
|
|
303
|
+
if module_loader.get_filename().endswith(".pyc"):
|
|
304
|
+
continue
|
|
305
|
+
except AttributeError:
|
|
306
|
+
# Not a bytecode loader, but e.g. extension module, which is OK in case
|
|
307
|
+
# it was compiled with Nuitka.
|
|
308
|
+
pass
|
|
309
|
+
|
|
310
|
+
try:
|
|
311
|
+
plugin_module = module_loader.load_module(item.name)
|
|
312
|
+
except Exception:
|
|
313
|
+
if Options.is_non_debug:
|
|
314
|
+
plugins_logger.warning(
|
|
315
|
+
"Problem loading plugin %r ('%s'), ignored. Use '--debug' to make it visible."
|
|
316
|
+
% (item.name, module_loader.get_filename())
|
|
317
|
+
)
|
|
318
|
+
continue
|
|
319
|
+
|
|
320
|
+
raise
|
|
321
|
+
|
|
322
|
+
# At least for Python2, this is not set properly, but we use it for package
|
|
323
|
+
# data loading.
|
|
324
|
+
plugin_module.__package__ = scan_package.__name__
|
|
325
|
+
|
|
326
|
+
plugin_classes = set(
|
|
327
|
+
obj
|
|
328
|
+
for obj in plugin_module.__dict__.values()
|
|
329
|
+
if isObjectAUserPluginBaseClass(obj)
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
detectors = [
|
|
333
|
+
plugin_class
|
|
334
|
+
for plugin_class in plugin_classes
|
|
335
|
+
if hasattr(plugin_class, "detector_for")
|
|
336
|
+
]
|
|
337
|
+
|
|
338
|
+
# First the ones with detectors.
|
|
339
|
+
for detector in detectors:
|
|
340
|
+
plugin_class = detector.detector_for
|
|
341
|
+
|
|
342
|
+
if detector.__name__.replace(
|
|
343
|
+
"NuitkaPluginDetector", ""
|
|
344
|
+
) != plugin_class.__name__.replace("NuitkaPlugin", ""):
|
|
345
|
+
plugins_logger.warning(
|
|
346
|
+
"Class names %r and %r do not match NuitkaPlugin* and NuitkaPluginDetector* naming convention."
|
|
347
|
+
% (plugin_class.__name__, detector.__name__)
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
assert detector.plugin_name is None, detector
|
|
351
|
+
detector.plugin_name = plugin_class.plugin_name
|
|
352
|
+
|
|
353
|
+
if plugin_class not in plugin_classes:
|
|
354
|
+
plugins_logger.sysexit(
|
|
355
|
+
"Plugin detector %r references unknown plugin %r"
|
|
356
|
+
% (detector, plugin_class)
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
plugin_classes.remove(detector)
|
|
360
|
+
plugin_classes.remove(plugin_class)
|
|
361
|
+
|
|
362
|
+
_addPluginClass(
|
|
363
|
+
plugin_class=plugin_class,
|
|
364
|
+
detector=detector,
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
# Remaining ones have no detector.
|
|
368
|
+
for plugin_class in plugin_classes:
|
|
369
|
+
_addPluginClass(plugin_class=plugin_class, detector=None)
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def loadStandardPluginClasses():
|
|
373
|
+
"""Load plugin files located in 'standard' folder.
|
|
374
|
+
|
|
375
|
+
Notes:
|
|
376
|
+
Scan through the 'standard' and 'commercial' plugins. Import each valid
|
|
377
|
+
Python module (but not packages) and process it as a plugin.
|
|
378
|
+
Returns:
|
|
379
|
+
None
|
|
380
|
+
"""
|
|
381
|
+
import nuitka.plugins.standard
|
|
382
|
+
|
|
383
|
+
_loadPluginClassesFromPackage(nuitka.plugins.standard)
|
|
384
|
+
|
|
385
|
+
try:
|
|
386
|
+
import nuitka.plugins.commercial
|
|
387
|
+
except ImportError:
|
|
388
|
+
pass
|
|
389
|
+
else:
|
|
390
|
+
_loadPluginClassesFromPackage(nuitka.plugins.commercial)
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
class Plugins(object):
|
|
394
|
+
implicit_imports_cache = {}
|
|
395
|
+
extra_scan_paths_cache = {}
|
|
396
|
+
|
|
397
|
+
@staticmethod
|
|
398
|
+
def _considerImplicitImports(plugin, module):
|
|
399
|
+
result = []
|
|
400
|
+
|
|
401
|
+
def iterateModuleNames(value):
|
|
402
|
+
for v in value:
|
|
403
|
+
if type(v) in (tuple, list):
|
|
404
|
+
plugin.sysexit(
|
|
405
|
+
"Plugin '%s' needs to be change to only return modules names, not %r (for module '%s')"
|
|
406
|
+
% (plugin.plugin_name, v, module.getFullName())
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
if inspect.isgenerator(v):
|
|
410
|
+
for w in iterateModuleNames(v):
|
|
411
|
+
yield w
|
|
412
|
+
|
|
413
|
+
return
|
|
414
|
+
|
|
415
|
+
if not checkModuleName(v):
|
|
416
|
+
plugin.sysexit(
|
|
417
|
+
"Plugin '%s' returned an invalid module name, not %r (for module '%s')"
|
|
418
|
+
% (plugin.plugin_name, v, module.getFullName())
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
yield ModuleName(v)
|
|
422
|
+
|
|
423
|
+
seen = set()
|
|
424
|
+
|
|
425
|
+
for full_name in iterateModuleNames(plugin.getImplicitImports(module)):
|
|
426
|
+
if full_name in seen:
|
|
427
|
+
continue
|
|
428
|
+
seen.add(full_name)
|
|
429
|
+
|
|
430
|
+
# Ignore dependencies on self. TODO: Make this an error for the
|
|
431
|
+
# plugin.
|
|
432
|
+
if full_name == module.getFullName():
|
|
433
|
+
continue
|
|
434
|
+
|
|
435
|
+
try:
|
|
436
|
+
module_filename = plugin.locateModule(full_name)
|
|
437
|
+
except Exception:
|
|
438
|
+
plugin.warning(
|
|
439
|
+
"Problem locating '%s' for implicit imports of '%s'."
|
|
440
|
+
% (full_name, module.getFullName())
|
|
441
|
+
)
|
|
442
|
+
raise
|
|
443
|
+
|
|
444
|
+
if module_filename is None:
|
|
445
|
+
if Options.isShowInclusion():
|
|
446
|
+
plugin.info(
|
|
447
|
+
"Implicit module '%s' suggested for '%s' not found."
|
|
448
|
+
% (full_name, module.getFullName())
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
continue
|
|
452
|
+
|
|
453
|
+
result.append((full_name, module_filename))
|
|
454
|
+
|
|
455
|
+
if result and Options.isShowInclusion():
|
|
456
|
+
plugin.info(
|
|
457
|
+
"Implicit dependencies of module '%s' added '%s'."
|
|
458
|
+
% (module.getFullName(), ",".join(r[0] for r in result))
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
return result
|
|
462
|
+
|
|
463
|
+
@staticmethod
|
|
464
|
+
def _reportImplicitImports(plugin, module, implicit_imports):
|
|
465
|
+
from nuitka.importing.Importing import getModuleNameAndKindFromFilename
|
|
466
|
+
from nuitka.importing.Recursion import decideRecursion, recurseTo
|
|
467
|
+
|
|
468
|
+
for full_name, module_filename in implicit_imports:
|
|
469
|
+
# TODO: The module_kind should be forwarded from previous in the class using locateModule code.
|
|
470
|
+
_module_name2, module_kind = getModuleNameAndKindFromFilename(
|
|
471
|
+
module_filename
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
# This will get back to all other plugins allowing them to inhibit it though.
|
|
475
|
+
decision, decision_reason = decideRecursion(
|
|
476
|
+
using_module_name=module.getFullName(),
|
|
477
|
+
module_filename=module_filename,
|
|
478
|
+
module_name=full_name,
|
|
479
|
+
module_kind=module_kind,
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
if decision:
|
|
483
|
+
imported_module = recurseTo(
|
|
484
|
+
module_name=full_name,
|
|
485
|
+
module_filename=module_filename,
|
|
486
|
+
module_kind=module_kind,
|
|
487
|
+
source_ref=module.getSourceReference(),
|
|
488
|
+
reason="implicit import",
|
|
489
|
+
using_module_name=module.module_name,
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
addUsedModule(
|
|
493
|
+
module=imported_module,
|
|
494
|
+
using_module=module,
|
|
495
|
+
usage_tag="plugin:" + plugin.plugin_name,
|
|
496
|
+
reason=decision_reason,
|
|
497
|
+
source_ref=module.source_ref,
|
|
498
|
+
)
|
|
499
|
+
|
|
500
|
+
@classmethod
|
|
501
|
+
def _getPackageExtraScanPaths(cls, plugin, package_name, package_dir):
|
|
502
|
+
with withPluginModuleNameProblemReporting(plugin, package_name):
|
|
503
|
+
for path in plugin.getPackageExtraScanPaths(package_name, package_dir):
|
|
504
|
+
if os.path.isdir(path):
|
|
505
|
+
yield path
|
|
506
|
+
|
|
507
|
+
@classmethod
|
|
508
|
+
def getPackageExtraScanPaths(cls, package_name, package_dir):
|
|
509
|
+
key = package_name, package_dir
|
|
510
|
+
|
|
511
|
+
if key not in cls.extra_scan_paths_cache:
|
|
512
|
+
cls.extra_scan_paths_cache[key] = ()
|
|
513
|
+
|
|
514
|
+
for plugin in getActivePlugins():
|
|
515
|
+
cls.extra_scan_paths_cache[key] += tuple(
|
|
516
|
+
cls._getPackageExtraScanPaths(
|
|
517
|
+
plugin=plugin,
|
|
518
|
+
package_name=package_name,
|
|
519
|
+
package_dir=package_dir,
|
|
520
|
+
)
|
|
521
|
+
)
|
|
522
|
+
|
|
523
|
+
return cls.extra_scan_paths_cache[key]
|
|
524
|
+
|
|
525
|
+
@classmethod
|
|
526
|
+
def considerImplicitImports(cls, module):
|
|
527
|
+
for plugin in getActivePlugins():
|
|
528
|
+
key = (module.getFullName(), plugin)
|
|
529
|
+
|
|
530
|
+
if key not in cls.implicit_imports_cache:
|
|
531
|
+
with withPluginModuleProblemReporting(plugin, module):
|
|
532
|
+
cls.implicit_imports_cache[key] = tuple(
|
|
533
|
+
cls._considerImplicitImports(plugin=plugin, module=module)
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
cls._reportImplicitImports(
|
|
537
|
+
plugin=plugin,
|
|
538
|
+
module=module,
|
|
539
|
+
implicit_imports=cls.implicit_imports_cache[key],
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
# Pre and post load code may have been created, if so indicate it's used.
|
|
543
|
+
full_name = module.getFullName()
|
|
544
|
+
|
|
545
|
+
if full_name in pre_modules:
|
|
546
|
+
addUsedModule(
|
|
547
|
+
pre_modules[full_name],
|
|
548
|
+
using_module=module,
|
|
549
|
+
usage_tag="plugins",
|
|
550
|
+
reason=" ".join(pre_modules_reasons[full_name]),
|
|
551
|
+
source_ref=module.source_ref,
|
|
552
|
+
)
|
|
553
|
+
|
|
554
|
+
if full_name in post_modules:
|
|
555
|
+
addUsedModule(
|
|
556
|
+
module=post_modules[full_name],
|
|
557
|
+
using_module=module,
|
|
558
|
+
usage_tag="plugins",
|
|
559
|
+
reason=" ".join(post_modules_reasons[full_name]),
|
|
560
|
+
source_ref=module.source_ref,
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
if full_name in fake_modules:
|
|
564
|
+
for fake_module, plugin, reason in fake_modules[full_name]:
|
|
565
|
+
addUsedModule(
|
|
566
|
+
module=fake_module,
|
|
567
|
+
using_module=module,
|
|
568
|
+
usage_tag="plugins",
|
|
569
|
+
reason=reason,
|
|
570
|
+
source_ref=module.source_ref,
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
@staticmethod
|
|
574
|
+
def onCopiedDLLs(dist_dir, standalone_entry_points):
|
|
575
|
+
"""Lets the plugins modify entry points on disk."""
|
|
576
|
+
for entry_point in standalone_entry_points:
|
|
577
|
+
if entry_point.kind.endswith("_ignored"):
|
|
578
|
+
continue
|
|
579
|
+
|
|
580
|
+
for plugin in getActivePlugins():
|
|
581
|
+
dll_path = os.path.join(dist_dir, entry_point.dest_path)
|
|
582
|
+
|
|
583
|
+
with withPluginProblemReporting(plugin, "DLL '%s'", dll_path):
|
|
584
|
+
plugin.onCopiedDLL(dll_path)
|
|
585
|
+
|
|
586
|
+
@staticmethod
|
|
587
|
+
def onBeforeCodeParsing():
|
|
588
|
+
"""Let plugins prepare for code parsing"""
|
|
589
|
+
for plugin in getActivePlugins():
|
|
590
|
+
plugin.onBeforeCodeParsing()
|
|
591
|
+
|
|
592
|
+
@staticmethod
|
|
593
|
+
def onStandaloneDistributionFinished(dist_dir):
|
|
594
|
+
"""Let plugins post-process the distribution folder in standalone mode"""
|
|
595
|
+
for plugin in getActivePlugins():
|
|
596
|
+
plugin.onStandaloneDistributionFinished(dist_dir)
|
|
597
|
+
|
|
598
|
+
standalone_binary = OutputDirectories.getResultFullpath(onefile=False)
|
|
599
|
+
|
|
600
|
+
for plugin in getActivePlugins():
|
|
601
|
+
plugin.onStandaloneBinary(standalone_binary)
|
|
602
|
+
|
|
603
|
+
@staticmethod
|
|
604
|
+
def onOnefileFinished(filename):
|
|
605
|
+
"""Let plugins post-process the onefile executable in onefile mode"""
|
|
606
|
+
for plugin in getActivePlugins():
|
|
607
|
+
plugin.onOnefileFinished(filename)
|
|
608
|
+
|
|
609
|
+
@staticmethod
|
|
610
|
+
def onBootstrapBinary(filename):
|
|
611
|
+
"""Let plugins add to bootstrap binary in some way"""
|
|
612
|
+
for plugin in getActivePlugins():
|
|
613
|
+
plugin.onBootstrapBinary(filename)
|
|
614
|
+
|
|
615
|
+
@staticmethod
|
|
616
|
+
def onFinalResult(filename):
|
|
617
|
+
"""Let plugins add to final binary in some way"""
|
|
618
|
+
for plugin in getActivePlugins():
|
|
619
|
+
plugin.onFinalResult(filename)
|
|
620
|
+
|
|
621
|
+
@staticmethod
|
|
622
|
+
def considerExtraDlls(module):
|
|
623
|
+
"""Ask plugins to provide extra DLLs.
|
|
624
|
+
|
|
625
|
+
Notes:
|
|
626
|
+
These will be of type IncludedEntryPoint or generators providing them, so
|
|
627
|
+
we get "yield from" effective with simple yield.
|
|
628
|
+
|
|
629
|
+
"""
|
|
630
|
+
|
|
631
|
+
result = []
|
|
632
|
+
|
|
633
|
+
# TODO: This is probably something generic that only different
|
|
634
|
+
def _iterateExtraBinaries(plugin, value):
|
|
635
|
+
if value is None:
|
|
636
|
+
pass
|
|
637
|
+
elif isinstance(value, IncludedEntryPoint):
|
|
638
|
+
yield value
|
|
639
|
+
elif isinstance(value, (tuple, list)) or inspect.isgenerator(value):
|
|
640
|
+
for val in value:
|
|
641
|
+
for v in _iterateExtraBinaries(plugin, val):
|
|
642
|
+
yield v
|
|
643
|
+
else:
|
|
644
|
+
plugin.sysexit(
|
|
645
|
+
"Returned object '%s' for module '%s' but should do 'IncludedEntryPoint' or generator."
|
|
646
|
+
% (repr(value), module.asString())
|
|
647
|
+
)
|
|
648
|
+
|
|
649
|
+
for plugin in getActivePlugins():
|
|
650
|
+
with withPluginModuleProblemReporting(plugin, module):
|
|
651
|
+
for entry_point in _iterateExtraBinaries(
|
|
652
|
+
plugin, plugin.getExtraDlls(module)
|
|
653
|
+
):
|
|
654
|
+
result.append(entry_point)
|
|
655
|
+
|
|
656
|
+
return result
|
|
657
|
+
|
|
658
|
+
@staticmethod
|
|
659
|
+
def getModuleSpecificDllPaths(module_name):
|
|
660
|
+
"""Provide a list of directories, where DLLs should be searched for this package (or module).
|
|
661
|
+
|
|
662
|
+
Args:
|
|
663
|
+
module_name: name of a package or module, for which the DLL path addition applies.
|
|
664
|
+
|
|
665
|
+
"""
|
|
666
|
+
result = OrderedSet()
|
|
667
|
+
for plugin in getActivePlugins():
|
|
668
|
+
for dll_path in plugin.getModuleSpecificDllPaths(module_name):
|
|
669
|
+
result.add(dll_path)
|
|
670
|
+
|
|
671
|
+
return result
|
|
672
|
+
|
|
673
|
+
sys_path_additions_cache = {}
|
|
674
|
+
|
|
675
|
+
@classmethod
|
|
676
|
+
def getModuleSysPathAdditions(cls, module_name):
|
|
677
|
+
"""Provide a list of directories, that should be considered in 'PYTHONPATH' when this module is used.
|
|
678
|
+
|
|
679
|
+
Args:
|
|
680
|
+
module_name: name of a package or module
|
|
681
|
+
Returns:
|
|
682
|
+
iterable of paths
|
|
683
|
+
"""
|
|
684
|
+
|
|
685
|
+
if module_name not in cls.sys_path_additions_cache:
|
|
686
|
+
cls.sys_path_additions_cache[module_name] = OrderedSet()
|
|
687
|
+
|
|
688
|
+
for plugin in getActivePlugins():
|
|
689
|
+
for dll_path in plugin.getModuleSysPathAdditions(module_name):
|
|
690
|
+
cls.sys_path_additions_cache[module_name].add(dll_path)
|
|
691
|
+
|
|
692
|
+
return cls.sys_path_additions_cache[module_name]
|
|
693
|
+
|
|
694
|
+
@staticmethod
|
|
695
|
+
def removeDllDependencies(dll_filename, dll_filenames):
|
|
696
|
+
"""Create list of removable shared libraries by scanning through the plugins.
|
|
697
|
+
|
|
698
|
+
Args:
|
|
699
|
+
dll_filename: shared library filename
|
|
700
|
+
dll_filenames: list of shared library filenames
|
|
701
|
+
Returns:
|
|
702
|
+
list of removable files
|
|
703
|
+
"""
|
|
704
|
+
dll_filenames = tuple(sorted(dll_filenames))
|
|
705
|
+
|
|
706
|
+
to_remove = OrderedSet()
|
|
707
|
+
|
|
708
|
+
for plugin in getActivePlugins():
|
|
709
|
+
removed_dlls = tuple(
|
|
710
|
+
plugin.removeDllDependencies(dll_filename, dll_filenames)
|
|
711
|
+
)
|
|
712
|
+
|
|
713
|
+
if removed_dlls and Options.isShowInclusion():
|
|
714
|
+
plugin.info(
|
|
715
|
+
"Removing DLLs %s of %s by plugin decision."
|
|
716
|
+
% (dll_filename, removed_dlls)
|
|
717
|
+
)
|
|
718
|
+
|
|
719
|
+
for removed_dll in removed_dlls:
|
|
720
|
+
to_remove.add(removed_dll)
|
|
721
|
+
|
|
722
|
+
return to_remove
|
|
723
|
+
|
|
724
|
+
@staticmethod
|
|
725
|
+
def considerDataFiles(module):
|
|
726
|
+
"""For a given module, ask plugins for any needed data files it may require.
|
|
727
|
+
|
|
728
|
+
Args:
|
|
729
|
+
module: module object
|
|
730
|
+
Yields:
|
|
731
|
+
Data file description pairs, either (source, dest) or (func, dest)
|
|
732
|
+
where the func will be called to create the content dynamically.
|
|
733
|
+
"""
|
|
734
|
+
|
|
735
|
+
def _iterateIncludedDataFiles(plugin, value):
|
|
736
|
+
if value is None:
|
|
737
|
+
pass
|
|
738
|
+
elif isinstance(value, IncludedDataFile):
|
|
739
|
+
yield value
|
|
740
|
+
elif inspect.isgenerator(value):
|
|
741
|
+
for val in value:
|
|
742
|
+
for v in _iterateIncludedDataFiles(plugin, val):
|
|
743
|
+
yield v
|
|
744
|
+
else:
|
|
745
|
+
plugin.sysexit("Plugin return non-datafile '%s'" % repr(value))
|
|
746
|
+
|
|
747
|
+
for plugin in getActivePlugins():
|
|
748
|
+
for value in plugin.considerDataFiles(module):
|
|
749
|
+
for included_datafile in _iterateIncludedDataFiles(plugin, value):
|
|
750
|
+
yield included_datafile
|
|
751
|
+
|
|
752
|
+
@staticmethod
|
|
753
|
+
def getDataFileTags(included_datafile):
|
|
754
|
+
tags = OrderedSet([included_datafile.kind])
|
|
755
|
+
|
|
756
|
+
tags.update(Options.getDataFileTags(tags))
|
|
757
|
+
|
|
758
|
+
for plugin in getActivePlugins():
|
|
759
|
+
plugin.updateDataFileTags(included_datafile)
|
|
760
|
+
|
|
761
|
+
return tags
|
|
762
|
+
|
|
763
|
+
@staticmethod
|
|
764
|
+
def onDataFileTags(included_datafile):
|
|
765
|
+
for plugin in getActivePlugins():
|
|
766
|
+
plugin.onDataFileTags(included_datafile)
|
|
767
|
+
|
|
768
|
+
@classmethod
|
|
769
|
+
def _createTriggerLoadedModule(cls, module, trigger_name, code, flags):
|
|
770
|
+
"""Create a "trigger" for a module to be imported.
|
|
771
|
+
|
|
772
|
+
Notes:
|
|
773
|
+
The trigger will incorporate the code to be prepended / appended.
|
|
774
|
+
Called by @onModuleDiscovered.
|
|
775
|
+
|
|
776
|
+
Args:
|
|
777
|
+
module: the module object (serves as dict key)
|
|
778
|
+
trigger_name: string ("preLoad"/"postLoad")
|
|
779
|
+
code: the code string
|
|
780
|
+
|
|
781
|
+
Returns
|
|
782
|
+
trigger_module
|
|
783
|
+
"""
|
|
784
|
+
|
|
785
|
+
from nuitka.tree.Building import buildModule
|
|
786
|
+
|
|
787
|
+
module_name = makeTriggerModuleName(module.getFullName(), trigger_name)
|
|
788
|
+
|
|
789
|
+
# In debug mode, put the files in the build folder, so they can be looked up easily.
|
|
790
|
+
if Options.is_debug and "HIDE_SOURCE" not in flags:
|
|
791
|
+
source_path = os.path.join(
|
|
792
|
+
OutputDirectories.getSourceDirectoryPath(), module_name + ".py"
|
|
793
|
+
)
|
|
794
|
+
|
|
795
|
+
putTextFileContents(filename=source_path, contents=code)
|
|
796
|
+
|
|
797
|
+
try:
|
|
798
|
+
trigger_module = buildModule(
|
|
799
|
+
module_filename=getNormalizedPath(
|
|
800
|
+
os.path.join(
|
|
801
|
+
os.path.dirname(module.getCompileTimeFilename()),
|
|
802
|
+
module_name.asPath() + ".py",
|
|
803
|
+
)
|
|
804
|
+
),
|
|
805
|
+
module_name=module_name,
|
|
806
|
+
reason="trigger",
|
|
807
|
+
source_code=code,
|
|
808
|
+
is_top=False,
|
|
809
|
+
is_main=False,
|
|
810
|
+
module_kind="py",
|
|
811
|
+
is_fake=module_name,
|
|
812
|
+
hide_syntax_error=False,
|
|
813
|
+
)
|
|
814
|
+
except SyntaxError as e:
|
|
815
|
+
plugins_logger.sysexit(
|
|
816
|
+
"SyntaxError in plugin provided source code for '%s': %s."
|
|
817
|
+
% (module_name, e)
|
|
818
|
+
)
|
|
819
|
+
|
|
820
|
+
if trigger_module.getCompilationMode() == "bytecode":
|
|
821
|
+
trigger_module.setSourceCode(code)
|
|
822
|
+
|
|
823
|
+
return trigger_module
|
|
824
|
+
|
|
825
|
+
@classmethod
|
|
826
|
+
def onModuleDiscovered(cls, module):
|
|
827
|
+
# We offer plugins many ways to provide extra stuff
|
|
828
|
+
# pylint: disable=too-many-locals,too-many-statements
|
|
829
|
+
full_name = module.getFullName()
|
|
830
|
+
|
|
831
|
+
def _untangleLoadDescription(description):
|
|
832
|
+
if description and inspect.isgenerator(description):
|
|
833
|
+
description = tuple(description)
|
|
834
|
+
|
|
835
|
+
if description:
|
|
836
|
+
if type(description[0]) not in (tuple, list):
|
|
837
|
+
description = [description]
|
|
838
|
+
|
|
839
|
+
for desc in description:
|
|
840
|
+
if desc is None:
|
|
841
|
+
continue
|
|
842
|
+
|
|
843
|
+
if len(desc) == 2:
|
|
844
|
+
code, reason = desc
|
|
845
|
+
flags = ()
|
|
846
|
+
else:
|
|
847
|
+
code, reason, flags = desc
|
|
848
|
+
|
|
849
|
+
if flags is None:
|
|
850
|
+
flags = ()
|
|
851
|
+
elif type(flags) is str:
|
|
852
|
+
flags = (flags,)
|
|
853
|
+
|
|
854
|
+
yield plugin, code, reason, flags
|
|
855
|
+
|
|
856
|
+
def _untangleFakeDesc(description):
|
|
857
|
+
if description and inspect.isgenerator(description):
|
|
858
|
+
description = tuple(description)
|
|
859
|
+
|
|
860
|
+
if description:
|
|
861
|
+
if type(description[0]) not in (tuple, list):
|
|
862
|
+
description = [description]
|
|
863
|
+
|
|
864
|
+
for desc in description:
|
|
865
|
+
assert len(desc) == 4, desc
|
|
866
|
+
yield plugin, desc[0], desc[1], desc[2], desc[3]
|
|
867
|
+
|
|
868
|
+
pre_module_load_descriptions = []
|
|
869
|
+
post_module_load_descriptions = []
|
|
870
|
+
fake_module_descriptions = []
|
|
871
|
+
|
|
872
|
+
if module.isMainModule():
|
|
873
|
+
plugin = None
|
|
874
|
+
pre_module_load_descriptions.extend(
|
|
875
|
+
_untangleLoadDescription(_getMainModulePreloadCodes())
|
|
876
|
+
)
|
|
877
|
+
|
|
878
|
+
for plugin in getActivePlugins():
|
|
879
|
+
plugin.onModuleDiscovered(module)
|
|
880
|
+
|
|
881
|
+
pre_module_load_descriptions.extend(
|
|
882
|
+
_untangleLoadDescription(
|
|
883
|
+
description=plugin.createPreModuleLoadCode(module)
|
|
884
|
+
)
|
|
885
|
+
)
|
|
886
|
+
post_module_load_descriptions.extend(
|
|
887
|
+
_untangleLoadDescription(
|
|
888
|
+
description=plugin.createPostModuleLoadCode(module)
|
|
889
|
+
)
|
|
890
|
+
)
|
|
891
|
+
fake_module_descriptions.extend(
|
|
892
|
+
_untangleFakeDesc(description=plugin.createFakeModuleDependency(module))
|
|
893
|
+
)
|
|
894
|
+
|
|
895
|
+
def combineLoadCodes(module_load_descriptions):
|
|
896
|
+
future_imports_code = []
|
|
897
|
+
normal_code_code = []
|
|
898
|
+
total_flags = OrderedSet()
|
|
899
|
+
reasons = []
|
|
900
|
+
|
|
901
|
+
for _plugin, code, reason, flags in module_load_descriptions:
|
|
902
|
+
if code:
|
|
903
|
+
for line in code.splitlines():
|
|
904
|
+
line = line + "\n"
|
|
905
|
+
|
|
906
|
+
if line.startswith("from __future__"):
|
|
907
|
+
future_imports_code.append(line)
|
|
908
|
+
else:
|
|
909
|
+
normal_code_code.append(line)
|
|
910
|
+
|
|
911
|
+
total_flags.update(flags)
|
|
912
|
+
reasons.append(reason)
|
|
913
|
+
|
|
914
|
+
total_code = future_imports_code + normal_code_code
|
|
915
|
+
|
|
916
|
+
return total_code, reasons, total_flags
|
|
917
|
+
|
|
918
|
+
if pre_module_load_descriptions:
|
|
919
|
+
total_code, reasons, total_flags = combineLoadCodes(
|
|
920
|
+
module_load_descriptions=pre_module_load_descriptions
|
|
921
|
+
)
|
|
922
|
+
|
|
923
|
+
if total_code:
|
|
924
|
+
assert full_name not in pre_modules
|
|
925
|
+
|
|
926
|
+
pre_modules[full_name] = cls._createTriggerLoadedModule(
|
|
927
|
+
module=module,
|
|
928
|
+
trigger_name=pre_module_load_trigger_name,
|
|
929
|
+
code="".join(total_code),
|
|
930
|
+
flags=total_flags,
|
|
931
|
+
)
|
|
932
|
+
pre_modules_reasons[full_name] = tuple(reasons)
|
|
933
|
+
|
|
934
|
+
if post_module_load_descriptions:
|
|
935
|
+
total_code, reasons, total_flags = combineLoadCodes(
|
|
936
|
+
module_load_descriptions=post_module_load_descriptions
|
|
937
|
+
)
|
|
938
|
+
|
|
939
|
+
if total_code:
|
|
940
|
+
assert full_name not in post_modules
|
|
941
|
+
|
|
942
|
+
post_modules[full_name] = cls._createTriggerLoadedModule(
|
|
943
|
+
module=module,
|
|
944
|
+
trigger_name=post_module_load_trigger_name,
|
|
945
|
+
code="".join(total_code),
|
|
946
|
+
flags=total_flags,
|
|
947
|
+
)
|
|
948
|
+
post_modules_reasons[full_name] = reasons
|
|
949
|
+
|
|
950
|
+
if fake_module_descriptions:
|
|
951
|
+
fake_modules[full_name] = []
|
|
952
|
+
|
|
953
|
+
from nuitka.tree.Building import buildModule
|
|
954
|
+
|
|
955
|
+
for (
|
|
956
|
+
plugin,
|
|
957
|
+
fake_module_name,
|
|
958
|
+
source_code,
|
|
959
|
+
fake_filename,
|
|
960
|
+
reason,
|
|
961
|
+
) in fake_module_descriptions:
|
|
962
|
+
fake_module = buildModule(
|
|
963
|
+
module_filename=fake_filename,
|
|
964
|
+
module_name=fake_module_name,
|
|
965
|
+
reason="fake",
|
|
966
|
+
source_code=source_code,
|
|
967
|
+
is_top=False,
|
|
968
|
+
is_main=False,
|
|
969
|
+
module_kind="py",
|
|
970
|
+
is_fake=fake_module_name,
|
|
971
|
+
hide_syntax_error=False,
|
|
972
|
+
)
|
|
973
|
+
|
|
974
|
+
if fake_module.getCompilationMode() == "bytecode":
|
|
975
|
+
fake_module.setSourceCode(source_code)
|
|
976
|
+
|
|
977
|
+
fake_modules[full_name].append((fake_module, plugin, reason))
|
|
978
|
+
|
|
979
|
+
@staticmethod
|
|
980
|
+
def onModuleSourceCode(module_name, source_filename, source_code):
|
|
981
|
+
assert type(module_name) is ModuleName
|
|
982
|
+
assert type(source_code) is str
|
|
983
|
+
|
|
984
|
+
contributing_plugins = OrderedSet()
|
|
985
|
+
|
|
986
|
+
for plugin in getActivePlugins():
|
|
987
|
+
with withPluginModuleNameProblemReporting(plugin, module_name):
|
|
988
|
+
new_source_code = plugin.onModuleSourceCode(
|
|
989
|
+
module_name=module_name,
|
|
990
|
+
source_filename=source_filename,
|
|
991
|
+
source_code=source_code,
|
|
992
|
+
)
|
|
993
|
+
if new_source_code is not None and new_source_code != source_code:
|
|
994
|
+
source_code = new_source_code
|
|
995
|
+
contributing_plugins.add(plugin)
|
|
996
|
+
|
|
997
|
+
assert type(source_code) is str
|
|
998
|
+
|
|
999
|
+
return source_code, contributing_plugins
|
|
1000
|
+
|
|
1001
|
+
@staticmethod
|
|
1002
|
+
def onFrozenModuleBytecode(module_name, is_package, bytecode):
|
|
1003
|
+
assert type(module_name) is ModuleName
|
|
1004
|
+
assert bytecode.__class__.__name__ == "code"
|
|
1005
|
+
|
|
1006
|
+
for plugin in getActivePlugins():
|
|
1007
|
+
bytecode = plugin.onFrozenModuleBytecode(module_name, is_package, bytecode)
|
|
1008
|
+
assert bytecode.__class__.__name__ == "code"
|
|
1009
|
+
|
|
1010
|
+
return bytecode
|
|
1011
|
+
|
|
1012
|
+
@staticmethod
|
|
1013
|
+
def onModuleEncounter(using_module_name, module_name, module_filename, module_kind):
|
|
1014
|
+
result = None
|
|
1015
|
+
deciding_plugins = []
|
|
1016
|
+
|
|
1017
|
+
for plugin in getActivePlugins():
|
|
1018
|
+
must_recurse = plugin.onModuleEncounter(
|
|
1019
|
+
using_module_name=using_module_name,
|
|
1020
|
+
module_name=module_name,
|
|
1021
|
+
module_filename=module_filename,
|
|
1022
|
+
module_kind=module_kind,
|
|
1023
|
+
)
|
|
1024
|
+
|
|
1025
|
+
if must_recurse is None:
|
|
1026
|
+
continue
|
|
1027
|
+
|
|
1028
|
+
if type(must_recurse) is not tuple and must_recurse not in (True, False):
|
|
1029
|
+
plugin.sysexit(
|
|
1030
|
+
"Error, onModuleEncounter code failed to return a None or tuple(bool, reason) result."
|
|
1031
|
+
)
|
|
1032
|
+
|
|
1033
|
+
if result is not None:
|
|
1034
|
+
if result[0] != must_recurse[0]:
|
|
1035
|
+
plugin.sysexit(
|
|
1036
|
+
"Error, decision %s does not match other plugin '%s' decision."
|
|
1037
|
+
% (
|
|
1038
|
+
must_recurse[0],
|
|
1039
|
+
".".join(
|
|
1040
|
+
deciding_plugin.plugin_name
|
|
1041
|
+
for deciding_plugin in deciding_plugins
|
|
1042
|
+
),
|
|
1043
|
+
)
|
|
1044
|
+
)
|
|
1045
|
+
|
|
1046
|
+
deciding_plugins.append(plugin)
|
|
1047
|
+
result = must_recurse
|
|
1048
|
+
|
|
1049
|
+
return result, deciding_plugins
|
|
1050
|
+
|
|
1051
|
+
module_usage_looked_ahead_cache = set()
|
|
1052
|
+
|
|
1053
|
+
@classmethod
|
|
1054
|
+
def onModuleUsageLookAhead(cls, module_name, module_filename, module_kind):
|
|
1055
|
+
if module_name in cls.module_usage_looked_ahead_cache:
|
|
1056
|
+
return
|
|
1057
|
+
|
|
1058
|
+
cls.module_usage_looked_ahead_cache.add(module_name)
|
|
1059
|
+
|
|
1060
|
+
# Do parent package look ahead first.
|
|
1061
|
+
parent_package_name = module_name.getPackageName()
|
|
1062
|
+
if parent_package_name is not None:
|
|
1063
|
+
from nuitka.importing.Importing import locateModule
|
|
1064
|
+
|
|
1065
|
+
(
|
|
1066
|
+
_parent_package_name,
|
|
1067
|
+
parent_module_filename,
|
|
1068
|
+
parent_module_kind,
|
|
1069
|
+
_parent_module_finding,
|
|
1070
|
+
) = locateModule(
|
|
1071
|
+
module_name=parent_package_name,
|
|
1072
|
+
parent_package=None,
|
|
1073
|
+
level=0,
|
|
1074
|
+
)
|
|
1075
|
+
|
|
1076
|
+
cls.onModuleUsageLookAhead(
|
|
1077
|
+
module_name=parent_package_name,
|
|
1078
|
+
module_filename=parent_module_filename,
|
|
1079
|
+
module_kind=parent_module_kind,
|
|
1080
|
+
)
|
|
1081
|
+
|
|
1082
|
+
# Lazy load the source code if a plugin wants it, the pre_load caches
|
|
1083
|
+
# the result for later usage.
|
|
1084
|
+
def getModuleSourceCode():
|
|
1085
|
+
if module_kind != "py":
|
|
1086
|
+
return None
|
|
1087
|
+
|
|
1088
|
+
from nuitka.tree.SourceHandling import readSourceCodeFromFilename
|
|
1089
|
+
|
|
1090
|
+
if os.path.isdir(module_filename):
|
|
1091
|
+
source_filename = os.path.join(module_filename, "__init__.py")
|
|
1092
|
+
else:
|
|
1093
|
+
source_filename = module_filename
|
|
1094
|
+
|
|
1095
|
+
if not os.path.isfile(source_filename):
|
|
1096
|
+
return None
|
|
1097
|
+
|
|
1098
|
+
try:
|
|
1099
|
+
return readSourceCodeFromFilename(
|
|
1100
|
+
module_name=module_name,
|
|
1101
|
+
source_filename=source_filename,
|
|
1102
|
+
pre_load=True,
|
|
1103
|
+
)
|
|
1104
|
+
except SyntaxError as e:
|
|
1105
|
+
# Look ahead just not possible.
|
|
1106
|
+
raise NuitkaSyntaxError(e)
|
|
1107
|
+
|
|
1108
|
+
try:
|
|
1109
|
+
for plugin in getActivePlugins():
|
|
1110
|
+
plugin.onModuleUsageLookAhead(
|
|
1111
|
+
module_name=module_name,
|
|
1112
|
+
module_filename=module_filename,
|
|
1113
|
+
module_kind=module_kind,
|
|
1114
|
+
get_module_source=getModuleSourceCode,
|
|
1115
|
+
)
|
|
1116
|
+
except NuitkaSyntaxError:
|
|
1117
|
+
pass
|
|
1118
|
+
|
|
1119
|
+
@staticmethod
|
|
1120
|
+
def onModuleRecursion(
|
|
1121
|
+
module_name, module_filename, module_kind, using_module_name, source_ref, reason
|
|
1122
|
+
):
|
|
1123
|
+
for plugin in getActivePlugins():
|
|
1124
|
+
plugin.onModuleRecursion(
|
|
1125
|
+
module_name=module_name,
|
|
1126
|
+
module_filename=module_filename,
|
|
1127
|
+
module_kind=module_kind,
|
|
1128
|
+
using_module_name=using_module_name,
|
|
1129
|
+
source_ref=source_ref,
|
|
1130
|
+
reason=reason,
|
|
1131
|
+
)
|
|
1132
|
+
|
|
1133
|
+
@staticmethod
|
|
1134
|
+
def onCompilationStartChecks():
|
|
1135
|
+
"""The compilation is setup, locating modules if expected to work."""
|
|
1136
|
+
|
|
1137
|
+
for plugin in getActivePlugins():
|
|
1138
|
+
with withPluginProblemReporting(plugin, "plugin startup checks", ()):
|
|
1139
|
+
plugin.onCompilationStartChecks()
|
|
1140
|
+
|
|
1141
|
+
@staticmethod
|
|
1142
|
+
def onModuleInitialSet():
|
|
1143
|
+
"""The initial set of root modules is complete, plugins may add more."""
|
|
1144
|
+
|
|
1145
|
+
from nuitka.ModuleRegistry import addRootModule
|
|
1146
|
+
|
|
1147
|
+
for plugin in getActivePlugins():
|
|
1148
|
+
for module in plugin.onModuleInitialSet():
|
|
1149
|
+
addRootModule(module)
|
|
1150
|
+
|
|
1151
|
+
@staticmethod
|
|
1152
|
+
def onModuleCompleteSet():
|
|
1153
|
+
"""The final set of modules is determined, this is only for inspection, cannot change."""
|
|
1154
|
+
from nuitka.ModuleRegistry import getDoneModules
|
|
1155
|
+
|
|
1156
|
+
# Make sure it's immutable.
|
|
1157
|
+
module_set = tuple(getDoneModules())
|
|
1158
|
+
|
|
1159
|
+
for plugin in getActivePlugins():
|
|
1160
|
+
plugin.onModuleCompleteSet(module_set)
|
|
1161
|
+
|
|
1162
|
+
@staticmethod
|
|
1163
|
+
def suppressUnknownImportWarning(importing, source_ref, module_name):
|
|
1164
|
+
"""Let plugins decide whether to suppress import warnings for an unknown module.
|
|
1165
|
+
|
|
1166
|
+
Notes:
|
|
1167
|
+
If all plugins return False or None, the return will be False, else True.
|
|
1168
|
+
Args:
|
|
1169
|
+
importing: the module which is importing "module_name"
|
|
1170
|
+
source_ref: pointer to file source code or bytecode
|
|
1171
|
+
module_name: the module to be imported
|
|
1172
|
+
returns:
|
|
1173
|
+
True or False (default)
|
|
1174
|
+
"""
|
|
1175
|
+
source_ref = importing.getSourceReference()
|
|
1176
|
+
|
|
1177
|
+
for plugin in getActivePlugins():
|
|
1178
|
+
if plugin.suppressUnknownImportWarning(importing, module_name, source_ref):
|
|
1179
|
+
return True
|
|
1180
|
+
|
|
1181
|
+
return False
|
|
1182
|
+
|
|
1183
|
+
@staticmethod
|
|
1184
|
+
def decideCompilation(module_name):
|
|
1185
|
+
"""Let plugins decide whether to C compile a module or include as bytecode.
|
|
1186
|
+
|
|
1187
|
+
Notes:
|
|
1188
|
+
The decision is made by the first plugin not returning None.
|
|
1189
|
+
|
|
1190
|
+
Returns:
|
|
1191
|
+
"compiled" (default) or "bytecode".
|
|
1192
|
+
"""
|
|
1193
|
+
for plugin in getActivePlugins():
|
|
1194
|
+
value = plugin.decideCompilation(module_name)
|
|
1195
|
+
|
|
1196
|
+
if value is not None:
|
|
1197
|
+
assert value in ("compiled", "bytecode")
|
|
1198
|
+
return value
|
|
1199
|
+
|
|
1200
|
+
return None
|
|
1201
|
+
|
|
1202
|
+
preprocessor_symbols = None
|
|
1203
|
+
|
|
1204
|
+
@classmethod
|
|
1205
|
+
def getPreprocessorSymbols(cls):
|
|
1206
|
+
"""Let plugins provide C defines to be used in compilation.
|
|
1207
|
+
|
|
1208
|
+
Notes:
|
|
1209
|
+
The plugins can each contribute, but are hopefully using
|
|
1210
|
+
a namespace for their defines.
|
|
1211
|
+
|
|
1212
|
+
Returns:
|
|
1213
|
+
OrderedDict(), where None value indicates no define value,
|
|
1214
|
+
i.e. "-Dkey=value" vs. "-Dkey"
|
|
1215
|
+
"""
|
|
1216
|
+
|
|
1217
|
+
# spell-checker: ignore -Dkey
|
|
1218
|
+
|
|
1219
|
+
if cls.preprocessor_symbols is None:
|
|
1220
|
+
cls.preprocessor_symbols = OrderedDict()
|
|
1221
|
+
|
|
1222
|
+
for plugin in getActivePlugins():
|
|
1223
|
+
value = plugin.getPreprocessorSymbols()
|
|
1224
|
+
|
|
1225
|
+
if value is not None:
|
|
1226
|
+
assert type(value) is dict, value
|
|
1227
|
+
|
|
1228
|
+
# We order per plugin, but from the plugins, lets just take a dict
|
|
1229
|
+
# and achieve determinism by ordering the defines by name.
|
|
1230
|
+
for key, value in sorted(value.items()):
|
|
1231
|
+
# False alarm, pylint: disable=I0021,unsupported-assignment-operation
|
|
1232
|
+
cls.preprocessor_symbols[key] = value
|
|
1233
|
+
|
|
1234
|
+
return cls.preprocessor_symbols
|
|
1235
|
+
|
|
1236
|
+
build_definitions = None
|
|
1237
|
+
|
|
1238
|
+
@classmethod
|
|
1239
|
+
def getBuildDefinitions(cls):
|
|
1240
|
+
"""Let plugins provide C source defines to be used in compilation.
|
|
1241
|
+
|
|
1242
|
+
Notes:
|
|
1243
|
+
The plugins can each contribute, but are hopefully using
|
|
1244
|
+
a namespace for their defines. Only specific code sees these
|
|
1245
|
+
if it chooses to include "build_definitions.h" file.
|
|
1246
|
+
|
|
1247
|
+
Returns:
|
|
1248
|
+
OrderedDict() with keys and values."
|
|
1249
|
+
"""
|
|
1250
|
+
|
|
1251
|
+
if cls.build_definitions is None:
|
|
1252
|
+
cls.build_definitions = OrderedDict()
|
|
1253
|
+
|
|
1254
|
+
for plugin in getActivePlugins():
|
|
1255
|
+
value = plugin.getBuildDefinitions()
|
|
1256
|
+
|
|
1257
|
+
if value is not None:
|
|
1258
|
+
assert type(value) is dict, value
|
|
1259
|
+
|
|
1260
|
+
# We order per plugin, but from the plugins themselves, lets just assume
|
|
1261
|
+
# unordered dict and achieve determinism by ordering the defines by name.
|
|
1262
|
+
for key, value in sorted(value.items()):
|
|
1263
|
+
# False alarm, pylint: disable=I0021,unsupported-assignment-operation
|
|
1264
|
+
cls.build_definitions[key] = value
|
|
1265
|
+
|
|
1266
|
+
return cls.build_definitions
|
|
1267
|
+
|
|
1268
|
+
extra_include_directories = None
|
|
1269
|
+
|
|
1270
|
+
@classmethod
|
|
1271
|
+
def getExtraIncludeDirectories(cls):
|
|
1272
|
+
"""Let plugins extra directories to use for C includes in compilation.
|
|
1273
|
+
|
|
1274
|
+
Notes:
|
|
1275
|
+
The plugins can each contribute, but are hopefully not colliding,
|
|
1276
|
+
order will be plugin order.
|
|
1277
|
+
|
|
1278
|
+
Returns:
|
|
1279
|
+
OrderedSet() of paths to include as well.
|
|
1280
|
+
"""
|
|
1281
|
+
if cls.extra_include_directories is None:
|
|
1282
|
+
cls.extra_include_directories = OrderedSet()
|
|
1283
|
+
|
|
1284
|
+
for plugin in getActivePlugins():
|
|
1285
|
+
value = plugin.getExtraIncludeDirectories()
|
|
1286
|
+
|
|
1287
|
+
if value:
|
|
1288
|
+
cls.extra_include_directories.update(value)
|
|
1289
|
+
|
|
1290
|
+
return cls.extra_include_directories
|
|
1291
|
+
|
|
1292
|
+
@staticmethod
|
|
1293
|
+
def _getExtraCodeFiles(for_onefile):
|
|
1294
|
+
result = OrderedDict()
|
|
1295
|
+
|
|
1296
|
+
for plugin in getActivePlugins():
|
|
1297
|
+
value = plugin.getExtraCodeFiles()
|
|
1298
|
+
|
|
1299
|
+
if value is not None:
|
|
1300
|
+
assert type(value) is dict
|
|
1301
|
+
|
|
1302
|
+
# We order per plugin, but from the plugins, lets just take a dict
|
|
1303
|
+
# and achieve determinism by ordering the files by name.
|
|
1304
|
+
for key, value in sorted(value.items()):
|
|
1305
|
+
if (for_onefile and "onefile_" not in key) or (
|
|
1306
|
+
not for_onefile and "onefile_" in key
|
|
1307
|
+
):
|
|
1308
|
+
continue
|
|
1309
|
+
|
|
1310
|
+
if not key.startswith("nuitka_"):
|
|
1311
|
+
key = "plugin." + plugin.plugin_name + "." + key
|
|
1312
|
+
|
|
1313
|
+
assert key not in result, key
|
|
1314
|
+
result[key] = value
|
|
1315
|
+
|
|
1316
|
+
return result
|
|
1317
|
+
|
|
1318
|
+
@staticmethod
|
|
1319
|
+
def writeExtraCodeFiles(onefile):
|
|
1320
|
+
# Circular dependency.
|
|
1321
|
+
from nuitka.tree.SourceHandling import writeSourceCode
|
|
1322
|
+
|
|
1323
|
+
source_dir = OutputDirectories.getSourceDirectoryPath(onefile=onefile)
|
|
1324
|
+
|
|
1325
|
+
for filename, source_code in Plugins._getExtraCodeFiles(onefile).items():
|
|
1326
|
+
target_dir = os.path.join(source_dir, "plugins")
|
|
1327
|
+
|
|
1328
|
+
if not os.path.isdir(target_dir):
|
|
1329
|
+
makePath(target_dir)
|
|
1330
|
+
|
|
1331
|
+
writeSourceCode(
|
|
1332
|
+
filename=os.path.join(target_dir, filename), source_code=source_code
|
|
1333
|
+
)
|
|
1334
|
+
|
|
1335
|
+
extra_link_libraries = None
|
|
1336
|
+
|
|
1337
|
+
@classmethod
|
|
1338
|
+
def getExtraLinkLibraries(cls):
|
|
1339
|
+
if cls.extra_link_libraries is None:
|
|
1340
|
+
cls.extra_link_libraries = OrderedSet()
|
|
1341
|
+
|
|
1342
|
+
for plugin in getActivePlugins():
|
|
1343
|
+
value = plugin.getExtraLinkLibraries()
|
|
1344
|
+
|
|
1345
|
+
if value is not None:
|
|
1346
|
+
if isinstance(value, basestring):
|
|
1347
|
+
cls.extra_link_libraries.add(os.path.normcase(value))
|
|
1348
|
+
else:
|
|
1349
|
+
for library_name in value:
|
|
1350
|
+
cls.extra_link_libraries.add(os.path.normcase(library_name))
|
|
1351
|
+
|
|
1352
|
+
return cls.extra_link_libraries
|
|
1353
|
+
|
|
1354
|
+
extra_link_directories = None
|
|
1355
|
+
|
|
1356
|
+
@classmethod
|
|
1357
|
+
def getExtraLinkDirectories(cls):
|
|
1358
|
+
if cls.extra_link_directories is None:
|
|
1359
|
+
cls.extra_link_directories = OrderedSet()
|
|
1360
|
+
|
|
1361
|
+
for plugin in getActivePlugins():
|
|
1362
|
+
value = plugin.getExtraLinkDirectories()
|
|
1363
|
+
|
|
1364
|
+
if value is not None:
|
|
1365
|
+
if isinstance(value, basestring):
|
|
1366
|
+
cls.extra_link_directories.add(value)
|
|
1367
|
+
else:
|
|
1368
|
+
for dir_name in value:
|
|
1369
|
+
cls.extra_link_directories.add(dir_name)
|
|
1370
|
+
|
|
1371
|
+
return cls.extra_link_directories
|
|
1372
|
+
|
|
1373
|
+
@classmethod
|
|
1374
|
+
def onDataComposerRun(cls):
|
|
1375
|
+
for plugin in getActivePlugins():
|
|
1376
|
+
plugin.onDataComposerRun()
|
|
1377
|
+
|
|
1378
|
+
@classmethod
|
|
1379
|
+
def onDataComposerResult(cls, blob_filename):
|
|
1380
|
+
for plugin in getActivePlugins():
|
|
1381
|
+
plugin.onDataComposerResult(blob_filename)
|
|
1382
|
+
|
|
1383
|
+
@classmethod
|
|
1384
|
+
def deriveModuleConstantsBlobName(cls, data_filename):
|
|
1385
|
+
result = deriveModuleConstantsBlobName(data_filename)
|
|
1386
|
+
|
|
1387
|
+
return cls.encodeDataComposerName(result)
|
|
1388
|
+
|
|
1389
|
+
@classmethod
|
|
1390
|
+
def encodeDataComposerName(cls, name):
|
|
1391
|
+
# Encoding needs to match generated source code output.
|
|
1392
|
+
if str is not bytes:
|
|
1393
|
+
name = name.encode("utf8")
|
|
1394
|
+
|
|
1395
|
+
for plugin in getActivePlugins():
|
|
1396
|
+
r = plugin.encodeDataComposerName(name)
|
|
1397
|
+
|
|
1398
|
+
if r is not None:
|
|
1399
|
+
name = r
|
|
1400
|
+
break
|
|
1401
|
+
|
|
1402
|
+
return name
|
|
1403
|
+
|
|
1404
|
+
@classmethod
|
|
1405
|
+
def onFunctionBodyParsing(cls, provider, function_name, body):
|
|
1406
|
+
module_name = provider.getParentModule().getFullName()
|
|
1407
|
+
|
|
1408
|
+
for plugin in getActivePlugins():
|
|
1409
|
+
# TODO: Could record what functions got modified by what plugin
|
|
1410
|
+
# and in what way checking the return value
|
|
1411
|
+
plugin.onFunctionBodyParsing(
|
|
1412
|
+
module_name=module_name,
|
|
1413
|
+
function_name=function_name,
|
|
1414
|
+
body=body,
|
|
1415
|
+
)
|
|
1416
|
+
|
|
1417
|
+
@classmethod
|
|
1418
|
+
def onClassBodyParsing(cls, provider, class_name, node):
|
|
1419
|
+
module_name = provider.getParentModule().getFullName()
|
|
1420
|
+
|
|
1421
|
+
for plugin in getActivePlugins():
|
|
1422
|
+
# TODO: Could record what classes got modified by what plugin
|
|
1423
|
+
# and in what way checking the return value
|
|
1424
|
+
plugin.onClassBodyParsing(
|
|
1425
|
+
module_name=module_name,
|
|
1426
|
+
class_name=class_name,
|
|
1427
|
+
node=node,
|
|
1428
|
+
)
|
|
1429
|
+
|
|
1430
|
+
@classmethod
|
|
1431
|
+
def getCacheContributionValues(cls, module_name):
|
|
1432
|
+
for plugin in getActivePlugins():
|
|
1433
|
+
for value in plugin.getCacheContributionValues(module_name):
|
|
1434
|
+
yield value
|
|
1435
|
+
|
|
1436
|
+
@classmethod
|
|
1437
|
+
def getExtraConstantDefaultPopulation(cls):
|
|
1438
|
+
for plugin in getActivePlugins():
|
|
1439
|
+
for value in plugin.getExtraConstantDefaultPopulation():
|
|
1440
|
+
yield value
|
|
1441
|
+
|
|
1442
|
+
@classmethod
|
|
1443
|
+
def _decideWithoutDisagreement(
|
|
1444
|
+
cls,
|
|
1445
|
+
method_name,
|
|
1446
|
+
call_per_plugin,
|
|
1447
|
+
legal_values,
|
|
1448
|
+
abstain_values,
|
|
1449
|
+
get_default_value,
|
|
1450
|
+
):
|
|
1451
|
+
result = abstain_values[0]
|
|
1452
|
+
plugin_name = None
|
|
1453
|
+
|
|
1454
|
+
for plugin in getActivePlugins():
|
|
1455
|
+
value = call_per_plugin(plugin)
|
|
1456
|
+
|
|
1457
|
+
if value not in legal_values:
|
|
1458
|
+
plugin.sysexit(
|
|
1459
|
+
"Error, can only return '%s' from '%s' not %r"
|
|
1460
|
+
% (legal_values, method_name, value)
|
|
1461
|
+
)
|
|
1462
|
+
|
|
1463
|
+
if value in abstain_values:
|
|
1464
|
+
continue
|
|
1465
|
+
|
|
1466
|
+
if value != result:
|
|
1467
|
+
if result in abstain_values:
|
|
1468
|
+
result = value
|
|
1469
|
+
plugin_name = plugin.plugin_name
|
|
1470
|
+
else:
|
|
1471
|
+
plugin.sysexit(
|
|
1472
|
+
"Error, conflicting value '%s' with plug-in '%s' value '%s'."
|
|
1473
|
+
% (value, plugin_name, result)
|
|
1474
|
+
)
|
|
1475
|
+
if result in abstain_values:
|
|
1476
|
+
result = get_default_value()
|
|
1477
|
+
|
|
1478
|
+
return result
|
|
1479
|
+
|
|
1480
|
+
decide_annotations_cache = {}
|
|
1481
|
+
|
|
1482
|
+
@classmethod
|
|
1483
|
+
def decideAnnotations(cls, module_name):
|
|
1484
|
+
# For Python2 it's not a thing.
|
|
1485
|
+
if str is bytes:
|
|
1486
|
+
return False
|
|
1487
|
+
|
|
1488
|
+
if module_name not in cls.decide_annotations_cache:
|
|
1489
|
+
cls.decide_annotations_cache[module_name] = cls._decideWithoutDisagreement(
|
|
1490
|
+
call_per_plugin=lambda plugin: plugin.decideAnnotations(module_name),
|
|
1491
|
+
legal_values=(None, True, False),
|
|
1492
|
+
abstain_values=(None,),
|
|
1493
|
+
method_name="decideAnnotations",
|
|
1494
|
+
get_default_value=lambda: not Options.hasPythonFlagNoAnnotations(),
|
|
1495
|
+
)
|
|
1496
|
+
|
|
1497
|
+
return cls.decide_annotations_cache[module_name]
|
|
1498
|
+
|
|
1499
|
+
decide_doc_strings_cache = {}
|
|
1500
|
+
|
|
1501
|
+
@classmethod
|
|
1502
|
+
def decideDocStrings(cls, module_name):
|
|
1503
|
+
if module_name not in cls.decide_doc_strings_cache:
|
|
1504
|
+
cls.decide_doc_strings_cache[module_name] = cls._decideWithoutDisagreement(
|
|
1505
|
+
call_per_plugin=lambda plugin: plugin.decideDocStrings(module_name),
|
|
1506
|
+
legal_values=(None, True, False),
|
|
1507
|
+
abstain_values=(None,),
|
|
1508
|
+
method_name="decideDocStrings",
|
|
1509
|
+
get_default_value=lambda: not Options.hasPythonFlagNoDocStrings(),
|
|
1510
|
+
)
|
|
1511
|
+
|
|
1512
|
+
return cls.decide_doc_strings_cache[module_name]
|
|
1513
|
+
|
|
1514
|
+
decide_assertions_cache = {}
|
|
1515
|
+
|
|
1516
|
+
@classmethod
|
|
1517
|
+
def decideAssertions(cls, module_name):
|
|
1518
|
+
if module_name not in cls.decide_assertions_cache:
|
|
1519
|
+
cls.decide_assertions_cache[module_name] = cls._decideWithoutDisagreement(
|
|
1520
|
+
call_per_plugin=lambda plugin: plugin.decideAssertions(module_name),
|
|
1521
|
+
legal_values=(None, True, False),
|
|
1522
|
+
abstain_values=(None,),
|
|
1523
|
+
method_name="decideAssertions",
|
|
1524
|
+
get_default_value=lambda: not Options.hasPythonFlagNoAsserts(),
|
|
1525
|
+
)
|
|
1526
|
+
|
|
1527
|
+
return cls.decide_assertions_cache[module_name]
|
|
1528
|
+
|
|
1529
|
+
@classmethod
|
|
1530
|
+
def decideAllowOutsideDependencies(cls, module_name):
|
|
1531
|
+
result = None
|
|
1532
|
+
plugin_name = None
|
|
1533
|
+
|
|
1534
|
+
assert module_name is not None
|
|
1535
|
+
|
|
1536
|
+
for plugin in getActivePlugins():
|
|
1537
|
+
value = plugin.decideAllowOutsideDependencies(module_name)
|
|
1538
|
+
|
|
1539
|
+
if value is True:
|
|
1540
|
+
if result is False:
|
|
1541
|
+
plugin.sysexit(
|
|
1542
|
+
"Error, conflicting allow/disallow outside dependencies of plug-in '%s'."
|
|
1543
|
+
% plugin_name
|
|
1544
|
+
)
|
|
1545
|
+
|
|
1546
|
+
result = True
|
|
1547
|
+
plugin_name = plugin.plugin_name
|
|
1548
|
+
|
|
1549
|
+
elif value is False:
|
|
1550
|
+
if result is False:
|
|
1551
|
+
plugin.sysexit(
|
|
1552
|
+
"Error, conflicting allow/disallow outside dependencies of plug-in '%s'."
|
|
1553
|
+
% plugin_name
|
|
1554
|
+
)
|
|
1555
|
+
|
|
1556
|
+
result = False
|
|
1557
|
+
plugin_name = plugin.plugin_name
|
|
1558
|
+
elif value is not None:
|
|
1559
|
+
plugin.sysexit(
|
|
1560
|
+
"Error, can only return True, False, None from 'decideAllowOutsideDependencies' not %r"
|
|
1561
|
+
% value
|
|
1562
|
+
)
|
|
1563
|
+
|
|
1564
|
+
return result
|
|
1565
|
+
|
|
1566
|
+
@classmethod
|
|
1567
|
+
def isAcceptableMissingDLL(cls, package_name, filename):
|
|
1568
|
+
dll_basename = getDllBasename(os.path.basename(filename))
|
|
1569
|
+
|
|
1570
|
+
# Not a DLL filename, then it cannot be true, but it's kind of strange
|
|
1571
|
+
# to get asked.
|
|
1572
|
+
if dll_basename is None:
|
|
1573
|
+
return None, None
|
|
1574
|
+
|
|
1575
|
+
result = None
|
|
1576
|
+
plugin_name = None
|
|
1577
|
+
|
|
1578
|
+
for plugin in getActivePlugins():
|
|
1579
|
+
value = plugin.isAcceptableMissingDLL(
|
|
1580
|
+
package_name=package_name, dll_basename=dll_basename
|
|
1581
|
+
)
|
|
1582
|
+
|
|
1583
|
+
if value is True:
|
|
1584
|
+
if result is False:
|
|
1585
|
+
plugin.sysexit(
|
|
1586
|
+
"Error, conflicting accept/reject missing DLLs of plug-in '%s'."
|
|
1587
|
+
% plugin_name
|
|
1588
|
+
)
|
|
1589
|
+
|
|
1590
|
+
result = True
|
|
1591
|
+
plugin_name = plugin.plugin_name
|
|
1592
|
+
|
|
1593
|
+
elif value is False:
|
|
1594
|
+
if result is False:
|
|
1595
|
+
plugin.sysexit(
|
|
1596
|
+
"Error, conflicting accept/reject missing DLLs of plug-in '%s'."
|
|
1597
|
+
% plugin_name
|
|
1598
|
+
)
|
|
1599
|
+
|
|
1600
|
+
result = False
|
|
1601
|
+
plugin_name = plugin.plugin_name
|
|
1602
|
+
elif value is not None:
|
|
1603
|
+
plugin.sysexit(
|
|
1604
|
+
"Error, can only return True, False, None from 'isAcceptableMissingDLL' not %r"
|
|
1605
|
+
% value
|
|
1606
|
+
)
|
|
1607
|
+
|
|
1608
|
+
return result, plugin_name
|
|
1609
|
+
|
|
1610
|
+
|
|
1611
|
+
def listPlugins():
|
|
1612
|
+
"""Print available standard plugins."""
|
|
1613
|
+
|
|
1614
|
+
loadPlugins()
|
|
1615
|
+
|
|
1616
|
+
printLine("The following plugins are available in Nuitka".center(80))
|
|
1617
|
+
printLine("-" * 80)
|
|
1618
|
+
|
|
1619
|
+
plist = []
|
|
1620
|
+
max_name_length = 0
|
|
1621
|
+
for plugin_name in sorted(plugin_name2plugin_classes):
|
|
1622
|
+
plugin = plugin_name2plugin_classes[plugin_name][0]
|
|
1623
|
+
|
|
1624
|
+
if plugin.isDeprecated():
|
|
1625
|
+
continue
|
|
1626
|
+
|
|
1627
|
+
if hasattr(plugin, "plugin_desc"):
|
|
1628
|
+
plist.append((plugin_name, plugin.plugin_desc))
|
|
1629
|
+
else:
|
|
1630
|
+
plist.append((plugin_name, ""))
|
|
1631
|
+
|
|
1632
|
+
max_name_length = max(len(plugin_name), max_name_length)
|
|
1633
|
+
|
|
1634
|
+
for line in plist:
|
|
1635
|
+
printLine(" " + line[0].ljust(max_name_length + 1), line[1])
|
|
1636
|
+
|
|
1637
|
+
|
|
1638
|
+
def isObjectAUserPluginBaseClass(obj):
|
|
1639
|
+
"""Verify that a user plugin inherits from UserPluginBase."""
|
|
1640
|
+
try:
|
|
1641
|
+
return (
|
|
1642
|
+
obj is not NuitkaPluginBase
|
|
1643
|
+
and issubclass(obj, NuitkaPluginBase)
|
|
1644
|
+
and not inspect.isabstract(obj)
|
|
1645
|
+
and not obj.__name__.endswith("PluginBase")
|
|
1646
|
+
)
|
|
1647
|
+
except TypeError:
|
|
1648
|
+
return False
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
def loadUserPlugin(plugin_filename):
|
|
1652
|
+
"""Load of a user plugins and store them in list of active plugins.
|
|
1653
|
+
|
|
1654
|
+
Notes:
|
|
1655
|
+
A plugin is accepted only if it has a non-empty variable plugin_name, which
|
|
1656
|
+
does not equal that of a disabled (standard) plugin.
|
|
1657
|
+
Supports plugin option specifications.
|
|
1658
|
+
Returns:
|
|
1659
|
+
None
|
|
1660
|
+
"""
|
|
1661
|
+
if not os.path.exists(plugin_filename):
|
|
1662
|
+
plugins_logger.sysexit("Error, cannot find '%s'." % plugin_filename)
|
|
1663
|
+
|
|
1664
|
+
user_plugin_module = importFileAsModule(plugin_filename)
|
|
1665
|
+
|
|
1666
|
+
valid_file = False
|
|
1667
|
+
plugin_class = None
|
|
1668
|
+
for key in dir(user_plugin_module):
|
|
1669
|
+
obj = getattr(user_plugin_module, key)
|
|
1670
|
+
if not isObjectAUserPluginBaseClass(obj):
|
|
1671
|
+
continue
|
|
1672
|
+
|
|
1673
|
+
plugin_name = getattr(obj, "plugin_name", None)
|
|
1674
|
+
if plugin_name and plugin_name not in Options.getPluginsDisabled():
|
|
1675
|
+
plugin_class = obj
|
|
1676
|
+
|
|
1677
|
+
valid_file = True
|
|
1678
|
+
break # do not look for more in that module
|
|
1679
|
+
|
|
1680
|
+
if not valid_file: # this is not a plugin file ...
|
|
1681
|
+
plugins_logger.sysexit("Error, '%s' is not a plugin file." % plugin_filename)
|
|
1682
|
+
|
|
1683
|
+
return plugin_class
|
|
1684
|
+
|
|
1685
|
+
|
|
1686
|
+
_loaded_plugins = False
|
|
1687
|
+
|
|
1688
|
+
|
|
1689
|
+
def loadPlugins():
|
|
1690
|
+
"""Initialize plugin class
|
|
1691
|
+
|
|
1692
|
+
Notes:
|
|
1693
|
+
Load user plugins provided as Python script file names, and standard
|
|
1694
|
+
plugins via their class attribute 'plugin_name'.
|
|
1695
|
+
|
|
1696
|
+
Several checks are made, see the loader functions.
|
|
1697
|
+
|
|
1698
|
+
User plugins are enabled as a first step, because they themselves may
|
|
1699
|
+
enable standard plugins.
|
|
1700
|
+
|
|
1701
|
+
Returns:
|
|
1702
|
+
None
|
|
1703
|
+
"""
|
|
1704
|
+
|
|
1705
|
+
# Singleton, called potentially multiple times, pylint: disable=global-statement
|
|
1706
|
+
global _loaded_plugins
|
|
1707
|
+
if not _loaded_plugins:
|
|
1708
|
+
_loaded_plugins = True
|
|
1709
|
+
|
|
1710
|
+
# now enable standard plugins
|
|
1711
|
+
loadStandardPluginClasses()
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
# TODO: Use in more places.
|
|
1715
|
+
def _keyPluginForSort(plugin_class):
|
|
1716
|
+
return plugin_class.getCategories(), plugin_class.plugin_name
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
def _keyPluginForSort2(item):
|
|
1720
|
+
_plugin_name, (plugin_class, _plugin_detector) = item
|
|
1721
|
+
|
|
1722
|
+
return _keyPluginForSort(plugin_class)
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
def addStandardPluginCommandLineOptions(parser, plugin_help_mode):
|
|
1726
|
+
loadPlugins()
|
|
1727
|
+
|
|
1728
|
+
for _plugin_name, (plugin_class, _plugin_detector) in sorted(
|
|
1729
|
+
plugin_name2plugin_classes.items(), key=_keyPluginForSort2
|
|
1730
|
+
):
|
|
1731
|
+
if plugin_class.isAlwaysEnabled():
|
|
1732
|
+
if not plugin_help_mode or not plugin_class.hasCategory("package-support"):
|
|
1733
|
+
_addPluginCommandLineOptions(
|
|
1734
|
+
parser=parser,
|
|
1735
|
+
plugin_class=plugin_class,
|
|
1736
|
+
plugin_help_mode=plugin_help_mode,
|
|
1737
|
+
)
|
|
1738
|
+
else:
|
|
1739
|
+
if plugin_help_mode:
|
|
1740
|
+
_addPluginCommandLineOptions(
|
|
1741
|
+
parser=parser,
|
|
1742
|
+
plugin_class=plugin_class,
|
|
1743
|
+
plugin_help_mode=plugin_help_mode,
|
|
1744
|
+
)
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
def activatePlugins():
|
|
1748
|
+
"""Activate selected plugin classes
|
|
1749
|
+
|
|
1750
|
+
Args:
|
|
1751
|
+
None
|
|
1752
|
+
|
|
1753
|
+
Notes:
|
|
1754
|
+
This creates actual plugin instances, before only class objects were
|
|
1755
|
+
used.
|
|
1756
|
+
|
|
1757
|
+
User plugins are activated as a first step, because they themselves may
|
|
1758
|
+
enable standard plugins.
|
|
1759
|
+
|
|
1760
|
+
Returns:
|
|
1761
|
+
None
|
|
1762
|
+
"""
|
|
1763
|
+
# Many cases, often with UI related decisions, pylint: disable=too-many-branches
|
|
1764
|
+
|
|
1765
|
+
loadPlugins()
|
|
1766
|
+
|
|
1767
|
+
# ensure plugin is known and not both, enabled and disabled
|
|
1768
|
+
for plugin_name in Options.getPluginsEnabled() + Options.getPluginsDisabled():
|
|
1769
|
+
if plugin_name not in plugin_name2plugin_classes:
|
|
1770
|
+
plugins_logger.sysexit(
|
|
1771
|
+
"Error, unknown plug-in '%s' referenced." % plugin_name
|
|
1772
|
+
)
|
|
1773
|
+
|
|
1774
|
+
if (
|
|
1775
|
+
plugin_name in Options.getPluginsEnabled()
|
|
1776
|
+
and plugin_name in Options.getPluginsDisabled()
|
|
1777
|
+
):
|
|
1778
|
+
plugins_logger.sysexit(
|
|
1779
|
+
"Error, conflicting enable/disable of plug-in '%s'." % plugin_name
|
|
1780
|
+
)
|
|
1781
|
+
|
|
1782
|
+
plugin_detectors = OrderedSet()
|
|
1783
|
+
|
|
1784
|
+
for plugin_name, (plugin_class, plugin_detector) in sorted(
|
|
1785
|
+
plugin_name2plugin_classes.items()
|
|
1786
|
+
):
|
|
1787
|
+
if plugin_name in Options.getPluginsEnabled():
|
|
1788
|
+
if plugin_class.isAlwaysEnabled():
|
|
1789
|
+
plugin_class.warning(
|
|
1790
|
+
"Plugin is defined as always enabled, no need to enable it."
|
|
1791
|
+
)
|
|
1792
|
+
|
|
1793
|
+
if plugin_class.isRelevant():
|
|
1794
|
+
_addActivePlugin(plugin_class, args=True)
|
|
1795
|
+
elif plugin_class.isDeprecated():
|
|
1796
|
+
plugin_class.warning(
|
|
1797
|
+
"This plugin has been deprecated, do not enable it anymore."
|
|
1798
|
+
)
|
|
1799
|
+
else:
|
|
1800
|
+
plugin_class.warning(
|
|
1801
|
+
"Not relevant with this OS, or Nuitka arguments given, not activated."
|
|
1802
|
+
)
|
|
1803
|
+
elif plugin_name in Options.getPluginsDisabled():
|
|
1804
|
+
pass
|
|
1805
|
+
elif plugin_class.isAlwaysEnabled() and plugin_class.isRelevant():
|
|
1806
|
+
_addActivePlugin(plugin_class, args=True)
|
|
1807
|
+
elif (
|
|
1808
|
+
plugin_detector is not None
|
|
1809
|
+
and Options.shallDetectMissingPlugins()
|
|
1810
|
+
and plugin_detector.isRelevant()
|
|
1811
|
+
):
|
|
1812
|
+
plugin_detectors.add(plugin_detector)
|
|
1813
|
+
|
|
1814
|
+
for plugin_class in user_plugins:
|
|
1815
|
+
_addActivePlugin(plugin_class, args=True)
|
|
1816
|
+
|
|
1817
|
+
# Suppress GUI toolkit detectors automatically.
|
|
1818
|
+
for plugin_detector in plugin_detectors:
|
|
1819
|
+
if (
|
|
1820
|
+
not has_active_gui_toolkit_plugin
|
|
1821
|
+
or plugin_detector.plugin_name not in getGuiPluginNames()
|
|
1822
|
+
):
|
|
1823
|
+
_addActivePlugin(plugin_detector, args=False)
|
|
1824
|
+
|
|
1825
|
+
|
|
1826
|
+
def _addPluginCommandLineOptions(parser, plugin_class, plugin_help_mode):
|
|
1827
|
+
plugin_name = plugin_class.plugin_name
|
|
1828
|
+
|
|
1829
|
+
if plugin_name not in plugin_options:
|
|
1830
|
+
plugin_display_name = repr(plugin_name)
|
|
1831
|
+
|
|
1832
|
+
if plugin_help_mode:
|
|
1833
|
+
# Ignore duplicate per design givers.
|
|
1834
|
+
if plugin_name in ("pyside2", "pyqt6", "pyqt5"):
|
|
1835
|
+
return
|
|
1836
|
+
|
|
1837
|
+
if plugin_name == "pyside6":
|
|
1838
|
+
plugin_display_name = (
|
|
1839
|
+
"'pyside6' (same for 'pyside2', 'pyqt6', 'pyqt5' plugins)"
|
|
1840
|
+
)
|
|
1841
|
+
|
|
1842
|
+
option_group = OurOptionGroup(
|
|
1843
|
+
parser,
|
|
1844
|
+
"Plugin options of %s (categories: %s)"
|
|
1845
|
+
% (plugin_display_name, ", ".join(plugin_class.getCategories())),
|
|
1846
|
+
)
|
|
1847
|
+
try:
|
|
1848
|
+
plugin_class.addPluginCommandLineOptions(option_group)
|
|
1849
|
+
except OptionConflictError as e:
|
|
1850
|
+
for other_plugin_name, other_plugin_option_list in plugin_options.items():
|
|
1851
|
+
for other_plugin_option in other_plugin_option_list:
|
|
1852
|
+
# no public interface for that, pylint: disable=protected-access
|
|
1853
|
+
if (
|
|
1854
|
+
e.option_id in other_plugin_option._long_opts
|
|
1855
|
+
or other_plugin_option._short_opts
|
|
1856
|
+
):
|
|
1857
|
+
plugins_logger.sysexit(
|
|
1858
|
+
"Plugin '%s' failed to add options due to conflict with '%s' from plugin '%s."
|
|
1859
|
+
% (plugin_name, e.option_id, other_plugin_name)
|
|
1860
|
+
)
|
|
1861
|
+
|
|
1862
|
+
if option_group.option_list:
|
|
1863
|
+
parser.add_option_group(option_group)
|
|
1864
|
+
plugin_options[plugin_name] = option_group.option_list
|
|
1865
|
+
else:
|
|
1866
|
+
plugin_options[plugin_name] = ()
|
|
1867
|
+
|
|
1868
|
+
|
|
1869
|
+
def addPluginCommandLineOptions(parser, plugin_names, plugin_help_mode):
|
|
1870
|
+
"""Add option group for the plugin to the parser.
|
|
1871
|
+
|
|
1872
|
+
Notes:
|
|
1873
|
+
This is exclusively for use in the command line parsing. Not all
|
|
1874
|
+
plugins have to have options. But this will add them to the
|
|
1875
|
+
parser in a first pass, so they can be recognized in a second
|
|
1876
|
+
pass with them included.
|
|
1877
|
+
|
|
1878
|
+
Returns:
|
|
1879
|
+
None
|
|
1880
|
+
"""
|
|
1881
|
+
for plugin_name in plugin_names:
|
|
1882
|
+
plugin_class = getPluginClass(plugin_name)
|
|
1883
|
+
_addPluginCommandLineOptions(
|
|
1884
|
+
parser=parser, plugin_class=plugin_class, plugin_help_mode=plugin_help_mode
|
|
1885
|
+
)
|
|
1886
|
+
|
|
1887
|
+
|
|
1888
|
+
def addUserPluginCommandLineOptions(parser, filename):
|
|
1889
|
+
plugin_class = loadUserPlugin(filename)
|
|
1890
|
+
_addPluginCommandLineOptions(
|
|
1891
|
+
parser=parser,
|
|
1892
|
+
plugin_class=plugin_class,
|
|
1893
|
+
# List those user plugins always.
|
|
1894
|
+
plugin_help_mode=True,
|
|
1895
|
+
)
|
|
1896
|
+
|
|
1897
|
+
user_plugins.add(plugin_class)
|
|
1898
|
+
|
|
1899
|
+
|
|
1900
|
+
def setPluginOptions(plugin_name, values):
|
|
1901
|
+
"""Set the option values for the specified plugin.
|
|
1902
|
+
|
|
1903
|
+
Args:
|
|
1904
|
+
plugin_name: plugin identifier
|
|
1905
|
+
values: dictionary to be used for the plugin constructor
|
|
1906
|
+
Notes:
|
|
1907
|
+
Use this function, if you want to set the plugin values, without using
|
|
1908
|
+
the actual command line parsing.
|
|
1909
|
+
|
|
1910
|
+
Normally the command line arguments are populating the dictionary for
|
|
1911
|
+
the plugin, but this will be used if given, and command line parsing
|
|
1912
|
+
is not done.
|
|
1913
|
+
"""
|
|
1914
|
+
assert isinstance(values, dict), values
|
|
1915
|
+
plugin_values[plugin_name] = values
|
|
1916
|
+
|
|
1917
|
+
|
|
1918
|
+
def getPluginOptions(plugin_name):
|
|
1919
|
+
"""Return the options values for the specified plugin.
|
|
1920
|
+
|
|
1921
|
+
Args:
|
|
1922
|
+
plugin_name: plugin identifier
|
|
1923
|
+
Returns:
|
|
1924
|
+
dict with key, value of options given, potentially from default values.
|
|
1925
|
+
"""
|
|
1926
|
+
result = plugin_values.get(plugin_name, {})
|
|
1927
|
+
|
|
1928
|
+
for option in plugin_options.get(plugin_name, {}):
|
|
1929
|
+
option_name = option._long_opts[0] # pylint: disable=protected-access
|
|
1930
|
+
|
|
1931
|
+
arg_value = getattr(Options.options, option.dest)
|
|
1932
|
+
|
|
1933
|
+
if "[REQUIRED]" in option.help:
|
|
1934
|
+
if not arg_value:
|
|
1935
|
+
plugins_logger.sysexit(
|
|
1936
|
+
"Error, required plugin argument '%s' of Nuitka plugin '%s' not given."
|
|
1937
|
+
% (option_name, plugin_name)
|
|
1938
|
+
)
|
|
1939
|
+
|
|
1940
|
+
result[option.dest] = arg_value
|
|
1941
|
+
|
|
1942
|
+
return result
|
|
1943
|
+
|
|
1944
|
+
|
|
1945
|
+
def replaceTriggerModule(old, new):
|
|
1946
|
+
"""Replace a trigger module with another form if it. For use in bytecode demotion."""
|
|
1947
|
+
|
|
1948
|
+
found = None
|
|
1949
|
+
for key, value in pre_modules.items():
|
|
1950
|
+
if value is old:
|
|
1951
|
+
found = key
|
|
1952
|
+
break
|
|
1953
|
+
|
|
1954
|
+
if found is not None:
|
|
1955
|
+
pre_modules[found] = new
|
|
1956
|
+
|
|
1957
|
+
found = None
|
|
1958
|
+
for key, value in post_modules.items():
|
|
1959
|
+
if value is old:
|
|
1960
|
+
found = key
|
|
1961
|
+
break
|
|
1962
|
+
|
|
1963
|
+
if found is not None:
|
|
1964
|
+
post_modules[found] = new
|
|
1965
|
+
|
|
1966
|
+
|
|
1967
|
+
def isTriggerModule(module):
|
|
1968
|
+
"""Decide of a module is a trigger module."""
|
|
1969
|
+
return module in pre_modules.values() or module in post_modules.values()
|
|
1970
|
+
|
|
1971
|
+
|
|
1972
|
+
# TODO: Make this a dedicated thing generally.
|
|
1973
|
+
def _getMainModulePreloadCodes():
|
|
1974
|
+
forced_runtime_env_variable_values = tuple(
|
|
1975
|
+
Options.getForcedRuntimeEnvironmentVariableValues()
|
|
1976
|
+
)
|
|
1977
|
+
if not forced_runtime_env_variable_values:
|
|
1978
|
+
return
|
|
1979
|
+
|
|
1980
|
+
result = ["import os"]
|
|
1981
|
+
|
|
1982
|
+
for (
|
|
1983
|
+
forced_runtime_env_variable_name,
|
|
1984
|
+
forced_runtime_env_variable_value,
|
|
1985
|
+
) in forced_runtime_env_variable_values:
|
|
1986
|
+
result.append(
|
|
1987
|
+
"os.environ['%s'] = '%s'"
|
|
1988
|
+
% (forced_runtime_env_variable_name, forced_runtime_env_variable_value)
|
|
1989
|
+
)
|
|
1990
|
+
|
|
1991
|
+
yield ("\n".join(result), "forcing environment variable(s)")
|
|
1992
|
+
|
|
1993
|
+
|
|
1994
|
+
# Part of "Nuitka", an optimizing Python compiler that is compatible and
|
|
1995
|
+
# integrates with CPython, but also works on its own.
|
|
1996
|
+
#
|
|
1997
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
1998
|
+
# you may not use this file except in compliance with the License.
|
|
1999
|
+
# You may obtain a copy of the License at
|
|
2000
|
+
#
|
|
2001
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
2002
|
+
#
|
|
2003
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
2004
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
2005
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2006
|
+
# See the License for the specific language governing permissions and
|
|
2007
|
+
# limitations under the License.
|