From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mx.groups.io with SMTP id smtpd.web10.636.1587480231357951672 for ; Tue, 21 Apr 2020 07:43:51 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.120, mailfrom: ray.ni@intel.com) IronPort-SDR: lvXJdF3+2lU12OxU3AyXpaQ5Dqe/Wkaeu31o4qt5i+LBQLETt6e39Ct2snD2qzbsTSIAxrs7QX YbrDeYwkqpwQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Apr 2020 07:43:50 -0700 IronPort-SDR: oDtK0WC3NJHttGz0Uztbiw2o+bjobIYnY92mFfOEqlKxr68A61w8cohHAQFe58VS+HQOLG+6WM MLQcaN9lvYKQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,410,1580803200"; d="scan'208";a="290482016" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by fmsmga002.fm.intel.com with ESMTP; 21 Apr 2020 07:43:50 -0700 Received: from fmsmsx157.amr.corp.intel.com (10.18.116.73) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 21 Apr 2020 07:43:33 -0700 Received: from shsmsx105.ccr.corp.intel.com (10.239.4.158) by FMSMSX157.amr.corp.intel.com (10.18.116.73) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 21 Apr 2020 07:43:32 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.225]) by SHSMSX105.ccr.corp.intel.com ([169.254.11.213]) with mapi id 14.03.0439.000; Tue, 21 Apr 2020 22:43:29 +0800 From: "Ni, Ray" To: "devel@edk2.groups.io" , "michael.kubacki@outlook.com" CC: "Justen, Jordan L" , Andrew Fish Subject: Re: [edk2-devel] [PATCH v2 3/6] EmulatorPkg: Add Platform CI and configuration for Core CI Thread-Topic: [edk2-devel] [PATCH v2 3/6] EmulatorPkg: Add Platform CI and configuration for Core CI Thread-Index: AQHWF0e9tZB2lxv+TE++Qe1N/c9B0KiDp9aw Date: Tue, 21 Apr 2020 14:43:29 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C506063@SHSMSX104.ccr.corp.intel.com> References: <20200420191216.24572-1-michael.kubacki@outlook.com> In-Reply-To: Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: ray.ni@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Acked-by: Ray Ni > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Michael K= ubacki > 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 co= nfiguration for Core CI >=20 > From: Sean Brogan >=20 > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2570 >=20 > 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 >=20 > 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(+) >=20 > diff --git a/EmulatorPkg/EmulatorPkg.ci.yaml b/EmulatorPkg/EmulatorPkg.c= i.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 er= rors > + "IgnoreFiles": [], # use gitignore syntax to ignore e= rrors in matching files > + "ExtendWords": [ > + "setjump", > + "plong", > + "lparam", > + "lpdword", > + "lpthread", > + "lresult", > + ], # words to extend to the dictionary for this packa= ge > + "IgnoreStandardPaths": [], # Standard Plugin defined paths th= at should be ignore > + "AdditionalIncludePaths": [] # Additional paths to spell check = (wildcards supported) > + } > +} > diff --git a/EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC5.yml b/Em= ulatorPkg/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=3DTRUE" > + > + #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-s= teps.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['Buil= d.Arch'], 'IA32'), succeeded()) > + - bash: sudo apt-get update > + displayName: do apt-get update > + condition: and(gt(variables.pkg_count, 0), eq(variables['Buil= d.Arch'], 'IA32'), succeeded()) > + - bash: sudo apt-get install libc6-dev:i386 libx11-dev:i386 lib= xext-dev:i386 lib32gcc-7-dev > + displayName: Add additional i386 packages > + condition: and(gt(variables.pkg_count, 0), eq(variables['Buil= d.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=3DTRUE" > + > + #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-s= teps.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/Platf= ormCI/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 BuildSettingsMan= ager > +from edk2toolext.invocables.edk2_setup import SetupSettingsManager, Req= uiredSubmodule > +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 =3D ("EmulatorPkg",) > + ArchSupported =3D ("X64", "IA32") > + TargetsSupported =3D ("DEBUG", "RELEASE", "NOOPT") > + Scopes =3D ('emulatorpkg', 'edk2-build') > + WorkspaceRoot =3D os.path.realpath(os.path.join( > + os.path.dirname(os.path.abspath(__file__)), "..", "..")) > + > + # #################################################################= ###################### # > + # Configuration for Update & Setup = # > + # #################################################################= ###################### # > + > + > +class SettingsManager(UpdateSettingsManager, SetupSettingsManager, PrEv= alSettingsManager): > + > + 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 bui= ld ''' > + 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 =3D [] > + # 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 i= n list. > + # The GetRequiredSubmodules is designed to allow a build to opt= imize > + # the desired submodules but it isn't necessary for this reposi= tory. > + result =3D io.StringIO() > + ret =3D RunCmd("git", "config --file .gitmodules --get-regexp p= ath", workingdir=3Dself.GetWorkspaceRoot(), > outstream=3Dresult) > + # Cmd output is expected to look like: > + # submodule.CryptoPkg/Library/OpensslLib/openssl.path CryptoPkg= /Library/OpensslLib/openssl > + # submodule.SoftFloat.path ArmPkg/Library/ArmSoftFloatLib/berke= ley-softfloat-3 > + if ret =3D=3D 0: > + for line in result.getvalue().splitlines(): > + _, _, path =3D 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 configu= re SettingsManager > + to run only the requested architectures. > + > + Raise Exception if a list_of_requested_architectures is not sup= ported > + ''' > + unsupported =3D set(list_of_requested_architectures) - \ > + set(self.GetArchitecturesSupported()) > + if(len(unsupported) > 0): > + errorString =3D ( > + "Unsupported Architecture Requested: " + " ".join(unsup= ported)) > + logging.critical(errorString) > + raise Exception(errorString) > + self.ActualArchitectures =3D list_of_requested_architectures > + > + def GetWorkspaceRoot(self): > + ''' get WorkspacePath ''' > + return CommonPlatform.WorkspaceRoot > + > + def GetActiveScopes(self): > + ''' return tuple containing scopes that should be active for th= is process ''' > + return CommonPlatform.Scopes > + > + def FilterPackagesToTest(self, changedFilesList: list, potentialPac= kagesList: 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 =3D [] > + possible_packages =3D 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 =3D possible_packages > + break > + # if the azure pipeline platform template file changed > + if "platform-build-run-steps.yml" in f: > + build_these_packages =3D 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=3D"build_arch", typ= e=3Dstr, default=3D"X64", > + help=3D"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 Cmd= Line") > + > + def GetWorkspaceRoot(self): > + ''' get WorkspacePath ''' > + return CommonPlatform.WorkspaceRoot > + > + def GetPackagesPath(self): > + ''' Return a list of workspace relative paths that should be ma= pped as edk2 PackagesPath ''' > + return () > + > + def GetActiveScopes(self): > + ''' return tuple containing scopes that should be active for th= is 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 fil= e. > + # this helps in CI so we don't overwrite the build log since ru= nning > + # uses the stuart_build command. > + if(shell_environment.GetBuildVars().GetValue("MAKE_STARTUP_NSH"= , "FALSE") =3D=3D "TRUE"): > + return "EmulatorPkg_With_Run" > + return "EmulatorPkg" > + > + def GetLoggingLevel(self, loggerType): > + ''' Get the logging level for a given type > + base =3D=3D lowest logging level supported > + con =3D=3D Screen logging > + txt =3D=3D plain text file logging > + md =3D=3D markdown file logging > + ''' > + return logging.DEBUG > + > + def SetPlatformEnv(self): > + logging.debug("PlatformBuilder SetPlatformEnv") > + self.env.SetValue("PRODUCT_NAME", "EmulatorPkg", "Platform Hard= coded") > + self.env.SetValue("TOOL_CHAIN_TAG", "VS2019", "Default Toolchai= n") > + > + # Add support for using the correct Platform Headers, tools, an= d Libs based on emulator architecture > + # requested to be built when building VS2019 or VS2017 > + if self.env.GetValue("TOOL_CHAIN_TAG") =3D=3D "VS2019" or self.= env.GetValue("TOOL_CHAIN_TAG") =3D=3D "VS2017": > + key =3D self.env.GetValue("TOOL_CHAIN_TAG") + "_HOST" > + if self.env.GetValue("TARGET_ARCH") =3D=3D "IA32": > + shell_environment.ShellEnvironment().set_shell_var(key,= "x86") > + elif self.env.GetValue("TARGET_ARCH") =3D=3D "X64": > + shell_environment.ShellEnvironment().set_shell_var(key,= "x64") > + > + # Add support for using the correct Platform Headers, tools, an= d Libs based on emulator architecture > + # requested to be built when building on linux. > + if GetHostInfo().os.upper() =3D=3D "LINUX": > + self.ConfigureLinuxDLinkPath() > + > + if GetHostInfo().os.upper() =3D=3D "WINDOWS": > + self.env.SetValue("BLD_*_WIN_HOST_BUILD", "TRUE", > + "Trigger Windows host build") > + > + self.env.SetValue("MAKE_STARTUP_NSH", "FALSE", "Default to fals= e") > + > + # I don't see what this does but it is in build.sh > + key =3D "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 =3D os.path.join(self.env.GetValue( > + "BUILD_OUTPUT_BASE"), self.env.GetValue("TARGET_ARCH")) > + > + if (self.env.GetValue("MAKE_STARTUP_NSH") =3D=3D "TRUE"): > + f =3D 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() =3D=3D "WINDOWS": > + cmd =3D "WinHost.exe" > + elif GetHostInfo().os.upper() =3D=3D "LINUX": > + cmd =3D "./Host" > + else: > + logging.critical("Unsupported Host") > + return -1 > + return RunCmd(cmd, "", workingdir=3DOutputPath) > + > + def ConfigureLinuxDLinkPath(self): > + ''' > + logic copied from build.sh to setup the correct libraries > + ''' > + if self.env.GetValue("TARGET_ARCH") =3D=3D "IA32": > + LIB_NAMES =3D ["ld-linux.so.2", "libdl.so.2 crt1.o", "crti.= o crtn.o"] > + LIB_SEARCH_PATHS =3D ["/usr/lib/i386-linux-gnu", > + "/usr/lib32", "/lib32", "/usr/lib", "/l= ib"] > + elif self.env.GetValue("TARGET_ARCH") =3D=3D "X64": > + LIB_NAMES =3D ["ld-linux-x86-64.so.2", > + "libdl.so.2", "crt1.o", "crti.o", "crtn.o"] > + LIB_SEARCH_PATHS =3D ["/usr/lib/x86_64-linux-gnu", > + "/usr/lib64", "/lib64", "/usr/lib", "/l= ib"] > + > + HOST_DLINK_PATHS =3D "" > + 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 +=3D os.path.join( > + os.path.join(dname, lname)) + os.pathsep > + break > + HOST_DLINK_PATHS =3D HOST_DLINK_PATHS.rstrip(os.pathsep) > + logging.critical(f"Setting HOST_DLINK_PATHS to {HOST_DLINK_PATH= S}") > + 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 @@ > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > +EmulatorPkg > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + > +This README.rst summarizes the current state of Azure DevOps Platform C= I > +for EmulatorPkg. It also describes how to *build* EmulatorPkg locally u= sing the > +Pytools build system. For general documentation on EmulatorPkg, refer > +to the `ReadMe <./Readme.md>`_. > + > +Platform CI Current Status > +--------------------------- > + > +IA32 Configuration > +`````````````````` > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D > + Toolchain DEBUG RELEASE NOOPT > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D > +`Win VS2019`_ |ap32d| |ap32r| |ap32n| > +`Ubuntu GCC5`_ |ap32du| |ap32ru| |ap32nu| > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D > + > +|TCBZ_2668|_ - Ubuntu GCC5 Segfaults during execution. The builds > +only compile for Ubuntu GCC5 (not run to shell). > + > +X64 Configuration > +````````````````` > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D > + Toolchain DEBUG RELEASE NOOPT > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D > +`Win VS2019`_ |ap64d| |ap64r| |ap64n| > +`Ubuntu GCC5`_ |ap64du| |ap64ru| |ap64nu| > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D > + > +|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 instructio= ns, 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 need= ed. > + > + .. code-block:: bash > + > + sudo dpkg --add-architecture i386 > + sudo apt-get update > + sudo apt-get install libc6-dev:i386 libx11-dev:i386 libxext-dev:i38= 6 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=3D] -a > + > +* Running Emulator > + > + - You can add `--FlashRom` to the end of your build command and the e= mulator 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=3D -a - > -FlashOnly > + > +**NOTE:** configuring ACTIVE_PLATFORM and TARGET_ARCH in Conf/target.tx= t is *not* required. > +This environment is set by PlatformBuild.py based upon the `[-a ]` parameter. > + > +Custom Build Options > +```````````````````` > + > +**MAKE_STARTUP_NSH=3DTRUE** will output a *startup.nsh* file to the loc= ation mapped as fs0. This is used in CI in > +combination with the `--FlashOnly` feature to run the emulator to the U= EFI shell and then execute the > +contents of startup.nsh. > + > +Passing Build Defines > +````````````````````` > + > +To pass build defines through stuart_build, prepend `BLD_*_` to the def= ine name and pass it on the command-line. > +stuart_build currently requires values to be assigned, so add a `=3D1` = 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=3D1 > + > +References > +---------- > + > +- `Installing Pytools `_ > +- For each workspace, consider creating & using a `Python Virtual Envir= onment > `_ > + > + * `Sample Layout setup-process>`_ > + > +- `stuart_build commandline parser extensions/blob/56f6a7aee09995c2f22da4765e8b0a29c1cbf5de/edk2toolext/edk= 2_invocable.py#L109>`_ > + > + > +.. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > +.. This is a bunch of directives to make the README file more readable > +.. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + > +.. |TCBZ_2668| image:: https://img.shields.io/bugzilla/2668?baseUrl=3Dh= ttps%3A%2F%2Fbugzilla.tianocore.org > +.. _TCBZ_2668: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2668 > + > +.. |TCBZ_2639| image:: https://img.shields.io/bugzilla/2639?baseUrl=3Dh= ttps%3A%2F%2Fbugzilla.tianocore.org > +.. _TCBZ_2639: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2639 > + > +.. _Win VS2019: https://dev.azure.com/tianocore/edk2-ci-play/_build/la= test?definitionId=3D40&branchName=3Dmaster > +.. _Ubuntu GCC5: https://dev.azure.com/tianocore/edk2-ci-play/_build/la= test?definitionId=3D39&branchName=3Dmaster > + > +.. |ap32d| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branc= hName=3Dmaster&jobName=3DPlatform_CI& > configuration=3DPlatform_CI%20EmulatorPkg_IA32_DEBUG > +.. |ap32du| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_IA32_DEBUG > +.. |ap32r| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branc= hName=3Dmaster&jobName=3DPlatform_CI& > configuration=3DPlatform_CI%20EmulatorPkg_IA32_RELEASE > +.. |ap32ru| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_IA32_RELEASE > +.. |ap32n| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branc= hName=3Dmaster&jobName=3DPlatform_CI& > configuration=3DPlatform_CI%20EmulatorPkg_IA32_NOOPT > +.. |ap32nu| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_IA32_NOOPT > + > +.. |ap64d| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_DEBUG > +.. |ap64du| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_DEBUG > +.. |ap64r| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_RELEASE > +.. |ap64ru| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_RELEASE > +.. |ap64n| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_NOOPT > +.. |ap64nu| image:: https://dev.azure.com/tianocore/edk2-ci- > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_NOOPT > -- > 2.16.3.windows.1 >=20 >=20 >=20