From patchwork Tue Sep 13 12:08:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Hoyes X-Patchwork-Id: 12769 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92FD9C54EE9 for ; Tue, 13 Sep 2022 12:09:19 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.3818.1663070957267244392 for ; Tue, 13 Sep 2022 05:09:17 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: peter.hoyes@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 311641063; Tue, 13 Sep 2022 05:09:23 -0700 (PDT) Received: from e125920.cambridge.arm.com (unknown [10.1.199.1]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3DC9A3F71A; Tue, 13 Sep 2022 05:09:16 -0700 (PDT) From: Peter Hoyes To: meta-arm@lists.yoctoproject.org Cc: diego.sueiro@arm.com, Peter Hoyes Subject: [PATCH v2] arm/lib: Specify the FVP environment variables explicitly Date: Tue, 13 Sep 2022 13:08:50 +0100 Message-Id: <20220913120850.1409443-1-peter.hoyes@arm.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Tue, 13 Sep 2022 12:09:19 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/meta-arm/message/3772 From: Peter Hoyes It is sometimes useful to be able to configure the behavior of FVPs using environment variables, e.g. for licensing or plugins. Add a new FVP option: FVP_ENV_PASSTHROUGH, which allows the Bitbake variables to be passed to the environment to be specified explicitly (in a similar way to BB_ENV_PASSTHROUGH). This ensures that: * FVPs launched via runfvp have a reproducable environment * FVPs launched via testimage (which run from an isolated Bitbake task) can receive environment variables Change the self-tests to use cwd instead of PATH to find the mock FVPs, as the PATH environment variable is no longer passed through. Issue-Id: SCM-4964 Signed-off-by: Peter Hoyes Change-Id: Idf6ac6d41fda4cd5f950bc383c2fc1fa1acdf4e3 --- documentation/runfvp.md | 8 ++++++++ meta-arm/classes/fvpboot.bbclass | 6 ++++++ meta-arm/lib/fvp/conffile.py | 1 + meta-arm/lib/fvp/runner.py | 5 ++++- meta-arm/lib/oeqa/selftest/cases/runfvp.py | 12 ++++++------ .../lib/oeqa/selftest/cases/tests/auto-basic.json | 1 + .../oeqa/selftest/cases/tests/auto-parameters.json | 1 + .../oeqa/selftest/cases/tests/test-parameter.json | 1 + 8 files changed, 28 insertions(+), 7 deletions(-) diff --git a/documentation/runfvp.md b/documentation/runfvp.md index c792f4e0..01b13693 100644 --- a/documentation/runfvp.md +++ b/documentation/runfvp.md @@ -116,6 +116,14 @@ Arbitrary extra arguments that are passed directly to the FVP. For example: FVP_EXTRA_ARGS = "--simlimit 60" ``` +### `FVP_ENV_PASSTHROUGH` + +The FVP is launched with an isolated set of environment variables. Add the name of a Bitbake variable to this list to pass it through to the FVP environment. For example: + +``` +FVP_ENV_PASSTHROUGH = "ARMLMD_LICENSE_FILE FM_TRACE_PLUGINS" +``` + [AEM]: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms/arm-ecosystem-models [FVP]: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms diff --git a/meta-arm/classes/fvpboot.bbclass b/meta-arm/classes/fvpboot.bbclass index fbdfa965..78dabd73 100644 --- a/meta-arm/classes/fvpboot.bbclass +++ b/meta-arm/classes/fvpboot.bbclass @@ -23,6 +23,8 @@ FVP_CONSOLE ?= "" FVP_CONSOLES[default] ?= "${FVP_CONSOLE}" # Arbitrary extra arguments FVP_EXTRA_ARGS ?= "" +# Bitbake variables to pass to the FVP environment +FVP_ENV_PASSTHROUGH ?= "" EXTRA_IMAGEDEPENDS += "${FVP_PROVIDER}" @@ -66,6 +68,10 @@ python do_write_fvpboot_conf() { data["terminals"] = getFlags("FVP_TERMINALS") data["args"] = shlex.split(d.getVar("FVP_EXTRA_ARGS") or "") + data["env"] = {} + for var in d.getVar("FVP_ENV_PASSTHROUGH").split(): + data["env"][var] = d.getVar(var) + os.makedirs(os.path.dirname(conffile), exist_ok=True) with open(conffile, "wt") as f: json.dump(data, f) diff --git a/meta-arm/lib/fvp/conffile.py b/meta-arm/lib/fvp/conffile.py index acede40e..603851d1 100644 --- a/meta-arm/lib/fvp/conffile.py +++ b/meta-arm/lib/fvp/conffile.py @@ -51,6 +51,7 @@ def load(config_file): sanitise("terminals", {}) sanitise("args", []) sanitise("consoles", {}) + sanitise("env", {}) if not config["exe"]: raise ValueError("Required value FVP_EXE not set in machine configuration") diff --git a/meta-arm/lib/fvp/runner.py b/meta-arm/lib/fvp/runner.py index 7641cd67..8c6b4cad 100644 --- a/meta-arm/lib/fvp/runner.py +++ b/meta-arm/lib/fvp/runner.py @@ -60,7 +60,10 @@ class FVPRunner: cli = cli_from_config(config, terminal_choice) cli += extra_args self._logger.debug(f"Constructed FVP call: {cli}") - self._fvp_process = await asyncio.create_subprocess_exec(*cli, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + self._fvp_process = await asyncio.create_subprocess_exec( + *cli, + stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + env=config['env']) def detect_terminals(line): m = re.match(r"^(\S+): Listening for serial connection on port (\d+)$", line) diff --git a/meta-arm/lib/oeqa/selftest/cases/runfvp.py b/meta-arm/lib/oeqa/selftest/cases/runfvp.py index d1e452f6..e1bf2040 100644 --- a/meta-arm/lib/oeqa/selftest/cases/runfvp.py +++ b/meta-arm/lib/oeqa/selftest/cases/runfvp.py @@ -20,11 +20,10 @@ class RunFVPTests(OESelftestTestCase): on exit code 0 or fail the test, otherwise return the CompletedProcess instance. """ - # Put the test directory in PATH so that any mock FVPs are found first - newenv = {"PATH": str(testdir) + ":" + os.environ["PATH"]} cli = [runfvp,] + list(args) print(f"Calling {cli}") - ret = subprocess.run(cli, env=newenv, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) + # Set cwd to testdir so that any mock FVPs are found + ret = subprocess.run(cli, cwd=testdir, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) if should_succeed: self.assertEqual(ret.returncode, 0, f"runfvp exit {ret.returncode}, output: {ret.stdout}") return ret.stdout @@ -40,8 +39,6 @@ class RunFVPTests(OESelftestTestCase): self.run_fvp("--this-is-an-invalid-option", should_succeed=False) def test_run_auto_tests(self): - newenv = {"PATH": str(testdir) + ":" + os.environ["PATH"]} - cases = list(testdir.glob("auto-*.json")) if not cases: self.fail("No tests found") @@ -79,6 +76,7 @@ class ConfFileTests(OESelftestTestCase): self.assertTrue("terminals" in conf) self.assertTrue("args" in conf) self.assertTrue("consoles" in conf) + self.assertTrue("env" in conf) class RunnerTests(OESelftestTestCase): @@ -97,6 +95,7 @@ class RunnerTests(OESelftestTestCase): "applications": {'a1': 'file'}, "terminals": {}, "args": ['--extra-arg'], + "env": {"FOO": "BAR"} })) m.assert_called_once_with('/usr/bin/FVP_Binary', @@ -106,4 +105,5 @@ class RunnerTests(OESelftestTestCase): '--extra-arg', stdin=unittest.mock.ANY, stdout=unittest.mock.ANY, - stderr=unittest.mock.ANY) + stderr=unittest.mock.ANY, + env={"FOO":"BAR"}) diff --git a/meta-arm/lib/oeqa/selftest/cases/tests/auto-basic.json b/meta-arm/lib/oeqa/selftest/cases/tests/auto-basic.json index 476eb572..a476ac10 100644 --- a/meta-arm/lib/oeqa/selftest/cases/tests/auto-basic.json +++ b/meta-arm/lib/oeqa/selftest/cases/tests/auto-basic.json @@ -1,3 +1,4 @@ { + "fvp-bindir": ".", "exe": "auto-basic.sh" } diff --git a/meta-arm/lib/oeqa/selftest/cases/tests/auto-parameters.json b/meta-arm/lib/oeqa/selftest/cases/tests/auto-parameters.json index 0c7d4ef9..a60abac3 100644 --- a/meta-arm/lib/oeqa/selftest/cases/tests/auto-parameters.json +++ b/meta-arm/lib/oeqa/selftest/cases/tests/auto-parameters.json @@ -1,4 +1,5 @@ { + "fvp-bindir": ".", "exe": "test-parameters.py", "parameters": { "board.cow": "moo", diff --git a/meta-arm/lib/oeqa/selftest/cases/tests/test-parameter.json b/meta-arm/lib/oeqa/selftest/cases/tests/test-parameter.json index 9b565f27..031ef660 100644 --- a/meta-arm/lib/oeqa/selftest/cases/tests/test-parameter.json +++ b/meta-arm/lib/oeqa/selftest/cases/tests/test-parameter.json @@ -1,4 +1,5 @@ { + "fvp-bindir": ".", "exe": "test-parameters.py", "parameters": { "board.cow": "moo"