public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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
> -
> -
> -
> 

  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