rust/hgcli/pyoxidizer.bzl
author Gregory Szorc <gregory.szorc@gmail.com>
Tue, 31 Mar 2020 19:44:28 -0700
changeset 44639 bc847878f4c0
parent 44638 af739894a4c1
child 44763 94f4f2ec7dee
permissions -rw-r--r--
hgcli: customize for Mercurial Now that we have a shiny new PyOxidizer-based hgcli project, let's customize it for Mercurial! This commit replaces the auto-generated pyoxidizer.bzl with one that installs Mercurial from the local source repository. A README.md with build instructions has been added. The Cargo.toml file has been updated to reflect the proper license and reference the added README.md. In my Linux environment, running the test suite yields 27 failures. It's worth noting the run time of the test harness on Linux on my Ryzen 3950X: before: 378s wall; 9982s user; 1195s sys after: 353s wall; 8996s user; 958s sys % orig: 93.4 wall; 90.1 user; 80.2 sys While I haven't measured explicitly, I suspect the performance win is due to in-memory resource loading (which is known to be faster than Python's filesystem importer). Differential Revision: https://phab.mercurial-scm.org/D8351

ROOT = CWD + "/../.."

def make_exe():
    dist = default_python_distribution()

    code = "import hgdemandimport; hgdemandimport.enable(); from mercurial import dispatch; dispatch.run()"

    config = PythonInterpreterConfig(
        raw_allocator = "system",
        run_eval = 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",
    )

    exe.add_python_resources(dist.pip_install([ROOT]))

    return exe

def make_install(exe):
    m = FileManifest()

    # `hg` goes in root directory.
    m.add_python_resource(".", exe)

    templates = glob(
        include = [ROOT + "/mercurial/templates/**/*"],
        strip_prefix = ROOT + "/mercurial/",
    )
    m.add_manifest(templates)

    return m

def make_embedded_resources(exe):
    return exe.to_embedded_resources()

register_target("exe", make_exe)
register_target("app", make_install, depends = ["exe"], default = True)
register_target("embedded", make_embedded_resources, depends = ["exe"], default_build_script = True)
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-pre"
PYOXIDIZER_COMMIT = "c772a1379c3026314eda1c8ea244b86c0658951d"