From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mx.groups.io with SMTP id smtpd.web10.470.1587479796944282608 for ; Tue, 21 Apr 2020 07:36:37 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=Y1sN6EZS; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: liming.gao@intel.com) IronPort-SDR: B8vKX3ioZgcOXlxK1Yi+xSaDuopVc/GJfs6XRE5IjeE9dOXwECSPacOVg8zc5lorYg6+jQGrSA JlZzEDKIAAGA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Apr 2020 07:36:35 -0700 IronPort-SDR: 818Ju+oObKU5xwFN8bj+FCGESgeOqJVHODsSQM/+EpY5jvhWlo4G4TaFjsL3uBN/qgy07gQeK1 WdXkDC+0CM4A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,410,1580803200"; d="scan'208";a="245697514" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga007.fm.intel.com with ESMTP; 21 Apr 2020 07:36:35 -0700 Received: from fmsmsx115.amr.corp.intel.com (10.18.116.19) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 21 Apr 2020 07:36:34 -0700 Received: from FMSEDG001.ED.cps.intel.com (10.1.192.133) by fmsmsx115.amr.corp.intel.com (10.18.116.19) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 21 Apr 2020 07:36:34 -0700 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (104.47.57.174) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 21 Apr 2020 07:36:34 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=DEJUMlzSwfAs2HpIqOnkIVX7BfHIyAz6W5a+dNszCNDKSeQfh4/iy5nSTqg/5j76nQoKSXd4z2shj8OXxvxbZAoWv0p+aOwFMtAR7Mnqvhy1pj0sV8tKhSrFm4gfXnmju77tFYdAEndxMQbYj8xpTpRiCqbeLpuy5TD/o9rz+V3Jz57hHownG/ly1MEgwzLXpjqLD34FGR20NipZJROUhZrldF3e5LfRZCyNSCa+DG7ete1zIbmEpSzEKp5KK9IUAnFfTCycsMt4yDHMHRwO+R0v1bNh3jwbzLWb9OHACXL4Ec7sKQObgiCcFPRfJlS5jrz08dFCvdd4mOdZJKG3tw== 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=+XdqH8+jNM1HcCzcswAta+jbG2zgPb7WoE4Qd+lW4R8=; b=Qo/9pMNO8/lKKHSnPNmU36HGeNEC0NLVM/mZDnGj69tQ0y3R5kqfHPqQ4SJof41TOz5K43FCmR9YY0wXizkfy2VMmdlWaPec69nHxM+yION4VxAsrggs7vPt97R91PuApRj6IfPwTNUefmikcVzeg2qugQ9Ip8CAc0yfzuohedKDa1g3z3mv0PjElTyu3rmqeLSEFryH7AeJ/grY4Z3vhpdKpdEg4/vczRhVIOVEOBMR/nF7WfPUw+oQPW207KVrrzavpia/YyYQT3mdg09rrVGYWDkv52iFA46c81Renu0TMa6hErJJ9DSWTfCRX+uOm/E7iyRvIiSDcfC6l1HMTQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+XdqH8+jNM1HcCzcswAta+jbG2zgPb7WoE4Qd+lW4R8=; b=Y1sN6EZS72F2v62XtuMUKe/s4KCBZN8zInIFblowpWpGn3satVpZmHEXZxC+vYXJVN29TSvnUPoCUu9+/3lCHMbU5v+UF7E1WLwxY6TsIws2dgVndHbaJkVC8dmhrMyJY9YxCL0/Ji5Q3kWv6aHLoKXiJwGP6vOK6iOkdT0RcFI= Received: from BN6PR11MB3972.namprd11.prod.outlook.com (2603:10b6:405:7f::11) by BN6PR11MB4082.namprd11.prod.outlook.com (2603:10b6:405:7d::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13; Tue, 21 Apr 2020 14:36:30 +0000 Received: from BN6PR11MB3972.namprd11.prod.outlook.com ([fe80::4dcc:bc5c:def:9ae9]) by BN6PR11MB3972.namprd11.prod.outlook.com ([fe80::4dcc:bc5c:def:9ae9%5]) with mapi id 15.20.2921.030; Tue, 21 Apr 2020 14:36:30 +0000 From: "Liming Gao" To: "devel@edk2.groups.io" , "michael.kubacki@outlook.com" , "Ni, Ray" 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: AQHWF0fPbCJ1DfY0O0y/2BFUX1NtC6iDpUdw Date: Tue, 21 Apr 2020 14:36:29 +0000 Message-ID: References: <20200420191216.24572-1-michael.kubacki@outlook.com> In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-version: 11.2.0.6 dlp-product: dlpe-windows dlp-reaction: no-action authentication-results: spf=none (sender IP is ) smtp.mailfrom=liming.gao@intel.com; x-originating-ip: [192.55.52.205] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: d311b78e-9f1a-4642-3ddb-08d7e601618e x-ms-traffictypediagnostic: BN6PR11MB4082: x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:1186; x-forefront-prvs: 038002787A x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BN6PR11MB3972.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(376002)(136003)(396003)(366004)(39860400002)(346002)(71200400001)(33656002)(26005)(6506007)(4326008)(53546011)(186003)(316002)(110136005)(54906003)(81156014)(6636002)(8676002)(8936002)(86362001)(19627235002)(7696005)(66556008)(66476007)(52536014)(66446008)(66946007)(76116006)(83080400001)(30864003)(2906002)(64756008)(55016002)(5660300002)(45080400002)(478600001)(966005)(9686003)(559001)(579004)(460985005);DIR:OUT;SFP:1102; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: zLeJ1z7GOmJIccV4PJVrEKmyHeJ0ye6SXjA7tF4CMOsFzQ8W6cUc7l9mpKjVvxO40GfokAWLqiJqdLmpD1YmdelsGb8tHyA6pRe/WGZtXZtGycCpjCoBH50OTyGrP/leqFe8ktLa+M8dYoQNmPNgdwLyL2HJ+HdPe2oXMB2CYd8qQmVA9t3bRbA5w+cj3gJ5LqaOStKe8nVBt3pd/+BOfbZE9pvxlVcURtlrsOIGpRRkXBRatAJIITYymInkzAgwlUc5U+Bys++5/7RPcNuZuKsvGD46rRvIKnI0ZE1eiKLNwCvox/zvQwvoq079tXN7evEUd/hKX2lbPFak2euhd0ZFY4AzUiIzFpYV6Jnsg7R9KDDlvAKb89e0V5yPQswF0Kko2L7nk3W8Gs+lsi1M8LrNk0mkCCvvVnZF/p8m+zt4tYOlAtyAFCho0lFCuycoWg+DzLilR6JcqpQR5rkUBrbik+f3D5PbXmBXyUz42+A/IGjoFpedaFef6XXHf+vfZa2eKayFP0gUDKY8ircGZACpIIPklt4VOG57nmLuze6t/4UJBr0JR5vFTFmVrsAq x-ms-exchange-antispam-messagedata: daQ8OFxcJdYcSzbQK5f4IzYvEzBJC1IVhKcf+GvAMenWRWO+ZBcL5eRTNzGAxZNQucZncZbrNT/YeceH+w4qli3S+3zzmjBpOF/kPLEQC6H6r1lLNqPq69REm38jo9vWPfHjuzzIfl+BSJ1XKj/iyw== MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: d311b78e-9f1a-4642-3ddb-08d7e601618e X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Apr 2020 14:36:29.9763 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: fVZ+UYYI3GvXgBUi/lpvP9iLMsPzv/Dx0nEMqKhujYNWfvcZU/lTV6PpOlXL0oUr3kJQr0R2/GLqTerEX+WqSA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR11MB4082 Return-Path: liming.gao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Sean: I see some comments on Ovmf. If you make the change in Ovmf, please also= update EmulatorPkg. I would like to keep the consistent style in EmulatorP= kg/OvmfPkg.=20 This change is good to me. Reviewed-by: Liming Gao Ray: If you have no comment, can you give Ack-by for this change? Thanks Liming > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Michael 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 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&configurati > on=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&configuration=3D > Platform_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&configurati > on=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&configuration=3D > Platform_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&configurati > on=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&configuration=3D > Platform_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&configuration=3D > Platform_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&configuration=3D > Platform_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&configuration=3D > Platform_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&configuration=3D > Platform_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&configuration=3D > Platform_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&configuration=3D > Platform_CI%20EmulatorPkg_X64_NOOPT > -- > 2.16.3.windows.1 >=20 >=20 >=20