def _getAppImageToolPath(for_operation, assume_yes_for_downloads): """Return the path of appimagetool (for Linux). Will prompt the user to download if not already cached in AppData directory for Nuitka. """ arch_name = getArchitecture() # Mismatch between Debian arch name and appimage arch naming. if arch_name == "armv7l": arch_name = "armhf" appimagetool_url = ( "https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-%s.AppImage" % arch_name ) return getCachedDownload( url=appimagetool_url, is_arch_specific=True, binary=appimagetool_url.rsplit("/", 1)[1], flatten=True, specifity=appimagetool_url.rsplit("/", 2)[1], message="""\ Nuitka will make use of AppImage (https://appimage.org/) tool to combine Nuitka dist folder to onefile binary.""", reject="Nuitka does not work in --onefile on Linux without." if for_operation else None, assume_yes_for_downloads=assume_yes_for_downloads, )
def getDownloadedGccPath(target_arch, assume_yes_for_downloads): # Large URLs, pylint: disable=line-too-long if target_arch == "x86_64": url = "https://github.com/brechtsanders/winlibs_mingw/releases/download/10.2.0-11.0.0-8.0.0-r5/winlibs-x86_64-posix-seh-gcc-10.2.0-llvm-11.0.0-mingw-w64-8.0.0-r5.zip" binary = r"mingw64\bin\gcc.exe" else: url = "https://github.com/brechtsanders/winlibs_mingw/releases/download/10.2.0-11.0.0-8.0.0-r5/winlibs-i686-posix-dwarf-gcc-10.2.0-llvm-11.0.0-mingw-w64-8.0.0-r5.zip" binary = r"mingw32\bin\gcc.exe" gcc_binary = getCachedDownload( url=url, is_arch_specific=True, specifity=url.rsplit("/", 2)[1], binary=binary, flatten=False, message= "Nuitka will use gcc from MinGW64 of winlibs to compile on Windows.", reject="Only this specific gcc is supported with Nuitka.", assume_yes_for_downloads=assume_yes_for_downloads, ) return gcc_binary
def getAppImageToolPath(): """Return the path of appimagetool (for Linux). Will prompt the user to download if not already cached in AppData directory for Nuitka. """ appimagetool_url = ( "https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-%s.AppImage" % getArchitecture()) return getCachedDownload( url=appimagetool_url, is_arch_specific=True, binary=appimagetool_url.rsplit("/", 1)[1], flatten=True, specifity=appimagetool_url.rsplit("/", 2)[1], message="""\ Nuitka will make use of AppImage (https://appimage.org/) tool to combine Nuitka dist folder to onefile binary.""", reject="Nuitka does not work in --onefile on Linux without.", assume_yes_for_downloads=assumeYesForDownloads(), )
def getDependsExePath(): """Return the path of depends.exe (for Windows). Will prompt the user to download if not already cached in AppData directory for Nuitka. """ if getArchitecture() == "x86": depends_url = "https://dependencywalker.com/depends22_x86.zip" else: depends_url = "https://dependencywalker.com/depends22_x64.zip" return getCachedDownload( url=depends_url, is_arch_specific=getArchitecture(), binary="depends.exe", flatten=True, specificity="", # Note: If there ever was an update, put version here. message="""\ Nuitka will make use of Dependency Walker (https://dependencywalker.com) tool to analyze the dependencies of Python extension modules.""", reject="Nuitka does not work in --standalone or --onefile on Windows without.", assume_yes_for_downloads=assumeYesForDownloads(), )
def _injectCcache(the_compiler, cc_path, env, python_prefix, assume_yes_for_downloads): ccache_binary = os.environ.get("NUITKA_CCACHE_BINARY") # If not provided, search it in PATH and guessed directories. if ccache_binary is None: ccache_binary = getExecutablePath("ccache", env=env) if ccache_binary is None: for candidate in _getCcacheGuessedPaths(python_prefix): scons_details_logger.info( "Checking if ccache is at '%s' guessed path." % candidate ) if os.path.exists(candidate): ccache_binary = candidate scons_details_logger.info( "Using ccache '%s' from guessed path." % ccache_binary ) break if ccache_binary is None and os.name == "nt": url = "https://github.com/ccache/ccache/releases/download/v3.7.12/ccache-3.7.12-windows-32.zip" ccache_binary = getCachedDownload( url=url, is_arch_specific=False, specifity=url.rsplit("/", 2)[1], flatten=True, binary="ccache.exe", message="Nuitka will make use of ccache to speed up repeated compilation.", reject=None, assume_yes_for_downloads=assume_yes_for_downloads, ) else: scons_details_logger.info( "Using ccache '%s' from NUITKA_CCACHE_BINARY environment variable." % ccache_binary ) if ccache_binary is not None and os.path.exists(ccache_binary): # Make sure the # In case we are on Windows, make sure the Anaconda form runs outside of Anaconda # environment, by adding DLL folder to PATH. assert getExecutablePath(os.path.basename(the_compiler), env=env) == cc_path # We use absolute paths for CC, pass it like this, as ccache does not like absolute. env["CXX"] = env["CC"] = '"%s" "%s"' % (ccache_binary, cc_path) # Spare ccache the detection of the compiler, seems it will also misbehave when it's # prefixed with "ccache" on old gcc versions in terms of detecting need for C++ linkage. env["LINK"] = cc_path scons_details_logger.info( "Found ccache '%s' to cache C compilation result." % ccache_binary ) scons_details_logger.info( "Providing real CC path '%s' via PATH extension." % cc_path ) else: if isWin32Windows(): scons_logger.warning( "Didn't find ccache for C level caching, follow Nuitka user manual description." )
def _injectCcache(env, cc_path, python_prefix, target_arch, assume_yes_for_downloads): ccache_binary = os.environ.get("NUITKA_CCACHE_BINARY") # If not provided, search it in PATH and guessed directories. if ccache_binary is None: ccache_binary = getExecutablePath("ccache", env=env) if ccache_binary is None: for candidate in _getCcacheGuessedPaths(python_prefix): scons_details_logger.info( "Checking if ccache is at '%s' guessed path." % candidate) if os.path.exists(candidate): ccache_binary = candidate scons_details_logger.info( "Using ccache '%s' from guessed path." % ccache_binary) break if ccache_binary is None: if isWin32Windows(): url = "https://github.com/ccache/ccache/releases/download/v3.7.12/ccache-3.7.12-windows-32.zip" ccache_binary = getCachedDownload( url=url, is_arch_specific=False, specificity=url.rsplit("/", 2)[1], flatten=True, binary="ccache.exe", message= "Nuitka will make use of ccache to speed up repeated compilation.", reject=None, assume_yes_for_downloads=assume_yes_for_downloads, ) elif isMacOS(): # TODO: Do not yet have M1 access to create one and 10.14 is minimum # we managed to compile ccache for. if target_arch != "arm64" and tuple( int(d) for d in platform.release().split(".")) >= (18, 2): url = "https://nuitka.net/ccache/v4.2.1/ccache-4.2.1.zip" ccache_binary = getCachedDownload( url=url, is_arch_specific=False, specificity=url.rsplit("/", 2)[1], flatten=True, binary="ccache", message= "Nuitka will make use of ccache to speed up repeated compilation.", reject=None, assume_yes_for_downloads=assume_yes_for_downloads, ) else: scons_details_logger.info( "Using ccache '%s' from NUITKA_CCACHE_BINARY environment variable." % ccache_binary) if ccache_binary is not None and os.path.exists(ccache_binary): # Make sure the # In case we are on Windows, make sure the Anaconda form runs outside of Anaconda # environment, by adding DLL folder to PATH. assert areSamePaths( getExecutablePath(os.path.basename(env.the_compiler), env=env), cc_path) # We use absolute paths for CC, pass it like this, as ccache does not like absolute. env["CXX"] = env["CC"] = '"%s" "%s"' % (ccache_binary, cc_path) # Spare ccache the detection of the compiler, seems it will also misbehave when it's # prefixed with "ccache" on old gcc versions in terms of detecting need for C++ linkage. env["LINK"] = cc_path scons_details_logger.info( "Found ccache '%s' to cache C compilation result." % ccache_binary) scons_details_logger.info( "Providing real CC path '%s' via PATH extension." % cc_path)