mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-17 19:27:28 +00:00
Customized environment variables are not inherited to child processes created by the subprocess module. As a result the legacy board parser may not be able to locate the prerequisite utilities if they can be found only with the customized PATH. This patch passes the PATH of cli.py to the legacy parser so that both scripts use the same PATH to search for utilities. This patch is added in v2 of the series. Tracked-On: #6287 Signed-off-by: Junjie Mao <junjie.mao@intel.com>
66 lines
2.5 KiB
Python
Executable File
66 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# Copyright (C) 2021 Intel Corporation. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
|
|
import sys, os
|
|
import logging
|
|
import subprocess
|
|
import lxml.etree
|
|
import argparse
|
|
from importlib import import_module
|
|
|
|
script_dir = os.path.dirname(os.path.realpath(__file__))
|
|
sys.path.append(os.path.join(script_dir))
|
|
|
|
def main(board_name, board_xml, args):
|
|
try:
|
|
# First invoke the legacy board parser to create the board XML ...
|
|
legacy_parser = os.path.join(script_dir, "legacy", "board_parser.py")
|
|
env = { "PYTHONPATH": script_dir, "PATH": os.environ["PATH"] }
|
|
subprocess.run([sys.executable, legacy_parser, args.board_name, "--out", board_xml], check=True, env=env)
|
|
|
|
# ... then load the created board XML and append it with additional data by invoking the extractors.
|
|
board_etree = lxml.etree.parse(board_xml)
|
|
root_node = board_etree.getroot()
|
|
|
|
# Clear the whitespaces between adjacent children under the root node
|
|
root_node.text = None
|
|
for elem in root_node:
|
|
elem.tail = None
|
|
|
|
# Create nodes for each kind of resource
|
|
root_node.append(lxml.etree.Element("processors"))
|
|
root_node.append(lxml.etree.Element("caches"))
|
|
root_node.append(lxml.etree.Element("memory"))
|
|
root_node.append(lxml.etree.Element("devices"))
|
|
|
|
extractors_path = os.path.join(script_dir, "extractors")
|
|
extractors = [f for f in os.listdir(extractors_path) if f[:2].isdigit()]
|
|
for extractor in sorted(extractors):
|
|
module_name = os.path.splitext(extractor)[0]
|
|
module = import_module(f"extractors.{module_name}")
|
|
if not args.advanced and getattr(module, "advanced", False):
|
|
continue
|
|
module.extract(board_etree)
|
|
|
|
# Finally overwrite the output with the updated XML
|
|
board_etree.write(board_xml, pretty_print=True)
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
print(e)
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
logging.basicConfig(level=logging.INFO)
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("board_name", help="the name of the board that runs the ACRN hypervisor")
|
|
parser.add_argument("--out", help="the name of board info file")
|
|
parser.add_argument("--advanced", action="store_true", default=False, help="extract advanced information such as ACPI namespace")
|
|
args = parser.parse_args()
|
|
|
|
board_xml = args.out if args.out else f"{args.board_name}.xml"
|
|
main(args.board_name, board_xml, args)
|