def test_icon(): f = bbfreeze.Freezer() f.addScript("ex-mbox.py", False) f.setIcon('python.ico') f() err = os.system("dist\\ex-mbox") assert err == 0
def test_guiscript2(): f = bbfreeze.Freezer() f.addScript("hello-world.py", True) f() cmd = os.path.join("dist", "hello-world") err = os.system(cmd) assert err == 0
def recipe_gtk_override(mf): # Override bbfreeze function so that it includes all gtk libraries # in the installer so users don't require a separate GTK+ installation. return True bbfreeze.recipes.recipe_gtk_and_friends = recipe_gtk_override # Workaround for "ImportError: The 'packaging' package is required" with setuptools > 18.8. # (https://github.com/pypa/setuptools/issues/517) bbfreeze.recipes.recipe_pkg_resources = bbfreeze.recipes.include_whole_package( 'pkg_resources') fzr = bbfreeze.Freezer(build_dir, includes=includes, excludes=excludes) fzr.include_py = False fzr.setIcon( os.path.join(os.path.dirname(deluge.common.__file__), 'ui', 'data', 'pixmaps', 'deluge.ico')) # TODO: Can/should we grab the script list from setup.py entry_points somehow. # Hide cmd console popup for these console entries force gui_script True. force_gui = ['deluge-web', 'deluged'] for force_script in force_gui: script_path = os.path.join(python_path, 'Scripts', force_script + '-script.py') shutil.copy(script_path, script_path.replace('script', 'debug-script'))
def test_guiscript(): f = bbfreeze.Freezer() f.addScript("ex-mbox.py", True) f() err = os.system("dist\\ex-mbox") assert err == 0
def freeze(dist): """Freeze the given distribution data using bbfreeze.""" includes = dist.includes excludes = dist.excludes options = dist.freezer_options # Merge in any encludes/excludes given in freezer_options for inc in options.pop("includes",()): includes.append(inc) for exc in options.pop("excludes",()): excludes.append(exc) if "pypy" not in includes and "pypy" not in excludes: excludes.append("pypy") # Freeze up the given scripts f = bbfreeze.Freezer(dist.freeze_dir,includes=includes,excludes=excludes) for (nm,val) in options.iteritems(): setattr(f,nm,val) f.addModule("esky") tdir = tempfile.mkdtemp() try: for exe in dist.get_executables(): f.addScript(exe.script,gui_only=exe.gui_only) if "include_py" not in options: f.include_py = False if "linkmethod" not in options: # Since we're going to zip it up, the benefits of hard- # or sym-linking the loader exe will mostly be lost. f.linkmethod = "loader" f() finally: shutil.rmtree(tdir) # Copy data files into the freeze dir for (src,dst) in dist.get_data_files(): dst = os.path.join(dist.freeze_dir,dst) dstdir = os.path.dirname(dst) if not os.path.isdir(dstdir): dist.mkpath(dstdir) dist.copy_file(src,dst) # Copy package data into the library.zip lib = zipfile.ZipFile(os.path.join(dist.freeze_dir,"library.zip"),"a") for (src,arcnm) in dist.get_package_data(): lib.write(src,arcnm) lib.close() # Create the bootstrap code, using custom code if specified. # For win32 we include a special chainloader that can suck the selected # version into the running process rather than spawn a new proc. code_source = ["__name__ = '__main__'"] code_source.append("__esky_name__ = '%s'" % (dist.distribution.get_name(),)) code_source.append(inspect.getsource(esky.bootstrap)) if dist.compile_bootstrap_exes: if sys.platform == "win32": # The pypy-compiled bootstrap exe will try to load a python env # into its own process and run this "take2" code to bootstrap. take2_code = code_source[1:] take2_code.append(_CUSTOM_WIN32_CHAINLOADER) take2_code.append(dist.get_bootstrap_code()) take2_code = compile("\n".join(take2_code),"<string>","exec") take2_code = marshal.dumps(take2_code) clscript = "import marshal; " clscript += "exec marshal.loads(%r); " % (take2_code,) clscript = clscript.replace("%","%%") clscript += "chainload(\"%s\")" # Here's the actual source for the compiled bootstrap exe. from esky.bdist_esky import pypy_libpython code_source.append(inspect.getsource(pypy_libpython)) code_source.append("_PYPY_CHAINLOADER_SCRIPT = %r" % (clscript,)) code_source.append(_CUSTOM_PYPY_CHAINLOADER) code_source.append(dist.get_bootstrap_code()) code_source = "\n".join(code_source) for exe in dist.get_executables(normalise=False): if not exe.include_in_bootstrap_env: continue bsexe = dist.compile_to_bootstrap_exe(exe,code_source) if sys.platform == "win32": fexe = os.path.join(dist.freeze_dir,exe.name) winres.copy_safe_resources(fexe,bsexe) # We may also need the bundled MSVCRT libs if sys.platform == "win32": for nm in os.listdir(dist.freeze_dir): if is_core_dependency(nm) and nm.startswith("Microsoft"): dist.copy_to_bootstrap_env(nm) else: if sys.platform == "win32": code_source.append(_CUSTOM_WIN32_CHAINLOADER) code_source.append(dist.get_bootstrap_code()) code_source.append("bootstrap()") code_source = "\n".join(code_source) # For non-compiled bootstrap exe, store the bootstrapping code # into the library.zip as __main__. maincode = imp.get_magic() + struct.pack("<i",0) maincode += marshal.dumps(compile(code_source,"__main__.py","exec")) # Create code for a fake esky.bootstrap module eskycode = imp.get_magic() + struct.pack("<i",0) eskycode += marshal.dumps(compile("","esky/__init__.py","exec")) eskybscode = imp.get_magic() + struct.pack("<i",0) eskybscode += marshal.dumps(compile("","esky/bootstrap.py","exec")) # Store bootstrap code as __main__ in the bootstrap library.zip. # The frozen library.zip might have the loader prepended to it, but # that gets overwritten here. bslib_path = dist.copy_to_bootstrap_env("library.zip") bslib = zipfile.PyZipFile(bslib_path,"w",zipfile.ZIP_STORED) cdate = (2000,1,1,0,0,0) bslib.writestr(zipfile.ZipInfo("__main__.pyc",cdate),maincode) bslib.writestr(zipfile.ZipInfo("esky/__init__.pyc",cdate),eskycode) bslib.writestr(zipfile.ZipInfo("esky/bootstrap.pyc",cdate),eskybscode) bslib.close() # Copy any core dependencies if "fcntl" not in sys.builtin_module_names: for nm in os.listdir(dist.freeze_dir): if nm.startswith("fcntl"): dist.copy_to_bootstrap_env(nm) for nm in os.listdir(dist.freeze_dir): if is_core_dependency(nm): dist.copy_to_bootstrap_env(nm) # Copy the bbfreeze interpreter if necessary if f.include_py: if sys.platform == "win32": dist.copy_to_bootstrap_env("py.exe") else: dist.copy_to_bootstrap_env("py") # Copy the loader program for each script. # We explicitly strip the loader binaries, in case they were made # by linking to the library.zip. for exe in dist.get_executables(normalise=False): if not exe.include_in_bootstrap_env: continue exepath = dist.copy_to_bootstrap_env(exe.name) f.stripBinary(exepath)
import os, bbfreeze, zipfile, compileall compileall.compile_dir("libbe") f = bbfreeze.Freezer() f.addScript("be.py") f.addModule("htmlentitydefs") f.addModule("jinja2") print "Assembling ..." f() # Hack in the missing files from libbe with zipfile.ZipFile("dist/library.zip", "a") as zf: existing = [f for f in zf.namelist() if f[:6] == 'libbe/'] #print existing for dirpath, dirnames, filenames in os.walk("libbe"): for filename in filenames: if filename[-4:] == ".pyc": path = os.path.join(dirpath, filename).replace(os.sep, '/') if path not in existing: print "Adding file", path, "..." zf.write(path)