From: "Sean" <spbrogan@outlook.com>
To: devel@edk2.groups.io, kraxel@redhat.com
Cc: Jiewen Yao <jiewen.yao@intel.com>,
Jordan Justen <jordan.l.justen@intel.com>,
Ard Biesheuvel <ardb+tianocore@kernel.org>
Subject: Re: [edk2-devel] [PATCH 1/6] OvmfPkg/PlatformCI: factor out PlatformBuildLib.py
Date: Thu, 28 Oct 2021 10:09:07 -0700 [thread overview]
Message-ID: <BY3PR19MB490005FD6122CE9B9DB14D0EC8869@BY3PR19MB4900.namprd19.prod.outlook.com> (raw)
In-Reply-To: <20211019080832.265545-2-kraxel@redhat.com>
one thing that jumped out quickly (comment below).
Do you have a branch that i can look at and compare online?
Thanks
Sean
On 10/19/2021 1:08 AM, Gerd Hoffmann wrote:
> Move SettingsManager and PlatformBuilder classes to PlatformBuildLib.py
> file, keep only CommonPlatform class in PlatformBuild.py. Allows
> reusing these classes for other builds. Pure code motion, no functional
> change.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
> OvmfPkg/PlatformCI/PlatformBuild.py | 223 +-----------------
> .../{PlatformBuild.py => PlatformBuildLib.py} | 32 ---
> 2 files changed, 6 insertions(+), 249 deletions(-)
> copy OvmfPkg/PlatformCI/{PlatformBuild.py => PlatformBuildLib.py} (87%)
>
> diff --git a/OvmfPkg/PlatformCI/PlatformBuild.py b/OvmfPkg/PlatformCI/PlatformBuild.py
> index 627bb7b992db..413f004990e5 100644
> --- a/OvmfPkg/PlatformCI/PlatformBuild.py
> +++ b/OvmfPkg/PlatformCI/PlatformBuild.py
> @@ -5,17 +5,11 @@
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> ##
> import os
> -import logging
> -import io
> -
> -from edk2toolext.environment import shell_environment
> -from edk2toolext.environment.uefi_build import UefiBuilder
> -from edk2toolext.invocables.edk2_platform_build import BuildSettingsManager
> -from edk2toolext.invocables.edk2_setup import SetupSettingsManager, RequiredSubmodule
> -from edk2toolext.invocables.edk2_update import UpdateSettingsManager
> -from edk2toolext.invocables.edk2_pr_eval import PrEvalSettingsManager
> -from edk2toollib.utility_functions import RunCmd
> +import sys
>
> +sys.path.append(os.path.join(os.getcwd(), 'OvmfPkg', 'PlatformCI'))
I would strongly suggest you base your path off your current file
location rather than CWD. This makes invocation much more flexible.
See how workspace root is determined for similar solution.
> +from PlatformBuildLib import SettingsManager
> +from PlatformBuildLib import PlatformBuilder
>
> # ####################################################################################### #
> # Common Configuration #
> @@ -45,210 +39,5 @@ class CommonPlatform():
> dsc += ".dsc"
> return dsc
>
> -
> - # ####################################################################################### #
> - # Configuration for Update & Setup #
> - # ####################################################################################### #
> -class SettingsManager(UpdateSettingsManager, SetupSettingsManager, PrEvalSettingsManager):
> -
> - def GetPackagesSupported(self):
> - ''' return iterable of edk2 packages supported by this build.
> - These should be edk2 workspace relative paths '''
> - return CommonPlatform.PackagesSupported
> -
> - def GetArchitecturesSupported(self):
> - ''' return iterable of edk2 architectures supported by this build '''
> - return CommonPlatform.ArchSupported
> -
> - def GetTargetsSupported(self):
> - ''' return iterable of edk2 target tags supported by this build '''
> - return CommonPlatform.TargetsSupported
> -
> - def GetRequiredSubmodules(self):
> - ''' return iterable containing RequiredSubmodule objects.
> - If no RequiredSubmodules return an empty iterable
> - '''
> - rs = []
> -
> - # intentionally declare this one with recursive false to avoid overhead
> - rs.append(RequiredSubmodule(
> - "CryptoPkg/Library/OpensslLib/openssl", False))
> -
> - # To avoid maintenance of this file for every new submodule
> - # lets just parse the .gitmodules and add each if not already in list.
> - # The GetRequiredSubmodules is designed to allow a build to optimize
> - # the desired submodules but it isn't necessary for this repository.
> - result = io.StringIO()
> - ret = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self.GetWorkspaceRoot(), outstream=result)
> - # Cmd output is expected to look like:
> - # submodule.CryptoPkg/Library/OpensslLib/openssl.path CryptoPkg/Library/OpensslLib/openssl
> - # submodule.SoftFloat.path ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3
> - if ret == 0:
> - for line in result.getvalue().splitlines():
> - _, _, path = line.partition(" ")
> - if path is not None:
> - if path not in [x.path for x in rs]:
> - rs.append(RequiredSubmodule(path, True)) # add it with recursive since we don't know
> - return rs
> -
> - def SetArchitectures(self, list_of_requested_architectures):
> - ''' Confirm the requests architecture list is valid and configure SettingsManager
> - to run only the requested architectures.
> -
> - Raise Exception if a list_of_requested_architectures is not supported
> - '''
> - unsupported = set(list_of_requested_architectures) - set(self.GetArchitecturesSupported())
> - if(len(unsupported) > 0):
> - errorString = ( "Unsupported Architecture Requested: " + " ".join(unsupported))
> - logging.critical( errorString )
> - raise Exception( errorString )
> - self.ActualArchitectures = list_of_requested_architectures
> -
> - def GetWorkspaceRoot(self):
> - ''' get WorkspacePath '''
> - return CommonPlatform.WorkspaceRoot
> -
> - def GetActiveScopes(self):
> - ''' return tuple containing scopes that should be active for this process '''
> - return CommonPlatform.Scopes
> -
> - def FilterPackagesToTest(self, changedFilesList: list, potentialPackagesList: list) -> list:
> - ''' Filter other cases that this package should be built
> - based on changed files. This should cover things that can't
> - be detected as dependencies. '''
> - build_these_packages = []
> - possible_packages = potentialPackagesList.copy()
> - for f in changedFilesList:
> - # BaseTools files that might change the build
> - if "BaseTools" in f:
> - if os.path.splitext(f) not in [".txt", ".md"]:
> - build_these_packages = possible_packages
> - break
> -
> - # if the azure pipeline platform template file changed
> - if "platform-build-run-steps.yml" in f:
> - build_these_packages = possible_packages
> - break
> -
> - return build_these_packages
> -
> - def GetPlatformDscAndConfig(self) -> tuple:
> - ''' If a platform desires to provide its DSC then Policy 4 will evaluate if
> - any of the changes will be built in the dsc.
> -
> - The tuple should be (<workspace relative path to dsc file>, <input dictionary of dsc key value pairs>)
> - '''
> - dsc = CommonPlatform.GetDscName(",".join(self.ActualArchitectures))
> - return (f"OvmfPkg/{dsc}", {})
> -
> -
> - # ####################################################################################### #
> - # Actual Configuration for Platform Build #
> - # ####################################################################################### #
> -class PlatformBuilder( UefiBuilder, BuildSettingsManager):
> - def __init__(self):
> - UefiBuilder.__init__(self)
> -
> - def AddCommandLineOptions(self, parserObj):
> - ''' Add command line options to the argparser '''
> - parserObj.add_argument('-a', "--arch", dest="build_arch", type=str, default="IA32,X64",
> - help="Optional - CSV of architecture to build. IA32 will use IA32 for Pei & Dxe. "
> - "X64 will use X64 for both PEI and DXE. IA32,X64 will use IA32 for PEI and "
> - "X64 for DXE. default is IA32,X64")
> -
> - def RetrieveCommandLineOptions(self, args):
> - ''' Retrieve command line options from the argparser '''
> -
> - shell_environment.GetBuildVars().SetValue("TARGET_ARCH"," ".join(args.build_arch.upper().split(",")), "From CmdLine")
> - dsc = CommonPlatform.GetDscName(args.build_arch)
> - shell_environment.GetBuildVars().SetValue("ACTIVE_PLATFORM", f"OvmfPkg/{dsc}", "From CmdLine")
> -
> - def GetWorkspaceRoot(self):
> - ''' get WorkspacePath '''
> - return CommonPlatform.WorkspaceRoot
> -
> - def GetPackagesPath(self):
> - ''' Return a list of workspace relative paths that should be mapped as edk2 PackagesPath '''
> - return ()
> -
> - def GetActiveScopes(self):
> - ''' return tuple containing scopes that should be active for this process '''
> - return CommonPlatform.Scopes
> -
> - def GetName(self):
> - ''' Get the name of the repo, platform, or product being build '''
> - ''' Used for naming the log file, among others '''
> - # check the startup nsh flag and if set then rename the log file.
> - # this helps in CI so we don't overwrite the build log since running
> - # uses the stuart_build command.
> - if(shell_environment.GetBuildVars().GetValue("MAKE_STARTUP_NSH", "FALSE") == "TRUE"):
> - return "OvmfPkg_With_Run"
> - return "OvmfPkg"
> -
> - def GetLoggingLevel(self, loggerType):
> - ''' Get the logging level for a given type
> - base == lowest logging level supported
> - con == Screen logging
> - txt == plain text file logging
> - md == markdown file logging
> - '''
> - return logging.DEBUG
> -
> - def SetPlatformEnv(self):
> - logging.debug("PlatformBuilder SetPlatformEnv")
> - self.env.SetValue("PRODUCT_NAME", "OVMF", "Platform Hardcoded")
> - self.env.SetValue("MAKE_STARTUP_NSH", "FALSE", "Default to false")
> - self.env.SetValue("QEMU_HEADLESS", "FALSE", "Default to false")
> - return 0
> -
> - def PlatformPreBuild(self):
> - return 0
> -
> - def PlatformPostBuild(self):
> - return 0
> -
> - def FlashRomImage(self):
> - VirtualDrive = os.path.join(self.env.GetValue("BUILD_OUTPUT_BASE"), "VirtualDrive")
> - os.makedirs(VirtualDrive, exist_ok=True)
> - OutputPath_FV = os.path.join(self.env.GetValue("BUILD_OUTPUT_BASE"), "FV")
> -
> - #
> - # QEMU must be on the path
> - #
> - cmd = "qemu-system-x86_64"
> - args = "-debugcon stdio" # write messages to stdio
> - args += " -global isa-debugcon.iobase=0x402" # debug messages out thru virtual io port
> - args += " -net none" # turn off network
> - args += f" -drive file=fat:rw:{VirtualDrive},format=raw,media=disk" # Mount disk with startup.nsh
> -
> - if (self.env.GetValue("QEMU_HEADLESS").upper() == "TRUE"):
> - args += " -display none" # no graphics
> -
> - if (self.env.GetBuildValue("SMM_REQUIRE") == "1"):
> - args += " -machine q35,smm=on" #,accel=(tcg|kvm)"
> - #args += " -m ..."
> - #args += " -smp ..."
> - args += " -global driver=cfi.pflash01,property=secure,value=on"
> - args += " -drive if=pflash,format=raw,unit=0,file=" + os.path.join(OutputPath_FV, "OVMF_CODE.fd") + ",readonly=on"
> - args += " -drive if=pflash,format=raw,unit=1,file=" + os.path.join(OutputPath_FV, "OVMF_VARS.fd")
> - else:
> - args += " -pflash " + os.path.join(OutputPath_FV, "OVMF.fd") # path to firmware
> -
> -
> - if (self.env.GetValue("MAKE_STARTUP_NSH").upper() == "TRUE"):
> - f = open(os.path.join(VirtualDrive, "startup.nsh"), "w")
> - f.write("BOOT SUCCESS !!! \n")
> - ## add commands here
> - f.write("reset -s\n")
> - f.close()
> -
> - ret = RunCmd(cmd, args)
> -
> - if ret == 0xc0000005:
> - #for some reason getting a c0000005 on successful return
> - return 0
> -
> - return ret
> -
> -
> -
> +import PlatformBuildLib
> +PlatformBuildLib.CommonPlatform = CommonPlatform
> diff --git a/OvmfPkg/PlatformCI/PlatformBuild.py b/OvmfPkg/PlatformCI/PlatformBuildLib.py
> similarity index 87%
> copy from OvmfPkg/PlatformCI/PlatformBuild.py
> copy to OvmfPkg/PlatformCI/PlatformBuildLib.py
> index 627bb7b992db..90ac0b29a892 100644
> --- a/OvmfPkg/PlatformCI/PlatformBuild.py
> +++ b/OvmfPkg/PlatformCI/PlatformBuildLib.py
> @@ -17,35 +17,6 @@ from edk2toolext.invocables.edk2_pr_eval import PrEvalSettingsManager
> from edk2toollib.utility_functions import RunCmd
>
>
> - # ####################################################################################### #
> - # Common Configuration #
> - # ####################################################################################### #
> -class CommonPlatform():
> - ''' Common settings for this platform. Define static data here and use
> - for the different parts of stuart
> - '''
> - PackagesSupported = ("OvmfPkg",)
> - ArchSupported = ("IA32", "X64")
> - TargetsSupported = ("DEBUG", "RELEASE", "NOOPT")
> - Scopes = ('ovmf', 'edk2-build')
> - WorkspaceRoot = os.path.realpath(os.path.join(
> - os.path.dirname(os.path.abspath(__file__)), "..", ".."))
> -
> - @classmethod
> - def GetDscName(cls, ArchCsv: str) -> str:
> - ''' return the DSC given the architectures requested.
> -
> - ArchCsv: csv string containing all architectures to build
> - '''
> - dsc = "OvmfPkg"
> - if "IA32" in ArchCsv.upper().split(","):
> - dsc += "Ia32"
> - if "X64" in ArchCsv.upper().split(","):
> - dsc += "X64"
> - dsc += ".dsc"
> - return dsc
> -
> -
> # ####################################################################################### #
> # Configuration for Update & Setup #
> # ####################################################################################### #
> @@ -249,6 +220,3 @@ class PlatformBuilder( UefiBuilder, BuildSettingsManager):
> return 0
>
> return ret
> -
> -
> -
>
next prev parent reply other threads:[~2021-10-28 17:09 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-19 8:08 [PATCH 0/6] OvmfPkg/PlatformCI: hook up AmdSev, Bhyve and Microvm Gerd Hoffmann
2021-10-19 8:08 ` [PATCH 1/6] OvmfPkg/PlatformCI: factor out PlatformBuildLib.py Gerd Hoffmann
2021-10-28 17:09 ` Sean [this message]
2021-10-29 5:07 ` [edk2-devel] " Gerd Hoffmann
2021-10-19 8:08 ` [PATCH 2/6] OvmfPkg/PlatformCI: add QEMU_SKIP Gerd Hoffmann
2021-10-19 8:08 ` [PATCH 3/6] OvmfPkg/PlatformCI: add BhyveBuild.py Gerd Hoffmann
2021-10-19 8:08 ` [PATCH 4/6] OvmfPkg/PlatformCI: add MicrovmBuild.py Gerd Hoffmann
2021-10-19 8:08 ` [PATCH 5/6] OvmfPkg/PlatformCI: add AmdSevBuild.py Gerd Hoffmann
2021-10-19 8:08 ` [PATCH 6/6] OvmfPkg/PlatformCI: dummy grub.efi for AmdSev Gerd Hoffmann
2021-10-19 8:21 ` [PATCH 0/6] OvmfPkg/PlatformCI: hook up AmdSev, Bhyve and Microvm Yao, Jiewen
2021-10-19 8:56 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BY3PR19MB490005FD6122CE9B9DB14D0EC8869@BY3PR19MB4900.namprd19.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox