def copyQmlFiles(self, full_name, target_plugin_dir): for plugin_dir in self.getQtPluginDirs(): qml_plugin_dir = os.path.normpath( os.path.join(plugin_dir, "..", "qml")) if os.path.exists(qml_plugin_dir): break else: self.sysexit("Error, no such Qt plugin family: qml") qml_target_dir = os.path.normpath( self._getQmlTargetDir(target_plugin_dir)) self.info("Copying Qt plug-ins 'qml' to '%s'." % (qml_target_dir)) copyTree(qml_plugin_dir, qml_target_dir) # We try to filter here, not for DLLs. return [( filename, os.path.join(qml_target_dir, os.path.relpath(filename, qml_plugin_dir)), full_name, ) for filename in getFileList(qml_plugin_dir) if not filename.endswith(( ".qml", ".qmlc", ".qmltypes", ".js", ".jsc", ".png", ".ttf", ".metainfo", )) if not os.path.isdir(filename) if not os.path.basename(filename) == "qmldir"]
def considerExtraDlls(self, dist_dir, module): """ Copy sklearn.datasets folders to the dist folder. Notes: Args: dist_dir: the name of the program's dist folder module: the module object (not used here) Returns: None """ if self.files_copied: return () if not module.getFullName() == "sklearn.datasets": return () self.files_copied = True sklearn_dir = get_module_file_attribute("sklearn") source_data = os.path.join(sklearn_dir, "datasets", "data") target_data = os.path.join(dist_dir, "sklearn", "datasets", "data") source_descr = os.path.join(sklearn_dir, "datasets", "descr") target_descr = os.path.join(dist_dir, "sklearn", "datasets", "descr") info("") info(" Copying folder sklearn/datasets/data") copyTree(source_data, target_data) info(" Copying folder sklearn/datasets/descr") copyTree(source_descr, target_descr) return ()
def copyQmlFiles(self, target_plugin_dir): qml_plugin_dir = self._getQmlDirectory() qml_target_dir = os.path.normpath(self._getQmlTargetDir(target_plugin_dir)) self.info("Copying Qt plug-ins 'qml' to '%s'." % (qml_target_dir)) copyTree(qml_plugin_dir, qml_target_dir) # We try to filter here, for the DLLs. return [ ( filename, os.path.join(qml_target_dir, os.path.relpath(filename, qml_plugin_dir)), self.binding_name, ) for filename in self._getQmlFileList(dlls=True) ]
def _handleDataFile(dist_dir, tracer, included_datafile): """Handle a data file.""" if isinstance(included_datafile, IncludedDataFile): if included_datafile.kind == "empty_dirs": tracer.info("Included empty directories %s due to %s." % ( ",".join(included_datafile.dest_path), included_datafile.reason, )) for sub_dir in included_datafile.dest_path: makePath(os.path.join(dist_dir, sub_dir)) elif included_datafile.kind == "data_file": dest_path = os.path.join(dist_dir, included_datafile.dest_path) tracer.info("Included data file %r due to %s." % ( included_datafile.dest_path, included_datafile.reason, )) makePath(os.path.dirname(dest_path)) shutil.copyfile(included_datafile.source_path, dest_path) elif included_datafile.kind == "data_dir": dest_path = os.path.join(dist_dir, included_datafile.dest_path) makePath(os.path.dirname(dest_path)) copied = copyTree(included_datafile.source_path, dest_path) tracer.info("Included data dir %r with %d files due to %s." % ( included_datafile.dest_path, len(copied), included_datafile.reason, )) else: assert False, included_datafile else: # TODO: Goal is have this unused. source_desc, target_filename = included_datafile if not isPathBelow(dist_dir, target_filename): target_filename = os.path.join(dist_dir, target_filename) makePath(os.path.dirname(target_filename)) if inspect.isfunction(source_desc): content = source_desc(target_filename) if content is not None: # support creation of empty directories with open(target_filename, "wb" if type(content) is bytes else "w") as output: output.write(content) else: copyFileWithPermissions(source_desc, target_filename)
def main(): python_version = setup() os.chdir("subject") nuitka_main_path = os.path.join("..", "..", "..", "bin", "nuitka") tmp_dir = getTempDir() command = [ os.environ["PYTHON"], nuitka_main_path, "--plugin-enable=pylint-warnings", "--output-dir=%s" % tmp_dir, "--follow-imports", "--include-package=package", "--nofollow-import-to=*.tests", "--python-flag=-v", "--debug", "--module", "package", ] result = subprocess.call(command) if result != 0: sys.exit(result) os.makedirs(os.path.join(tmp_dir, "package.ext")) copyTree("package", os.path.join(tmp_dir, "package.ext/package")) os.chdir(tmp_dir) # We compile the package non-closed, so we can smuggle in tests # and user code. This is going to be the example code. with open("package.ext/package/user_provided.py", "w") as output: # TODO: Maybe assert that the type name of a local function and one from # the package are not the same, i.e. we are running inside the compiled # package. output.write(""" from __future__ import print_function import package print("__name__:", package.__name__) print("__package__:", package.__package__) print("__path__:", package.__path__) print("__file__:", package.__file__) # print("__loader__:", package.__loader__) import package.sub_package1 print("__name__:", package.sub_package1.__name__) print("__package__:", package.sub_package1.__package__) print("__path__:", package.sub_package1.__path__) print("__file__:", package.sub_package1.__file__) # print("__loader__:", package.sub_package1.__loader__) import package.sub_package1.tests; print("__name__:", package.sub_package1.tests.__name__) print("__package__:", package.sub_package1.tests.__package__) print("__path__:", package.sub_package1.tests.__path__) print("__file__:", package.sub_package1.tests.__file__) # print("__loader__:", package.sub_package1.tests.__loader__) """) os.makedirs("nose") with open("nose/usage.txt", "w") as output: pass os.system("find | sort") # Inform about the extra path, format is NUITKA_PACKAGE_fullname where # dots become "_" and should point to the directory where external code # to be loaded will live under. Probably should be an absolute path, but # we avoid it here. os.environ["NUITKA_PACKAGE_package"] = "./package.ext/package" # Lets make sure these to not work. These will be used in the compiled # form only. for module_path in ("__init__.py", "sub_package1__init__.py"): with open(os.path.join("./package.ext/package", module_path), "w") as output: output.write("assert False") # Check the compiled package is functional for importing. my_print("Running package as basic test:") command = [os.environ["PYTHON"], "-c", "import package"] result = subprocess.call(command) if result != 0: sys.exit(result) my_print("Running nose tests:") # assert os.system(os.environ["PYTHON"] + " -m nose --first-package-wins -s package.sub_package1.tests" ) == 0 my_print("Running py.test tests:") command = [ os.environ["PYTHON"], "-m", "pytest", "-v", "--pyargs", "package.sub_package1.tests", ] result = subprocess.call(command) if result != 0: sys.exit(result)
def considerExtraDlls(self, dist_dir, module): # pylint: disable=too-many-branches,too-many-locals,too-many-statements full_name = module.getFullName() elements = full_name.split(".") plugin_dirs = None if elements[0] in ("PyQt4", "PyQt5"): qt_version = int(elements[0][-1]) plugin_dirs = self.getPyQtPluginDirs(qt_version) if full_name in ("PyQt4", "PyQt5"): if not plugin_dirs: sys.exit("Error, failed to detect %s plugin directories." % full_name) target_plugin_dir = os.path.join(dist_dir, full_name, "qt-plugins") plugin_options = set(self.qt_plugins.split(",")) if "sensible" in plugin_options: # Most used ones with low dependencies. plugin_options.update( tuple( family for family in ( "imageformats", "iconengines", "mediaservice", "printsupport", "platforms", ) if self.hasPluginFamily(plugin_dirs, family) ) ) plugin_options.remove("sensible") # Make sure the above didn't detect nothing, which would be # indicating the check to be bad. assert plugin_options self.info( "Copying Qt plug-ins '%s' to '%s'." % ( ",".join(sorted(x for x in plugin_options if x != "xml")), target_plugin_dir, ) ) for plugin_dir in plugin_dirs: copyTree(plugin_dir, target_plugin_dir) if "all" not in plugin_options: for plugin_candidate in getSubDirectories(target_plugin_dir): if os.path.basename(plugin_candidate) not in plugin_options: removeDirectory(plugin_candidate, ignore_errors=False) for plugin_candidate in plugin_options: if plugin_candidate == "qml": continue if not os.path.isdir( os.path.join(target_plugin_dir, plugin_candidate) ): sys.exit( "Error, no such Qt plugin family: %s" % plugin_candidate ) result = [ ( filename, os.path.join( target_plugin_dir, os.path.relpath(filename, plugin_dir) ), full_name, ) for plugin_dir in plugin_dirs for filename in getFileList(plugin_dir) if not filename.endswith(".qml") if os.path.exists( os.path.join( target_plugin_dir, os.path.relpath(filename, plugin_dir) ) ) ] if isWin32Windows(): # Those 2 vars will be used later, just saving some resources # by caching the files list qt_bin_files = sum( ( getFileList(qt_bin_dir) for qt_bin_dir in self._getQtBinDirs(plugin_dirs) ), [], ) self.info("Copying OpenSSL DLLs to %r." % dist_dir) for filename in qt_bin_files: basename = os.path.basename(filename).lower() if basename in ("libeay32.dll", "ssleay32.dll"): shutil.copy(filename, os.path.join(dist_dir, basename)) if "qml" in plugin_options or "all" in plugin_options: for plugin_dir in plugin_dirs: qml_plugin_dir = os.path.normpath( os.path.join(plugin_dir, "..", "qml") ) if os.path.exists(qml_plugin_dir): break else: sys.exit("Error, no such Qt plugin family: qml") qml_target_dir = os.path.normpath( os.path.join(target_plugin_dir, "..", "Qt", "qml") ) self.info("Copying Qt plug-ins 'xml' to '%s'." % (qml_target_dir)) copyTree(qml_plugin_dir, qml_target_dir) # We try to filter here, not for DLLs. result += [ ( filename, os.path.join( qml_target_dir, os.path.relpath(filename, qml_plugin_dir) ), full_name, ) for filename in getFileList(qml_plugin_dir) if not filename.endswith( ( ".qml", ".qmlc", ".qmltypes", ".js", ".jsc", ".png", ".ttf", ".metainfo", ) ) if not os.path.isdir(filename) if not os.path.basename(filename) == "qmldir" ] # Also copy required OpenGL DLLs on Windows if isWin32Windows(): opengl_dlls = ("libegl.dll", "libglesv2.dll", "opengl32sw.dll") self.info("Copying OpenGL DLLs to %r." % dist_dir) for filename in qt_bin_files: basename = os.path.basename(filename).lower() if basename in opengl_dlls or basename.startswith( "d3dcompiler_" ): shutil.copy(filename, os.path.join(dist_dir, basename)) return result elif full_name == "PyQt5.QtNetwork": if not isWin32Windows(): dll_path = locateDLL("crypto") if dll_path is None: dist_dll_path = os.path.join(dist_dir, os.path.basename(dll_path)) shutil.copy(dll_path, dist_dll_path) dll_path = locateDLL("ssl") if dll_path is not None: dist_dll_path = os.path.join(dist_dir, os.path.basename(dll_path)) shutil.copy(dll_path, dist_dll_path) elif ( full_name.startswith(("PyQt4.QtWebEngine", "PyQt5.QtWebEngine")) and not self.webengine_done ): self.webengine_done = True # prevent multiple copies self.info("Copying QtWebEngine components") plugin_parent = os.path.dirname(plugin_dirs[0]) if isWin32Windows(): bin_dir = os.path.join(plugin_parent, "bin") else: # TODO verify this for non-Windows! bin_dir = os.path.join(plugin_parent, "libexec") target_bin_dir = os.path.join(dist_dir) for f in os.listdir(bin_dir): if f.startswith("QtWebEngineProcess"): shutil.copy(os.path.join(bin_dir, f), target_bin_dir) resources_dir = os.path.join(plugin_parent, "resources") target_resources_dir = os.path.join(dist_dir) for f in os.listdir(resources_dir): shutil.copy(os.path.join(resources_dir, f), target_resources_dir) translations_dir = os.path.join(plugin_parent, "translations") pos = len(translations_dir) + 1 target_translations_dir = os.path.join( dist_dir, elements[0], "Qt", "translations" ) for f in getFileList(translations_dir): tar_f = os.path.join(target_translations_dir, f[pos:]) makePath(os.path.dirname(tar_f)) shutil.copyfile(f, tar_f) return ()
def _build(self, build_lib): # High complexity, pylint: disable=too-many-branches,too-many-locals # Nuitka wants the main package by filename, probably we should stop # needing that. from nuitka.__past__ import ( # pylint: disable=I0021,redefined-builtin Iterable, unicode, ) from nuitka.importing.Importing import ( findModule, setMainScriptDirectory, ) from nuitka.utils.ModuleNames import ModuleName old_dir = os.getcwd() os.chdir(build_lib) # Search in the build directory preferably. setMainScriptDirectory(".") to_builds = self._find_to_build() for to_build in to_builds: package, main_filename, finding = findModule( importing=None, module_name=ModuleName(to_build.module_name), parent_package=None, level=0, warn=False, ) # Check expectations, e.g. do not compile built-in modules. assert finding == "absolute", finding if package is not None: output_dir = os.path.join(build_lib, package) else: output_dir = build_lib command = [ sys.executable, "-m", "nuitka", "--module", "--plugin-enable=pylint-warnings", "--output-dir=%s" % output_dir, "--nofollow-import-to=*.tests", "--show-modules", "--remove-output", ] if type(to_build) is PyPackage: command += ("--include-package=%s" % package_name.replace("/", ".") for package_name in to_build.related_packages) else: # type(to_build) is PyModule command += ("--include-module=%s" % module_name for module_name in to_build.related_modules) # Process any extra options from setuptools if "nuitka" in self.distribution.command_options: for option, value in self.distribution.command_options[ "nuitka"].items(): option = "--" + option.lstrip("-") if value is None: command.append(option) elif isinstance(value, bool): option = "--" + ("no" if not value else "") + option.lstrip("-") command.append(option) elif isinstance(value, Iterable) and not isinstance( value, (unicode, bytes, str)): for val in value: command.append("%s=%s" % (option, val)) else: command.append("%s=%s" % (option, value)) command.append(main_filename) # added for clarity my_print("Building: %s" % to_build, style="yellow") check_call(command, cwd=build_lib) for root, _, filenames in os.walk(build_lib): for filename in filenames: fullpath = os.path.join(root, filename) if fullpath.lower().endswith( (".py", ".pyw", ".pyc", ".pyo")): os.unlink(fullpath) # If the Python module has more than one parent package (e.g. # 'a.b.mod'), the compiled module will be in 'a.b/mod.so'. Move it # to 'a/b/mod.so', to make imports work. if package and "." in package: compiled_package_path = os.path.join(build_lib, package) assert os.path.isdir( compiled_package_path), compiled_package_path parts = package.split(".") fixed_package_path = os.path.join(build_lib, *parts) copyTree(compiled_package_path, fixed_package_path) removeDirectory(compiled_package_path, ignore_errors=False) os.chdir(old_dir) self.build_lib = build_lib
def executePASS1(): my_print("PASS 1: Compiling from compiler running from .py files.") base_dir = os.path.join("..", "..") for package in PACKAGE_LIST: package = package.replace("/", os.path.sep) source_dir = os.path.join(base_dir, package) target_dir = package removeDirectory(path=target_dir, ignore_errors=False) os.mkdir(target_dir) for path, filename in listDir(target_dir): if filename.endswith(".so"): os.unlink(path) for path, filename in listDir(source_dir): if not filename.endswith(".py"): continue if filename.startswith(".#"): continue if filename != "__init__.py": my_print("Compiling '%s'." % path) command = [ os.environ["PYTHON"], nuitka_main_path, "--module", "--plugin-enable=pylint-warnings", "--output-dir=%s" % target_dir, "--no-pyi-file", path, ] command += os.environ.get("NUITKA_EXTRA_OPTIONS", "").split() result = subprocess.call(command) if result != 0: sys.exit(result) else: shutil.copyfile(path, os.path.join(target_dir, filename)) my_print("Compiling '%s'." % nuitka_main_path) shutil.copyfile(nuitka_main_path, "nuitka-runner.py") command = [ os.environ["PYTHON"], nuitka_main_path, "--nofollow-imports", "--plugin-enable=pylint-warnings", "--output-dir=.", "--python-flag=-S", "nuitka-runner.py", ] command += os.environ.get("NUITKA_EXTRA_OPTIONS", "").split() my_print("Command: ", " ".join(command)) result = subprocess.call(command) if result != 0: sys.exit(result) shutil.move("nuitka-runner" + exe_suffix, "nuitka" + exe_suffix) scons_inline_copy_path = os.path.join(base_dir, "nuitka", "build", "inline_copy") if os.path.exists(scons_inline_copy_path): copyTree(scons_inline_copy_path, os.path.join("nuitka", "build", "inline_copy")) shutil.copyfile( os.path.join(base_dir, "nuitka", "build", "SingleExe.scons"), os.path.join("nuitka", "build", "SingleExe.scons"), ) copyTree( os.path.join(base_dir, "nuitka", "build", "static_src"), os.path.join("nuitka", "build", "static_src"), ) copyTree( os.path.join(base_dir, "nuitka", "build", "include"), os.path.join("nuitka", "build", "include"), )
def considerExtraDlls(self, dist_dir, module): # pylint: disable=too-many-branches,too-many-locals,too-many-statements full_name = module.getFullName() if full_name == self.binding_name: if not self.getQtPluginDirs(): self.sysexit( "Error, failed to detect %r plugin directories." % self.binding_name ) target_plugin_dir = os.path.join(dist_dir, full_name.asPath(), "qt-plugins") self.info( "Copying Qt plug-ins '%s' to '%s'." % ( ",".join( sorted(x for x in self.getQtPluginsSelected() if x != "xml") ), target_plugin_dir, ) ) # TODO: Change this to filtering copyTree while it's doing it. for plugin_dir in self.getQtPluginDirs(): copyTree(plugin_dir, target_plugin_dir) if "all" not in self.getQtPluginsSelected(): for plugin_candidate in getSubDirectories(target_plugin_dir): if ( os.path.basename(plugin_candidate) not in self.getQtPluginsSelected() ): removeDirectory(plugin_candidate, ignore_errors=False) for plugin_candidate in self.getQtPluginsSelected(): if plugin_candidate == "qml": continue if not os.path.isdir( os.path.join(target_plugin_dir, plugin_candidate) ): self.sysexit( "Error, no such Qt plugin family: %s" % plugin_candidate ) result = self.findDLLs( full_name=full_name, target_plugin_dir=target_plugin_dir, ) if isWin32Windows(): # Those 2 vars will be used later, just saving some resources # by caching the files list qt_bin_files = sum( (getFileList(qt_bin_dir) for qt_bin_dir in self._getQtBinDirs()), [], ) self.info("Copying OpenSSL DLLs to %r." % dist_dir) for filename in qt_bin_files: basename = os.path.basename(filename).lower() if basename in ("libeay32.dll", "ssleay32.dll"): shutil.copy(filename, os.path.join(dist_dir, basename)) if ( "qml" in self.getQtPluginsSelected() or "all" in self.getQtPluginsSelected() ): result += self.copyQmlFiles( full_name=full_name, target_plugin_dir=target_plugin_dir, ) # Also copy required OpenGL DLLs on Windows if isWin32Windows(): opengl_dlls = ("libegl.dll", "libglesv2.dll", "opengl32sw.dll") self.info("Copying OpenGL DLLs to %r." % dist_dir) for filename in qt_bin_files: basename = os.path.basename(filename).lower() if basename in opengl_dlls or basename.startswith( "d3dcompiler_" ): shutil.copy(filename, os.path.join(dist_dir, basename)) return result elif full_name == self.binding_name + ".QtNetwork": if not isWin32Windows(): dll_path = locateDLL("crypto") if dll_path is not None: dist_dll_path = os.path.join(dist_dir, os.path.basename(dll_path)) shutil.copy(dll_path, dist_dll_path) dll_path = locateDLL("ssl") if dll_path is not None: dist_dll_path = os.path.join(dist_dir, os.path.basename(dll_path)) shutil.copy(dll_path, dist_dll_path) elif ( full_name in ( self.binding_name + ".QtWebEngine", self.binding_name + ".QtWebEngineCore", self.binding_name + ".QtWebEngineWidgets", ) and not self.webengine_done ): self.webengine_done = True # prevent multiple copies self.info("Copying QtWebEngine components") plugin_parent = os.path.dirname(self.getQtPluginDirs()[0]) if isWin32Windows(): bin_dir = os.path.join(plugin_parent, "bin") else: # TODO verify this for non-Windows! bin_dir = os.path.join(plugin_parent, "libexec") target_bin_dir = os.path.join(dist_dir) for f in os.listdir(bin_dir): if f.startswith("QtWebEngineProcess"): shutil.copy(os.path.join(bin_dir, f), target_bin_dir) resources_dir = os.path.join(plugin_parent, "resources") target_resources_dir = os.path.join(dist_dir) for f in os.listdir(resources_dir): shutil.copy(os.path.join(resources_dir, f), target_resources_dir) translations_dir = os.path.join(plugin_parent, "translations") pos = len(translations_dir) + 1 target_translations_dir = os.path.join( dist_dir, full_name.getTopLevelPackageName().asPath(), "Qt", "translations", ) for f in getFileList(translations_dir): tar_f = os.path.join(target_translations_dir, f[pos:]) makePath(os.path.dirname(tar_f)) shutil.copyfile(f, tar_f) return ()
def considerExtraDlls(self, dist_dir, module): """ Copy TCL libraries to the dist folder. Notes: We will copy the TCL/TK directories to the program's root directory. The general intention is that we return a tuple of file names. We need however two subdirectories inserted, and therefore do the copy ourselves and return an empty tuple. Args: dist_dir: the name of the program's dist folder module: the module object (not used here) Returns: None """ if not _isTkInterModule(module): return () if self.files_copied: return () self.files_copied = True # Check typical locations of the dirs candidates_tcl = ( os.environ.get("TCL_LIBRARY"), os.path.join(sys.prefix, "tcl", "tcl8.5"), os.path.join(sys.prefix, "tcl", "tcl8.6"), "/usr/share/tcltk/tcl8.6", "/usr/share/tcltk/tcl8.5", "/usr/share/tcl8.6", "/usr/share/tcl8.5", "/usr/lib64/tcl/tcl8.5", "/usr/lib64/tcl/tcl8.6", ) candidates_tk = ( os.environ.get("TK_LIBRARY"), os.path.join(sys.prefix, "tcl", "tk8.5"), os.path.join(sys.prefix, "tcl", "tk8.6"), "/usr/share/tcltk/tk8.6", "/usr/share/tcltk/tk8.5", "/usr/share/tk8.6", "/usr/share/tk8.5", "/usr/lib64/tcl/tk8.5", "/usr/lib64/tcl/tk8.6", ) tcl = self.tcl_library_dir if tcl is None: for tcl in candidates_tcl: if tcl is not None and os.path.exists(tcl): break if tcl is None or not os.path.exists(tcl): sys.exit("Could not find Tcl. Aborting standalone generation.") tk = self.tk_library_dir if tk is None: for tk in candidates_tk: if tk is not None and os.path.exists(tk): break if tk is None or not os.path.exists(tcl): sys.exit("Could not find Tk. Aborting standalone generation.") # survived the above, now do the copying to following locations target_tk = os.path.join(dist_dir, "tk") target_tcl = os.path.join(dist_dir, "tcl") copyTree(tk, target_tk) self.info("Copied Tk libraries from %s." % tk) # just to entertain # Definitely don't need the demos, so remove them again. # TODO: Anything else? shutil.rmtree(os.path.join(target_tk, "demos"), ignore_errors=True) copyTree(tcl, target_tcl) self.info("Copied TCL libraries from %s." % tcl) # just to entertain return ()
def considerExtraDlls(self, dist_dir, module): # pylint: disable=too-many-branches,too-many-locals full_name = module.getFullName() if full_name in ("PyQt4", "PyQt5"): qt_version = int(full_name[-1]) plugin_dirs = self.getPyQtPluginDirs(qt_version) if not plugin_dirs: sys.exit("Error, failed to detect %s plugin directories." % full_name) target_plugin_dir = os.path.join(dist_dir, full_name, "qt-plugins") plugin_options = self.getPluginOptions() plugin_options = set(plugin_options) # Default to using sensible plugins. if not plugin_options: plugin_options.add("sensible") if "sensible" in plugin_options: # Most used ones with low dependencies. plugin_options.update( tuple( family for family in ( "imageformats", "iconengines", "mediaservice", "printsupport", "platforms", ) if self.hasPluginFamily(plugin_dirs, family) ) ) plugin_options.remove("sensible") # Make sure the above didn't detect nothing, which would be # indicating the check to be bad. assert plugin_options info( "Copying Qt plug-ins '%s' to '%s'." % ( ",".join(sorted(x for x in plugin_options if x != "xml")), target_plugin_dir, ) ) for plugin_dir in plugin_dirs: copyTree(plugin_dir, target_plugin_dir) if "all" not in plugin_options: for plugin_candidate in getSubDirectories(target_plugin_dir): if os.path.basename(plugin_candidate) not in plugin_options: removeDirectory(plugin_candidate, ignore_errors=False) for plugin_candidate in plugin_options: if plugin_candidate == "qml": continue if not os.path.isdir( os.path.join(target_plugin_dir, plugin_candidate) ): sys.exit( "Error, no such Qt plugin family: %s" % plugin_candidate ) result = [ ( filename, os.path.join( target_plugin_dir, os.path.relpath(filename, plugin_dir) ), full_name, ) for plugin_dir in plugin_dirs for filename in getFileList(plugin_dir) if not filename.endswith(".qml") if os.path.exists( os.path.join( target_plugin_dir, os.path.relpath(filename, plugin_dir) ) ) ] if isWin32Windows(): # Those 2 vars will be used later, just saving some resources # by caching the files list qt_bin_files = sum( ( getFileList(qt_bin_dir) for qt_bin_dir in self._getQtBinDirs(plugin_dirs) ), [], ) info("Copying OpenSSL DLLs to %r" % (dist_dir,)) for filename in qt_bin_files: basename = os.path.basename(filename).lower() if basename in ("libeay32.dll", "ssleay32.dll"): shutil.copy(filename, os.path.join(dist_dir, basename)) if "qml" in plugin_options or "all" in plugin_options: for plugin_dir in plugin_dirs: qml_plugin_dir = os.path.normpath( os.path.join(plugin_dir, "..", "qml") ) if os.path.exists(qml_plugin_dir): break else: sys.exit("Error, no such Qt plugin family: qml") qml_target_dir = os.path.normpath( os.path.join(target_plugin_dir, "..", "Qt", "qml") ) info("Copying Qt plug-ins 'xml' to '%s'." % (qml_target_dir)) copyTree(qml_plugin_dir, qml_target_dir) # We try to filter here, not for DLLs. result += [ ( filename, os.path.join( qml_target_dir, os.path.relpath(filename, qml_plugin_dir) ), full_name, ) for filename in getFileList(qml_plugin_dir) if not filename.endswith( ( ".qml", ".qmlc", ".qmltypes", ".js", ".jsc", ".png", ".ttf", ".metainfo", ) ) if not os.path.isdir(filename) if not os.path.basename(filename) == "qmldir" ] # Also copy required OpenGL DLLs on Windows if isWin32Windows(): opengl_dlls = ("libegl.dll", "libglesv2.dll", "opengl32sw.dll") info("Copying OpenGL DLLs to %r" % (dist_dir,)) for filename in qt_bin_files: basename = os.path.basename(filename).lower() if basename in opengl_dlls or basename.startswith( "d3dcompiler_" ): shutil.copy(filename, os.path.join(dist_dir, basename)) return result return ()
def considerExtraDlls(self, dist_dir, module): """ Copy TCL libraries to the dist folder. Notes: We will copy the TCL/TK directories to the program's root directory. The general intention is that we return a tuple of file names. We need however two subdirectories inserted, and therefore do the copy ourselves and return an empty tuple. Args: dist_dir: the name of the program's dist folder module: the module object (not used here) Returns: None """ if not _isTkInterModule(module): return () if self.files_copied: return () self.files_copied = True if not isWin32Windows(): # if not Windows notify wrong usage once info("tkinter plugin supported on Windows only") return () if python_version < 340: # last tk/tcl qualifyers Py 2 tk_lq = "tk8.5" tcl_lq = "tcl8.5" else: # last tk/tcl qualifyers Py 3+ tk_lq = "tk8.6" tcl_lq = "tcl8.6" # check possible locations of the dirs sys_tcl = os.path.join(os.path.dirname(sys.executable), "tcl") tk = os.path.join(sys_tcl, tk_lq) tcl = os.path.join(sys_tcl, tcl_lq) # if this was not the right place, try this: if not (os.path.exists(tk) and os.path.exists(tcl)): tk = os.environ.get("TK_LIBRARY", None) tcl = os.environ.get("TCL_LIBRARY", None) if not (tk and tcl): info(" Could not find TK / TCL libraries") sys.exit("aborting standalone generation.") # survived the above, now do the copying to following locations tar_tk = os.path.join(dist_dir, "tk") tar_tcl = os.path.join(dist_dir, "tcl") info(" Now copying tk libraries from %r." % tk) # just to entertain copyTree(tk, tar_tk) info(" Now copying tkinter libraries from %r." % tcl) # just to entertain copyTree(tcl, tar_tcl) # Definitely don't need the demos, so remove them again. # TODO: Anything else? shutil.rmtree(os.path.join(tar_tk, "demos"), ignore_errors=True) return ()
def executePASS1(): test_logger.info( "PASS 1: Compiling to many compiled modules from compiler running from .py files." ) base_dir = os.path.join("..", "..") for package in PACKAGE_LIST: package = package.replace("/", os.path.sep) source_dir = os.path.join(base_dir, package) target_dir = package removeDirectory(path=target_dir, ignore_errors=False) os.mkdir(target_dir) for path, filename in listDir(target_dir): if filename.endswith((".so", ".dylib")): os.unlink(path) for path, filename in listDir(source_dir): if not filename.endswith(".py"): continue if filename.startswith(".#"): continue if filename != "__init__.py": _traceCompilation(path=path, pass_number=1) command = [ os.environ["PYTHON"], nuitka_main_path, "--module", "--nofollow-imports", "--output-dir=%s" % target_dir, "--no-pyi-file", path, ] command += os.environ.get("NUITKA_EXTRA_OPTIONS", "").split() my_print("Command: ", " ".join(command)) result = subprocess.call(command) if result != 0: sys.exit(result) else: shutil.copyfile(path, os.path.join(target_dir, filename)) _traceCompilation(path=nuitka_main_path, pass_number=1) shutil.copyfile(nuitka_main_path, "nuitka-runner.py") command = [ os.environ["PYTHON"], nuitka_main_path, "--nofollow-imports", "--plugin-enable=pylint-warnings", "--output-dir=.", "--python-flag=-S", "nuitka-runner.py", ] command += os.environ.get("NUITKA_EXTRA_OPTIONS", "").split() my_print("Command: ", " ".join(command)) result = subprocess.call(command) if result != 0: sys.exit(result) shutil.move("nuitka-runner" + exe_suffix, "nuitka" + exe_suffix) scons_inline_copy_path = os.path.join(base_dir, "nuitka", "build", "inline_copy") if os.path.exists(scons_inline_copy_path): copyTree(scons_inline_copy_path, os.path.join("nuitka", "build", "inline_copy")) # Copy required data files. for filename in ( "nuitka/build/Backend.scons", "nuitka/plugins/standard/anti-bloat.yml", "nuitka/plugins/standard/implicit-imports.yml", "nuitka/plugins/standard/data-files.yml", ): shutil.copyfile( os.path.join(base_dir, filename), filename, ) copyTree( os.path.join(base_dir, "nuitka", "codegen", "templates_c"), os.path.join("nuitka", "codegen", "templates_c"), ) copyTree( os.path.join(base_dir, "nuitka", "build", "static_src"), os.path.join("nuitka", "build", "static_src"), ) copyTree( os.path.join(base_dir, "nuitka", "build", "include"), os.path.join("nuitka", "build", "include"), ) # The data composer tool, use it by source. copyTree( os.path.join(base_dir, "nuitka", "tools"), os.path.join("nuitka", "tools"), ) test_logger.info("OK.")
def considerExtraDlls(self, dist_dir, module): """ Copy extra shared libraries or data for this installation. Args: dist_dir: the name of the program's dist folder module: module object Returns: empty tuple """ # pylint: disable=too-many-branches,too-many-locals,too-many-return-statements,too-many-statements full_name = module.getFullName() if full_name not in ("numpy", "scipy", "matplotlib", "sklearn.datasets"): return () if full_name == "numpy": if self.numpy_copied: return () self.numpy_copied = True binaries = get_numpy_core_binaries() bin_total = len(binaries) # anything there at all? if bin_total == 0: return () for f in binaries: bin_file, idx = f # (filename, pos. prefix + 1) back_end = bin_file[idx:] tar_file = os.path.join(dist_dir, back_end) makePath( # create any missing intermediate folders os.path.dirname(tar_file)) shutil.copyfile(bin_file, tar_file) msg = "Copied %i %s from 'numpy' installation." % ( bin_total, "file" if bin_total < 2 else "files", ) info(msg) return () if full_name == "scipy": if self.scipy_copied: return () self.scipy_copied = True if not self.getPluginOptionBool("scipy", False): return () binaries = get_scipy_core_binaries() bin_total = len(binaries) if bin_total == 0: return () for f in binaries: bin_file, idx = f # (filename, pos. prefix + 1) back_end = bin_file[idx:] tar_file = os.path.join(dist_dir, back_end) makePath( # create any missing intermediate folders os.path.dirname(tar_file)) shutil.copyfile(bin_file, tar_file) msg = "Copied %i %s from 'scipy' installation." % ( bin_total, "file" if bin_total < 2 else "files", ) info(msg) return () if full_name == "matplotlib": if self.mpl_copied: return () self.mpl_copied = True if not self.getPluginOptionBool("matplotlib", False): return () mpl_data = get_matplotlib_data() if not mpl_data: warning("'mpl-data' folder not found in matplotlib.") return () mpl_data, idx = mpl_data # (folder, pos. of 'matplotlib') back_end = mpl_data[idx:] tar_dir = os.path.join(dist_dir, back_end) copyTree(mpl_data, tar_dir) msg = "Copied 'mpl-data' from 'matplotlib' installation." info(msg) return () if full_name == "sklearn.datasets": if self.sklearn_copied: return () self.sklearn_copied = True if not self.getPluginOptionBool("sklearn", False): return () sklearn_dir = os.path.dirname(get_module_file_attribute("sklearn")) source_data = os.path.join(sklearn_dir, "datasets", "data") target_data = os.path.join(dist_dir, "sklearn", "datasets", "data") source_descr = os.path.join(sklearn_dir, "datasets", "descr") target_descr = os.path.join(dist_dir, "sklearn", "datasets", "descr") copyTree(source_data, target_data) info("Copied folder sklearn/datasets/data") copyTree(source_descr, target_descr) info("Copied folder sklearn/datasets/descr") return ()