From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (NAM10-DM6-obe.outbound.protection.outlook.com [40.107.93.117]) by mx.groups.io with SMTP id smtpd.web10.357.1587759706352970634 for ; Fri, 24 Apr 2020 13:21:46 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@microsoft.com header.s=selector2 header.b=BvN/7Kr4; spf=pass (domain: microsoft.com, ip: 40.107.93.117, mailfrom: bret.barkelew@microsoft.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Tn+dcYx+rOT5Z7REXlsO+l1v06QguoozRYii3GHLtJqOYL9dqhpr7YksjYDbon/sYyrh4eTGPHn+SvxAt8LDyGRHFGvsfTlj3AI3DNSvl/wm1PSh7Lbuvp2evS0aRIMnUpPWXD+QNv425duCMbUJ4yFoyHk50RtC4K3cfBB1r8Tcp2XCm0McMoXfIJOOTt5zFNZ1hibIATZFNkGPNvJitx+QJUv+1p2/tAHSERmeS1ee+VllYMbOv42k0uLdW3SZWwsFj7FYxj3w9SfQn+iVS8veiaInVUr221nAe5To6LMr3orfpffli0tXsi7JDPxP8K7bDdYhNYSnQKwfvHOo4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=v810eXXRox0w9W3LrXDWubox/smcadtJCmiG8FzQo9Y=; b=bPDI6QHGxPjnSANgAQQyZJuQfuzIC6syi+DRarcmSRmNNRtiGDOy8RrlSQfPs2hC008mbuRLDhJVkiIbiQ8I5lKIub9Ah9t0mPwBsS+BvdM+5xNWWBDgkjboK97eQFEfffgISzYA3Wg47WQUGzNnKFzIqirOxXPk2hOIpFWY2ktaYNQrvb6bGz8HLGpPdOxsTGCms/uzBGZCR8EnN3FQYwu1ko3Zp47ef0CUq+HmVgckT0iUgA7GR2or+49EuTL0fK4NdH1iNdb1/PgsZKINQe0psLGmvlTWgamUwls4H0haZeggB4ZQP0lqpQR2jT/Htaco/gKVRJNmOshMvqxEYw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microsoft.com; dmarc=pass action=none header.from=microsoft.com; dkim=pass header.d=microsoft.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=v810eXXRox0w9W3LrXDWubox/smcadtJCmiG8FzQo9Y=; b=BvN/7Kr4JTFAtqaDH4r5h7fIY3RXOioqnj9o+MLet6RlOeOs/CXJVqcdANIWo5c34eryNIcBaxwNNX4AsJoIsyLNE58WyC/vJY53u1e3OIWk5CSrt/4ffHzqeVVEMcZU74t3heUhdm3IiRv2dADwhRd3bN/ZhuHAIsCKAEWnyGM= Received: from CY4PR21MB0743.namprd21.prod.outlook.com (2603:10b6:903:b2::9) by CY4PR21MB1538.namprd21.prod.outlook.com (2603:10b6:910:8f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2958.2; Fri, 24 Apr 2020 20:21:44 +0000 Received: from CY4PR21MB0743.namprd21.prod.outlook.com ([fe80::90d:10d9:c5bc:5318]) by CY4PR21MB0743.namprd21.prod.outlook.com ([fe80::90d:10d9:c5bc:5318%12]) with mapi id 15.20.2958.010; Fri, 24 Apr 2020 20:21:44 +0000 From: "Bret Barkelew" To: "devel@edk2.groups.io" , "ray.ni@intel.com" , "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: AQHWF+tIjNKeq3xvzE2NpfDESAaE4KiIvBZd Date: Fri, 24 Apr 2020 20:21:44 +0000 Message-ID: References: <20200420191216.24572-1-michael.kubacki@outlook.com> ,<734D49CCEBEEF84792F5B80ED585239D5C506063@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5C506063@SHSMSX104.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Enabled=True;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SiteId=72f988bf-86f1-41af-91ab-2d7cd011db47;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_SetDate=2020-04-24T20:21:39.8732813Z;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_ContentBits=0;MSIP_Label_f42aa342-8706-4288-bd11-ebb85995028c_Method=Privileged authentication-results: spf=none (sender IP is ) smtp.mailfrom=Bret.Barkelew@microsoft.com; x-originating-ip: [174.21.83.205] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: c43b96ce-9760-4f7a-447d-08d7e88d1b40 x-ms-traffictypediagnostic: CY4PR21MB1538: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:1303; x-forefront-prvs: 03838E948C x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CY4PR21MB0743.namprd21.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(4636009)(396003)(346002)(366004)(376002)(136003)(39860400002)(82950400001)(66476007)(60390400001)(66446008)(64756008)(66556008)(55016002)(66946007)(110136005)(54906003)(8936002)(316002)(83080400001)(4326008)(82960400001)(81156014)(33656002)(2906002)(26005)(8990500004)(186003)(966005)(9686003)(19627235002)(18265965003)(478600001)(5660300002)(30864003)(7696005)(76116006)(86362001)(8676002)(6506007)(52536014)(10290500003)(71200400001)(53546011)(579004)(559001)(460985005);DIR:OUT;SFP:1102; received-spf: None (protection.outlook.com: microsoft.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: +HWJiyAOs4lJo6VaUHo5KQwNJA5Wk3bwKHXp60Mx3VAUgq/WKkldpo0pElmTAWmjTpR4NSYczbJQRigRj5XggGBcS4gIGA7LTwcUx6C6m70x3DHLrVNOUXl3RWd3zvieDZnF2G+5dk6vr4Cl3sSOkN03uEnC5By50ggu9LXZvg31/uDhDxmyAfmcVZGuyw5ZNUQ9EvLS/+WKu0YPyCGESEqjKuyx1MDmrCaf7NlOuRWcgbcmSdHoxcleGiUoaheuxqYJ1bBzc2SS1AaKT1Ata1gfOU5U95YzWFquflr1EBaF6ytCAdunHbWTexUqmBJ4cPyJkwyuYQWaVJ1lawkJGpS269LPOXlTKMvCT2sevcuXzhLxd0yBoD8yUG9ExlPNbQLFyWix9DWHJ4jnC01gO/M2v56F9VbU7tARaoIQERXeEoXDezbuj+Vi3TLwbwINqxGsuVq/f/f2ZQ0I8AYr7vExrrGwacnznChzQZq3lNg8JTei2BwodrQE2tSdp565q5K5/y5sS5GKpc+lzmSRdMM5IR1iTK+g8wU0zgBmkICfLNXJmMErjGri9RZa71xKsVukhV4awecRCjMeGnSTysMDv4L+EEEnQCMzIocPW34= x-ms-exchange-antispam-messagedata: ehRvdd3luNspEEgOhUcJueWYs6mzgnxEU7xpx5oQW52iAUE693naDD79zTcb/KRJeSqljuq+LF0jNkWLq1+h/uJVJKf7WflYRMNi4FxI6aHLwIED5y6Gs/ifaH02EYa1sn59AVsoERVQJ/cTa3/E9cxeVrUjSPLOj721UAC5cKCMTJkJvixvtzalsS6qihHfI1bBYdDsBjaKOzbv8TlPc1I2VCI7I2gpVZODDrTtNTNMgM7ncEVCRvAKWF8j37DZ/JmOoGBEVjgyck9fttPRDxuwn8BTOPJFPKqMDvzWd9mhMhzB/YKvVw6PnKIQ09E99970ikERQTyEWxw+fEmuex9vYSU6WawRuHNZGocODzwxvUiHxRtuhqdK17Q71IP25v4Y7F7xXc7Dnml6XoBGWm9ETTW6qJc8UKflBMjWtoXn6oM0hbDV5fo1AHlITNWbjBtymBwUOeoOHuih7FQDDWe3TzD44O8Ju0jcHqycqPUDNCucywOCirhSfR+fb1JWdwI4AsAuV72H5jfR21UawafjFe7bDJ+vxxSzvvXv64zDtm8YAG0KcZnkpen+yy9rcwyN2t96T4PscwAEQp21BqKYFZKwaqHPbPPpL+Zcarh+/ZVP13u81DE7nt6F0YPmEsqssAkGfh8o7cg+tVJ+j/lktUYeFKYqJFLWYXXxxkwT2fOGVL3sg9VLLwOdfd/+Fk/qqJH+Lsc2ogJTCFrMRvFJ8741Mjkl0yBycUF86rZf09dEDA8YTCkeKcrWyOreFwPqcyfc1M6KEFjemhAfUGdk/yTM0Q892u2ponDshMM= x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-Network-Message-Id: c43b96ce-9760-4f7a-447d-08d7e88d1b40 X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Apr 2020 20:21:44.0504 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 11LnecNaW49Jt57aJ+JAaCgfzx8URnq7mX3QLZZwW8RGN3RiHiqjnTSZ6Y/X0cxVDvM9hmvh27oXmPfrmSE4gw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR21MB1538 Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_CY4PR21MB07433764E011757CC39DB1E4EFD00CY4PR21MB0743namp_" --_000_CY4PR21MB07433764E011757CC39DB1E4EFD00CY4PR21MB0743namp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Bret Barkelew - Bret ________________________________ From: devel@edk2.groups.io on behalf of Ni, Ray via= groups.io Sent: Tuesday, April 21, 2020 7:43:29 AM To: devel@edk2.groups.io ; michael.kubacki@outlook.c= om Cc: Justen, Jordan L ; Andrew Fish Subject: [EXTERNAL] Re: [edk2-devel] [PATCH v2 3/6] EmulatorPkg: Add Platf= orm CI and configuration for Core CI 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 > > From: Sean Brogan > > REF:https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2F= bugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2570&data=3D02%7C01%7CBret= .Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f1= 41af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&sdata=3DJvB7nU6x2k0pB= ImPCBErmajsH%2B%2FVfbZdrVV%2BZlKfwL0%3D&reserved=3D0 > > 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.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://nam06.safelinks.protection.outlook.com/?= url=3Dhttps%3A%2F%2Fimg.shields.io%2Fbugzilla%2F2668%3FbaseUrl%3Dhttps%253A= %252F%252Fbugzilla.tianocore.org&data=3D02%7C01%7CBret.Barkelew%40micro= soft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011d= b47%7C1%7C0%7C637230770344287401&sdata=3D6iEnYBmAs18nzJ62x2Ak60wBDE0VrR= NiQXFu6ZLHvhI%3D&reserved=3D0 > +.. _TCBZ_2668: https://nam06.safelinks.protection.outlook.com/?url=3Dht= tps%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2668&data=3D02= %7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C= 72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&sdata=3DO= w3JWtPspqE6GYD%2BUrxa0UWarmRUfE8kRQDL5LofMxA%3D&reserved=3D0 > + > +.. |TCBZ_2639| image:: https://nam06.safelinks.protection.outlook.com/?= url=3Dhttps%3A%2F%2Fimg.shields.io%2Fbugzilla%2F2639%3FbaseUrl%3Dhttps%253A= %252F%252Fbugzilla.tianocore.org&data=3D02%7C01%7CBret.Barkelew%40micro= soft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011d= b47%7C1%7C0%7C637230770344287401&sdata=3Dc893bcidlionAC%2FJzdpv0Alw6lSr= 6yYZe40OsfdcdoI%3D&reserved=3D0 > +.. _TCBZ_2639: https://nam06.safelinks.protection.outlook.com/?url=3Dht= tps%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2639&data=3D02= %7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C= 72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3Dt= WjybrNQ%2F9vWty6iiVRzZX8wU1v7OYTxCfMU6A7BDLc%3D&reserved=3D0 > + > +.. _Win VS2019: https://nam06.safelinks.protection.outlook.com/?url=3D= https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-play%2F_build%2Flatest%3F= definitionId%3D40%26branchName%3Dmaster&data=3D02%7C01%7CBret.Barkelew%= 40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d= 7cd011db47%7C1%7C0%7C637230770344297383&sdata=3Dm3nzV%2BgjDym6nfIb%2Baw= SDhjMqUarBd52ibHYwYQv%2Fu0%3D&reserved=3D0 > +.. _Ubuntu GCC5: https://nam06.safelinks.protection.outlook.com/?url=3D= https%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-play%2F_build%2Flatest%3F= definitionId%3D39%26branchName%3Dmaster&data=3D02%7C01%7CBret.Barkelew%= 40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d= 7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DkN6eOFHL761YeuxmVT%2F7I= BSc650ZpOmrERK3h4K8Mik%3D&reserved=3D0 > + > +.. |ap32d| image:: https://nam06.safelinks.protection.outlook.com/?url= =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branc= hName=3Dmaster&jobName=3DPlatform_CI& > configuration=3DPlatform_CI%20EmulatorPkg_IA32_DEBUG > +.. |ap32du| image:: https://nam06.safelinks.protection.outlook.com/?url= = =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_IA32_DEBUG > +.. |ap32r| image:: https://nam06.safelinks.protection.outlook.com/?url= =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branc= hName=3Dmaster&jobName=3DPlatform_CI& > configuration=3DPlatform_CI%20EmulatorPkg_IA32_RELEASE > +.. |ap32ru| image:: https://nam06.safelinks.protection.outlook.com/?url= = =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_IA32_RELEASE > +.. |ap32n| image:: https://nam06.safelinks.protection.outlook.com/?url= =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?branc= hName=3Dmaster&jobName=3DPlatform_CI& > configuration=3DPlatform_CI%20EmulatorPkg_IA32_NOOPT > +.. |ap32nu| image:: https://nam06.safelinks.protection.outlook.com/?url= = =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_IA32_NOOPT > + > +.. |ap64d| image:: https://nam06.safelinks.protection.outlook.com/?url= =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_DEBUG > +.. |ap64du| image:: https://nam06.safelinks.protection.outlook.com/?url= = =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_DEBUG > +.. |ap64r| image:: https://nam06.safelinks.protection.outlook.com/?url= =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_RELEASE > +.. |ap64ru| image:: https://nam06.safelinks.protection.outlook.com/?url= = =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_RELEASE > +.. |ap64n| image:: https://nam06.safelinks.protection.outlook.com/?url= =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branchNa= me=3Dmaster&jobName=3DPlatform_CI&con > figuration=3DPlatform_CI%20EmulatorPkg_X64_NOOPT > +.. |ap64nu| image:: https://nam06.safelinks.protection.outlook.com/?url= = =3Dhttps%3A%2F%2Fdev.azure.com%2Ftianocore%2Fedk2-ci-&data=3D02%7C01%7= CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988b= f86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&sdata=3DjZPE0l0C= Lb635yfNSIZrIycrNbvUjb%2BUgN%2Fmtrcozvw%3D&reserved=3D0 > 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 > > > --_000_CY4PR21MB07433764E011757CC39DB1E4EFD00CY4PR21MB0743namp_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Reviewed-by: Bret Barkelew <bret.barkelew@micros= oft.com>

 

- Bret

 


From: devel@edk2.groups.io= <devel@edk2.groups.io> on behalf of Ni, Ray via groups.io <ray.ni= = =3Dintel.com@groups.io>
Sent: Tuesday, April 21, 2020 7:43:29 AM
To: devel@edk2.groups.io <devel@edk2.groups.io>; michael.kuba= cki@outlook.com <michael.kubacki@outlook.com>
Cc: Justen, Jordan L <jordan.l.justen@intel.com>; Andrew Fish= <afish@apple.com>
Subject: [EXTERNAL] Re: [edk2-devel] [PATCH v2 3/6] EmulatorPkg: Ad= d Platform CI and configuration for Core CI
 
Acked-by: Ray Ni <ray.ni@intel.com>

> -----Original Message-----
> From: devel@edk2.groups.io <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 <jordan.l.justen@intel.com>; Andrew Fish &= lt;afish@apple.com>; Ni, Ray <ray.ni@intel.com>
> Subject: [edk2-devel] [PATCH v2 3/6] EmulatorPkg: Add Platform CI and= configuration for Core CI
>
> From: Sean Brogan <sean.brogan@microsoft.com>
>
> REF:https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F= %2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2570&amp;data=3D02%7C01= %7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f98= 8bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&amp;sdata=3DJv= B7nU6x2k0pBImPCBErmajsH%2B%2FVfbZdrVV%2BZlKfwL0%3D&amp;reserved=3D0
>
> 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 <jordan.l.justen@intel.com>
> Cc: Andrew Fish <afish@apple.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Signed-off-by: Sean Brogan <sean.brogan@microsoft.com>
> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com><= br> > ---
>  EmulatorPkg/EmulatorPkg.ci.yaml     &n= bsp;            = ;         |  85 +++= ;+++
>  EmulatorPkg/PlatformCI/.azurepipelines/Ubuntu-GCC5.yml &nb= sp;  |  95 +++++++
>  EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS2019.yml |&nbs= p; 85 ++++++
>  EmulatorPkg/PlatformCI/PlatformBuild.py    =             &nb= sp;  | 272 ++++++++++++= ;++++++++
>  EmulatorPkg/README.rst       = ;            &n= bsp;            = ;    | 175 ++++++++++= ;+++
>  5 files changed, 712 insertions(+)
>
> diff --git a/EmulatorPkg/EmulatorPkg.ci.yaml b/EmulatorPkg/EmulatorPk= g.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<= br> > +# used for code analysis.
> +#
> +# Copyright (c) Microsoft Corporation
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +##
> +{
> +    ## options defined .pytool/Plugin/CompilerPlu= gin
> +    "CompilerPlugin": {
> +        "DscPath": = "" # Don't support this test
> +    },
> +
> +    ## options defined .pytool/Plugin/HostUnitTes= tCompilerPlugin
> +    "HostUnitTestCompilerPlugin": {
> +        "DscPath": = "" # Don't support this test
> +    },
> +
> +    ## options defined .pytool/Plugin/CharEncodin= gCheck
> +    "CharEncodingCheck": {
> +        "IgnoreFiles&quo= t;: []
> +    },
> +
> +    ## options defined .pytool/Plugin/DependencyC= heck
> +    "DependencyCheck": {
> +        "AcceptableDepen= dencies": [
> +          &nbs= p; # For this platform all packages are allowed???
> +          &nbs= p; "MdePkg/MdePkg.dec",
> +          &nbs= p; "MdeModulePkg/MdeModulePkg.dec",
> +          &nbs= p; "EmulatorPkg/EmulatorPkg.dec",
> +          &nbs= p; "NetworkPkg/NetworkPkg.dec",
> +          &nbs= p; "EmbeddedPkg/EmbeddedPkg.dec", ## is this one OK??
> +        ],
> +        # For host based unit= tests
> +        "AcceptableDepen= dencies-HOST_APPLICATION":[
> +          &nbs= p; "UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec"
> +        ],
> +        # For UEFI shell base= d apps
> +        "AcceptableDepen= dencies-UEFI_APPLICATION":[],
> +        "IgnoreInf"= : []
> +    },
> +
> +    ## options defined .pytool/Plugin/DscComplete= Check
> +    "DscCompleteCheck": {
> +        "IgnoreInf"= : [""],
> +        "DscPath": = ""  # Don't support this test
> +    },
> +
> +    ## options defined .pytool/Plugin/HostUnitTes= tDscCompleteCheck
> +    "HostUnitTestDscCompleteCheck": { > +        "IgnoreInf"= : [""],
> +        "DscPath": = "" # Don't support this test
> +    },
> +
> +    ## options defined .pytool/Plugin/GuidCheck > +    "GuidCheck": {
> +        "IgnoreGuidName&= quot;: [],
> +        "IgnoreGuidValue= ": [],
> +        "IgnoreFoldersAn= dFiles": [],
> +        "IgnoreDuplicate= s": [],
> +    },
> +
> +    ## options defined .pytool/Plugin/LibraryClas= sCheck
> +    "LibraryClassCheck": {
> +        "IgnoreHeaderFil= e": []
> +    },
> +
> +    ## options defined .pytool/Plugin/SpellCheck<= br> > +    "SpellCheck": {
> +        "AuditOnly"= : True,           # Fails= right now with over 270 errors
> +        "IgnoreFiles&quo= t;: [],           # use g= itignore syntax to ignore errors in matching files
> +        "ExtendWords&quo= t;: [
> +          &nbs= p; "setjump",
> +          &nbs= p; "plong",
> +          &nbs= p; "lparam",
> +          &nbs= p; "lpdword",
> +          &nbs= p; "lpthread",
> +          &nbs= p; "lresult",
> +        ],   &= nbsp;       # words to extend to the dictiona= ry for this package
> +        "IgnoreStandardP= aths": [],   # Standard Plugin defined paths that should be = ignore
> +        "AdditionalInclu= dePaths": [] # 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= = =3DTRUE"
> +
> +    #Use matrix to speed up the build process
> +    strategy:
> +        matrix:
> +          EmulatorP= kg_X64_DEBUG:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "X64"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "DEBUG"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_X64_RELEASE:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "X64"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "RELEASE"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_X64_NOOPT:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "X64"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "NOOPT"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_IA32_DEBUG:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "IA32"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "DEBUG"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_IA32_RELEASE:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "IA32"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "RELEASE"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_IA32_NOOPT:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "IA32"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "NOOPT"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +
> +    workspace:
> +      clean: all
> +
> +    pool:
> +      vmImage: $(vm_image)
> +
> +    steps:
> +    - template: ../../../.azurepipelines/template= s/platform-build-run-steps.yml
> +      parameters:
> +        tool_chain_tag: GCC5<= br> > +        build_pkg: $(package)=
> +        build_target: $(Build= .Target)
> +        build_arch: $(Build.A= rch)
> +        build_file: $(Build.F= ile)
> +        build_flags: $(Build.= Flags)
> +        run_flags: $(Run.Flag= s)
> +        # Add steps to instal= l some IA32 only dependencies
> +        extra_install_step: > +        - bash: sudo dpkg --a= dd-architecture i386
> +          displayNa= me: Add i386 to dpkg
> +          condition= : and(gt(variables.pkg_count, 0), eq(variables['Build.Arch'], 'IA32'), succ= eeded())
> +        - bash: sudo apt-get = update
> +          displayNa= me: do apt-get update
> +          condition= : and(gt(variables.pkg_count, 0), eq(variables['Build.Arch'], 'IA32'), succ= eeded())
> +        - bash: sudo apt-get = install libc6-dev:i386 libx11-dev:i386 libxext-dev:i386 lib32gcc-7-dev
> +          displayNa= me: Add additional i386 packages
> +          condition= : and(gt(variables.pkg_count, 0), eq(variables['Build.Arch'], 'IA32'), succ= eeded())
> diff --git a/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS2019.ym= l
> b/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS2019.yml
> new file mode 100644
> index 000000000000..a5baf4b6064b
> --- /dev/null
> +++ b/EmulatorPkg/PlatformCI/.azurepipelines/Windows-VS20= 19.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:
> +          EmulatorP= kg_X64_DEBUG:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "X64"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "DEBUG"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_X64_RELEASE:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "X64"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "RELEASE"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_X64_NOOPT:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "X64"
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "NOOPT"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_IA32_DEBUG:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "IA32 "
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "DEBUG"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_IA32_RELEASE:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "IA32 "
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "RELEASE"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +          EmulatorP= kg_IA32_NOOPT:
> +          &nbs= p; Build.File: "$(package)/PlatformCI/PlatformBuild.py"
> +          &nbs= p; Build.Arch: "IA32 "
> +          &nbs= p; Build.Flags: ""
> +          &nbs= p; Build.Target: "NOOPT"
> +          &nbs= p; Run.Flags: $(run_flags)
> +          &nbs= p; Run: $(should_run)
> +
> +    workspace:
> +      clean: all
> +
> +    pool:
> +      vmImage: $(vm_image)
> +
> +    steps:
> +    - template: ../../../.azurepipelines/template= s/platform-build-run-steps.yml
> +      parameters:
> +        tool_chain_tag: VS201= 9
> +        build_pkg: $(package)=
> +        build_target: $(Build= .Target)
> +        build_arch: $(Build.A= rch)
> +        build_file: $(Build.F= ile)
> +        build_flags: $(Build.= Flags)
> +        run_flags: $(Run.Flag= s)
> diff --git a/EmulatorPkg/PlatformCI/PlatformBuild.py b/EmulatorPkg/Pl= atformCI/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 BuildSett= ingsManager
> +from edk2toolext.invocables.edk2_setup import SetupSettingsManag= er, RequiredSubmodule
> +from edk2toolext.invocables.edk2_update import UpdateSettingsMan= ager
> +from edk2toolext.invocables.edk2_pr_eval import PrEvalSettingsMa= nager
> +from edk2toollib.utility_functions import RunCmd
> +from edk2toollib.utility_functions import GetHostInfo
> +
> +# ##############################################################= ######################### #
> +#          &nb= sp;            =          Common Configuration =             &nb= sp;            =            #
> +# ##############################################################= ######################### #
> +
> +
> +class CommonPlatform():
> +    ''' Common settings for this platform.  = Define static data here and use
> +        for the different par= ts of stuart
> +    '''
> +    PackagesSupported =3D ("EmulatorPkg"= ;,)
> +    ArchSupported =3D ("X64", "IA3= 2")
> +    TargetsSupported =3D ("DEBUG", &quo= t;RELEASE", "NOOPT")
> +    Scopes =3D ('emulatorpkg', 'edk2-build')
> +    WorkspaceRoot =3D os.path.realpath(os.path.jo= in(
> +        os.path.dirname(os.pa= th.abspath(__file__)), "..", ".."))
> +
> +    # ###########################################= ############################################ #
> +    #       &n= bsp;            = ;     Configuration for Update & Setup  &= nbsp;           &nbs= p;            &= nbsp;    #
> +    # ###########################################= ############################################ #
> +
> +
> +class SettingsManager(UpdateSettingsManager, SetupSettingsManage= r, PrEvalSettingsManager):
> +
> +    def GetPackagesSupported(self):
> +        ''' return iterable o= f edk2 packages supported by this build.
> +        These should be edk2 = workspace relative paths '''
> +        return CommonPlatform= .PackagesSupported
> +
> +    def GetArchitecturesSupported(self):
> +        ''' return iterable o= f edk2 architectures supported by this build '''
> +        return CommonPlatform= .ArchSupported
> +
> +    def GetTargetsSupported(self):
> +        ''' return iterable o= f edk2 target tags supported by this build '''
> +        return CommonPlatform= .TargetsSupported
> +
> +    def GetRequiredSubmodules(self):
> +        ''' return iterable c= ontaining RequiredSubmodule objects.
> +        If no RequiredSubmodu= les return an empty iterable
> +        '''
> +        rs =3D []
> +        # intentionally decla= re this one with recursive false to avoid overhead
> +        rs.append(RequiredSub= module(
> +          &nbs= p; "CryptoPkg/Library/OpensslLib/openssl", False))
> +
> +        # To avoid maintenanc= e of this file for every new submodule
> +        # lets just parse the= .gitmodules and add each if not already in list.
> +        # The GetRequiredSubm= odules is designed to allow a build to optimize
> +        # the desired submodu= les but it isn't necessary for this repository.
> +        result =3D io.StringI= O()
> +        ret =3D RunCmd("= git", "config --file .gitmodules --get-regexp path", working= dir=3Dself.GetWorkspaceRoot(),
> outstream=3Dresult)
> +        # Cmd output is expec= ted to look like:
> +        # submodule.CryptoPkg= /Library/OpensslLib/openssl.path CryptoPkg/Library/OpensslLib/openssl
> +        # submodule.SoftFloat= .path ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3
> +        if ret =3D=3D 0:
> +          &nbs= p; for line in result.getvalue().splitlines():
> +          &nbs= p;     _, _, path =3D line.partition(" ")
> +          &nbs= p;     if path is not None:
> +          &nbs= p;         if path not in [x.path f= or x in rs]:
> +          &nbs= p;             = rs.append(RequiredSubmodule(path, True)) # add it with recursive since we d= on't know
> +        return rs
> +
> +    def SetArchitectures(self, list_of_requested_= architectures):
> +        ''' Confirm the reque= sts architecture list is valid and configure SettingsManager
> +        to run only the reque= sted architectures.
> +
> +        Raise Exception if a = list_of_requested_architectures is not supported
> +        '''
> +        unsupported =3D set(l= ist_of_requested_architectures) - \
> +          &nbs= p; set(self.GetArchitecturesSupported())
> +        if(len(unsupported) &= gt; 0):
> +          &nbs= p; errorString =3D (
> +          &nbs= p;     "Unsupported Architecture Requested: "= + " ".join(unsupported))
> +          &nbs= p; logging.critical(errorString)
> +          &nbs= p; raise Exception(errorString)
> +        self.ActualArchitectu= res =3D list_of_requested_architectures
> +
> +    def GetWorkspaceRoot(self):
> +        ''' get WorkspacePath= '''
> +        return CommonPlatform= .WorkspaceRoot
> +
> +    def GetActiveScopes(self):
> +        ''' return tuple cont= aining scopes that should be active for this process '''
> +        return CommonPlatform= .Scopes
> +
> +    def FilterPackagesToTest(self, changedFilesLi= st: list, potentialPackagesList: list) -> list:
> +        ''' Filter other case= s that this package should be built
> +        based on changed file= s. This should cover things that can't
> +        be detected as depend= encies. '''
> +        build_these_packages = = =3D []
> +        possible_packages =3D= potentialPackagesList.copy()
> +        for f in changedFiles= List:
> +          &nbs= p; # BaseTools files that might change the build
> +          &nbs= p; if "BaseTools" in f:
> +          &nbs= p;     if os.path.splitext(f) not in [".txt",= ".md"]:
> +          &nbs= p;         build_these_packages =3D= possible_packages
> +          &nbs= p;         break
> +          &nbs= p; # if the azure pipeline platform template file changed
> +          &nbs= p; if "platform-build-run-steps.yml" in f:
> +          &nbs= p;     build_these_packages =3D possible_packages
> +          &nbs= p;     break
> +        return build_these_pa= ckages
> +
> +    def GetPlatformDscAndConfig(self) -> tuple= :
> +        ''' If a platform des= ires to provide its DSC then Policy 4 will evaluate if
> +        any of the changes wi= ll be built in the dsc.
> +
> +        The tuple should be (= <workspace relative path to dsc file>, <input dictionary of dsc ke= y value pairs>)
> +        '''
> +        return (os.path.join(= "EmulatorPkg", "EmulatorPkg.dsc"), {})
> +
> +    # ###########################################= ############################################ #
> +    #       &n= bsp;            = ;     Actual Configuration for Platform Build &nbs= p;            &= nbsp;          #
> +    # ###########################################= ############################################ #
> +
> +
> +class PlatformBuilder(UefiBuilder, BuildSettingsManager):
> +    def __init__(self):
> +        UefiBuilder.__init__(= self)
> +
> +    def AddCommandLineOptions(self, parserObj): > +        ''' Add command line = options to the argparser '''
> +        parserObj.add_argumen= t('-a', "--arch", dest=3D"build_arch", type=3Dstr, defa= ult=3D"X64",
> +          &nbs= p;            &= nbsp;       help=3D"Optional - architect= ure to build.  IA32 will use IA32 for Pei & Dxe. "
> +          &nbs= p;            &= nbsp;       "X64 will use X64 for both P= EI and DXE.")
> +
> +    def RetrieveCommandLineOptions(self, args): > +        '''  Retrieve co= mmand line options from the argparser '''
> +
> +        shell_environment.Get= BuildVars().SetValue(
> +          &nbs= p; "TARGET_ARCH", args.build_arch.upper(), "From CmdLine&quo= t;)
> +        shell_environment.Get= BuildVars().SetValue(
> +          &nbs= p; "ACTIVE_PLATFORM", "EmulatorPkg/EmulatorPkg.dsc", &q= uot;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 cont= aining scopes that should be active for this process '''
> +        return CommonPlatform= .Scopes
> +
> +    def GetName(self):
> +        ''' Get the name of t= he repo, platform, or product being build '''
> +        ''' Used for naming t= he log file, among others '''
> +
> +        # check the startup n= sh 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_bui= ld command.
> +        if(shell_environment.= GetBuildVars().GetValue("MAKE_STARTUP_NSH", "FALSE") = =3D=3D "TRUE"):
> +          &nbs= p; return "EmulatorPkg_With_Run"
> +        return "Emulator= Pkg"
> +
> +    def GetLoggingLevel(self, loggerType):
> +        ''' Get the logging l= evel for a given type
> +        base =3D=3D lowest lo= gging level supported
> +        con  =3D=3D Scre= en logging
> +        txt  =3D=3D plai= n text file logging
> +        md   =3D=3D= markdown file logging
> +        '''
> +        return logging.DEBUG<= br> > +
> +    def SetPlatformEnv(self):
> +        logging.debug("P= latformBuilder SetPlatformEnv")
> +        self.env.SetValue(&qu= ot;PRODUCT_NAME", "EmulatorPkg", "Platform Hardcoded&qu= ot;)
> +        self.env.SetValue(&qu= ot;TOOL_CHAIN_TAG", "VS2019", "Default Toolchain")=
> +
> +        # Add support for usi= ng the correct Platform Headers, tools, and Libs based on emulator architec= ture
> +        # requested to be bui= lt 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":
> +          &nbs= p; key =3D self.env.GetValue("TOOL_CHAIN_TAG") + "_HOST&= quot;
> +          &nbs= p; if self.env.GetValue("TARGET_ARCH") =3D=3D "IA32": > +          &nbs= p;     shell_environment.ShellEnvironment().set_shell_v= ar(key, "x86")
> +          &nbs= p; elif self.env.GetValue("TARGET_ARCH") =3D=3D "X64":<= br> > +          &nbs= p;     shell_environment.ShellEnvironment().set_shell_v= ar(key, "x64")
> +
> +        # Add support for usi= ng the correct Platform Headers, tools, and Libs based on emulator architec= ture
> +        # requested to be bui= lt when building on linux.
> +        if GetHostInfo().os.u= pper() =3D=3D "LINUX":
> +          &nbs= p; self.ConfigureLinuxDLinkPath()
> +
> +        if GetHostInfo().os.u= pper() =3D=3D "WINDOWS":
> +          &nbs= p; self.env.SetValue("BLD_*_WIN_HOST_BUILD", "TRUE", > +          &nbs= p;            &= nbsp;      "Trigger Windows host build")=
> +
> +        self.env.SetValue(&qu= ot;MAKE_STARTUP_NSH", "FALSE", "Default to false")=
> +
> +        # I don't see what th= is does but it is in build.sh
> +        key =3D "BLD_*_B= UILD_" + 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.pat= h.join(self.env.GetValue(
> +          &nbs= p; "BUILD_OUTPUT_BASE"), self.env.GetValue("TARGET_ARCH"= ;))
> +
> +        if (self.env.GetValue= ("MAKE_STARTUP_NSH") =3D=3D "TRUE"):
> +          &nbs= p; f =3D open(os.path.join(OutputPath, "startup.nsh"), "w&qu= ot;)
> +          &nbs= p; f.write("BOOT SUCCESS !!! \n")
> +          &nbs= p; # add commands here
> +          &nbs= p; f.write("reset\n")
> +          &nbs= p; f.close()
> +
> +        if GetHostInfo().os.u= pper() =3D=3D "WINDOWS":
> +          &nbs= p; cmd =3D "WinHost.exe"
> +        elif GetHostInfo().os= .upper() =3D=3D "LINUX":
> +          &nbs= p; cmd =3D "./Host"
> +        else:
> +          &nbs= p; logging.critical("Unsupported Host")
> +          &nbs= p; return -1
> +        return RunCmd(cmd, &q= uot;", workingdir=3DOutputPath)
> +
> +    def ConfigureLinuxDLinkPath(self):
> +        '''
> +        logic copied from bui= ld.sh to setup the correct libraries
> +        '''
> +        if self.env.GetValue(= "TARGET_ARCH") =3D=3D "IA32":
> +          &nbs= p; LIB_NAMES =3D ["ld-linux.so.2", "libdl.so.2 crt1.o",= "crti.o crtn.o"]
> +          &nbs= p; LIB_SEARCH_PATHS =3D ["/usr/lib/i386-linux-gnu",
> +          &nbs= p;            &= nbsp;        "/usr/lib32", &qu= ot;/lib32", "/usr/lib", "/lib"]
> +        elif self.env.GetValu= e("TARGET_ARCH") =3D=3D "X64":
> +          &nbs= p; LIB_NAMES =3D ["ld-linux-x86-64.so.2",
> +          &nbs= p;            &= nbsp; "libdl.so.2", "crt1.o", "crti.o", "= ;crtn.o"]
> +          &nbs= p; LIB_SEARCH_PATHS =3D ["/usr/lib/x86_64-linux-gnu",
> +          &nbs= p;            &= nbsp;        "/usr/lib64", &qu= ot;/lib64", "/usr/lib", "/lib"]
> +
> +        HOST_DLINK_PATHS =3D = ""
> +        for lname in LIB_NAME= S:
> +          &nbs= p; logging.debug(f"Looking for {lname}")
> +          &nbs= p; for dname in LIB_SEARCH_PATHS:
> +          &nbs= p;     logging.debug(f"In {dname}")
> +          &nbs= p;     if os.path.isfile(os.path.join(dname, lname)): > +          &nbs= p;         logging.debug(f"Fou= nd {lname} in {dname}")
> +          &nbs= p;         HOST_DLINK_PATHS += =3D os.path.join(
> +          &nbs= p;             = os.path.join(dname, lname)) + os.pathsep
> +          &nbs= p;         break
> +        HOST_DLINK_PATHS =3D = HOST_DLINK_PATHS.rstrip(os.pathsep)
> +        logging.critical(f&qu= ot;Setting HOST_DLINK_PATHS to {HOST_DLINK_PATHS}")
> +        shell_environment.She= llEnvironment().set_shell_var(
> +          &nbs= p; "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 Pla= tform CI
> +for EmulatorPkg. It also describes how to *build* EmulatorPkg lo= cally using 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|     &= nbsp; |ap32r|       |ap32n|
> +`Ubuntu GCC5`_  |ap32du|      |ap3= 2ru|      |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|     &= nbsp; |ap64r|       |ap64n|
> +`Ubuntu GCC5`_  |ap64du|      |ap6= 4ru|      |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 <https://nam06.safelinks.protection.outlook.c= om/?url=3Dhttps%3A%2F%2Fwww.python.org%2Fdownloads%2F&amp;data=3D02%7C0= 1%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f9= 88bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&amp;sdata=3DV= QCxpGl5SSb8cV9%2FGJzhlNbjRH0NCPEyebD1jNIi4mg%3D&amp;reserved=3D0>= ;`_
> +- `GIT - Download & Install <https://nam06.safelinks.protection.outlook.com/?url=3Dhtt= ps%3A%2F%2Fgit-scm.com%2Fdownload%2F&amp;data=3D02%7C01%7CBret.Barkelew= %40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2= d7cd011db47%7C1%7C0%7C637230770344287401&amp;sdata=3DETH89vbrr4DNOQWyMi= 6s4BGQ7CL1KRtB%2BLETtHrtuCw%3D&amp;reserved=3D0>`_
> +- `GIT - Configure for EDK II <ht= tps://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fgithub.co= m%2Ftianocore%2Ftianocore.github.io%2Fwiki%2FWindows-systems%23github-help&= amp;amp;data=3D02%7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe= 9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344287= 401&amp;sdata=3Dagu3dYNpQ26bcBKomU8xYDt07dn4iCUfcUX8SBNUR8E%3D&amp;= reserved=3D0>`_
> +- `EDKII Source - Download/Checkout from Github <https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fgi= thub.com%2Ftianocore%2Ftianocore.github.io%2Fwiki%2FWindows-&amp;data= =3D02%7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026= 919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&amp= ;sdata=3D5%2F7rt81jwBZK%2FzlF0zYsn8wmxPOojGQQDJu7N43SCIs%3D&amp;reserve= d=3D0
> systems#download>`_
> +
> +**NOTE:** Do *not* follow the EDK II Compile Tools and Build ins= tructions, see below...
> +
> +Install the necessary development packages for your distribution=
> +````````````````````````````````````````````````````````````````=
> +
> +This varies by distribution, toolchain, and your configuration b= ut here are a few hints.
> +
> +* For building ARCH IA32 on X64 Ubuntu 18.04 LTS these steps whe= re needed.
> +
> +  .. code-block:: bash
> +
> +    sudo dpkg --add-architecture i386
> +    sudo apt-get update
> +    sudo apt-get install libc6-dev:i386 libx11-de= v: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 uui= d-dev
> +
> +Differences from EDK Classic Build Setup
> +````````````````````````````````````````
> +
> +- Build BaseTools using `python BaseTools/Edk2ToolsBuild.py [-t = <ToolChainTag>]`
> +
> +  - This replaces `edksetup Rebuild`" from the classic= build system
> +  - For Windows `<ToolChainTag>` examples, refer to `= Windows ToolChain Matrix
> <https://nam06.safelinks.protection.= outlook.com/?url=3Dhttps%3A%2F%2Fgithub.com%2Ftianocore%2Ftianocore.github.= io%2Fwiki%2FWindows-systems-ToolChain-Matrix&amp;data=3D02%7C01%7CBret.= Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f14= 1af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&amp;sdata=3DMYUTaXbL0e= EbWohyPCpmnTpmHJ5bUTTI6383se7diM0%3D&amp;reserved=3D0>`_,
> +    defaults to `VS2017` if not specified
> +
> +- **No Action:** edksetup, Submodule initialization and manual s= etup 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/Platfo= rmBuild.py
> +
> +* Initialize & Update Dependencies (e.g. iASL & NASM) > +
> +  .. code-block:: bash
> +
> +    stuart_update -c EmulatorPkg/PlatformCI/Platf= ormBuild.py
> +
> +* Compile (IA32 or X64 supported)
> +
> +  .. code-block:: bash
> +
> +    stuart_build -c EmulatorPkg/PlatformCI/Platfo= rmBuild.py [TOOL_CHAIN_TAG=3D<TOOL_CHAIN_TAG>] -a <TARGET_ARCH>=
> +
> +* Running Emulator
> +
> +  - You can add `--FlashRom` to the end of your build comma= nd and the emulator will run after the build is complete.
> +  - or use the `--FlashOnly` feature to just run the emulat= or.
> +
> +  .. code-block:: bash
> +
> +    stuart_build -c EmulatorPkg/PlatformCI/Platfo= rmBuild.py TOOL_CHAIN_TAG=3D<TOOL_CHAIN_TAG> -a <TARGET_ARCH> -=
> -FlashOnly
> +
> +**NOTE:** configuring ACTIVE_PLATFORM and TARGET_ARCH in Conf/ta= rget.txt is *not* required.
> +This environment is set by PlatformBuild.py based upon the `[-a = <TARGET_ARCH>]` parameter.
> +
> +Custom Build Options
> +````````````````````
> +
> +**MAKE_STARTUP_NSH=3DTRUE** 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 t= o 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 = `=3D1` suffix for bare defines.
> +For example, to enable the IP6 Network Stack, the stuart_build c= ommand-line would be:
> +
> +.. code-block:: bash
> +
> +  stuart_build -c EmulatorPkg/PlatformCI/PlatformBuild.py B= LD_*_NETWORK_IP6_ENABLE=3D1
> +
> +References
> +----------
> +
> +- `Installing Pytools <https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2F= github.com%2Ftianocore%2Fedk2-pytool-extensions%2Fblob%2Fmaster%2Fdocs%2Fus= ing.md%23installing&amp;data=3D02%7C01%7CBret.Barkelew%40microsoft.com%= 7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7= C0%7C637230770344287401&amp;sdata=3Dvc5uDCwe6uLeqJNZQPZuHlOezbhYwTxjbQd= YNecml%2FI%3D&amp;reserved=3D0>`_
> +- For each workspace, consider creating & using a `Python Vi= rtual Environment
> <https://nam06.safelinks.protection.outlook.com/?= url=3Dhttps%3A%2F%2Fdocs.python.org%2F3%2Flibrary%2Fvenv.html&amp;data= =3D02%7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026= 919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&amp= ;sdata=3DAoWeAOJy70ek22KQdmEq4TKpY67Ttaqw%2Fiddjhm4cqI%3D&amp;reserved= =3D0>`_
> +
> +  * `Sample Layout <https://nam06.safel= inks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fmicrosoft.github.io%2Fmu%2= FCodeDevelopment%2Fprerequisites%2F%23workspace-virtual-environment-&am= p;data=3D02%7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7= e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&am= p;amp;sdata=3DALAB0us06CAqkVYNq4ZOzWuYIn6tZjwYKxb7RcBX%2Bys%3D&amp;rese= rved=3D0
> setup-process>`_
> +
> +- `stuart_build commandline parser <https://= nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fgithub.com%2Fti= anocore%2Fedk2-pytool-&amp;data=3D02%7C01%7CBret.Barkelew%40microsoft.c= om%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C= 1%7C0%7C637230770344287401&amp;sdata=3DXqDNZzsH04%2FQt6VYb%2FfD69OS4W3t= O84iQtaJBwQAb9c%3D&amp;reserved=3D0
> extensions/blob/56f6a7aee09995c2f22da4765e8b0a29c1cbf5de/edk2toolext/= edk2_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 re= adable
> +.. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fimg.sh= ields.io%2Fbugzilla%2F2668%3FbaseUrl%3Dhttps%253A%252F%252Fbugzilla.tianoco= re.org&amp;data=3D02%7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359= d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C63723077= 0344287401&amp;sdata=3D6iEnYBmAs18nzJ62x2Ak60wBDE0VrRNiQXFu6ZLHvhI%3D&a= mp;amp;reserved=3D0
> +.. _TCBZ_2668: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fbugzil= la.tianocore.org%2Fshow_bug.cgi%3Fid%3D2668&amp;data=3D02%7C01%7CBret.B= arkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141= af91ab2d7cd011db47%7C1%7C0%7C637230770344287401&amp;sdata=3DOw3JWtPspqE= 6GYD%2BUrxa0UWarmRUfE8kRQDL5LofMxA%3D&amp;reserved=3D0
> +
> +.. |TCBZ_2639| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fimg.sh= ields.io%2Fbugzilla%2F2639%3FbaseUrl%3Dhttps%253A%252F%252Fbugzilla.tianoco= re.org&amp;data=3D02%7C01%7CBret.Barkelew%40microsoft.com%7Cff0c73d3359= d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C63723077= 0344287401&amp;sdata=3Dc893bcidlionAC%2FJzdpv0Alw6lSr6yYZe40OsfdcdoI%3D= &amp;reserved=3D0
> +.. _TCBZ_2639: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fbugzil= la.tianocore.org%2Fshow_bug.cgi%3Fid%3D2639&amp;data=3D02%7C01%7CBret.B= arkelew%40microsoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141= af91ab2d7cd011db47%7C1%7C0%7C637230770344297383&amp;sdata=3DtWjybrNQ%2F= 9vWty6iiVRzZX8wU1v7OYTxCfMU6A7BDLc%3D&amp;reserved=3D0
> +
> +.. _Win VS2019:  https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-play%2F_build%2Flatest%3FdefinitionId%3D40%26= branchName%3Dmaster&amp;data=3D02%7C01%7CBret.Barkelew%40microsoft.com%= 7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7= C0%7C637230770344297383&amp;sdata=3Dm3nzV%2BgjDym6nfIb%2BawSDhjMqUarBd5= 2ibHYwYQv%2Fu0%3D&amp;reserved=3D0
> +.. _Ubuntu GCC5: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-play%2F_build%2Flatest%3FdefinitionId%3D39%26= branchName%3Dmaster&amp;data=3D02%7C01%7CBret.Barkelew%40microsoft.com%= 7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd011db47%7C1%7= C0%7C637230770344297383&amp;sdata=3DkN6eOFHL761YeuxmVT%2F7IBSc650ZpOmrE= RK3h4K8Mik%3D&amp;reserved=3D0
> +
> +.. |ap32d| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?br= anchName=3Dmaster&jobName=3DPlatform_CI&
> configuration=3DPlatform_CI%20EmulatorPkg_IA32_DEBUG
> +.. |ap32du| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_IA32_DEBUG
> +.. |ap32r| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?br= anchName=3Dmaster&jobName=3DPlatform_CI&
> configuration=3DPlatform_CI%20EmulatorPkg_IA32_RELEASE
> +.. |ap32ru| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_IA32_RELEASE
> +.. |ap32n| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Windows%20VS2019?br= anchName=3Dmaster&jobName=3DPlatform_CI&
> configuration=3DPlatform_CI%20EmulatorPkg_IA32_NOOPT
> +.. |ap32nu| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_IA32_NOOPT
> +
> +.. |ap64d| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_X64_DEBUG
> +.. |ap64du| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_X64_DEBUG
> +.. |ap64r| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_X64_RELEASE
> +.. |ap64ru| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_X64_RELEASE
> +.. |ap64n| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_X64_NOOPT
> +.. |ap64nu| image:: https://nam06.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fdev.az= ure.com%2Ftianocore%2Fedk2-ci-&amp;data=3D02%7C01%7CBret.Barkelew%40mic= rosoft.com%7Cff0c73d3359d43cffe9c08d7e6026919%7C72f988bf86f141af91ab2d7cd01= 1db47%7C1%7C0%7C637230770344297383&amp;sdata=3DjZPE0l0CLb635yfNSIZrIycr= NbvUjb%2BUgN%2Fmtrcozvw%3D&amp;reserved=3D0
> play/_apis/build/status/EmulatorPkg/EmulatorPkg%20Ubuntu%20GCC5?branc= hName=3Dmaster&jobName=3DPlatform_CI&con
> figuration=3DPlatform_CI%20EmulatorPkg_X64_NOOPT
> --
> 2.16.3.windows.1
>
>
>




--_000_CY4PR21MB07433764E011757CC39DB1E4EFD00CY4PR21MB0743namp_--