ROOT = CWD + "/../.." # Code to run in Python interpreter. RUN_CODE = "import hgdemandimport; hgdemandimport.enable(); from mercurial import dispatch; dispatch.run()" set_build_path(ROOT + "/build/pyoxidizer") def make_distribution(): return default_python_distribution() def make_distribution_windows(): return default_python_distribution(flavor = "standalone_dynamic") def make_exe(dist): """Builds a Rust-wrapped Mercurial binary.""" config = PythonInterpreterConfig( raw_allocator = "system", run_eval = RUN_CODE, # We want to let the user load extensions from the file system filesystem_importer = True, # We need this to make resourceutil happy, since it looks for sys.frozen. sys_frozen = True, legacy_windows_stdio = True, ) exe = dist.to_python_executable( name = "hg", resources_policy = "prefer-in-memory-fallback-filesystem-relative:lib", config = config, # Extension may depend on any Python functionality. Include all # extensions. extension_module_filter = "all", ) # Add Mercurial to resources. for resource in dist.pip_install(["--verbose", ROOT]): # This is a bit wonky and worth explaining. # # Various parts of Mercurial don't yet support loading package # resources via the ResourceReader interface. Or, not having # file-based resources would be too inconvenient for users. # # So, for package resources, we package them both in the # filesystem as well as in memory. If both are defined, # PyOxidizer will prefer the in-memory location. So even # if the filesystem file isn't packaged in the location # specified here, we should never encounter an errors as the # resource will always be available in memory. if type(resource) == "PythonPackageResource": exe.add_filesystem_relative_python_resource(".", resource) exe.add_in_memory_python_resource(resource) else: exe.add_python_resource(resource) # On Windows, we install extra packages for convenience. if "windows" in BUILD_TARGET_TRIPLE: exe.add_python_resources( dist.pip_install(["-r", ROOT + "/contrib/packaging/requirements_win32.txt"]), ) return exe def make_manifest(dist, exe): m = FileManifest() m.add_python_resource(".", exe) return m def make_embedded_resources(exe): return exe.to_embedded_resources() register_target("distribution_posix", make_distribution) register_target("distribution_windows", make_distribution_windows) register_target("exe_posix", make_exe, depends = ["distribution_posix"]) register_target("exe_windows", make_exe, depends = ["distribution_windows"]) register_target( "app_posix", make_manifest, depends = ["distribution_posix", "exe_posix"], default = "windows" not in BUILD_TARGET_TRIPLE, ) register_target( "app_windows", make_manifest, depends = ["distribution_windows", "exe_windows"], default = "windows" in BUILD_TARGET_TRIPLE, ) resolve_targets() # END OF COMMON USER-ADJUSTED SETTINGS. # # Everything below this is typically managed by PyOxidizer and doesn't need # to be updated by people. PYOXIDIZER_VERSION = "0.7.0"