Skip to content
Snippets Groups Projects
utils.py 1.94 KiB
Newer Older
Simon Rose's avatar
Simon Rose committed
import os
import subprocess
import time
from pathlib import Path

Simon Rose's avatar
Simon Rose committed
from run_iocsh import IOC
Simon Rose's avatar
Simon Rose committed

EPICS_BASE = os.environ.get("EPICS_BASE")
E3_REQUIRE_VERSION = os.environ.get("E3_REQUIRE_VERSION")


Simon Rose's avatar
Simon Rose committed
def set_env_vars(env: dict) -> dict:
Simon Rose's avatar
Simon Rose committed
    """
    Set a number of environment variables needed for require to build a module
    """
Simon Rose's avatar
Simon Rose committed
    assert "EPICS_BASE" in env
    assert Path(env["EPICS_BASE"]).is_dir
    assert "E3_REQUIRE_VERSION" in env
    assert env["E3_REQUIRE_VERSION"]

    E3_REQUIRE_LOCATION = f"{EPICS_BASE}/require/{E3_REQUIRE_VERSION}"
    assert Path(E3_REQUIRE_LOCATION).is_dir()
    env["E3_REQUIRE_LOCATION"] = E3_REQUIRE_LOCATION

    REQUIRE_CONFIG = f"{E3_REQUIRE_LOCATION}/configure"
    env["REQUIRE_CONFIG"] = REQUIRE_CONFIG

Simon Rose's avatar
Simon Rose committed
    # Add a default version
Simon Rose's avatar
Simon Rose committed
    env["E3_MODULE_VERSION"] = "0.0.0"

    return env


def run_make(wrapper, *args, **kwargs):
Simon Rose's avatar
Simon Rose committed
    """
    Attempt to run `make <args>` in the specified path with <kwargs> as environment variables
    """
Simon Rose's avatar
Simon Rose committed
    test_env = set_env_vars(os.environ.copy())
Simon Rose's avatar
Simon Rose committed
    for kw in kwargs:
        test_env[kw] = kwargs[kw]
    make_cmd = ["make", "-C", wrapper.path] + list(args)
Simon Rose's avatar
Simon Rose committed
    p = subprocess.Popen(
        make_cmd,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        env=test_env,
        encoding="utf-8",
Simon Rose's avatar
Simon Rose committed
    )
    outs, errs = p.communicate()
    return p.returncode, outs, errs


def get_env_var(wrapper, var: str):
    """
    Fetch an environment variable from the module build environment
    """
    _, out, _ = run_make(wrapper, "cellvars")
    for line in out.split("\n"):
        if line.startswith(var):
            return line.split("=")[1].strip()
    return ""
Simon Rose's avatar
Simon Rose committed
def run_ioc_get_output(module, version, cell_path):
Simon Rose's avatar
Simon Rose committed
    """
    Run an IOC and try to load the test module
    """
Simon Rose's avatar
Simon Rose committed
    print(f"run_ioc_get_output {module} {version} {cell_path}")
    with IOC("-r", f"{module},{version}", "-l", cell_path) as ioc:
Simon Rose's avatar
Simon Rose committed
        time.sleep(1)
    return ioc.proc.returncode, ioc.outs, ioc.errs