def compileTree(main_module): source_dir = getSourceDirectoryPath(main_module) if not Options.shallOnlyExecCppCall(): # Now build the target language code for the whole tree. makeSourceDirectory( main_module = main_module ) if Options.isStandaloneMode(): for late_import in detectLateImports(): addFrozenModule(late_import) if getFrozenModuleCount(): frozen_code = generateBytecodeFrozenCode() writeSourceCode( filename = Utils.joinpath( source_dir, "__frozen.cpp" ), source_code = frozen_code ) writeBinaryData( filename = Utils.joinpath(source_dir, "__constants.bin"), binary_data = ConstantCodes.stream_data.getBytes() ) else: source_dir = getSourceDirectoryPath(main_module) if not Utils.isFile( Utils.joinpath(source_dir, "__helpers.hpp")): sys.exit("Error, no previous build directory exists.") if Options.isShowProgress(): Tracing.printLine( """Total memory usage before running scons: {memory}:""".format( memory = Utils.getHumanReadableProcessMemoryUsage() ) ) # Run the Scons to build things. result, options = runScons( main_module = main_module, quiet = not Options.isShowScons() ) return result, options
def runScons(main_module, quiet): # Scons gets transported many details, that we express as variables, and # have checks for them, leading to many branches, pylint: disable=R0912 python_version = "%d.%d" % ( sys.version_info[0], sys.version_info[1] ) if hasattr(sys, "abiflags"): # The Python3 for some platforms has sys.abiflags pylint: disable=E1101 if Options.isPythonDebug() or \ hasattr(sys, "getobjects"): if sys.abiflags.startswith("d"): python_version += sys.abiflags else: python_version += "d" + sys.abiflags else: python_version += sys.abiflags def asBoolStr(value): return "true" if value else "false" options = { "name" : Utils.basename( getTreeFilenameWithSuffix(main_module, "") ), "result_name" : getResultBasepath(main_module), "source_dir" : getSourceDirectoryPath(main_module), "debug_mode" : asBoolStr(Options.isDebug()), "python_debug" : asBoolStr(Options.isPythonDebug()), "unstriped_mode" : asBoolStr(Options.isUnstriped()), "module_mode" : asBoolStr(Options.shallMakeModule()), "optimize_mode" : asBoolStr(Options.isOptimize()), "full_compat" : asBoolStr(Options.isFullCompat()), "experimental" : asBoolStr(Options.isExperimental()), "python_version" : python_version, "target_arch" : Utils.getArchitecture(), "python_prefix" : sys.prefix, "nuitka_src" : SconsInterface.getSconsDataPath(), "module_count" : "%d" % ( len(ModuleRegistry.getDoneUserModules()) + 1 ) } # Ask Scons to cache on Windows, except where the directory is thrown # away. On non-Windows you can should use ccache instead. if not Options.isRemoveBuildDir() and Utils.getOS() == "Windows": options["cache_mode"] = "true" if Options.isLto(): options["lto_mode"] = "true" if Options.shallDisableConsoleWindow(): options["win_disable_console"] = "true" if Options.isStandaloneMode(): options["standalone_mode"] = "true" if getFrozenModuleCount(): options["frozen_modules"] = str( getFrozenModuleCount() ) if Options.isShowScons(): options["show_scons"] = "true" if Options.isMingw(): options["mingw_mode"] = "true" if Options.isClang(): options["clang_mode"] = "true" if Options.getIconPath(): options["icon_path"] = Options.getIconPath() return SconsInterface.runScons( options, quiet ), options