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.

Files changed (995) hide show
  1. nuitka/Builtins.py +259 -0
  2. nuitka/BytecodeCaching.py +184 -0
  3. nuitka/Bytecodes.py +109 -0
  4. nuitka/CacheCleanup.py +54 -0
  5. nuitka/Constants.py +425 -0
  6. nuitka/Errors.py +93 -0
  7. nuitka/HardImportRegistry.py +408 -0
  8. nuitka/MainControl.py +1201 -0
  9. nuitka/ModuleRegistry.py +364 -0
  10. nuitka/OptionParsing.py +2473 -0
  11. nuitka/Options.py +2948 -0
  12. nuitka/OutputDirectories.py +201 -0
  13. nuitka/PostProcessing.py +551 -0
  14. nuitka/Progress.py +252 -0
  15. nuitka/PythonFlavors.py +426 -0
  16. nuitka/PythonOperators.py +146 -0
  17. nuitka/PythonVersions.py +513 -0
  18. nuitka/Serialization.py +291 -0
  19. nuitka/SourceCodeReferences.py +176 -0
  20. nuitka/Tracing.py +579 -0
  21. nuitka/TreeXML.py +141 -0
  22. nuitka/Variables.py +515 -0
  23. nuitka/Version.py +88 -0
  24. nuitka/__init__.py +19 -0
  25. nuitka/__main__.py +224 -0
  26. nuitka/__past__.py +217 -0
  27. nuitka/build/Backend.scons +1111 -0
  28. nuitka/build/CCompilerVersion.scons +281 -0
  29. nuitka/build/DataComposerInterface.py +116 -0
  30. nuitka/build/Offsets.scons +626 -0
  31. nuitka/build/Onefile.scons +564 -0
  32. nuitka/build/SconsCaching.py +451 -0
  33. nuitka/build/SconsCompilerSettings.py +1133 -0
  34. nuitka/build/SconsHacks.py +215 -0
  35. nuitka/build/SconsInterface.py +664 -0
  36. nuitka/build/SconsProgress.py +100 -0
  37. nuitka/build/SconsSpawn.py +436 -0
  38. nuitka/build/SconsUtils.py +939 -0
  39. nuitka/build/__init__.py +19 -0
  40. nuitka/build/include/nuitka/allocator.h +450 -0
  41. nuitka/build/include/nuitka/builtins.h +97 -0
  42. nuitka/build/include/nuitka/calling.h +123 -0
  43. nuitka/build/include/nuitka/checkers.h +39 -0
  44. nuitka/build/include/nuitka/checksum_tools.h +28 -0
  45. nuitka/build/include/nuitka/compiled_asyncgen.h +281 -0
  46. nuitka/build/include/nuitka/compiled_cell.h +64 -0
  47. nuitka/build/include/nuitka/compiled_coroutine.h +271 -0
  48. nuitka/build/include/nuitka/compiled_frame.h +502 -0
  49. nuitka/build/include/nuitka/compiled_function.h +170 -0
  50. nuitka/build/include/nuitka/compiled_generator.h +287 -0
  51. nuitka/build/include/nuitka/compiled_method.h +54 -0
  52. nuitka/build/include/nuitka/constants.h +251 -0
  53. nuitka/build/include/nuitka/constants_blob.h +34 -0
  54. nuitka/build/include/nuitka/debug_settings.h +60 -0
  55. nuitka/build/include/nuitka/environment_variables.h +30 -0
  56. nuitka/build/include/nuitka/environment_variables_system.h +51 -0
  57. nuitka/build/include/nuitka/exception_groups.h +167 -0
  58. nuitka/build/include/nuitka/exceptions.h +1458 -0
  59. nuitka/build/include/nuitka/filesystem_paths.h +117 -0
  60. nuitka/build/include/nuitka/freelists.h +92 -0
  61. nuitka/build/include/nuitka/hedley.h +1774 -0
  62. nuitka/build/include/nuitka/helper/attributes.h +90 -0
  63. nuitka/build/include/nuitka/helper/boolean.h +86 -0
  64. nuitka/build/include/nuitka/helper/bytearrays.h +34 -0
  65. nuitka/build/include/nuitka/helper/bytes.h +28 -0
  66. nuitka/build/include/nuitka/helper/calling_generated.h +132 -0
  67. nuitka/build/include/nuitka/helper/comparisons_dual_eq.h +47 -0
  68. nuitka/build/include/nuitka/helper/comparisons_dual_ge.h +39 -0
  69. nuitka/build/include/nuitka/helper/comparisons_dual_gt.h +39 -0
  70. nuitka/build/include/nuitka/helper/comparisons_dual_le.h +47 -0
  71. nuitka/build/include/nuitka/helper/comparisons_dual_lt.h +47 -0
  72. nuitka/build/include/nuitka/helper/comparisons_dual_ne.h +39 -0
  73. nuitka/build/include/nuitka/helper/comparisons_eq.h +247 -0
  74. nuitka/build/include/nuitka/helper/comparisons_ge.h +197 -0
  75. nuitka/build/include/nuitka/helper/comparisons_gt.h +197 -0
  76. nuitka/build/include/nuitka/helper/comparisons_le.h +247 -0
  77. nuitka/build/include/nuitka/helper/comparisons_lt.h +247 -0
  78. nuitka/build/include/nuitka/helper/comparisons_ne.h +197 -0
  79. nuitka/build/include/nuitka/helper/complex.h +46 -0
  80. nuitka/build/include/nuitka/helper/dictionaries.h +481 -0
  81. nuitka/build/include/nuitka/helper/floats.h +32 -0
  82. nuitka/build/include/nuitka/helper/import_hard.h +121 -0
  83. nuitka/build/include/nuitka/helper/indexes.h +47 -0
  84. nuitka/build/include/nuitka/helper/ints.h +165 -0
  85. nuitka/build/include/nuitka/helper/iterators.h +376 -0
  86. nuitka/build/include/nuitka/helper/lists.h +94 -0
  87. nuitka/build/include/nuitka/helper/lists_generated.h +36 -0
  88. nuitka/build/include/nuitka/helper/mappings.h +39 -0
  89. nuitka/build/include/nuitka/helper/operations.h +114 -0
  90. nuitka/build/include/nuitka/helper/operations_binary_add.h +240 -0
  91. nuitka/build/include/nuitka/helper/operations_binary_bitand.h +108 -0
  92. nuitka/build/include/nuitka/helper/operations_binary_bitor.h +108 -0
  93. nuitka/build/include/nuitka/helper/operations_binary_bitxor.h +108 -0
  94. nuitka/build/include/nuitka/helper/operations_binary_divmod.h +103 -0
  95. nuitka/build/include/nuitka/helper/operations_binary_dual_add.h +34 -0
  96. nuitka/build/include/nuitka/helper/operations_binary_floordiv.h +103 -0
  97. nuitka/build/include/nuitka/helper/operations_binary_lshift.h +99 -0
  98. nuitka/build/include/nuitka/helper/operations_binary_matmult.h +60 -0
  99. nuitka/build/include/nuitka/helper/operations_binary_mod.h +304 -0
  100. nuitka/build/include/nuitka/helper/operations_binary_mult.h +247 -0
  101. nuitka/build/include/nuitka/helper/operations_binary_olddiv.h +125 -0
  102. nuitka/build/include/nuitka/helper/operations_binary_pow.h +90 -0
  103. nuitka/build/include/nuitka/helper/operations_binary_rshift.h +99 -0
  104. nuitka/build/include/nuitka/helper/operations_binary_sub.h +117 -0
  105. nuitka/build/include/nuitka/helper/operations_binary_truediv.h +103 -0
  106. nuitka/build/include/nuitka/helper/operations_builtin_types.h +247 -0
  107. nuitka/build/include/nuitka/helper/operations_inplace_add.h +173 -0
  108. nuitka/build/include/nuitka/helper/operations_inplace_bitand.h +76 -0
  109. nuitka/build/include/nuitka/helper/operations_inplace_bitor.h +76 -0
  110. nuitka/build/include/nuitka/helper/operations_inplace_bitxor.h +76 -0
  111. nuitka/build/include/nuitka/helper/operations_inplace_floordiv.h +95 -0
  112. nuitka/build/include/nuitka/helper/operations_inplace_lshift.h +62 -0
  113. nuitka/build/include/nuitka/helper/operations_inplace_matmult.h +60 -0
  114. nuitka/build/include/nuitka/helper/operations_inplace_mod.h +218 -0
  115. nuitka/build/include/nuitka/helper/operations_inplace_mult.h +184 -0
  116. nuitka/build/include/nuitka/helper/operations_inplace_olddiv.h +115 -0
  117. nuitka/build/include/nuitka/helper/operations_inplace_pow.h +87 -0
  118. nuitka/build/include/nuitka/helper/operations_inplace_rshift.h +62 -0
  119. nuitka/build/include/nuitka/helper/operations_inplace_sub.h +102 -0
  120. nuitka/build/include/nuitka/helper/operations_inplace_truediv.h +95 -0
  121. nuitka/build/include/nuitka/helper/raising.h +114 -0
  122. nuitka/build/include/nuitka/helper/rangeobjects.h +66 -0
  123. nuitka/build/include/nuitka/helper/richcomparisons.h +35 -0
  124. nuitka/build/include/nuitka/helper/sequences.h +33 -0
  125. nuitka/build/include/nuitka/helper/sets.h +25 -0
  126. nuitka/build/include/nuitka/helper/slices.h +314 -0
  127. nuitka/build/include/nuitka/helper/strings.h +30 -0
  128. nuitka/build/include/nuitka/helper/subscripts.h +390 -0
  129. nuitka/build/include/nuitka/helper/tuples.h +187 -0
  130. nuitka/build/include/nuitka/helpers.h +417 -0
  131. nuitka/build/include/nuitka/importing.h +149 -0
  132. nuitka/build/include/nuitka/incbin.h +402 -0
  133. nuitka/build/include/nuitka/jit_sources.h +25 -0
  134. nuitka/build/include/nuitka/prelude.h +626 -0
  135. nuitka/build/include/nuitka/printing.h +84 -0
  136. nuitka/build/include/nuitka/python_pgo.h +57 -0
  137. nuitka/build/include/nuitka/safe_string_ops.h +57 -0
  138. nuitka/build/include/nuitka/threading.h +142 -0
  139. nuitka/build/include/nuitka/tracing.h +82 -0
  140. nuitka/build/include/nuitka/type_aliases.h +30 -0
  141. nuitka/build/include/nuitka/unfreezing.h +91 -0
  142. nuitka/build/inline_copy/appdirs/LICENSE.txt +23 -0
  143. nuitka/build/inline_copy/appdirs/appdirs.py +611 -0
  144. nuitka/build/inline_copy/atomicwrites/LICENSE +19 -0
  145. nuitka/build/inline_copy/atomicwrites/atomicwrites.py +226 -0
  146. nuitka/build/inline_copy/bin/scons.py +58 -0
  147. nuitka/build/inline_copy/clcache/clcache/LICENSE +30 -0
  148. nuitka/build/inline_copy/clcache/clcache/__init__.py +4 -0
  149. nuitka/build/inline_copy/clcache/clcache/caching.py +2008 -0
  150. nuitka/build/inline_copy/colorama/LICENSE.txt +27 -0
  151. nuitka/build/inline_copy/colorama/colorama/__init__.py +6 -0
  152. nuitka/build/inline_copy/colorama/colorama/ansi.py +102 -0
  153. nuitka/build/inline_copy/colorama/colorama/ansitowin32.py +258 -0
  154. nuitka/build/inline_copy/colorama/colorama/initialise.py +80 -0
  155. nuitka/build/inline_copy/colorama/colorama/win32.py +152 -0
  156. nuitka/build/inline_copy/colorama/colorama/winterm.py +169 -0
  157. nuitka/build/inline_copy/glob2/LICENSE +27 -0
  158. nuitka/build/inline_copy/glob2/glob2/__init__.py +5 -0
  159. nuitka/build/inline_copy/glob2/glob2/compat.py +167 -0
  160. nuitka/build/inline_copy/glob2/glob2/fnmatch.py +141 -0
  161. nuitka/build/inline_copy/glob2/glob2/impl.py +216 -0
  162. nuitka/build/inline_copy/jinja2/LICENSE.rst +28 -0
  163. nuitka/build/inline_copy/jinja2/README.rst +2 -0
  164. nuitka/build/inline_copy/jinja2/jinja2/__init__.py +72 -0
  165. nuitka/build/inline_copy/jinja2/jinja2/_compat.py +105 -0
  166. nuitka/build/inline_copy/jinja2/jinja2/_identifier.py +2 -0
  167. nuitka/build/inline_copy/jinja2/jinja2/bccache.py +361 -0
  168. nuitka/build/inline_copy/jinja2/jinja2/compiler.py +1721 -0
  169. nuitka/build/inline_copy/jinja2/jinja2/constants.py +32 -0
  170. nuitka/build/inline_copy/jinja2/jinja2/debug.py +378 -0
  171. nuitka/build/inline_copy/jinja2/jinja2/defaults.py +56 -0
  172. nuitka/build/inline_copy/jinja2/jinja2/environment.py +1276 -0
  173. nuitka/build/inline_copy/jinja2/jinja2/exceptions.py +146 -0
  174. nuitka/build/inline_copy/jinja2/jinja2/ext.py +627 -0
  175. nuitka/build/inline_copy/jinja2/jinja2/filters.py +1190 -0
  176. nuitka/build/inline_copy/jinja2/jinja2/idtracking.py +286 -0
  177. nuitka/build/inline_copy/jinja2/jinja2/lexer.py +739 -0
  178. nuitka/build/inline_copy/jinja2/jinja2/loaders.py +483 -0
  179. nuitka/build/inline_copy/jinja2/jinja2/meta.py +106 -0
  180. nuitka/build/inline_copy/jinja2/jinja2/nativetypes.py +220 -0
  181. nuitka/build/inline_copy/jinja2/jinja2/nodes.py +999 -0
  182. nuitka/build/inline_copy/jinja2/jinja2/optimizer.py +49 -0
  183. nuitka/build/inline_copy/jinja2/jinja2/parser.py +903 -0
  184. nuitka/build/inline_copy/jinja2/jinja2/runtime.py +808 -0
  185. nuitka/build/inline_copy/jinja2/jinja2/sandbox.py +488 -0
  186. nuitka/build/inline_copy/jinja2/jinja2/tests.py +174 -0
  187. nuitka/build/inline_copy/jinja2/jinja2/utils.py +642 -0
  188. nuitka/build/inline_copy/jinja2/jinja2/visitor.py +87 -0
  189. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Action.py +1475 -0
  190. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Builder.py +905 -0
  191. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/CacheDir.py +314 -0
  192. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Conftest.py +805 -0
  193. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Debug.py +251 -0
  194. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Defaults.py +646 -0
  195. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Environment.py +2561 -0
  196. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/EnvironmentValues.py +119 -0
  197. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Errors.py +222 -0
  198. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Executor.py +660 -0
  199. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Job.py +439 -0
  200. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Memoize.py +242 -0
  201. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Alias.py +176 -0
  202. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/FS.py +3861 -0
  203. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/Python.py +195 -0
  204. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Node/__init__.py +1784 -0
  205. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/PathList.py +224 -0
  206. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/__init__.py +341 -0
  207. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/aix.py +81 -0
  208. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/cygwin.py +61 -0
  209. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/darwin.py +70 -0
  210. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/hpux.py +45 -0
  211. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/irix.py +41 -0
  212. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/mingw.py +33 -0
  213. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/os2.py +55 -0
  214. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/posix.py +124 -0
  215. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/sunos.py +47 -0
  216. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/virtualenv.py +115 -0
  217. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Platform/win32.py +429 -0
  218. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConf.py +1119 -0
  219. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/SConsign.py +453 -0
  220. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/C.py +226 -0
  221. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Dir.py +131 -0
  222. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/Prog.py +114 -0
  223. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/RC.py +57 -0
  224. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Scanner/__init__.py +436 -0
  225. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Interactive.py +372 -0
  226. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/Main.py +1469 -0
  227. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConsOptions.py +1071 -0
  228. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/SConscript.py +686 -0
  229. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Script/__init__.py +425 -0
  230. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Subst.py +979 -0
  231. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Taskmaster.py +1062 -0
  232. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/386asm.py +61 -0
  233. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/GettextCommon.py +429 -0
  234. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/__init__.py +52 -0
  235. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/arch.py +66 -0
  236. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/common.py +371 -0
  237. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/netframework.py +83 -0
  238. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/sdk.py +411 -0
  239. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vc.py +994 -0
  240. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/MSCommon/vs.py +608 -0
  241. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/PharLapCommon.py +116 -0
  242. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/__init__.py +882 -0
  243. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixc++.py +43 -0
  244. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcc.py +74 -0
  245. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixcxx.py +77 -0
  246. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/aixlink.py +78 -0
  247. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/applelink.py +209 -0
  248. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ar.py +63 -0
  249. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/as.py +49 -0
  250. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/asm.py +78 -0
  251. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/bcc32.py +81 -0
  252. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/c++.py +44 -0
  253. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cc.py +105 -0
  254. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clang.py +91 -0
  255. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangCommon/__init__.py +18 -0
  256. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/clangxx.py +99 -0
  257. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cxx.py +95 -0
  258. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/cyglink.py +212 -0
  259. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/default.py +50 -0
  260. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/filesystem.py +98 -0
  261. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/g++.py +45 -0
  262. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gas.py +56 -0
  263. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gcc.py +110 -0
  264. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gettext_tool.py +69 -0
  265. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gnulink.py +70 -0
  266. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/gxx.py +78 -0
  267. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpc++.py +45 -0
  268. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcc.py +53 -0
  269. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hpcxx.py +88 -0
  270. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/hplink.py +72 -0
  271. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icc.py +59 -0
  272. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/icl.py +52 -0
  273. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink.py +55 -0
  274. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/ilink32.py +60 -0
  275. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/install.py +510 -0
  276. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/intelc.py +617 -0
  277. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/link.py +72 -0
  278. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/LoadableModule.py +131 -0
  279. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/SharedLibrary.py +218 -0
  280. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkCommon/__init__.py +171 -0
  281. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/linkloc.py +112 -0
  282. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/m4.py +63 -0
  283. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/masm.py +77 -0
  284. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mingw.py +232 -0
  285. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgfmt.py +132 -0
  286. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msginit.py +137 -0
  287. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msgmerge.py +125 -0
  288. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslib.py +73 -0
  289. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mslink.py +339 -0
  290. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mssdk.py +50 -0
  291. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvc.py +325 -0
  292. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/msvs.py +2116 -0
  293. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwcc.py +207 -0
  294. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/mwld.py +108 -0
  295. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/nasm.py +72 -0
  296. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rmic.py +139 -0
  297. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/rpcgen.py +70 -0
  298. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgiar.py +68 -0
  299. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgic++.py +43 -0
  300. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicc.py +53 -0
  301. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgicxx.py +61 -0
  302. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sgilink.py +59 -0
  303. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunar.py +64 -0
  304. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunc++.py +45 -0
  305. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncc.py +58 -0
  306. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/suncxx.py +153 -0
  307. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/sunlink.py +79 -0
  308. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tar.py +73 -0
  309. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/textfile.py +198 -0
  310. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/tlib.py +53 -0
  311. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/wix.py +104 -0
  312. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/xgettext.py +337 -0
  313. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Tool/zip.py +120 -0
  314. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Util.py +2134 -0
  315. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/ConfigureCache.py +171 -0
  316. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/__init__.py +0 -0
  317. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Utilities/sconsign.py +494 -0
  318. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/BoolVariable.py +96 -0
  319. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/EnumVariable.py +110 -0
  320. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/ListVariable.py +152 -0
  321. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PackageVariable.py +107 -0
  322. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/PathVariable.py +158 -0
  323. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Variables/__init__.py +334 -0
  324. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/Warnings.py +238 -0
  325. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/__init__.py +9 -0
  326. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/__init__.py +104 -0
  327. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/_scons_dbm.py +42 -0
  328. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/compat/win32.py +101 -0
  329. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/cpp.py +640 -0
  330. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/dblite.py +295 -0
  331. nuitka/build/inline_copy/lib/scons-4.3.0/SCons/exitfuncs.py +59 -0
  332. nuitka/build/inline_copy/markupsafe/LICENSE.rst +28 -0
  333. nuitka/build/inline_copy/markupsafe/markupsafe/__init__.py +327 -0
  334. nuitka/build/inline_copy/markupsafe/markupsafe/_compat.py +33 -0
  335. nuitka/build/inline_copy/markupsafe/markupsafe/_constants.py +264 -0
  336. nuitka/build/inline_copy/markupsafe/markupsafe/_native.py +69 -0
  337. nuitka/build/inline_copy/pefile/LICENSE.txt +21 -0
  338. nuitka/build/inline_copy/pefile/ordlookup/__init__.py +41 -0
  339. nuitka/build/inline_copy/pefile/ordlookup/oleaut32.py +400 -0
  340. nuitka/build/inline_copy/pefile/ordlookup/ws2_32.py +120 -0
  341. nuitka/build/inline_copy/pefile/pefile.py +8034 -0
  342. nuitka/build/inline_copy/pkg_resources/pkg_resources/__init__.py +3272 -0
  343. nuitka/build/inline_copy/pkg_resources/pkg_resources/py31compat.py +21 -0
  344. nuitka/build/inline_copy/python_hacl/LICENSE.txt +201 -0
  345. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.c +1430 -0
  346. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_MD5.h +66 -0
  347. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.c +463 -0
  348. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA1.h +66 -0
  349. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.c +1273 -0
  350. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA2.h +204 -0
  351. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.c +734 -0
  352. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Hash_SHA3.h +131 -0
  353. nuitka/build/inline_copy/python_hacl/hacl_312/Hacl_Streaming_Types.h +83 -0
  354. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt128_Verified.h +346 -0
  355. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/FStar_UInt_8_16_32_64.h +107 -0
  356. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/fstar_uint128_struct_endianness.h +68 -0
  357. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/internal/target.h +293 -0
  358. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/lowstar_endianness.h +231 -0
  359. nuitka/build/inline_copy/python_hacl/hacl_312/include/krml/types.h +14 -0
  360. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_MD5.h +56 -0
  361. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA1.h +56 -0
  362. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA2.h +164 -0
  363. nuitka/build/inline_copy/python_hacl/hacl_312/internal/Hacl_Hash_SHA3.h +65 -0
  364. nuitka/build/inline_copy/python_hacl/hacl_312/python_hacl_namespaces.h +89 -0
  365. nuitka/build/inline_copy/stubgen/astunparse.py +938 -0
  366. nuitka/build/inline_copy/stubgen/six.py +998 -0
  367. nuitka/build/inline_copy/stubgen/stubgen.py +484 -0
  368. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +40 -0
  369. nuitka/build/inline_copy/tqdm/tqdm/_main.py +9 -0
  370. nuitka/build/inline_copy/tqdm/tqdm/_monitor.py +97 -0
  371. nuitka/build/inline_copy/tqdm/tqdm/_tqdm.py +9 -0
  372. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_notebook.py +9 -0
  373. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_pandas.py +24 -0
  374. nuitka/build/inline_copy/tqdm/tqdm/_utils.py +12 -0
  375. nuitka/build/inline_copy/tqdm/tqdm/auto.py +44 -0
  376. nuitka/build/inline_copy/tqdm/tqdm/autonotebook.py +28 -0
  377. nuitka/build/inline_copy/tqdm/tqdm/dask.py +46 -0
  378. nuitka/build/inline_copy/tqdm/tqdm/notebook.py +316 -0
  379. nuitka/build/inline_copy/tqdm/tqdm/std.py +1524 -0
  380. nuitka/build/inline_copy/tqdm/tqdm/tk.py +207 -0
  381. nuitka/build/inline_copy/tqdm/tqdm/utils.py +351 -0
  382. nuitka/build/inline_copy/tqdm/tqdm/version.py +2 -0
  383. nuitka/build/inline_copy/yaml/LICENSE +20 -0
  384. nuitka/build/inline_copy/yaml/yaml/__init__.py +427 -0
  385. nuitka/build/inline_copy/yaml/yaml/composer.py +139 -0
  386. nuitka/build/inline_copy/yaml/yaml/constructor.py +748 -0
  387. nuitka/build/inline_copy/yaml/yaml/cyaml.py +101 -0
  388. nuitka/build/inline_copy/yaml/yaml/dumper.py +62 -0
  389. nuitka/build/inline_copy/yaml/yaml/emitter.py +1137 -0
  390. nuitka/build/inline_copy/yaml/yaml/error.py +75 -0
  391. nuitka/build/inline_copy/yaml/yaml/events.py +86 -0
  392. nuitka/build/inline_copy/yaml/yaml/loader.py +63 -0
  393. nuitka/build/inline_copy/yaml/yaml/nodes.py +49 -0
  394. nuitka/build/inline_copy/yaml/yaml/parser.py +589 -0
  395. nuitka/build/inline_copy/yaml/yaml/reader.py +185 -0
  396. nuitka/build/inline_copy/yaml/yaml/representer.py +389 -0
  397. nuitka/build/inline_copy/yaml/yaml/resolver.py +227 -0
  398. nuitka/build/inline_copy/yaml/yaml/scanner.py +1435 -0
  399. nuitka/build/inline_copy/yaml/yaml/serializer.py +111 -0
  400. nuitka/build/inline_copy/yaml/yaml/tokens.py +104 -0
  401. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  402. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  403. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  404. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  405. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  406. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  407. nuitka/build/inline_copy/zstd/LICENSE.txt +30 -0
  408. nuitka/build/inline_copy/zstd/common/bitstream.h +463 -0
  409. nuitka/build/inline_copy/zstd/common/compiler.h +288 -0
  410. nuitka/build/inline_copy/zstd/common/cpu.h +213 -0
  411. nuitka/build/inline_copy/zstd/common/debug.h +107 -0
  412. nuitka/build/inline_copy/zstd/common/entropy_common.c +360 -0
  413. nuitka/build/inline_copy/zstd/common/error_private.c +56 -0
  414. nuitka/build/inline_copy/zstd/common/error_private.h +80 -0
  415. nuitka/build/inline_copy/zstd/common/fse.h +715 -0
  416. nuitka/build/inline_copy/zstd/common/fse_decompress.c +393 -0
  417. nuitka/build/inline_copy/zstd/common/huf.h +361 -0
  418. nuitka/build/inline_copy/zstd/common/mem.h +426 -0
  419. nuitka/build/inline_copy/zstd/common/xxhash.c +826 -0
  420. nuitka/build/inline_copy/zstd/common/xxhash.h +285 -0
  421. nuitka/build/inline_copy/zstd/common/zstd_common.c +83 -0
  422. nuitka/build/inline_copy/zstd/common/zstd_deps.h +111 -0
  423. nuitka/build/inline_copy/zstd/common/zstd_errors.h +95 -0
  424. nuitka/build/inline_copy/zstd/common/zstd_internal.h +478 -0
  425. nuitka/build/inline_copy/zstd/decompress/huf_decompress.c +1350 -0
  426. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.c +244 -0
  427. nuitka/build/inline_copy/zstd/decompress/zstd_ddict.h +44 -0
  428. nuitka/build/inline_copy/zstd/decompress/zstd_decompress.c +1930 -0
  429. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.c +1540 -0
  430. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_block.h +62 -0
  431. nuitka/build/inline_copy/zstd/decompress/zstd_decompress_internal.h +190 -0
  432. nuitka/build/inline_copy/zstd/zstd.h +2391 -0
  433. nuitka/build/static_src/CompiledAsyncgenType.c +2211 -0
  434. nuitka/build/static_src/CompiledCellType.c +300 -0
  435. nuitka/build/static_src/CompiledCodeHelpers.c +2160 -0
  436. nuitka/build/static_src/CompiledCoroutineType.c +1946 -0
  437. nuitka/build/static_src/CompiledFrameType.c +1337 -0
  438. nuitka/build/static_src/CompiledFunctionType.c +3320 -0
  439. nuitka/build/static_src/CompiledGeneratorType.c +1997 -0
  440. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +2117 -0
  441. nuitka/build/static_src/CompiledMethodType.c +614 -0
  442. nuitka/build/static_src/GenerateHeadersMain.c +30 -0
  443. nuitka/build/static_src/HelpersAllocator.c +939 -0
  444. nuitka/build/static_src/HelpersAttributes.c +1241 -0
  445. nuitka/build/static_src/HelpersBuiltin.c +901 -0
  446. nuitka/build/static_src/HelpersBuiltinTypeMethods.c +3594 -0
  447. nuitka/build/static_src/HelpersBytes.c +107 -0
  448. nuitka/build/static_src/HelpersCalling.c +397 -0
  449. nuitka/build/static_src/HelpersCallingGenerated.c +14361 -0
  450. nuitka/build/static_src/HelpersChecksumTools.c +59 -0
  451. nuitka/build/static_src/HelpersClasses.c +91 -0
  452. nuitka/build/static_src/HelpersComparisonDualEq.c +183 -0
  453. nuitka/build/static_src/HelpersComparisonDualGe.c +121 -0
  454. nuitka/build/static_src/HelpersComparisonDualGt.c +121 -0
  455. nuitka/build/static_src/HelpersComparisonDualLe.c +183 -0
  456. nuitka/build/static_src/HelpersComparisonDualLt.c +183 -0
  457. nuitka/build/static_src/HelpersComparisonDualNe.c +121 -0
  458. nuitka/build/static_src/HelpersComparisonEq.c +12070 -0
  459. nuitka/build/static_src/HelpersComparisonEqUtils.c +169 -0
  460. nuitka/build/static_src/HelpersComparisonGe.c +11871 -0
  461. nuitka/build/static_src/HelpersComparisonGt.c +11855 -0
  462. nuitka/build/static_src/HelpersComparisonLe.c +11957 -0
  463. nuitka/build/static_src/HelpersComparisonLt.c +11941 -0
  464. nuitka/build/static_src/HelpersComparisonNe.c +11979 -0
  465. nuitka/build/static_src/HelpersConsole.c +124 -0
  466. nuitka/build/static_src/HelpersConstantsBlob.c +1487 -0
  467. nuitka/build/static_src/HelpersDeepcopy.c +636 -0
  468. nuitka/build/static_src/HelpersDictionaries.c +1739 -0
  469. nuitka/build/static_src/HelpersDictionariesGenerated.c +738 -0
  470. nuitka/build/static_src/HelpersDumpBacktraces.c +63 -0
  471. nuitka/build/static_src/HelpersEnvironmentVariables.c +65 -0
  472. nuitka/build/static_src/HelpersEnvironmentVariablesSystem.c +97 -0
  473. nuitka/build/static_src/HelpersExceptions.c +298 -0
  474. nuitka/build/static_src/HelpersFiles.c +353 -0
  475. nuitka/build/static_src/HelpersFilesystemPaths.c +1322 -0
  476. nuitka/build/static_src/HelpersFloats.c +92 -0
  477. nuitka/build/static_src/HelpersHeapStorage.c +68 -0
  478. nuitka/build/static_src/HelpersImport.c +506 -0
  479. nuitka/build/static_src/HelpersImportHard.c +526 -0
  480. nuitka/build/static_src/HelpersJitSources.c +48 -0
  481. nuitka/build/static_src/HelpersLists.c +899 -0
  482. nuitka/build/static_src/HelpersListsGenerated.c +564 -0
  483. nuitka/build/static_src/HelpersMappings.c +46 -0
  484. nuitka/build/static_src/HelpersMatching.c +192 -0
  485. nuitka/build/static_src/HelpersOperationBinaryAdd.c +6477 -0
  486. nuitka/build/static_src/HelpersOperationBinaryAddUtils.c +703 -0
  487. nuitka/build/static_src/HelpersOperationBinaryBitand.c +2738 -0
  488. nuitka/build/static_src/HelpersOperationBinaryBitor.c +2738 -0
  489. nuitka/build/static_src/HelpersOperationBinaryBitxor.c +2738 -0
  490. nuitka/build/static_src/HelpersOperationBinaryDivmod.c +2406 -0
  491. nuitka/build/static_src/HelpersOperationBinaryDivmodUtils.c +33 -0
  492. nuitka/build/static_src/HelpersOperationBinaryDualAdd.c +172 -0
  493. nuitka/build/static_src/HelpersOperationBinaryFloordiv.c +2422 -0
  494. nuitka/build/static_src/HelpersOperationBinaryInplaceAdd.c +220 -0
  495. nuitka/build/static_src/HelpersOperationBinaryLshift.c +2846 -0
  496. nuitka/build/static_src/HelpersOperationBinaryMatmult.c +453 -0
  497. nuitka/build/static_src/HelpersOperationBinaryMod.c +6549 -0
  498. nuitka/build/static_src/HelpersOperationBinaryMult.c +6438 -0
  499. nuitka/build/static_src/HelpersOperationBinaryMultUtils.c +125 -0
  500. nuitka/build/static_src/HelpersOperationBinaryOlddiv.c +2355 -0
  501. nuitka/build/static_src/HelpersOperationBinaryPow.c +2743 -0
  502. nuitka/build/static_src/HelpersOperationBinaryPowUtils.c +26 -0
  503. nuitka/build/static_src/HelpersOperationBinaryRshift.c +2706 -0
  504. nuitka/build/static_src/HelpersOperationBinarySub.c +2649 -0
  505. nuitka/build/static_src/HelpersOperationBinaryTruediv.c +2415 -0
  506. nuitka/build/static_src/HelpersOperationInplaceAdd.c +5211 -0
  507. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +144 -0
  508. nuitka/build/static_src/HelpersOperationInplaceBitand.c +1826 -0
  509. nuitka/build/static_src/HelpersOperationInplaceBitor.c +1826 -0
  510. nuitka/build/static_src/HelpersOperationInplaceBitxor.c +1826 -0
  511. nuitka/build/static_src/HelpersOperationInplaceFloordiv.c +2605 -0
  512. nuitka/build/static_src/HelpersOperationInplaceLshift.c +1594 -0
  513. nuitka/build/static_src/HelpersOperationInplaceMatmult.c +603 -0
  514. nuitka/build/static_src/HelpersOperationInplaceMod.c +4762 -0
  515. nuitka/build/static_src/HelpersOperationInplaceMult.c +4689 -0
  516. nuitka/build/static_src/HelpersOperationInplaceOlddiv.c +2553 -0
  517. nuitka/build/static_src/HelpersOperationInplacePow.c +2807 -0
  518. nuitka/build/static_src/HelpersOperationInplaceRshift.c +1534 -0
  519. nuitka/build/static_src/HelpersOperationInplaceSub.c +2894 -0
  520. nuitka/build/static_src/HelpersOperationInplaceTruediv.c +2612 -0
  521. nuitka/build/static_src/HelpersProfiling.c +104 -0
  522. nuitka/build/static_src/HelpersPythonPgo.c +113 -0
  523. nuitka/build/static_src/HelpersRaising.c +447 -0
  524. nuitka/build/static_src/HelpersSafeStrings.c +185 -0
  525. nuitka/build/static_src/HelpersSequences.c +134 -0
  526. nuitka/build/static_src/HelpersSlices.c +73 -0
  527. nuitka/build/static_src/HelpersStrings.c +998 -0
  528. nuitka/build/static_src/HelpersTuples.c +148 -0
  529. nuitka/build/static_src/HelpersTypes.c +329 -0
  530. nuitka/build/static_src/InspectPatcher.c +439 -0
  531. nuitka/build/static_src/MainProgram.c +2060 -0
  532. nuitka/build/static_src/MetaPathBasedLoader.c +2290 -0
  533. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +125 -0
  534. nuitka/build/static_src/MetaPathBasedLoaderResourceReader.c +158 -0
  535. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +785 -0
  536. nuitka/build/static_src/OnefileBootstrap.c +1580 -0
  537. nuitka/build/static_src/OnefileSplashScreen.cpp +275 -0
  538. nuitka/code_generation/AsyncgenCodes.py +186 -0
  539. nuitka/code_generation/AttributeCodes.py +357 -0
  540. nuitka/code_generation/BinaryOperationHelperDefinitions.py +720 -0
  541. nuitka/code_generation/BranchCodes.py +67 -0
  542. nuitka/code_generation/BuiltinCodes.py +529 -0
  543. nuitka/code_generation/CallCodes.py +1186 -0
  544. nuitka/code_generation/ClassCodes.py +156 -0
  545. nuitka/code_generation/CodeGeneration.py +1078 -0
  546. nuitka/code_generation/CodeHelperSelection.py +81 -0
  547. nuitka/code_generation/CodeHelpers.py +455 -0
  548. nuitka/code_generation/CodeObjectCodes.py +165 -0
  549. nuitka/code_generation/ComparisonCodes.py +569 -0
  550. nuitka/code_generation/ComparisonHelperDefinitions.py +146 -0
  551. nuitka/code_generation/ConditionalCodes.py +236 -0
  552. nuitka/code_generation/ConstantCodes.py +243 -0
  553. nuitka/code_generation/Contexts.py +1248 -0
  554. nuitka/code_generation/CoroutineCodes.py +253 -0
  555. nuitka/code_generation/CtypesCodes.py +46 -0
  556. nuitka/code_generation/DictCodes.py +918 -0
  557. nuitka/code_generation/Emission.py +75 -0
  558. nuitka/code_generation/ErrorCodes.py +281 -0
  559. nuitka/code_generation/EvalCodes.py +444 -0
  560. nuitka/code_generation/ExceptionCodes.py +337 -0
  561. nuitka/code_generation/ExpressionCTypeSelectionHelpers.py +227 -0
  562. nuitka/code_generation/ExpressionCodes.py +61 -0
  563. nuitka/code_generation/FrameCodes.py +518 -0
  564. nuitka/code_generation/FunctionCodes.py +858 -0
  565. nuitka/code_generation/GeneratorCodes.py +218 -0
  566. nuitka/code_generation/GlobalConstants.py +249 -0
  567. nuitka/code_generation/GlobalsLocalsCodes.py +211 -0
  568. nuitka/code_generation/IdCodes.py +53 -0
  569. nuitka/code_generation/ImportCodes.py +468 -0
  570. nuitka/code_generation/Indentation.py +45 -0
  571. nuitka/code_generation/IndexCodes.py +50 -0
  572. nuitka/code_generation/InjectCCodes.py +28 -0
  573. nuitka/code_generation/IntegerCodes.py +110 -0
  574. nuitka/code_generation/IteratorCodes.py +378 -0
  575. nuitka/code_generation/JitCodes.py +44 -0
  576. nuitka/code_generation/LabelCodes.py +68 -0
  577. nuitka/code_generation/LineNumberCodes.py +91 -0
  578. nuitka/code_generation/ListCodes.py +502 -0
  579. nuitka/code_generation/LoaderCodes.py +193 -0
  580. nuitka/code_generation/LocalsDictCodes.py +359 -0
  581. nuitka/code_generation/LoopCodes.py +88 -0
  582. nuitka/code_generation/MatchCodes.py +67 -0
  583. nuitka/code_generation/ModuleCodes.py +247 -0
  584. nuitka/code_generation/Namify.py +260 -0
  585. nuitka/code_generation/NetworkxCodes.py +51 -0
  586. nuitka/code_generation/OperationCodes.py +398 -0
  587. nuitka/code_generation/PackageResourceCodes.py +986 -0
  588. nuitka/code_generation/PrintCodes.py +93 -0
  589. nuitka/code_generation/PythonAPICodes.py +215 -0
  590. nuitka/code_generation/RaisingCodes.py +481 -0
  591. nuitka/code_generation/Reports.py +115 -0
  592. nuitka/code_generation/ReturnCodes.py +143 -0
  593. nuitka/code_generation/SetCodes.py +196 -0
  594. nuitka/code_generation/SliceCodes.py +465 -0
  595. nuitka/code_generation/StringCodes.py +303 -0
  596. nuitka/code_generation/SubscriptCodes.py +263 -0
  597. nuitka/code_generation/TensorflowCodes.py +54 -0
  598. nuitka/code_generation/TryCodes.py +326 -0
  599. nuitka/code_generation/TupleCodes.py +115 -0
  600. nuitka/code_generation/TypeAliasCodes.py +120 -0
  601. nuitka/code_generation/VariableCodes.py +519 -0
  602. nuitka/code_generation/VariableDeclarations.py +279 -0
  603. nuitka/code_generation/YieldCodes.py +253 -0
  604. nuitka/code_generation/__init__.py +19 -0
  605. nuitka/code_generation/c_types/CTypeBases.py +177 -0
  606. nuitka/code_generation/c_types/CTypeBooleans.py +104 -0
  607. nuitka/code_generation/c_types/CTypeCFloats.py +57 -0
  608. nuitka/code_generation/c_types/CTypeCLongs.py +45 -0
  609. nuitka/code_generation/c_types/CTypeModuleDictVariables.py +109 -0
  610. nuitka/code_generation/c_types/CTypeNuitkaBooleans.py +150 -0
  611. nuitka/code_generation/c_types/CTypeNuitkaInts.py +200 -0
  612. nuitka/code_generation/c_types/CTypeNuitkaVoids.py +107 -0
  613. nuitka/code_generation/c_types/CTypePyObjectPointers.py +572 -0
  614. nuitka/code_generation/c_types/CTypeVoids.py +92 -0
  615. nuitka/code_generation/c_types/__init__.py +19 -0
  616. nuitka/code_generation/templates/CodeTemplatesAsyncgens.py +106 -0
  617. nuitka/code_generation/templates/CodeTemplatesConstants.py +296 -0
  618. nuitka/code_generation/templates/CodeTemplatesCoroutines.py +109 -0
  619. nuitka/code_generation/templates/CodeTemplatesExceptions.py +84 -0
  620. nuitka/code_generation/templates/CodeTemplatesFrames.py +235 -0
  621. nuitka/code_generation/templates/CodeTemplatesFunction.py +117 -0
  622. nuitka/code_generation/templates/CodeTemplatesGeneratorFunction.py +130 -0
  623. nuitka/code_generation/templates/CodeTemplatesIterators.py +40 -0
  624. nuitka/code_generation/templates/CodeTemplatesLoader.py +180 -0
  625. nuitka/code_generation/templates/CodeTemplatesModules.py +710 -0
  626. nuitka/code_generation/templates/CodeTemplatesVariables.py +388 -0
  627. nuitka/code_generation/templates/TemplateDebugWrapper.py +80 -0
  628. nuitka/code_generation/templates/__init__.py +19 -0
  629. nuitka/code_generation/templates_c/CodeTemplateCallsMethodPositional.c.j2 +321 -0
  630. nuitka/code_generation/templates_c/CodeTemplateCallsMixed.c.j2 +143 -0
  631. nuitka/code_generation/templates_c/CodeTemplateCallsPositional.c.j2 +677 -0
  632. nuitka/code_generation/templates_c/CodeTemplateCallsPositionalMethodDescr.c.j2 +165 -0
  633. nuitka/code_generation/templates_c/CodeTemplateMakeListHinted.c.j2 +38 -0
  634. nuitka/code_generation/templates_c/CodeTemplateMakeListSmall.c.j2 +41 -0
  635. nuitka/code_generation/templates_c/HelperBuiltinMethodOperation.c.j2 +53 -0
  636. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +364 -0
  637. nuitka/code_generation/templates_c/HelperImportHard.c.j2 +37 -0
  638. nuitka/code_generation/templates_c/HelperLongTools.c.j2 +53 -0
  639. nuitka/code_generation/templates_c/HelperObjectTools.c.j2 +20 -0
  640. nuitka/code_generation/templates_c/HelperOperationBinary.c.j2 +148 -0
  641. nuitka/code_generation/templates_c/HelperOperationBinaryDual.c.j2 +115 -0
  642. nuitka/code_generation/templates_c/HelperOperationComparison.c.j2 +352 -0
  643. nuitka/code_generation/templates_c/HelperOperationComparisonBytes.c.j2 +115 -0
  644. nuitka/code_generation/templates_c/HelperOperationComparisonDual.c.j2 +86 -0
  645. nuitka/code_generation/templates_c/HelperOperationComparisonFloat.c.j2 +31 -0
  646. nuitka/code_generation/templates_c/HelperOperationComparisonInt.c.j2 +32 -0
  647. nuitka/code_generation/templates_c/HelperOperationComparisonList.c.j2 +112 -0
  648. nuitka/code_generation/templates_c/HelperOperationComparisonLong.c.j2 +157 -0
  649. nuitka/code_generation/templates_c/HelperOperationComparisonStr.c.j2 +115 -0
  650. nuitka/code_generation/templates_c/HelperOperationComparisonTuple.c.j2 +99 -0
  651. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +115 -0
  652. nuitka/code_generation/templates_c/HelperOperationInplace.c.j2 +281 -0
  653. nuitka/code_generation/templates_c/HelperSlotsBinary.c.j2 +420 -0
  654. nuitka/code_generation/templates_c/HelperSlotsBytes.c.j2 +51 -0
  655. nuitka/code_generation/templates_c/HelperSlotsCommon.c.j2 +71 -0
  656. nuitka/code_generation/templates_c/HelperSlotsFloat.c.j2 +327 -0
  657. nuitka/code_generation/templates_c/HelperSlotsInt.c.j2 +411 -0
  658. nuitka/code_generation/templates_c/HelperSlotsList.c.j2 +59 -0
  659. nuitka/code_generation/templates_c/HelperSlotsLong.c.j2 +229 -0
  660. nuitka/code_generation/templates_c/HelperSlotsSet.c.j2 +47 -0
  661. nuitka/code_generation/templates_c/HelperSlotsStr.c.j2 +55 -0
  662. nuitka/code_generation/templates_c/HelperSlotsTuple.c.j2 +58 -0
  663. nuitka/code_generation/templates_c/HelperSlotsUnicode.c.j2 +62 -0
  664. nuitka/containers/Namedtuples.py +51 -0
  665. nuitka/containers/OrderedDicts.py +191 -0
  666. nuitka/containers/OrderedSets.py +123 -0
  667. nuitka/containers/OrderedSetsFallback.py +139 -0
  668. nuitka/containers/__init__.py +19 -0
  669. nuitka/distutils/Build.py +76 -0
  670. nuitka/distutils/DistutilCommands.py +438 -0
  671. nuitka/distutils/__init__.py +19 -0
  672. nuitka/finalizations/Finalization.py +35 -0
  673. nuitka/finalizations/FinalizeMarkups.py +136 -0
  674. nuitka/finalizations/__init__.py +19 -0
  675. nuitka/freezer/DependsExe.py +257 -0
  676. nuitka/freezer/DllDependenciesCommon.py +97 -0
  677. nuitka/freezer/DllDependenciesMacOS.py +444 -0
  678. nuitka/freezer/DllDependenciesPosix.py +242 -0
  679. nuitka/freezer/DllDependenciesWin32.py +315 -0
  680. nuitka/freezer/ImportDetection.py +359 -0
  681. nuitka/freezer/IncludedDataFiles.py +689 -0
  682. nuitka/freezer/IncludedEntryPoints.py +376 -0
  683. nuitka/freezer/Onefile.py +296 -0
  684. nuitka/freezer/Standalone.py +520 -0
  685. nuitka/freezer/__init__.py +19 -0
  686. nuitka/importing/IgnoreListing.py +449 -0
  687. nuitka/importing/ImportCache.py +95 -0
  688. nuitka/importing/ImportResolving.py +186 -0
  689. nuitka/importing/Importing.py +1200 -0
  690. nuitka/importing/PreloadedPackages.py +164 -0
  691. nuitka/importing/Recursion.py +611 -0
  692. nuitka/importing/StandardLibrary.py +429 -0
  693. nuitka/importing/__init__.py +19 -0
  694. nuitka/nodes/AsyncgenNodes.py +107 -0
  695. nuitka/nodes/AttributeLookupNodes.py +124 -0
  696. nuitka/nodes/AttributeNodes.py +386 -0
  697. nuitka/nodes/AttributeNodesGenerated.py +10734 -0
  698. nuitka/nodes/BuiltinAllNodes.py +115 -0
  699. nuitka/nodes/BuiltinAnyNodes.py +124 -0
  700. nuitka/nodes/BuiltinComplexNodes.py +83 -0
  701. nuitka/nodes/BuiltinDecodingNodes.py +52 -0
  702. nuitka/nodes/BuiltinDecoratorNodes.py +85 -0
  703. nuitka/nodes/BuiltinDictNodes.py +140 -0
  704. nuitka/nodes/BuiltinFormatNodes.py +159 -0
  705. nuitka/nodes/BuiltinHashNodes.py +63 -0
  706. nuitka/nodes/BuiltinInputNodes.py +39 -0
  707. nuitka/nodes/BuiltinIntegerNodes.py +170 -0
  708. nuitka/nodes/BuiltinIteratorNodes.py +391 -0
  709. nuitka/nodes/BuiltinLenNodes.py +61 -0
  710. nuitka/nodes/BuiltinNextNodes.py +111 -0
  711. nuitka/nodes/BuiltinOpenNodes.py +148 -0
  712. nuitka/nodes/BuiltinOperationNodeBasesGenerated.py +7367 -0
  713. nuitka/nodes/BuiltinRangeNodes.py +690 -0
  714. nuitka/nodes/BuiltinRefNodes.py +314 -0
  715. nuitka/nodes/BuiltinSumNodes.py +104 -0
  716. nuitka/nodes/BuiltinTypeNodes.py +454 -0
  717. nuitka/nodes/BuiltinVarsNodes.py +44 -0
  718. nuitka/nodes/BytesNodes.py +829 -0
  719. nuitka/nodes/CallNodes.py +217 -0
  720. nuitka/nodes/Checkers.py +55 -0
  721. nuitka/nodes/ChildrenHavingMixins.py +21576 -0
  722. nuitka/nodes/ClassNodes.py +286 -0
  723. nuitka/nodes/CodeObjectSpecs.py +230 -0
  724. nuitka/nodes/ComparisonNodes.py +687 -0
  725. nuitka/nodes/ConditionalNodes.py +884 -0
  726. nuitka/nodes/ConstantRefNodes.py +1717 -0
  727. nuitka/nodes/ContainerMakingNodes.py +408 -0
  728. nuitka/nodes/ContainerOperationNodes.py +87 -0
  729. nuitka/nodes/CoroutineNodes.py +144 -0
  730. nuitka/nodes/CtypesNodes.py +51 -0
  731. nuitka/nodes/DictionaryNodes.py +1513 -0
  732. nuitka/nodes/ExceptionNodes.py +393 -0
  733. nuitka/nodes/ExecEvalNodes.py +229 -0
  734. nuitka/nodes/ExpressionBases.py +1301 -0
  735. nuitka/nodes/ExpressionBasesGenerated.py +2103 -0
  736. nuitka/nodes/ExpressionShapeMixins.py +886 -0
  737. nuitka/nodes/FrameNodes.py +413 -0
  738. nuitka/nodes/FunctionAttributeNodes.py +102 -0
  739. nuitka/nodes/FunctionNodes.py +1303 -0
  740. nuitka/nodes/FutureSpecs.py +224 -0
  741. nuitka/nodes/GeneratorNodes.py +201 -0
  742. nuitka/nodes/GlobalsLocalsNodes.py +209 -0
  743. nuitka/nodes/HardImportNodesGenerated.py +3599 -0
  744. nuitka/nodes/ImportHardNodes.py +185 -0
  745. nuitka/nodes/ImportNodes.py +1366 -0
  746. nuitka/nodes/IndicatorMixins.py +79 -0
  747. nuitka/nodes/InjectCNodes.py +51 -0
  748. nuitka/nodes/IterationHandles.py +407 -0
  749. nuitka/nodes/KeyValuePairNodes.py +378 -0
  750. nuitka/nodes/ListOperationNodes.py +525 -0
  751. nuitka/nodes/LocalsDictNodes.py +717 -0
  752. nuitka/nodes/LocalsScopes.py +505 -0
  753. nuitka/nodes/LoopNodes.py +445 -0
  754. nuitka/nodes/MatchNodes.py +60 -0
  755. nuitka/nodes/ModuleAttributeNodes.py +180 -0
  756. nuitka/nodes/ModuleNodes.py +1137 -0
  757. nuitka/nodes/NetworkxNodes.py +45 -0
  758. nuitka/nodes/NodeBases.py +890 -0
  759. nuitka/nodes/NodeMakingHelpers.py +481 -0
  760. nuitka/nodes/NodeMetaClasses.py +172 -0
  761. nuitka/nodes/OperatorNodes.py +944 -0
  762. nuitka/nodes/OperatorNodesUnary.py +403 -0
  763. nuitka/nodes/OsSysNodes.py +215 -0
  764. nuitka/nodes/OutlineNodes.py +372 -0
  765. nuitka/nodes/PackageMetadataNodes.py +982 -0
  766. nuitka/nodes/PackageResourceNodes.py +424 -0
  767. nuitka/nodes/PrintNodes.py +105 -0
  768. nuitka/nodes/ReturnNodes.py +255 -0
  769. nuitka/nodes/SideEffectNodes.py +139 -0
  770. nuitka/nodes/SliceNodes.py +386 -0
  771. nuitka/nodes/StatementBasesGenerated.py +3419 -0
  772. nuitka/nodes/StatementNodes.py +316 -0
  773. nuitka/nodes/StrNodes.py +919 -0
  774. nuitka/nodes/StringConcatenationNodes.py +103 -0
  775. nuitka/nodes/SubscriptNodes.py +245 -0
  776. nuitka/nodes/TensorflowNodes.py +38 -0
  777. nuitka/nodes/TryNodes.py +519 -0
  778. nuitka/nodes/TypeMatchNodes.py +65 -0
  779. nuitka/nodes/TypeNodes.py +390 -0
  780. nuitka/nodes/VariableAssignNodes.py +1177 -0
  781. nuitka/nodes/VariableDelNodes.py +320 -0
  782. nuitka/nodes/VariableNameNodes.py +153 -0
  783. nuitka/nodes/VariableRefNodes.py +895 -0
  784. nuitka/nodes/VariableReleaseNodes.py +153 -0
  785. nuitka/nodes/YieldNodes.py +121 -0
  786. nuitka/nodes/__init__.py +19 -0
  787. nuitka/nodes/shapes/BuiltinTypeShapes.py +4290 -0
  788. nuitka/nodes/shapes/ControlFlowDescriptions.py +199 -0
  789. nuitka/nodes/shapes/IteratorShapes.py +71 -0
  790. nuitka/nodes/shapes/ShapeMixins.py +255 -0
  791. nuitka/nodes/shapes/StandardShapes.py +1384 -0
  792. nuitka/nodes/shapes/__init__.py +19 -0
  793. nuitka/optimizations/BytecodeDemotion.py +105 -0
  794. nuitka/optimizations/FunctionInlining.py +110 -0
  795. nuitka/optimizations/Graphs.py +70 -0
  796. nuitka/optimizations/Optimization.py +363 -0
  797. nuitka/optimizations/OptimizeBuiltinCalls.py +1582 -0
  798. nuitka/optimizations/Tags.py +76 -0
  799. nuitka/optimizations/TraceCollections.py +1257 -0
  800. nuitka/optimizations/ValueTraces.py +980 -0
  801. nuitka/optimizations/__init__.py +19 -0
  802. nuitka/pgo/PGO.py +160 -0
  803. nuitka/pgo/__init__.py +19 -0
  804. nuitka/plugins/PluginBase.py +1924 -0
  805. nuitka/plugins/Plugins.py +2007 -0
  806. nuitka/plugins/YamlPluginBase.py +121 -0
  807. nuitka/plugins/__init__.py +19 -0
  808. nuitka/plugins/standard/AntiBloatPlugin.py +1024 -0
  809. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +95 -0
  810. nuitka/plugins/standard/DataFilesPlugin.py +311 -0
  811. nuitka/plugins/standard/DelvewheelPlugin.py +150 -0
  812. nuitka/plugins/standard/DillPlugin/DillPlugin.c +37 -0
  813. nuitka/plugins/standard/DillPlugin/cloudpickle-postLoad.py +67 -0
  814. nuitka/plugins/standard/DillPlugin/dill-postLoad.py +223 -0
  815. nuitka/plugins/standard/DillPlugin.py +137 -0
  816. nuitka/plugins/standard/DllFilesPlugin.py +527 -0
  817. nuitka/plugins/standard/EnumPlugin.py +64 -0
  818. nuitka/plugins/standard/EventletPlugin.py +57 -0
  819. nuitka/plugins/standard/GeventPlugin.py +64 -0
  820. nuitka/plugins/standard/GiPlugin.py +118 -0
  821. nuitka/plugins/standard/GlfwPlugin.py +138 -0
  822. nuitka/plugins/standard/ImplicitImports.py +845 -0
  823. nuitka/plugins/standard/KivyPlugin.py +141 -0
  824. nuitka/plugins/standard/MatplotlibPlugin.py +256 -0
  825. nuitka/plugins/standard/MultiprocessingPlugin.py +199 -0
  826. nuitka/plugins/standard/NumpyPlugin.py +35 -0
  827. nuitka/plugins/standard/OptionsNannyPlugin.py +158 -0
  828. nuitka/plugins/standard/PbrPlugin.py +62 -0
  829. nuitka/plugins/standard/PkgResourcesPlugin.py +162 -0
  830. nuitka/plugins/standard/PlaywrightPlugin.py +179 -0
  831. nuitka/plugins/standard/PmwPlugin.py +248 -0
  832. nuitka/plugins/standard/PySidePyQtPlugin.py +1666 -0
  833. nuitka/plugins/standard/PywebViewPlugin.py +81 -0
  834. nuitka/plugins/standard/SpacyPlugin.py +137 -0
  835. nuitka/plugins/standard/TensorflowPlugin.py +35 -0
  836. nuitka/plugins/standard/TkinterPlugin.py +416 -0
  837. nuitka/plugins/standard/TorchPlugin.py +35 -0
  838. nuitka/plugins/standard/TransformersPlugin.py +121 -0
  839. nuitka/plugins/standard/TrioPlugin.py +33 -0
  840. nuitka/plugins/standard/UpxPlugin.py +174 -0
  841. nuitka/plugins/standard/__init__.py +19 -0
  842. nuitka/plugins/standard/standard.nuitka-package.config.yml +9313 -0
  843. nuitka/plugins/standard/stdlib2.nuitka-package.config.yml +78 -0
  844. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +468 -0
  845. nuitka/reports/CompilationReportReader.py +83 -0
  846. nuitka/reports/LicenseReport.rst.j2 +41 -0
  847. nuitka/reports/Reports.py +961 -0
  848. nuitka/reports/__init__.py +19 -0
  849. nuitka/specs/BuiltinBytesOperationSpecs.py +180 -0
  850. nuitka/specs/BuiltinDictOperationSpecs.py +82 -0
  851. nuitka/specs/BuiltinListOperationSpecs.py +80 -0
  852. nuitka/specs/BuiltinParameterSpecs.py +831 -0
  853. nuitka/specs/BuiltinStrOperationSpecs.py +181 -0
  854. nuitka/specs/BuiltinTypeOperationSpecs.py +34 -0
  855. nuitka/specs/BuiltinUnicodeOperationSpecs.py +123 -0
  856. nuitka/specs/HardImportSpecs.py +236 -0
  857. nuitka/specs/ParameterSpecs.py +630 -0
  858. nuitka/specs/__init__.py +19 -0
  859. nuitka/tools/Basics.py +55 -0
  860. nuitka/tools/__init__.py +19 -0
  861. nuitka/tools/commercial/__init__.py +21 -0
  862. nuitka/tools/data_composer/DataComposer.py +593 -0
  863. nuitka/tools/data_composer/__init__.py +19 -0
  864. nuitka/tools/data_composer/__main__.py +41 -0
  865. nuitka/tools/environments/CreateEnvironment.py +69 -0
  866. nuitka/tools/environments/Virtualenv.py +158 -0
  867. nuitka/tools/environments/__init__.py +19 -0
  868. nuitka/tools/general/__init__.py +19 -0
  869. nuitka/tools/general/dll_report/__init__.py +19 -0
  870. nuitka/tools/general/dll_report/__main__.py +83 -0
  871. nuitka/tools/general/find_module/FindModuleCode.py +127 -0
  872. nuitka/tools/general/find_module/__init__.py +19 -0
  873. nuitka/tools/general/generate_header/GenerateHeader.py +73 -0
  874. nuitka/tools/general/generate_header/__init__.py +19 -0
  875. nuitka/tools/onefile_compressor/OnefileCompressor.py +390 -0
  876. nuitka/tools/onefile_compressor/__init__.py +19 -0
  877. nuitka/tools/onefile_compressor/__main__.py +41 -0
  878. nuitka/tools/podman/Podman.py +55 -0
  879. nuitka/tools/podman/__init__.py +19 -0
  880. nuitka/tools/podman/__main__.py +425 -0
  881. nuitka/tools/profiler/__init__.py +19 -0
  882. nuitka/tools/profiler/__main__.py +93 -0
  883. nuitka/tools/scanning/DisplayDistributions.py +39 -0
  884. nuitka/tools/scanning/DisplayPackageDLLs.py +151 -0
  885. nuitka/tools/scanning/DisplayPackageData.py +73 -0
  886. nuitka/tools/scanning/__init__.py +19 -0
  887. nuitka/tools/specialize/CTypeDescriptions.py +1928 -0
  888. nuitka/tools/specialize/Common.py +380 -0
  889. nuitka/tools/specialize/SpecializeC.py +1483 -0
  890. nuitka/tools/specialize/SpecializePython.py +1151 -0
  891. nuitka/tools/specialize/__init__.py +19 -0
  892. nuitka/tools/testing/Common.py +2007 -0
  893. nuitka/tools/testing/Constructs.py +53 -0
  894. nuitka/tools/testing/DocTests.py +156 -0
  895. nuitka/tools/testing/OutputComparison.py +313 -0
  896. nuitka/tools/testing/Pythons.py +34 -0
  897. nuitka/tools/testing/RuntimeTracing.py +260 -0
  898. nuitka/tools/testing/SearchModes.py +208 -0
  899. nuitka/tools/testing/Valgrind.py +103 -0
  900. nuitka/tools/testing/__init__.py +19 -0
  901. nuitka/tools/testing/check_reference_counts/__init__.py +19 -0
  902. nuitka/tools/testing/check_reference_counts/__main__.py +107 -0
  903. nuitka/tools/testing/compare_with_cpython/__init__.py +19 -0
  904. nuitka/tools/testing/compare_with_cpython/__main__.py +942 -0
  905. nuitka/tools/testing/find_sxs_modules/__init__.py +19 -0
  906. nuitka/tools/testing/find_sxs_modules/__main__.py +73 -0
  907. nuitka/tools/testing/measure_construct_performance/__init__.py +19 -0
  908. nuitka/tools/testing/measure_construct_performance/__main__.py +288 -0
  909. nuitka/tools/testing/run_nuitka_tests/__init__.py +19 -0
  910. nuitka/tools/testing/run_nuitka_tests/__main__.py +1091 -0
  911. nuitka/tools/watch/AutoStage.py +145 -0
  912. nuitka/tools/watch/Common.py +55 -0
  913. nuitka/tools/watch/Conda.py +125 -0
  914. nuitka/tools/watch/GitHub.py +113 -0
  915. nuitka/tools/watch/Pacman.py +73 -0
  916. nuitka/tools/watch/Pipenv.py +145 -0
  917. nuitka/tools/watch/__init__.py +19 -0
  918. nuitka/tools/watch/__main__.py +615 -0
  919. nuitka/tree/Building.py +1459 -0
  920. nuitka/tree/ComplexCallHelperFunctions.py +2150 -0
  921. nuitka/tree/Extractions.py +48 -0
  922. nuitka/tree/FutureSpecState.py +71 -0
  923. nuitka/tree/InternalModule.py +96 -0
  924. nuitka/tree/Operations.py +45 -0
  925. nuitka/tree/ReformulationAssertStatements.py +97 -0
  926. nuitka/tree/ReformulationAssignmentStatements.py +1260 -0
  927. nuitka/tree/ReformulationBooleanExpressions.py +97 -0
  928. nuitka/tree/ReformulationCallExpressions.py +314 -0
  929. nuitka/tree/ReformulationClasses.py +407 -0
  930. nuitka/tree/ReformulationClasses3.py +1149 -0
  931. nuitka/tree/ReformulationComparisonExpressions.py +174 -0
  932. nuitka/tree/ReformulationContractionExpressions.py +676 -0
  933. nuitka/tree/ReformulationDictionaryCreation.py +304 -0
  934. nuitka/tree/ReformulationExecStatements.py +386 -0
  935. nuitka/tree/ReformulationForLoopStatements.py +215 -0
  936. nuitka/tree/ReformulationFunctionStatements.py +931 -0
  937. nuitka/tree/ReformulationImportStatements.py +333 -0
  938. nuitka/tree/ReformulationLambdaExpressions.py +185 -0
  939. nuitka/tree/ReformulationMatchStatements.py +797 -0
  940. nuitka/tree/ReformulationMultidist.py +80 -0
  941. nuitka/tree/ReformulationNamespacePackages.py +239 -0
  942. nuitka/tree/ReformulationPrintStatements.py +127 -0
  943. nuitka/tree/ReformulationSequenceCreation.py +438 -0
  944. nuitka/tree/ReformulationSubscriptExpressions.py +123 -0
  945. nuitka/tree/ReformulationTryExceptStatements.py +418 -0
  946. nuitka/tree/ReformulationTryFinallyStatements.py +239 -0
  947. nuitka/tree/ReformulationWhileLoopStatements.py +160 -0
  948. nuitka/tree/ReformulationWithStatements.py +382 -0
  949. nuitka/tree/ReformulationYieldExpressions.py +133 -0
  950. nuitka/tree/SourceHandling.py +476 -0
  951. nuitka/tree/SyntaxErrors.py +143 -0
  952. nuitka/tree/TreeHelpers.py +720 -0
  953. nuitka/tree/VariableClosure.py +483 -0
  954. nuitka/tree/__init__.py +19 -0
  955. nuitka/utils/AppDirs.py +104 -0
  956. nuitka/utils/CStrings.py +208 -0
  957. nuitka/utils/CommandLineOptions.py +207 -0
  958. nuitka/utils/Distributions.py +728 -0
  959. nuitka/utils/Download.py +217 -0
  960. nuitka/utils/Execution.py +517 -0
  961. nuitka/utils/FileOperations.py +1587 -0
  962. nuitka/utils/Hashing.py +137 -0
  963. nuitka/utils/Images.py +79 -0
  964. nuitka/utils/Importing.py +335 -0
  965. nuitka/utils/InlineCopies.py +52 -0
  966. nuitka/utils/InstalledPythons.py +254 -0
  967. nuitka/utils/InstanceCounters.py +86 -0
  968. nuitka/utils/Jinja2.py +158 -0
  969. nuitka/utils/Json.py +40 -0
  970. nuitka/utils/MacOSApp.py +134 -0
  971. nuitka/utils/MemoryUsage.py +165 -0
  972. nuitka/utils/ModuleNames.py +317 -0
  973. nuitka/utils/PackageResources.py +44 -0
  974. nuitka/utils/ReExecute.py +152 -0
  975. nuitka/utils/Rest.py +60 -0
  976. nuitka/utils/SharedLibraries.py +1014 -0
  977. nuitka/utils/Shebang.py +113 -0
  978. nuitka/utils/Signing.py +144 -0
  979. nuitka/utils/SlotMetaClasses.py +57 -0
  980. nuitka/utils/StaticLibraries.py +260 -0
  981. nuitka/utils/ThreadedExecutor.py +87 -0
  982. nuitka/utils/Timing.py +102 -0
  983. nuitka/utils/Utils.py +483 -0
  984. nuitka/utils/WindowsFileUsage.py +337 -0
  985. nuitka/utils/WindowsResources.py +652 -0
  986. nuitka/utils/Yaml.py +247 -0
  987. nuitka/utils/__init__.py +19 -0
  988. nuitka_winsvc-2.7.7.data/scripts/nuitka-run.cmd +24 -0
  989. nuitka_winsvc-2.7.7.data/scripts/nuitka.cmd +30 -0
  990. nuitka_winsvc-2.7.7.dist-info/METADATA +115 -0
  991. nuitka_winsvc-2.7.7.dist-info/RECORD +995 -0
  992. nuitka_winsvc-2.7.7.dist-info/WHEEL +5 -0
  993. nuitka_winsvc-2.7.7.dist-info/entry_points.txt +7 -0
  994. nuitka_winsvc-2.7.7.dist-info/licenses/LICENSE.txt +202 -0
  995. 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.