Reviewed-by: Bret Barkelew - Bret ________________________________ From: devel@edk2.groups.io on behalf of Liming Gao via groups.io Sent: Tuesday, April 21, 2020 7:36:29 AM To: devel@edk2.groups.io ; michael.kubacki@outlook.com ; Ni, Ray Cc: Justen, Jordan L ; Andrew Fish Subject: [EXTERNAL] Re: [edk2-devel] [PATCH v2 3/6] EmulatorPkg: Add Platform CI and configuration for Core CI Sean: I see some comments on Ovmf. If you make the change in Ovmf, please also update EmulatorPkg. I would like to keep the consistent style in EmulatorPkg/OvmfPkg. This change is good to me. Reviewed-by: Liming Gao Ray: If you have no comment, can you give Ack-by for this change? Thanks Liming > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Michael Kubacki > Sent: Tuesday, April 21, 2020 3:12 AM > To: devel@edk2.groups.io > Cc: Justen, Jordan L ; Andrew Fish ; Ni, Ray > Subject: [edk2-devel] [PATCH v2 3/6] EmulatorPkg: Add Platform CI and configuration for Core CI > > From: Sean Brogan > > REF:https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2570&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006138775&sdata=pCu5hHjwcDLOBNmjxZzzBOKxI8Yso0IzZg%2Bp343H3v0%3D&reserved=0 > > Add new Azure Pipeline definitions to build and run EmulatorPkg with: > * Ubuntu GCC5 > * Windows VS2019 > Add PyTool based build of EmulatorPkg > Add EmulatorPkg.ci.yaml for Core CI > Add ReadMe.rst for status, details and instructions > > Cc: Jordan Justen > Cc: Andrew Fish > Cc: Ray Ni > Signed-off-by: Sean Brogan > Signed-off-by: Michael Kubacki > --- > EmulatorPkg/EmulatorPkg.ci.yaml | 85 ++++++ > EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC5.yml | 95 +++++++ > EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS2019.yml | 85 ++++++ > EmulatorPkg/PlatformCI/PlatformBuild.py | 272 ++++++++++++++++++++ > EmulatorPkg/README.rst | 175 +++++++++++++ > 5 files changed, 712 insertions(+) > > diff --git a/EmulatorPkg/EmulatorPkg.ci.yaml b/EmulatorPkg/EmulatorPkg.ci.yaml > new file mode 100644 > index 000000000000..81f81780ec76 > --- /dev/null > +++ b/EmulatorPkg/EmulatorPkg.ci.yaml > @@ -0,0 +1,85 @@ > +## @file > +# Core CI configuration for EmulatorPkg > +# > +# EmulatorPkg is part of Platform Ci for builds so this is only > +# used for code analysis. > +# > +# Copyright (c) Microsoft Corporation > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +## > +{ > + ## options defined .pytool/Plugin/CompilerPlugin > + "CompilerPlugin": { > + "DscPath": "" # Don't support this test > + }, > + > + ## options defined .pytool/Plugin/HostUnitTestCompilerPlugin > + "HostUnitTestCompilerPlugin": { > + "DscPath": "" # Don't support this test > + }, > + > + ## options defined .pytool/Plugin/CharEncodingCheck > + "CharEncodingCheck": { > + "IgnoreFiles": [] > + }, > + > + ## options defined .pytool/Plugin/DependencyCheck > + "DependencyCheck": { > + "AcceptableDependencies": [ > + # For this platform all packages are allowed??? > + "MdePkg/MdePkg.dec", > + "MdeModulePkg/MdeModulePkg.dec", > + "EmulatorPkg/EmulatorPkg.dec", > + "NetworkPkg/NetworkPkg.dec", > + "EmbeddedPkg/EmbeddedPkg.dec", ## is this one OK?? > + ], > + # For host based unit tests > + "AcceptableDependencies-HOST_APPLICATION":[ > + "UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec" > + ], > + # For UEFI shell based apps > + "AcceptableDependencies-UEFI_APPLICATION":[], > + "IgnoreInf": [] > + }, > + > + ## options defined .pytool/Plugin/DscCompleteCheck > + "DscCompleteCheck": { > + "IgnoreInf": [""], > + "DscPath": "" # Don't support this test > + }, > + > + ## options defined .pytool/Plugin/HostUnitTestDscCompleteCheck > + "HostUnitTestDscCompleteCheck": { > + "IgnoreInf": [""], > + "DscPath": "" # Don't support this test > + }, > + > + ## options defined .pytool/Plugin/GuidCheck > + "GuidCheck": { > + "IgnoreGuidName": [], > + "IgnoreGuidValue": [], > + "IgnoreFoldersAndFiles": [], > + "IgnoreDuplicates": [], > + }, > + > + ## options defined .pytool/Plugin/LibraryClassCheck > + "LibraryClassCheck": { > + "IgnoreHeaderFile": [] > + }, > + > + ## options defined .pytool/Plugin/SpellCheck > + "SpellCheck": { > + "AuditOnly": True, # Fails right now with over 270 errors > + "IgnoreFiles": [], # use gitignore syntax to ignore errors in matching files > + "ExtendWords": [ > + "setjump", > + "plong", > + "lparam", > + "lpdword", > + "lpthread", > + "lresult", > + ], # words to extend to the dictionary for this package > + "IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignore > + "AdditionalIncludePaths": [] # Additional paths to spell check (wildcards supported) > + } > +} > diff --git a/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC5.yml b/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC5.yml > new file mode 100644 > index 000000000000..12ef8226ff54 > --- /dev/null > +++ b/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC5.yml > @@ -0,0 +1,95 @@ > +## @file > +# Azure Pipeline build file for building a platform. > +# > +# Platform: EmulatorPkg > +# OS: Ubuntu > +# Toolchain: GCC5 > +# > +# Copyright (c) Microsoft Corporation. > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +## > +trigger: > + - master > +pr: > + - master > +jobs: > + - job: Platform_CI > + variables: > + package: 'EmulatorPkg' > + vm_image: 'ubuntu-latest' > + should_run: false > + run_flags: "MAKE_STARTUP_NSH=TRUE" > + > + #Use matrix to speed up the build process > + strategy: > + matrix: > + EmulatorPkg_X64_DEBUG: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "X64" > + Build.Flags: "" > + Build.Target: "DEBUG" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_X64_RELEASE: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "X64" > + Build.Flags: "" > + Build.Target: "RELEASE" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_X64_NOOPT: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "X64" > + Build.Flags: "" > + Build.Target: "NOOPT" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_IA32_DEBUG: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "IA32" > + Build.Flags: "" > + Build.Target: "DEBUG" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_IA32_RELEASE: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "IA32" > + Build.Flags: "" > + Build.Target: "RELEASE" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_IA32_NOOPT: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "IA32" > + Build.Flags: "" > + Build.Target: "NOOPT" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + > + workspace: > + clean: all > + > + pool: > + vmImage: $(vm_image) > + > + steps: > + - template: ../../../.azurepipelines/templates/platform-build-run-steps.yml > + parameters: > + tool_chain_tag: GCC5 > + build_pkg: $(package) > + build_target: $(Build.Target) > + build_arch: $(Build.Arch) > + build_file: $(Build.File) > + build_flags: $(Build.Flags) > + run_flags: $(Run.Flags) > + # Add steps to install some IA32 only dependencies > + extra_install_step: > + - bash: sudo dpkg --add-architecture i386 > + displayName: Add i386 to dpkg > + condition: and(gt(variables.pkg_count, 0), eq(variables['Build.Arch'], 'IA32'), succeeded()) > + - bash: sudo apt-get update > + displayName: do apt-get update > + condition: and(gt(variables.pkg_count, 0), eq(variables['Build.Arch'], 'IA32'), succeeded()) > + - bash: sudo apt-get install libc6-dev:i386 libx11-dev:i386 libxext-dev:i386 lib32gcc-7-dev > + displayName: Add additional i386 packages > + condition: and(gt(variables.pkg_count, 0), eq(variables['Build.Arch'], 'IA32'), succeeded()) > diff --git a/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS2019.yml b/EmulatorPkg/PlatformCI/.azurepipelines/Windows- > VS2019.yml > new file mode 100644 > index 000000000000..a5baf4b6064b > --- /dev/null > +++ b/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS2019.yml > @@ -0,0 +1,85 @@ > +## @file > +# Azure Pipeline build file for building a platform. > +# > +# Platform: EMULATORPKG > +# OS: Windows > +# Toolchain: VS2019 > +# > +# Copyright (c) Microsoft Corporation. > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +## > +trigger: > + - master > +pr: > + - master > + > +jobs: > + - job: Platform_CI > + variables: > + package: 'EmulatorPkg' > + vm_image: 'windows-latest' > + should_run: true > + run_flags: "MAKE_STARTUP_NSH=TRUE" > + > + #Use matrix to speed up the build process > + strategy: > + matrix: > + EmulatorPkg_X64_DEBUG: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "X64" > + Build.Flags: "" > + Build.Target: "DEBUG" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_X64_RELEASE: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "X64" > + Build.Flags: "" > + Build.Target: "RELEASE" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_X64_NOOPT: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "X64" > + Build.Flags: "" > + Build.Target: "NOOPT" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_IA32_DEBUG: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "IA32 " > + Build.Flags: "" > + Build.Target: "DEBUG" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_IA32_RELEASE: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "IA32 " > + Build.Flags: "" > + Build.Target: "RELEASE" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + EmulatorPkg_IA32_NOOPT: > + Build.File: "$(package)/PlatformCI/PlatformBuild.py" > + Build.Arch: "IA32 " > + Build.Flags: "" > + Build.Target: "NOOPT" > + Run.Flags: $(run_flags) > + Run: $(should_run) > + > + workspace: > + clean: all > + > + pool: > + vmImage: $(vm_image) > + > + steps: > + - template: ../../../.azurepipelines/templates/platform-build-run-steps.yml > + parameters: > + tool_chain_tag: VS2019 > + build_pkg: $(package) > + build_target: $(Build.Target) > + build_arch: $(Build.Arch) > + build_file: $(Build.File) > + build_flags: $(Build.Flags) > + run_flags: $(Run.Flags) > diff --git a/EmulatorPkg/PlatformCI/PlatformBuild.py b/EmulatorPkg/PlatformCI/PlatformBuild.py > new file mode 100644 > index 000000000000..6defbf6ef148 > --- /dev/null > +++ b/EmulatorPkg/PlatformCI/PlatformBuild.py > @@ -0,0 +1,272 @@ > +# @file > +# Script to Build EmulatorPkg UEFI firmware > +# > +# Copyright (c) Microsoft Corporation. > +# 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 > +from edk2toollib.utility_functions import GetHostInfo > + > +# ####################################################################################### # > +# Common Configuration # > +# ####################################################################################### # > + > + > +class CommonPlatform(): > + ''' Common settings for this platform. Define static data here and use > + for the different parts of stuart > + ''' > + PackagesSupported = ("EmulatorPkg",) > + ArchSupported = ("X64", "IA32") > + TargetsSupported = ("DEBUG", "RELEASE", "NOOPT") > + Scopes = ('emulatorpkg', 'edk2-build') > + WorkspaceRoot = os.path.realpath(os.path.join( > + os.path.dirname(os.path.abspath(__file__)), "..", "..")) > + > + # ####################################################################################### # > + # 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 (, ) > + ''' > + return (os.path.join("EmulatorPkg", "EmulatorPkg.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="X64", > + help="Optional - architecture to build. IA32 will use IA32 for Pei & Dxe. " > + "X64 will use X64 for both PEI and DXE.") > + > + def RetrieveCommandLineOptions(self, args): > + ''' Retrieve command line options from the argparser ''' > + > + shell_environment.GetBuildVars().SetValue( > + "TARGET_ARCH", args.build_arch.upper(), "From CmdLine") > + shell_environment.GetBuildVars().SetValue( > + "ACTIVE_PLATFORM", "EmulatorPkg/EmulatorPkg.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 "EmulatorPkg_With_Run" > + return "EmulatorPkg" > + > + 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", "EmulatorPkg", "Platform Hardcoded") > + self.env.SetValue("TOOL_CHAIN_TAG", "VS2019", "Default Toolchain") > + > + # Add support for using the correct Platform Headers, tools, and Libs based on emulator architecture > + # requested to be built when building VS2019 or VS2017 > + if self.env.GetValue("TOOL_CHAIN_TAG") == "VS2019" or self.env.GetValue("TOOL_CHAIN_TAG") == "VS2017": > + key = self.env.GetValue("TOOL_CHAIN_TAG") + "_HOST" > + if self.env.GetValue("TARGET_ARCH") == "IA32": > + shell_environment.ShellEnvironment().set_shell_var(key, "x86") > + elif self.env.GetValue("TARGET_ARCH") == "X64": > + shell_environment.ShellEnvironment().set_shell_var(key, "x64") > + > + # Add support for using the correct Platform Headers, tools, and Libs based on emulator architecture > + # requested to be built when building on linux. > + if GetHostInfo().os.upper() == "LINUX": > + self.ConfigureLinuxDLinkPath() > + > + if GetHostInfo().os.upper() == "WINDOWS": > + self.env.SetValue("BLD_*_WIN_HOST_BUILD", "TRUE", > + "Trigger Windows host build") > + > + self.env.SetValue("MAKE_STARTUP_NSH", "FALSE", "Default to false") > + > + # I don't see what this does but it is in build.sh > + key = "BLD_*_BUILD_" + self.env.GetValue("TARGET_ARCH") > + self.env.SetValue(key, "TRUE", "match script in build.sh") > + return 0 > + > + def PlatformPreBuild(self): > + return 0 > + > + def PlatformPostBuild(self): > + return 0 > + > + def FlashRomImage(self): > + ''' Use the FlashRom Function to run the emulator. This gives an easy stuart command line to > + activate the emulator. ''' > + > + OutputPath = os.path.join(self.env.GetValue( > + "BUILD_OUTPUT_BASE"), self.env.GetValue("TARGET_ARCH")) > + > + if (self.env.GetValue("MAKE_STARTUP_NSH") == "TRUE"): > + f = open(os.path.join(OutputPath, "startup.nsh"), "w") > + f.write("BOOT SUCCESS !!! \n") > + # add commands here > + f.write("reset\n") > + f.close() > + > + if GetHostInfo().os.upper() == "WINDOWS": > + cmd = "WinHost.exe" > + elif GetHostInfo().os.upper() == "LINUX": > + cmd = "./Host" > + else: > + logging.critical("Unsupported Host") > + return -1 > + return RunCmd(cmd, "", workingdir=OutputPath) > + > + def ConfigureLinuxDLinkPath(self): > + ''' > + logic copied from build.sh to setup the correct libraries > + ''' > + if self.env.GetValue("TARGET_ARCH") == "IA32": > + LIB_NAMES = ["ld-linux.so.2", "libdl.so.2 crt1.o", "crti.o crtn.o"] > + LIB_SEARCH_PATHS = ["/usr/lib/i386-linux-gnu", > + "/usr/lib32", "/lib32", "/usr/lib", "/lib"] > + elif self.env.GetValue("TARGET_ARCH") == "X64": > + LIB_NAMES = ["ld-linux-x86-64.so.2", > + "libdl.so.2", "crt1.o", "crti.o", "crtn.o"] > + LIB_SEARCH_PATHS = ["/usr/lib/x86_64-linux-gnu", > + "/usr/lib64", "/lib64", "/usr/lib", "/lib"] > + > + HOST_DLINK_PATHS = "" > + for lname in LIB_NAMES: > + logging.debug(f"Looking for {lname}") > + for dname in LIB_SEARCH_PATHS: > + logging.debug(f"In {dname}") > + if os.path.isfile(os.path.join(dname, lname)): > + logging.debug(f"Found {lname} in {dname}") > + HOST_DLINK_PATHS += os.path.join( > + os.path.join(dname, lname)) + os.pathsep > + break > + HOST_DLINK_PATHS = HOST_DLINK_PATHS.rstrip(os.pathsep) > + logging.critical(f"Setting HOST_DLINK_PATHS to {HOST_DLINK_PATHS}") > + shell_environment.ShellEnvironment().set_shell_var( > + "HOST_DLINK_PATHS", HOST_DLINK_PATHS) > diff --git a/EmulatorPkg/README.rst b/EmulatorPkg/README.rst > new file mode 100644 > index 000000000000..d1aa0a367965 > --- /dev/null > +++ b/EmulatorPkg/README.rst > @@ -0,0 +1,175 @@ > +=========== > +EmulatorPkg > +=========== > + > +This README.rst summarizes the current state of Azure DevOps Platform CI > +for EmulatorPkg. It also describes how to *build* EmulatorPkg locally using the > +Pytools build system. For general documentation on EmulatorPkg, refer > +to the `ReadMe <./Readme.md>`_. > + > +Platform CI Current Status > +--------------------------- > + > +IA32 Configuration > +`````````````````` > +=============== ============= ============= ============= > + Toolchain DEBUG RELEASE NOOPT > +=============== ============= ============= ============= > +`Win VS2019`_ |ap32d| |ap32r| |ap32n| > +`Ubuntu GCC5`_ |ap32du| |ap32ru| |ap32nu| > +=============== ============= ============= ============= > + > +|TCBZ_2668|_ - Ubuntu GCC5 Segfaults during execution. The builds > +only compile for Ubuntu GCC5 (not run to shell). > + > +X64 Configuration > +````````````````` > +=============== ============= ============= ============= > + Toolchain DEBUG RELEASE NOOPT > +=============== ============= ============= ============= > +`Win VS2019`_ |ap64d| |ap64r| |ap64n| > +`Ubuntu GCC5`_ |ap64du| |ap64ru| |ap64nu| > +=============== ============= ============= ============= > + > +|TCBZ_2639|_ - Ubuntu GCC5 Segfaults during execution. The builds > +only compile for Ubuntu GCC5 (not run to shell). > + > +Setup > +----- > + > +The Usual EDK2 Build Setup > +`````````````````````````` > + > +- `Python 3.8.x - Download & Install `_ > +- `GIT - Download & Install `_ > +- `GIT - Configure for EDK II `_ > +- `EDKII Source - Download/Checkout from Github systems#download>`_ > + > +**NOTE:** Do *not* follow the EDK II Compile Tools and Build instructions, see below... > + > +Install the necessary development packages for your distribution > +```````````````````````````````````````````````````````````````` > + > +This varies by distribution, toolchain, and your configuration but here are a few hints. > + > +* For building ARCH IA32 on X64 Ubuntu 18.04 LTS these steps where needed. > + > + .. code-block:: bash > + > + sudo dpkg --add-architecture i386 > + sudo apt-get update > + sudo apt-get install libc6-dev:i386 libx11-dev:i386 libxext-dev:i386 lib32gcc-7-dev > + > +* For building Basetools and other host applications > + > + .. code-block:: bash > + > + sudo apt-get update > + sudo apt-get install gcc g++ make uuid-dev > + > +Differences from EDK Classic Build Setup > +```````````````````````````````````````` > + > +- Build BaseTools using `python BaseTools/Edk2ToolsBuild.py [-t ]` > + > + - This replaces `edksetup Rebuild`" from the classic build system > + - For Windows `` examples, refer to `Windows ToolChain Matrix > `_, > + defaults to `VS2017` if not specified > + > +- **No Action:** edksetup, Submodule initialization and manual setup of NASM and iASL are **not** required, it is > + handled by the Pytools build system > + > +Install & Configure Pytools for EmulatorPkg > +``````````````````````````````````````````` > + > +* Install Pytools > + > + .. code-block:: bash > + > + pip install --upgrade -r pip-requirements.txt > + > +* Initialize & Update Submodules > + > + .. code-block:: bash > + > + stuart_setup -c EmulatorPkg/PlatformCI/PlatformBuild.py > + > +* Initialize & Update Dependencies (e.g. iASL & NASM) > + > + .. code-block:: bash > + > + stuart_update -c EmulatorPkg/PlatformCI/PlatformBuild.py > + > +* Compile (IA32 or X64 supported) > + > + .. code-block:: bash > + > + stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py [TOOL_CHAIN_TAG=] -a > + > +* Running Emulator > + > + - You can add `--FlashRom` to the end of your build command and the emulator will run after the build is complete. > + - or use the `--FlashOnly` feature to just run the emulator. > + > + .. code-block:: bash > + > + stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py TOOL_CHAIN_TAG= -a --FlashOnly > + > +**NOTE:** configuring ACTIVE_PLATFORM and TARGET_ARCH in Conf/target.txt is *not* required. > +This environment is set by PlatformBuild.py based upon the `[-a ]` parameter. > + > +Custom Build Options > +```````````````````` > + > +**MAKE_STARTUP_NSH=TRUE** will output a *startup.nsh* file to the location mapped as fs0. This is used in CI in > +combination with the `--FlashOnly` feature to run the emulator to the UEFI shell and then execute the > +contents of startup.nsh. > + > +Passing Build Defines > +````````````````````` > + > +To pass build defines through stuart_build, prepend `BLD_*_` to the define name and pass it on the command-line. > +stuart_build currently requires values to be assigned, so add a `=1` suffix for bare defines. > +For example, to enable the IP6 Network Stack, the stuart_build command-line would be: > + > +.. code-block:: bash > + > + stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py BLD_*_NETWORK_IP6_ENABLE=1 > + > +References > +---------- > + > +- `Installing Pytools `_ > +- For each workspace, consider creating & using a `Python Virtual Environment `_ > + > + * `Sample Layout process>`_ > + > +- `stuart_build commandline parser extensions/blob/56f6a7aee09995c2f22da4765e8b0a29c1cbf5de/edk2toolext/edk2_invocable.py#L109>`_ > + > + > +.. =================================================================== > +.. This is a bunch of directives to make the README file more readable > +.. =================================================================== > + > +.. |TCBZ_2668| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fimg.shields.io%2Fbugzilla%2F2668%3FbaseUrl%3Dhttps%253A%252F%252Fbugzilla.tianocore.org&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006138775&sdata=Y%2FkpWziEaD%2FNxg2xmR7qSAf%2BhYN0GjIl51fgyUwQF0c%3D&reserved=0 > +.. _TCBZ_2668: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2668&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006138775&sdata=8cQF13gRnPOWP2pXwq256rLl2wFdTMLiucd0Xt8544I%3D&reserved=0 > + > +.. |TCBZ_2639| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fimg.shields.io%2Fbugzilla%2F2639%3FbaseUrl%3Dhttps%253A%252F%252Fbugzilla.tianocore.org&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006138775&sdata=iBhLUOcFykBEvbC0C4ntnB7u5lX3pYW2DlQCGJoqeWE%3D&reserved=0 > +.. _TCBZ_2639: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2639&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=olU%2BBSw995DJFFjIwAa7IsEnrbwnwXDK1w1cNQ5cL6I%3D&reserved=0 > + > +.. _Win VS2019: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-play%2F_build%2Flatest%3FdefinitionId%3D40%26branchName%3Dmaster&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=ZcS35qz%2BxXUfOPWWxCUIOya1S0TkfnVbREQoVfIGLZ0%3D&reserved=0 > +.. _Ubuntu GCC5: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-play%2F_build%2Flatest%3FdefinitionId%3D39%26branchName%3Dmaster&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=M6PVd2dLSX5G9Nq0PI2YirmnB6n2Xf7n7goPSlnvtDs%3D&reserved=0 > + > +.. |ap32d| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branchName=master&jobName=Platform_CI&configurati > on=Platform_CI%20EmulatorPkg_IA32_DEBUG > +.. |ap32du| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_IA32_DEBUG > +.. |ap32r| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branchName=master&jobName=Platform_CI&configurati > on=Platform_CI%20EmulatorPkg_IA32_RELEASE > +.. |ap32ru| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_IA32_RELEASE > +.. |ap32n| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branchName=master&jobName=Platform_CI&configurati > on=Platform_CI%20EmulatorPkg_IA32_NOOPT > +.. |ap32nu| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_IA32_NOOPT > + > +.. |ap64d| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_X64_DEBUG > +.. |ap64du| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_X64_DEBUG > +.. |ap64r| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_X64_RELEASE > +.. |ap64ru| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_X64_RELEASE > +.. |ap64n| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_X64_NOOPT > +.. |ap64nu| image:: https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=02%7C01%7CBret.Barkelew%40microsoft.com%7Cda746308e0184e5d75fe08d7e601664b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230766006148770&sdata=uhKrJBCC8ADSD7gqXNrrPDtfltbqFAxbrt7w0DctFWw%3D&reserved=0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchName=master&jobName=Platform_CI&configuration= > Platform_CI%20EmulatorPkg_X64_NOOPT > -- > 2.16.3.windows.1 > > >