Nuitka-winsvc 1.8.6__cp312-cp312-win_amd64.whl → 1.9.3__cp312-cp312-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.
Files changed (214) hide show
  1. {Nuitka_winsvc-1.8.6.dist-info → Nuitka_winsvc-1.9.3.dist-info}/METADATA +1 -1
  2. {Nuitka_winsvc-1.8.6.dist-info → Nuitka_winsvc-1.9.3.dist-info}/RECORD +212 -203
  3. {Nuitka_winsvc-1.8.6.dist-info → Nuitka_winsvc-1.9.3.dist-info}/WHEEL +1 -1
  4. nuitka/BytecodeCaching.py +4 -1
  5. nuitka/HardImportRegistry.py +348 -0
  6. nuitka/MainControl.py +45 -25
  7. nuitka/OptionParsing.py +31 -20
  8. nuitka/Options.py +47 -16
  9. nuitka/Progress.py +32 -2
  10. nuitka/PythonFlavors.py +1 -1
  11. nuitka/PythonVersions.py +61 -0
  12. nuitka/Tracing.py +25 -12
  13. nuitka/TreeXML.py +5 -5
  14. nuitka/Variables.py +15 -24
  15. nuitka/Version.py +16 -6
  16. nuitka/__main__.py +15 -0
  17. nuitka/__past__.py +15 -17
  18. nuitka/build/Backend.scons +44 -35
  19. nuitka/build/CCompilerVersion.scons +10 -9
  20. nuitka/build/Onefile.scons +11 -26
  21. nuitka/build/SconsCaching.py +2 -0
  22. nuitka/build/SconsCompilerSettings.py +72 -22
  23. nuitka/build/SconsHacks.py +1 -0
  24. nuitka/build/SconsInterface.py +5 -0
  25. nuitka/build/SconsSpawn.py +16 -3
  26. nuitka/build/SconsUtils.py +11 -12
  27. nuitka/build/include/nuitka/checksum_tools.h +0 -4
  28. nuitka/build/include/nuitka/compiled_asyncgen.h +1 -1
  29. nuitka/build/include/nuitka/compiled_coroutine.h +1 -1
  30. nuitka/build/include/nuitka/compiled_frame.h +7 -4
  31. nuitka/build/include/nuitka/compiled_function.h +13 -3
  32. nuitka/build/include/nuitka/compiled_generator.h +1 -1
  33. nuitka/build/include/nuitka/constants.h +2 -0
  34. nuitka/build/include/nuitka/environment_variables.h +45 -0
  35. nuitka/build/include/nuitka/exceptions.h +32 -4
  36. nuitka/build/include/nuitka/filesystem_paths.h +6 -1
  37. nuitka/build/include/nuitka/freelists.h +11 -1
  38. nuitka/build/include/nuitka/helper/dictionaries.h +1 -1
  39. nuitka/build/include/nuitka/helper/import_hard.h +3 -0
  40. nuitka/build/include/nuitka/helpers.h +2 -0
  41. nuitka/build/include/nuitka/importing.h +3 -0
  42. nuitka/build/include/nuitka/prelude.h +17 -6
  43. nuitka/build/include/nuitka/unfreezing.h +1 -1
  44. nuitka/build/inline_copy/bin/scons.py +14 -0
  45. nuitka/build/inline_copy/tqdm/tqdm/__init__.py +2 -2
  46. nuitka/build/inline_copy/tqdm/tqdm/utils.py +14 -8
  47. nuitka/build/inline_copy/zlib/LICENSE +22 -0
  48. nuitka/build/inline_copy/zlib/crc32.c +1049 -0
  49. nuitka/build/inline_copy/zlib/crc32.h +9446 -0
  50. nuitka/build/inline_copy/zlib/zconf.h +551 -0
  51. nuitka/build/inline_copy/zlib/zlib.h +1938 -0
  52. nuitka/build/inline_copy/zlib/zutil.h +275 -0
  53. nuitka/build/static_src/CompiledAsyncgenType.c +41 -41
  54. nuitka/build/static_src/CompiledCodeHelpers.c +14 -7
  55. nuitka/build/static_src/CompiledCoroutineType.c +60 -51
  56. nuitka/build/static_src/CompiledFrameType.c +12 -12
  57. nuitka/build/static_src/CompiledFunctionType.c +149 -28
  58. nuitka/build/static_src/CompiledGeneratorType.c +64 -65
  59. nuitka/build/static_src/CompiledGeneratorTypeUncompiledIntegration.c +1 -1
  60. nuitka/build/static_src/CompiledMethodType.c +5 -3
  61. nuitka/build/static_src/HelperEnvironmentVariables.c +120 -0
  62. nuitka/build/static_src/HelpersAttributes.c +1 -1
  63. nuitka/build/static_src/HelpersBuiltin.c +1 -1
  64. nuitka/build/static_src/HelpersChecksumTools.c +19 -4
  65. nuitka/build/static_src/HelpersComparisonEq.c +4 -4
  66. nuitka/build/static_src/HelpersComparisonNe.c +4 -4
  67. nuitka/build/static_src/HelpersConstantsBlob.c +40 -23
  68. nuitka/build/static_src/HelpersDictionaries.c +3 -1
  69. nuitka/build/static_src/HelpersDictionariesGenerated.c +9 -9
  70. nuitka/build/static_src/HelpersFilesystemPaths.c +12 -2
  71. nuitka/build/static_src/HelpersImport.c +29 -1
  72. nuitka/build/static_src/HelpersImportHard.c +19 -0
  73. nuitka/build/static_src/HelpersOperationInplaceAddUtils.c +5 -4
  74. nuitka/build/static_src/HelpersPythonPgo.c +5 -5
  75. nuitka/build/static_src/HelpersSafeStrings.c +2 -1
  76. nuitka/build/static_src/HelpersStrings.c +12 -10
  77. nuitka/build/static_src/HelpersTypes.c +1 -1
  78. nuitka/build/static_src/InspectPatcher.c +3 -2
  79. nuitka/build/static_src/MainProgram.c +182 -214
  80. nuitka/build/static_src/MetaPathBasedLoader.c +36 -23
  81. nuitka/build/static_src/MetaPathBasedLoaderImportlibMetadataDistribution.c +4 -2
  82. nuitka/build/static_src/MetaPathBasedLoaderResourceReaderFiles.c +38 -2
  83. nuitka/build/static_src/OnefileBootstrap.c +124 -93
  84. nuitka/code_generation/CodeGeneration.py +4 -2
  85. nuitka/code_generation/CodeObjectCodes.py +5 -1
  86. nuitka/code_generation/ConstantCodes.py +4 -0
  87. nuitka/code_generation/Contexts.py +111 -3
  88. nuitka/code_generation/DictCodes.py +5 -5
  89. nuitka/code_generation/FunctionCodes.py +4 -2
  90. nuitka/code_generation/GlobalConstants.py +10 -0
  91. nuitka/code_generation/ImportCodes.py +69 -33
  92. nuitka/code_generation/ModuleCodes.py +4 -1
  93. nuitka/code_generation/Namify.py +6 -5
  94. nuitka/code_generation/YieldCodes.py +3 -3
  95. nuitka/code_generation/templates/CodeTemplatesModules.py +61 -95
  96. nuitka/code_generation/templates_c/HelperDictionaryCopy.c.j2 +3 -3
  97. nuitka/code_generation/templates_c/HelperOperationComparisonUnicode.c.j2 +2 -2
  98. nuitka/distutils/DistutilCommands.py +3 -0
  99. nuitka/finalizations/FinalizeMarkups.py +1 -1
  100. nuitka/freezer/DependsExe.py +2 -1
  101. nuitka/freezer/DllDependenciesPosix.py +11 -1
  102. nuitka/freezer/IncludedEntryPoints.py +54 -16
  103. nuitka/freezer/Onefile.py +7 -3
  104. nuitka/freezer/Standalone.py +39 -17
  105. nuitka/importing/Importing.py +195 -62
  106. nuitka/importing/PreloadedPackages.py +2 -1
  107. nuitka/importing/Recursion.py +98 -27
  108. nuitka/importing/StandardLibrary.py +7 -4
  109. nuitka/nodes/BuiltinOpenNodes.py +28 -1
  110. nuitka/nodes/BuiltinRangeNodes.py +2 -2
  111. nuitka/nodes/BuiltinSumNodes.py +1 -1
  112. nuitka/nodes/ChildrenHavingMixins.py +326 -2
  113. nuitka/nodes/HardImportNodesGenerated.py +141 -38
  114. nuitka/nodes/ImportHardNodes.py +0 -8
  115. nuitka/nodes/ImportNodes.py +267 -361
  116. nuitka/nodes/IterationHandles.py +36 -17
  117. nuitka/nodes/LocalsScopes.py +3 -1
  118. nuitka/nodes/NodeBases.py +8 -14
  119. nuitka/nodes/OperatorNodes.py +9 -9
  120. nuitka/nodes/OutlineNodes.py +3 -3
  121. nuitka/nodes/PackageMetadataNodes.py +19 -9
  122. nuitka/nodes/SliceNodes.py +1 -1
  123. nuitka/nodes/VariableAssignNodes.py +25 -15
  124. nuitka/nodes/VariableRefNodes.py +7 -7
  125. nuitka/nodes/YieldNodes.py +2 -2
  126. nuitka/nodes/shapes/BuiltinTypeShapes.py +81 -6
  127. nuitka/nodes/shapes/ShapeMixins.py +21 -0
  128. nuitka/nodes/shapes/StandardShapes.py +9 -3
  129. nuitka/optimizations/OptimizeBuiltinCalls.py +1 -1
  130. nuitka/optimizations/TraceCollections.py +75 -0
  131. nuitka/pgo/PGO.py +14 -6
  132. nuitka/plugins/PluginBase.py +83 -11
  133. nuitka/plugins/Plugins.py +78 -35
  134. nuitka/plugins/standard/AntiBloatPlugin.py +46 -1
  135. nuitka/plugins/standard/ConsiderPyLintAnnotationsPlugin.py +1 -1
  136. nuitka/plugins/standard/DelvewheelPlugin.py +2 -1
  137. nuitka/plugins/standard/DillPlugin.py +3 -99
  138. nuitka/plugins/standard/DllFilesPlugin.py +45 -0
  139. nuitka/plugins/standard/GiPlugin.py +23 -10
  140. nuitka/plugins/standard/GlfwPlugin.py +1 -0
  141. nuitka/plugins/standard/ImplicitImports.py +267 -15
  142. nuitka/plugins/standard/KivyPlugin.py +1 -0
  143. nuitka/plugins/standard/MatplotlibPlugin.py +43 -25
  144. nuitka/plugins/standard/OptionsNannyPlugin.py +5 -6
  145. nuitka/plugins/standard/PkgResourcesPlugin.py +1 -1
  146. nuitka/plugins/standard/PmwPlugin.py +1 -1
  147. nuitka/plugins/standard/PySidePyQtPlugin.py +37 -20
  148. nuitka/plugins/standard/TkinterPlugin.py +44 -30
  149. nuitka/plugins/standard/TransformersPlugin.py +3 -1
  150. nuitka/plugins/standard/standard.nuitka-package.config.yml +522 -86
  151. nuitka/plugins/standard/stdlib3.nuitka-package.config.yml +8 -1
  152. nuitka/reports/CompilationReportReader.py +53 -0
  153. nuitka/reports/LicenseReport.rst.j2 +4 -4
  154. nuitka/reports/Reports.py +129 -47
  155. nuitka/specs/HardImportSpecs.py +6 -0
  156. nuitka/tools/data_composer/DataComposer.py +29 -17
  157. nuitka/tools/onefile_compressor/OnefileCompressor.py +173 -110
  158. nuitka/tools/podman/__main__.py +17 -2
  159. nuitka/tools/scanning/DisplayPackageDLLs.py +11 -2
  160. nuitka/tools/scanning/DisplayPackageData.py +1 -1
  161. nuitka/tools/specialize/CTypeDescriptions.py +36 -27
  162. nuitka/tools/specialize/SpecializeC.py +1 -1
  163. nuitka/tools/specialize/SpecializePython.py +16 -0
  164. nuitka/tools/testing/Common.py +3 -4
  165. nuitka/tools/testing/OutputComparison.py +23 -0
  166. nuitka/tools/testing/SearchModes.py +2 -2
  167. nuitka/tools/testing/compare_with_cpython/__main__.py +13 -4
  168. nuitka/tools/testing/measure_construct_performance/__main__.py +2 -5
  169. nuitka/tools/watch/__main__.py +194 -56
  170. nuitka/tree/Building.py +8 -2
  171. nuitka/tree/ComplexCallHelperFunctions.py +45 -15
  172. nuitka/tree/ReformulationAssignmentStatements.py +18 -12
  173. nuitka/tree/ReformulationCallExpressions.py +1 -1
  174. nuitka/tree/ReformulationClasses.py +11 -5
  175. nuitka/tree/ReformulationClasses3.py +30 -12
  176. nuitka/tree/ReformulationComparisonExpressions.py +4 -2
  177. nuitka/tree/ReformulationContractionExpressions.py +19 -11
  178. nuitka/tree/ReformulationDictionaryCreation.py +9 -3
  179. nuitka/tree/ReformulationExecStatements.py +6 -6
  180. nuitka/tree/ReformulationForLoopStatements.py +5 -5
  181. nuitka/tree/ReformulationFunctionStatements.py +6 -2
  182. nuitka/tree/ReformulationImportStatements.py +7 -2
  183. nuitka/tree/ReformulationLambdaExpressions.py +1 -1
  184. nuitka/tree/ReformulationMatchStatements.py +3 -1
  185. nuitka/tree/ReformulationNamespacePackages.py +7 -3
  186. nuitka/tree/ReformulationPrintStatements.py +1 -1
  187. nuitka/tree/ReformulationSequenceCreation.py +18 -6
  188. nuitka/tree/ReformulationWithStatements.py +8 -8
  189. nuitka/tree/ReformulationYieldExpressions.py +2 -2
  190. nuitka/tree/SourceHandling.py +27 -5
  191. nuitka/tree/VariableClosure.py +11 -1
  192. nuitka/utils/AppDirs.py +2 -2
  193. nuitka/utils/CStrings.py +39 -3
  194. nuitka/utils/CommandLineOptions.py +42 -1
  195. nuitka/utils/Distributions.py +305 -38
  196. nuitka/utils/Download.py +27 -8
  197. nuitka/utils/FileOperations.py +103 -20
  198. nuitka/utils/Hashing.py +2 -3
  199. nuitka/utils/Importing.py +60 -3
  200. nuitka/utils/InstalledPythons.py +31 -36
  201. nuitka/utils/Jinja2.py +11 -5
  202. nuitka/utils/ModuleNames.py +11 -3
  203. nuitka/utils/ReExecute.py +7 -0
  204. nuitka/utils/SharedLibraries.py +38 -14
  205. nuitka/utils/SlotMetaClasses.py +55 -0
  206. nuitka/utils/Utils.py +10 -0
  207. nuitka/utils/Yaml.py +9 -1
  208. nuitka/build/inline_copy/tqdm/tqdm/_tqdm_gui.py +0 -9
  209. nuitka/build/inline_copy/tqdm/tqdm/gui.py +0 -191
  210. {Nuitka_winsvc-1.8.6.data → Nuitka_winsvc-1.9.3.data}/scripts/nuitka-run.bat +0 -0
  211. {Nuitka_winsvc-1.8.6.data → Nuitka_winsvc-1.9.3.data}/scripts/nuitka.bat +0 -0
  212. {Nuitka_winsvc-1.8.6.dist-info → Nuitka_winsvc-1.9.3.dist-info}/LICENSE.txt +0 -0
  213. {Nuitka_winsvc-1.8.6.dist-info → Nuitka_winsvc-1.9.3.dist-info}/entry_points.txt +0 -0
  214. {Nuitka_winsvc-1.8.6.dist-info → Nuitka_winsvc-1.9.3.dist-info}/top_level.txt +0 -0
@@ -102,7 +102,7 @@ from .SconsUtils import (
102
102
  writeSconsReport,
103
103
  )
104
104
 
105
- # spell-checker: ignore ccversion,ccflags,werror,cppdefines,cpppath
105
+ # spell-checker: ignore ccversion,ccflags,werror,cppdefines,cpppath,linkflags,libpath
106
106
 
107
107
  # Set the arguments.
108
108
  setArguments(ARGUMENTS)
@@ -120,7 +120,7 @@ nuitka_src = getArgumentRequired("nuitka_src")
120
120
  static_src = os.path.join(source_dir, "static")
121
121
 
122
122
  # The name of executable or extension module that we produce.
123
- result_basepath = getArgumentRequired("result_name")
123
+ result_base_path = getArgumentRequired("result_name")
124
124
 
125
125
  # The name of executable that we produce (in executable mode).
126
126
  result_exe = getArgumentDefaulted("result_exe", None)
@@ -178,10 +178,6 @@ lto_mode = getArgumentDefaulted("lto_mode", "auto")
178
178
  # PGO mode: Use profile guided optimization of C compiler if available.
179
179
  pgo_mode = getArgumentDefaulted("pgo_mode", "no")
180
180
 
181
- # Windows target mode: Compile for Windows. Used to be an option, but we
182
- # no longer cross compile this way.
183
- win_target = os.name == "nt"
184
-
185
181
  # Windows subsystem mode: Disable console for windows builds.
186
182
  disable_console = getArgumentBool("disable_console", False)
187
183
 
@@ -204,7 +200,7 @@ clang_mode = getArgumentBool("clang_mode", False)
204
200
  # Clang on Windows with no requirement to use MinGW64 or using MSYS2 MinGW flavor,
205
201
  # is changed to ClangCL from Visual Studio.
206
202
  clangcl_mode = False
207
- if win_target and not mingw_mode and clang_mode:
203
+ if os.name == "nt" and not mingw_mode and clang_mode:
208
204
  clang_mode = False
209
205
  clangcl_mode = True
210
206
 
@@ -290,6 +286,9 @@ cpp_include_dirs = getArgumentList("cpp_include_dirs", "")
290
286
  link_dirs = getArgumentList("link_dirs", "")
291
287
  link_libraries = getArgumentList("link_libraries", "")
292
288
 
289
+ # From statically compiled modules of the Python
290
+ link_module_libs = getArgumentList("link_module_libs", "")
291
+
293
292
  # Allow automatic downloads for ccache, etc.
294
293
  assume_yes_for_downloads = getArgumentBool("assume_yes_for_downloads", False)
295
294
 
@@ -362,6 +361,7 @@ env.debug_mode = debug_mode
362
361
  env.unstripped_mode = unstripped_mode
363
362
  env.disable_console = disable_console
364
363
  env.source_dir = source_dir
364
+ env.nuitka_src = nuitka_src
365
365
  env.low_memory = low_memory
366
366
  env.macos_min_version = macos_min_version
367
367
  env.macos_target_arch = macos_target_arch
@@ -377,8 +377,8 @@ env.gcc_mode = isGccName(env.the_cc_name) or clang_mode
377
377
  env.clang_mode = clang_mode
378
378
 
379
379
  # Only use MSVC if not already clear, we are using MinGW.
380
- env.msvc_mode = win_target and not env.gcc_mode
381
- env.mingw_mode = win_target and env.gcc_mode
380
+ env.msvc_mode = os.name == "nt" and not env.gcc_mode
381
+ env.mingw_mode = os.name == "nt" and env.gcc_mode
382
382
  env.clangcl_mode = clangcl_mode
383
383
 
384
384
  # Consider switching from gcc to its g++ compiler as a workaround that makes us work without C11.
@@ -395,7 +395,7 @@ if show_scons_mode:
395
395
  my_print("Scons: Compiler used", end=" ")
396
396
  my_print(getExecutablePath(env.the_compiler, env=env), end=" ")
397
397
 
398
- if win_target and env.msvc_mode:
398
+ if os.name == "nt" and env.msvc_mode:
399
399
  my_print("(MSVC %s)" % getMsvcVersionString(env))
400
400
 
401
401
  my_print()
@@ -412,6 +412,7 @@ setupCCompiler(
412
412
  lto_mode=lto_mode,
413
413
  pgo_mode=pgo_mode,
414
414
  job_count=job_count,
415
+ onefile_compile=False,
415
416
  )
416
417
 
417
418
 
@@ -425,14 +426,14 @@ if env.gcc_mode and not env.clang_mode and env.gcc_version >= (8,):
425
426
  "--file-prefix-map=%s=%s" % (os.path.normpath(source_dir), "."),
426
427
  "--file-prefix-map=%s=%s"
427
428
  % (
428
- os.path.normpath(os.path.join(source_dir, "static_src")),
429
- os.path.normpath(os.path.join(nuitka_src, "static_src")),
429
+ os.path.normpath(os.path.join(env.source_dir, "static_src")),
430
+ os.path.normpath(os.path.join(env.nuitka_src, "static_src")),
430
431
  ),
431
432
  ]
432
433
  )
433
434
 
434
435
  if env.msvc_mode:
435
- # With Clang on Windows, there is also an linker to use.
436
+ # With Clang on Windows, there is also an linker to use. spell-checker: ignore bigobj
436
437
  env.Append(
437
438
  CCFLAGS=[
438
439
  "/EHsc", # No C++ exception handling code.
@@ -447,7 +448,7 @@ if env.msvc_mode:
447
448
 
448
449
  if module_mode:
449
450
  # Make sure we handle import library on our own and put it into the
450
- # build directory.
451
+ # build directory, spell-checker: ignore IMPLIB
451
452
 
452
453
  no_import_lib = True
453
454
  env.Append(
@@ -463,10 +464,17 @@ if env.debug_mode:
463
464
  if env.gcc_mode:
464
465
  # Allow gcc/clang to point out all kinds of inconsistency to us by
465
466
  # raising an error.
467
+
468
+ if "allow-c-warnings" not in env.experimental_flags:
469
+ env.Append(
470
+ CCFLAGS=[
471
+ "-Wall",
472
+ "-Werror",
473
+ ]
474
+ )
475
+
466
476
  env.Append(
467
477
  CCFLAGS=[
468
- "-Wall",
469
- "-Werror",
470
478
  # Unfortunately Py_INCREF(Py_False) triggers aliasing warnings,
471
479
  # which are unfounded, so disable them.
472
480
  "-Wno-error=strict-aliasing",
@@ -571,7 +579,7 @@ if env.gcc_mode and env.debian_python:
571
579
 
572
580
 
573
581
  def _detectPythonHeaderPath():
574
- if win_target:
582
+ if os.name == "nt":
575
583
  # On Windows, the CPython installation layout is relatively fixed, but on MSYS2
576
584
  # compiled for mingw64, it's more standard.
577
585
 
@@ -611,7 +619,7 @@ def _detectPythonHeaderPath():
611
619
  if os.path.exists(os.path.join(candidate, "Python.h")):
612
620
  return candidate
613
621
 
614
- if win_target:
622
+ if os.name == "nt":
615
623
  scons_logger.sysexit(
616
624
  """Error, you seem to be using the unsupported embeddable CPython distribution."""
617
625
  )
@@ -645,10 +653,10 @@ if env.nuitka_python:
645
653
  if env.static_libpython:
646
654
  env.Append(CPPDEFINES=["_NUITKA_STATIC_LIBPYTHON"])
647
655
 
648
- if env.static_libpython and (not win_target or env.nuitka_python):
656
+ if env.static_libpython and (not os.name == "nt" or env.nuitka_python):
649
657
  env.Append(CPPDEFINES=["_NUITKA_USE_UNEXPOSED_API"])
650
658
 
651
- if win_target:
659
+ if os.name == "nt":
652
660
  if env.nuitka_python:
653
661
  env.Append(
654
662
  LINKFLAGS=[
@@ -709,16 +717,19 @@ elif not module_mode:
709
717
  python_lib_path = os.path.join(python_prefix_external, "lib")
710
718
  env.Append(LIBPATH=[python_lib_path])
711
719
 
720
+ # Any module libs that are for self-compiled Python to be static.
721
+ env.Append(_LIBFLAGS=["-l" + lib_desc for lib_desc in link_module_libs])
722
+
712
723
  if env.nuitka_python:
713
724
  link_data = loadJsonFromFilename(
714
725
  os.path.join(python_prefix_external, "link.json")
715
726
  )
716
727
  for lib in link_data["libraries"]:
717
728
  # Need to prevent Scons from stripping .a from the passed in libs.
718
- if os.path.isfile(lib):
719
- env.Append(_LIBFLAGS=[lib])
720
- elif lib.startswith(":") and lib.endswith(".a"):
729
+ if lib.startswith(":") and lib.endswith(".a"):
721
730
  env.Append(_LIBFLAGS=["-l" + lib])
731
+ elif os.path.isfile(lib):
732
+ env.Append(_LIBFLAGS=[lib])
722
733
  else:
723
734
  env.Append(LIBS=[lib])
724
735
  env.Append(LIBPATH=link_data["library_dirs"])
@@ -779,7 +790,7 @@ if isMacOS():
779
790
 
780
791
  # The static include files reside in Nuitka installation, which may be where
781
792
  # the "nuitka.build" package lives.
782
- nuitka_include = os.path.join(nuitka_src, "include")
793
+ nuitka_include = os.path.join(env.nuitka_src, "include")
783
794
 
784
795
  if not os.path.exists(os.path.join(nuitka_include, "nuitka", "prelude.h")):
785
796
  scons_logger.sysexit(
@@ -789,10 +800,12 @@ if not os.path.exists(os.path.join(nuitka_include, "nuitka", "prelude.h")):
789
800
 
790
801
  # We have include files in the build directory and the static include directory
791
802
  # that is located inside Nuitka installation.
792
- env.Append(CPPPATH=[source_dir, nuitka_include, os.path.join(nuitka_src, "static_src")])
803
+ env.Append(
804
+ CPPPATH=[source_dir, nuitka_include, os.path.join(env.nuitka_src, "static_src")]
805
+ )
793
806
 
794
807
  # Set load libpython from binary directory default
795
- if env.gcc_mode and not isMacOS() and not win_target and not module_mode:
808
+ if env.gcc_mode and not isMacOS() and not os.name == "nt" and not module_mode:
796
809
  if env.standalone_mode:
797
810
  rpath = "$$ORIGIN"
798
811
  else:
@@ -868,9 +881,8 @@ def discoverSourceFiles():
868
881
 
869
882
  result += [
870
883
  provideStaticSourceFile(
884
+ env=env,
871
885
  sub_path=filename,
872
- nuitka_src=nuitka_src,
873
- source_dir=source_dir,
874
886
  c11_mode=env.c11_mode,
875
887
  )
876
888
  for filename in static_src_filenames
@@ -883,11 +895,11 @@ source_files = discoverSourceFiles()
883
895
 
884
896
  if module_mode:
885
897
  # For Python modules, the standard shared library extension is not what
886
- # gets used.
898
+ # gets used. spell-checker: ignore SHLIBSUFFIX
887
899
  env["SHLIBSUFFIX"] = module_suffix
888
900
 
889
901
  target = env.SharedLibrary(
890
- result_basepath, source_files, no_import_lib=no_import_lib
902
+ result_base_path, source_files, no_import_lib=no_import_lib
891
903
  )
892
904
  else:
893
905
  target = env.Program(result_exe, source_files)
@@ -967,9 +979,7 @@ def createBuildDefinitionsFile():
967
979
  build_definitions["NUITKA_FORCED_STDERR_PATH"] = forced_stderr_path
968
980
 
969
981
  build_definitions["NUITKA_MAIN_MODULE_NAME"] = main_module_name
970
-
971
- if main_module_name != "__main__":
972
- build_definitions["NUITKA_MAIN_PACKAGE_MODE"] = 1
982
+ build_definitions["NUITKA_MAIN_IS_PACKAGE_BOOL"] = main_module_name != "__main__"
973
983
 
974
984
  createDefinitionsFile(source_dir, "build_definitions.h", build_definitions)
975
985
 
@@ -978,7 +988,7 @@ if forced_stderr_path and not forced_stdout_path:
978
988
  env.Append(CPPDEFINES=["NUITKA_STDERR_NOT_VISIBLE"])
979
989
 
980
990
  if file_reference_mode == "original":
981
- env.Append(CPPDEFINES=["NUITKA_FILE_REFERENCE_ORIGINAL_MODE"])
991
+ env.Append(CPPDEFINES=["_NUITKA_FILE_REFERENCE_ORIGINAL_MODE"])
982
992
 
983
993
 
984
994
  createBuildDefinitionsFile()
@@ -1010,7 +1020,6 @@ env.Append(LIBS=link_libraries)
1010
1020
  # Work around windows bugs and use watchdogs to track progress of compilation.
1011
1021
  enableSpawnMonitoring(
1012
1022
  env=env,
1013
- win_target=win_target,
1014
1023
  module_mode=module_mode,
1015
1024
  source_files=source_files,
1016
1025
  )
@@ -69,6 +69,7 @@ from .SconsUtils import (
69
69
  getArgumentBool,
70
70
  getArgumentDefaulted,
71
71
  getArgumentList,
72
+ getArgumentRequired,
72
73
  getExecutablePath,
73
74
  initScons,
74
75
  isClangName,
@@ -86,6 +87,8 @@ setArguments(ARGUMENTS)
86
87
  # Set up the basic stuff.
87
88
  initScons()
88
89
 
90
+ nuitka_src = getArgumentRequired("nuitka_src")
91
+
89
92
  # Module mode: Create a Python extension module, create an executable otherwise.
90
93
  module_mode = getArgumentBool("module_mode", False)
91
94
 
@@ -99,10 +102,6 @@ experimental = getArgumentList("experimental", "")
99
102
  # good with the compiler in question.
100
103
  lto_mode = getArgumentDefaulted("lto_mode", "auto")
101
104
 
102
- # Windows target mode: Compile for Windows. Used to be an option, but we
103
- # no longer cross compile this way.
104
- win_target = os.name == "nt"
105
-
106
105
  # Windows subsystem mode: Disable console for windows builds.
107
106
  disable_console = getArgumentBool("disable_console", False)
108
107
 
@@ -122,7 +121,7 @@ clang_mode = getArgumentBool("clang_mode", False)
122
121
  # Clang on Windows with no requirement to use MinGW64 or using MSYS2 MinGW flavor,
123
122
  # is changed to ClangCL from Visual Studio.
124
123
  clangcl_mode = False
125
- if win_target and not mingw_mode and clang_mode:
124
+ if os.name == "nt" and not mingw_mode and clang_mode:
126
125
  clang_mode = False
127
126
  clangcl_mode = True
128
127
 
@@ -163,7 +162,7 @@ if "CXX" in os.environ:
163
162
 
164
163
  cxx_dirname = os.path.dirname(os.environ["CXX"])
165
164
 
166
- if win_target and isGccName(os.path.basename(os.environ["CXX"])):
165
+ if os.name == "nt" and isGccName(os.path.basename(os.environ["CXX"])):
167
166
  if show_scons_mode:
168
167
  my_print("Scons: Environment CXX seems to be a gcc, enable mingw_mode.")
169
168
  mingw_mode = True
@@ -221,6 +220,7 @@ env.the_cc_name = os.path.normcase(os.path.basename(env.the_compiler))
221
220
  env.debug_mode = debug_mode
222
221
  env.unstripped_mode = unstripped_mode
223
222
  env.disable_console = disable_console
223
+ env.nuitka_src = nuitka_src
224
224
  env.low_memory = False
225
225
  env.macos_min_version = macos_min_version
226
226
  env.macos_target_arch = macos_target_arch
@@ -236,8 +236,8 @@ env.gcc_mode = isGccName(env.the_cc_name) or clang_mode
236
236
  env.clang_mode = clang_mode
237
237
 
238
238
  # Only use MSVC if not already clear, we are using MinGW.
239
- env.msvc_mode = win_target and not env.gcc_mode
240
- env.mingw_mode = win_target and env.gcc_mode
239
+ env.msvc_mode = os.name == "nt" and not env.gcc_mode
240
+ env.mingw_mode = os.name == "nt" and env.gcc_mode
241
241
  env.clangcl_mode = clangcl_mode
242
242
 
243
243
  # Consider switching from gcc to its g++ compiler as a workaround that makes us work without C11.
@@ -253,12 +253,13 @@ env.the_compiler = getExecutablePath(env.the_compiler, env=env)
253
253
  # Report the C compiler used.
254
254
  reportCCompiler(env, "Version", my_print)
255
255
 
256
- # Set up C compiler settings.
256
+ # Set up C compiler settings, we would use that mode mode outputs.
257
257
  setupCCompiler(
258
258
  env=env,
259
259
  lto_mode=lto_mode,
260
260
  pgo_mode="no", # TODO: Have this here too, decompression might benefit.
261
261
  job_count=job_count,
262
+ onefile_compile=False,
262
263
  )
263
264
 
264
265
  # TODO: Report modes.
@@ -141,10 +141,6 @@ trace_mode = getArgumentBool("trace_mode", False)
141
141
  # good with the compiler in question.
142
142
  lto_mode = getArgumentDefaulted("lto_mode", "auto")
143
143
 
144
- # Windows target mode: Compile for Windows. Used to be an option, but we
145
- # no longer cross compile this way.
146
- win_target = os.name == "nt"
147
-
148
144
  # Windows subsystem mode: Disable console for windows builds.
149
145
  disable_console = getArgumentBool("disable_console", False)
150
146
 
@@ -164,7 +160,7 @@ clang_mode = getArgumentBool("clang_mode", False)
164
160
  # Clang on Windows with no requirement to use MinGW64 or using MSYS2 MinGW flavor,
165
161
  # is changed to ClangCL from Visual Studio.
166
162
  clangcl_mode = False
167
- if clang_mode and win_target and not mingw_mode:
163
+ if clang_mode and os.name == "nt" and not mingw_mode:
168
164
  clang_mode = False
169
165
  clangcl_mode = True
170
166
 
@@ -223,7 +219,7 @@ if "CXX" in os.environ:
223
219
 
224
220
  cxx_dirname = os.path.dirname(os.environ["CXX"])
225
221
 
226
- if win_target and isGccName(os.path.basename(os.environ["CXX"])):
222
+ if os.name == "nt" and isGccName(os.path.basename(os.environ["CXX"])):
227
223
  if show_scons_mode:
228
224
  my_print("Scons: Environment CXX seems to be a gcc, enable mingw_mode.")
229
225
  mingw_mode = True
@@ -283,6 +279,7 @@ env.debug_mode = debug_mode
283
279
  env.unstripped_mode = unstripped_mode
284
280
  env.disable_console = disable_console
285
281
  env.source_dir = source_dir
282
+ env.nuitka_src = nuitka_src
286
283
  env.low_memory = False # Never a concern in this case.
287
284
  env.macos_min_version = macos_min_version
288
285
  env.macos_target_arch = macos_target_arch
@@ -298,8 +295,8 @@ env.gcc_mode = isGccName(env.the_cc_name) or clang_mode
298
295
  env.clang_mode = clang_mode
299
296
 
300
297
  # Only use MSVC if not already clear, we are using MinGW.
301
- env.msvc_mode = win_target and not env.gcc_mode
302
- env.mingw_mode = win_target and env.gcc_mode
298
+ env.msvc_mode = os.name == "nt" and not env.gcc_mode
299
+ env.mingw_mode = os.name == "nt" and env.gcc_mode
303
300
  env.clangcl_mode = clangcl_mode
304
301
 
305
302
  # Consider switching from gcc to its g++ compiler as a workaround that makes us work without C11.
@@ -314,7 +311,7 @@ if show_scons_mode:
314
311
  my_print("Scons: Compiler used", end=" ")
315
312
  my_print(getExecutablePath(env.the_compiler, env=env), end=" ")
316
313
 
317
- if win_target and env.msvc_mode:
314
+ if os.name == "nt" and env.msvc_mode:
318
315
  my_print("(MSVC %s)" % getMsvcVersionString(env))
319
316
 
320
317
  my_print()
@@ -332,6 +329,7 @@ setupCCompiler(
332
329
  lto_mode=lto_mode,
333
330
  pgo_mode="no", # TODO: Have this here too, decompression might benefit.
334
331
  job_count=job_count,
332
+ onefile_compile=True,
335
333
  )
336
334
 
337
335
  # Avoid them as appearing to be different files. TODO: Find out which
@@ -373,14 +371,6 @@ if debug_mode:
373
371
  CCFLAGS=[
374
372
  "-Wall",
375
373
  "-Werror",
376
- # Unfortunately Py_INCREF(Py_False) triggers aliasing warnings,
377
- # which are unfounded, so disable them.
378
- "-Wno-error=strict-aliasing",
379
- "-Wno-strict-aliasing",
380
- # At least for self-compiled Python3.2, and MinGW this happens
381
- # and has little use anyway.
382
- "-Wno-error=format",
383
- "-Wno-format",
384
374
  ]
385
375
  )
386
376
 
@@ -427,8 +417,8 @@ env.Append(
427
417
  CPPPATH=[
428
418
  source_dir,
429
419
  nuitka_include,
430
- os.path.join(nuitka_src, "static_src"),
431
- os.path.join(nuitka_src, "inline_copy", "zstd"),
420
+ os.path.join(env.nuitka_src, "static_src"),
421
+ os.path.join(env.nuitka_src, "inline_copy", "zstd"),
432
422
  ],
433
423
  )
434
424
 
@@ -437,8 +427,6 @@ if env.msvc_mode:
437
427
  env.Append(CCFLAGS=["/MT"]) # Multithreaded, static version of C run time.
438
428
 
439
429
  if isMacOS():
440
- env.Append(CPPDEFINES=["_NUITKA_PAYLOAD_FROM_MACOS_SECTION"])
441
-
442
430
  addConstantBlobFile(
443
431
  env=env,
444
432
  blob_filename=os.path.join(source_dir, "__payload.bin"),
@@ -463,9 +451,8 @@ def discoverSourceFiles():
463
451
  # Main onefile bootstrap program
464
452
  result.append(
465
453
  provideStaticSourceFile(
454
+ env=env,
466
455
  sub_path="OnefileBootstrap.c",
467
- nuitka_src=nuitka_src,
468
- source_dir=source_dir,
469
456
  c11_mode=env.c11_mode,
470
457
  )
471
458
  )
@@ -473,9 +460,8 @@ def discoverSourceFiles():
473
460
  if onefile_splash_screen:
474
461
  result.append(
475
462
  provideStaticSourceFile(
463
+ env=env,
476
464
  sub_path="OnefileSplashScreen.cpp",
477
- nuitka_src=nuitka_src,
478
- source_dir=source_dir,
479
465
  c11_mode=False,
480
466
  )
481
467
  )
@@ -510,7 +496,6 @@ env.Append(LIBS=link_libraries)
510
496
  # Work around windows bugs and use watchdogs to track progress of compilation.
511
497
  enableSpawnMonitoring(
512
498
  env=env,
513
- win_target=win_target,
514
499
  module_mode=module_mode,
515
500
  source_files=source_files,
516
501
  )
@@ -106,6 +106,7 @@ def _injectCcache(env, cc_path, python_prefix, assume_yes_for_downloads):
106
106
  if isWin32Windows():
107
107
  url = "https://github.com/ccache/ccache/releases/download/v4.6/ccache-4.6-windows-32.zip"
108
108
  ccache_binary = getCachedDownload(
109
+ name="ccache",
109
110
  url=url,
110
111
  is_arch_specific=False,
111
112
  specificity=url.rsplit("/", 2)[1],
@@ -121,6 +122,7 @@ def _injectCcache(env, cc_path, python_prefix, assume_yes_for_downloads):
121
122
  url = "https://nuitka.net/ccache/v4.2.1/ccache-4.2.1.zip"
122
123
 
123
124
  ccache_binary = getCachedDownload(
125
+ name="ccache",
124
126
  url=url,
125
127
  is_arch_specific=False,
126
128
  specificity=url.rsplit("/", 2)[1],
@@ -52,11 +52,11 @@ from .SconsUtils import (
52
52
  setEnvironmentVariable,
53
53
  )
54
54
 
55
- # spell-checker: ignore CPPDEFINES,CPPPATH,CXXVERSION,CCFLAGS,LINKFLAGS,CXXFLAGS
55
+ # spell-checker: ignore LIBPATH,CPPDEFINES,CPPPATH,CXXVERSION,CCFLAGS,LINKFLAGS,CXXFLAGS
56
56
  # spell-checker: ignore -flto,-fpartial-inlining,-freorder-functions,-defsym,-fprofile
57
57
  # spell-checker: ignore -fwrapv,-Wunused,fcompare,-ftrack,-fvisibility,-municode,
58
58
  # spell-checker: ignore -feliminate,noexecstack,implib
59
- # spell-checker: ignore LTCG,GENPROFILE,USEPROFILE,
59
+ # spell-checker: ignore LTCG,GENPROFILE,USEPROFILE,CGTHREADS
60
60
 
61
61
 
62
62
  def _detectWindowsSDK(env):
@@ -161,6 +161,9 @@ def _enableLtoSettings(
161
161
  elif env.nuitka_python:
162
162
  lto_mode = True
163
163
  reason = "known to be supported (Nuitka-Python)"
164
+ elif env.fedora_python:
165
+ lto_mode = True
166
+ reason = "known to be supported (Fedora Python)"
164
167
  elif (
165
168
  env.debian_python
166
169
  and env.gcc_mode
@@ -210,26 +213,31 @@ version for lto mode (>= 4.6). Disabled."""
210
213
  reason = "gcc 4.6 is doesn't have good enough LTO support"
211
214
 
212
215
  if env.gcc_mode and lto_mode:
213
- env.Append(CCFLAGS=["-flto"])
214
-
215
216
  if env.clang_mode:
217
+ env.Append(CCFLAGS=["-flto"])
216
218
  env.Append(LINKFLAGS=["-flto"])
217
219
  else:
220
+ env.Append(CCFLAGS=["-flto=%d" % job_count])
221
+ env.Append(LINKFLAGS=["-flto=%d" % job_count])
222
+
218
223
  env.Append(CCFLAGS=["-fuse-linker-plugin", "-fno-fat-lto-objects"])
219
224
  env.Append(LINKFLAGS=["-fuse-linker-plugin"])
220
225
 
221
- env.Append(LINKFLAGS=["-flto=%d" % job_count])
222
-
223
226
  # Need to tell the linker these things are OK.
224
227
  env.Append(LINKFLAGS=["-fpartial-inlining", "-freorder-functions"])
225
228
 
229
+ if env.mingw_mode and "MAKE" not in os.environ:
230
+ setEnvironmentVariable(env, "MAKE", "mingw32-make.exe")
231
+
226
232
  # Tell compiler to use link time optimization for MSVC
227
233
  if env.msvc_mode and lto_mode:
228
234
  env.Append(CCFLAGS=["/GL"])
229
235
 
230
236
  if not env.clangcl_mode:
231
237
  env.Append(LINKFLAGS=["/LTCG"])
232
- env.Append(LINKFLAGS=["/CGTHREADS:%d" % job_count])
238
+
239
+ if getMsvcVersion(env) >= (14, 3):
240
+ env.Append(LINKFLAGS=["/CGTHREADS:%d" % job_count])
233
241
 
234
242
  if orig_lto_mode == "auto":
235
243
  scons_details_logger.info(
@@ -491,6 +499,11 @@ unsigned char const *getConstantsBlobData(void) {
491
499
  # Indicate "linker" resource mode.
492
500
  env.Append(CPPDEFINES=["_NUITKA_CONSTANTS_FROM_LINKER"])
493
501
 
502
+ # For MinGW the symbol name to be used is more low level.
503
+ constant_bin_link_name = "constant_bin_data"
504
+ if env.mingw_mode:
505
+ constant_bin_link_name = "_" + constant_bin_link_name
506
+
494
507
  env.Append(
495
508
  LINKFLAGS=[
496
509
  "-Wl,-b",
@@ -503,9 +516,9 @@ unsigned char const *getConstantsBlobData(void) {
503
516
  mingw_mode=env.mingw_mode or isPosixWindows(),
504
517
  ),
505
518
  "-Wl,-defsym",
506
- "-Wl,%sconstant_bin_data=_binary_%s___constants_bin_start"
519
+ "-Wl,%s=_binary_%s___constants_bin_start"
507
520
  % (
508
- "_" if env.mingw_mode else "",
521
+ constant_bin_link_name,
509
522
  "".join(re.sub("[^a-zA-Z0-9_]", "_", c) for c in env.source_dir),
510
523
  ),
511
524
  ]
@@ -573,7 +586,7 @@ def enableWindowsStackSize(env, target_arch):
573
586
  env.Append(LINKFLAGS=["-Wl,--stack,%d" % stack_size])
574
587
 
575
588
 
576
- def setupCCompiler(env, lto_mode, pgo_mode, job_count):
589
+ def setupCCompiler(env, lto_mode, pgo_mode, job_count, onefile_compile):
577
590
  # This is driven by many branches on purpose and has a lot of things
578
591
  # to deal with for LTO checks and flags, pylint: disable=too-many-branches,too-many-statements
579
592
 
@@ -765,12 +778,12 @@ def setupCCompiler(env, lto_mode, pgo_mode, job_count):
765
778
  if env.disable_console:
766
779
  env.Append(CPPDEFINES=["_NUITKA_WINMAIN_ENTRY_POINT"])
767
780
 
768
- # Avoid dependency on MinGW libraries.
781
+ # Avoid dependency on MinGW libraries, spell-checker: ignore libgcc
769
782
  if env.mingw_mode and not env.clang_mode:
770
783
  env.Append(LINKFLAGS=["-static-libgcc"])
771
784
 
772
785
  # MinGW64 for 64 bits needs this due to CPython bugs.
773
- if env.mingw_mode and env.target_arch == "x86_64":
786
+ if env.mingw_mode and env.target_arch == "x86_64" and env.python_version < (3, 12):
774
787
  env.Append(CPPDEFINES=["MS_WIN64"])
775
788
 
776
789
  # For shell API usage to lookup app folders we need this. Note that on Windows ARM
@@ -783,6 +796,24 @@ def setupCCompiler(env, lto_mode, pgo_mode, job_count):
783
796
  if isFedoraBasedLinux():
784
797
  env.Append(CCFLAGS=["-fPIC"])
785
798
 
799
+ # We use zlib for crc32 functionality
800
+ zlib_inline_copy_dir = os.path.join(env.nuitka_src, "inline_copy", "zlib")
801
+ if os.path.exists(os.path.join(zlib_inline_copy_dir, "crc32.c")):
802
+ env.Append(
803
+ CPPPATH=[
804
+ zlib_inline_copy_dir,
805
+ ],
806
+ )
807
+ else:
808
+ # TODO: Should only happen for official Debian packages, and there we
809
+ # can use the zlib static linking maybe, but for onefile it's not easy
810
+ # to get it, so just use slow checksum for now.
811
+ if onefile_compile:
812
+ env.Append(CPPDEFINES=["_NUITKA_USE_OWN_CRC32"])
813
+ else:
814
+ env.Append(CPPDEFINES=["_NUITKA_USE_SYSTEM_CRC32"])
815
+ env.Append(LIBS="z")
816
+
786
817
 
787
818
  def _enablePgoSettings(env, pgo_mode):
788
819
  if pgo_mode == "no":
@@ -907,20 +938,29 @@ version (>= 5.3)."""
907
938
  )
908
939
 
909
940
  if env.gcc_version < (5,):
910
- scons_logger.info("The provided gcc is too old, switching to its g++ instead.")
941
+ if env.python_version < (3, 11):
942
+ scons_logger.info(
943
+ "The provided gcc is too old, switching to its g++ instead.",
944
+ mnemonic="too-old-gcc",
945
+ )
911
946
 
912
- # Switch to g++ from gcc then if possible, when C11 mode is false.
913
- the_gpp_compiler = os.path.join(
914
- os.path.dirname(env.the_compiler),
915
- os.path.basename(env.the_compiler).replace("gcc", "g++"),
916
- )
947
+ # Switch to g++ from gcc then if possible, when C11 mode is false.
948
+ the_gpp_compiler = os.path.join(
949
+ os.path.dirname(env.the_compiler),
950
+ os.path.basename(env.the_compiler).replace("gcc", "g++"),
951
+ )
917
952
 
918
- if getExecutablePath(the_gpp_compiler, env=env):
919
- env.the_compiler = the_gpp_compiler
920
- env.the_cc_name = env.the_cc_name.replace("gcc", "g++")
953
+ if getExecutablePath(the_gpp_compiler, env=env):
954
+ env.the_compiler = the_gpp_compiler
955
+ env.the_cc_name = env.the_cc_name.replace("gcc", "g++")
956
+ else:
957
+ scons_logger.sysexit(
958
+ "Error, your gcc is too old for C11 support, and no related g++ to workaround that is found."
959
+ )
921
960
  else:
922
961
  scons_logger.sysexit(
923
- "Error, your gcc is too old for C11 support, and no related g++ to workaround that is found."
962
+ "Error, your gcc is too old for C11 support, install a newer one.",
963
+ mnemonic="too-old-gcc",
924
964
  )
925
965
 
926
966
 
@@ -929,6 +969,16 @@ def reportCCompiler(env, context, output_func):
929
969
 
930
970
  if env.the_cc_name == "cl":
931
971
  cc_output = "%s %s" % (env.the_cc_name, getMsvcVersionString(env))
972
+ elif isGccName(env.the_cc_name):
973
+ cc_output = "%s %s" % (
974
+ env.the_cc_name,
975
+ ".".join(str(d) for d in env.gcc_version),
976
+ )
977
+ elif isClangName(env.the_cc_name):
978
+ cc_output = "%s %s" % (
979
+ env.the_cc_name,
980
+ ".".join(str(d) for d in myDetectVersion(env, env.the_cc_name)),
981
+ )
932
982
  else:
933
983
  cc_output = env.the_cc_name
934
984
 
@@ -93,6 +93,7 @@ def _myDetectVersion(cc):
93
93
  command = (
94
94
  cc,
95
95
  "-dumpversion",
96
+ "-dumpfullversion",
96
97
  )
97
98
  else:
98
99
  command = (