From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM04-BN3-obe.outbound.protection.outlook.com (NAM04-BN3-obe.outbound.protection.outlook.com [40.92.9.98]) by mx.groups.io with SMTP id smtpd.web11.972.1586369653762958114 for ; Wed, 08 Apr 2020 11:14:14 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@outlook.com header.s=selector1 header.b=a9qrXFkb; spf=pass (domain: outlook.com, ip: 40.92.9.98, mailfrom: michael.kubacki@outlook.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=i4IX+p7oXD1mf+2iTEWoj4BwJgsif6mAoLohTBJrc2BSxo+TvmFEoQRAPZwZiClT2WvAegggT2CaVR/7HkUrHyhM0akBvA8FcudftRBIW2LZT4vwyqvUJtvS/AvyQuyt3Ei9beipRLSnvH7G8S4kTI3vbvhf+jjkkMBeZdcGuWVAkuBbTy8RLmxPxa5yJCSTK/BWMpwo5zkro+s3huDE4LBhgJR/Pk6igjny7apoPfQsZxrk5mGIp/ECp34y6KKRbFEZWfwspR2yg6e+Yl4asO+Xe87wEBITTFJqxHDV2+j9MuxDpB86BzhipnfxLQdPMJv85LN/767fCSXvJYLsXA== 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=sIC9v/Jwxq9D/1oxyIgc1Kh+U2iWtw/Y15Tak2Ta7hA=; b=NCTNw3vs8lVvjY9ZqZZPO7APsuZ4z+3AceJ8TckePLrbSvXJW33sm+AW+SYtxOi0x1lWrFQh5ab9y9qcSFFx4oER1bpz6900/5VVPOcd2Kprq3UtPjWaOfF3d2u3Hx3rojwkwKmqmYZyNTCLD8XRcMoe63cvRx7qPfv+PhjAWLg/dc66yndl5Zjvt1fOnSHlOaAF9eK3KcWubjNnTqoR9l0NSRUy2g1JMZEfrdkztsGVcYR4QRIErDnxlE+zcHaRDY5zKB92HIn7E/GYkGQKyCv2U7eJHEB5YHke1nRUm+XCN6nvo9k+ChUe7gP84CMuakxvnyuOEp1/Kc9PJH5KJA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=outlook.com; dmarc=pass action=none header.from=outlook.com; dkim=pass header.d=outlook.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sIC9v/Jwxq9D/1oxyIgc1Kh+U2iWtw/Y15Tak2Ta7hA=; b=a9qrXFkbVM8RC52rB/jXo4u3ATlHmOt5bFf6mRXSksDxUoFVTERwQTDr0aVCTh86gugj1iXpjlX8Esxpa+GlTsBhzT4biU75i/e0j/f5FHrhgICKlKeVkBoglUio8l2heCgmleR6y2+gkrH7KCOMQGM/477EYnWnGPS1Dj8Ov++56lmpDJGG3heT+69Y76DXpv565A77b/+hnz7jDrXm5esxWygCokbT9FS6YNY/PGwHXGE7jUTQIyoXMol3sGvmZoKwQOCC6ZkI6OzjvXkMWo2bl1gDBzYk9mhOcpr1fpjs9pp8iMJt5YkzJ2o/+y4iA3r9KjE+yvOAWdA97teN1A== Received: from CO1NAM04FT025.eop-NAM04.prod.protection.outlook.com (10.152.90.57) by CO1NAM04HT173.eop-NAM04.prod.protection.outlook.com (10.152.91.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2878.19; Wed, 8 Apr 2020 18:14:12 +0000 Received: from MWHPR07MB3440.namprd07.prod.outlook.com (2a01:111:e400:7e4d::42) by CO1NAM04FT025.mail.protection.outlook.com (2a01:111:e400:7e4d::160) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2878.19 via Frontend Transport; Wed, 8 Apr 2020 18:14:12 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:4EAB2C3401C7EFD6867E8ED206F215FD03C438D0753AC8F93FEE69C9FE2E63D9;UpperCasedChecksum:719F33DCACEED22E6AF92D9112D7625FA0CDEFDC22CD2502F40C2649976611A0;SizeAsReceived:8958;Count:50 Received: from MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::f5a7:e51b:e22a:959f]) by MWHPR07MB3440.namprd07.prod.outlook.com ([fe80::f5a7:e51b:e22a:959f%7]) with mapi id 15.20.2878.022; Wed, 8 Apr 2020 18:14:12 +0000 From: "Michael Kubacki" To: devel@edk2.groups.io CC: Jordan Justen , Laszlo Ersek , Ard Biesheuvel Subject: [PATCH v1 4/6] OvmfPkg: Add Platform CI and configuration for Core CI Date: Wed, 8 Apr 2020 11:13:25 -0700 Message-ID: X-Mailer: git-send-email 2.16.3.windows.1 In-Reply-To: <20200408181327.4324-1-michael.kubacki@outlook.com> References: <20200408181327.4324-1-michael.kubacki@outlook.com> X-ClientProxiedBy: MWHPR10CA0054.namprd10.prod.outlook.com (2603:10b6:300:2c::16) To MWHPR07MB3440.namprd07.prod.outlook.com (2603:10b6:301:69::28) Return-Path: michael.kubacki@outlook.com X-Microsoft-Original-Message-ID: <20200408181327.4324-5-michael.kubacki@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from localhost.localdomain (2001:4898:80e8:2:c970:b9b:c52f:94cf) by MWHPR10CA0054.namprd10.prod.outlook.com (2603:10b6:300:2c::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2900.15 via Frontend Transport; Wed, 8 Apr 2020 18:14:11 +0000 X-Mailer: git-send-email 2.16.3.windows.1 X-Microsoft-Original-Message-ID: <20200408181327.4324-5-michael.kubacki@outlook.com> X-TMN: [9MNIv49ydAiCgkQ0ZFjffCLycsDY8B2/cTNGLWteSl1mFUraijBXPZFRLEeLn0qV] X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 50 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: 5b74695f-d2df-4314-af77-08d7dbe8a394 X-MS-TrafficTypeDiagnostic: CO1NAM04HT173: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4ouQa3cfeyE+QZZGno8Zq0e7pGZdhcyMyihD8hZWA5cqEMfRQq5GCYUmAcCPf2FECXC7S9BQ/8YdIDaukoNGfnpygKS+QCQgBPvOkV9HDSNrWKj6M4L3TjaD1XpvWRJPfTvBQ5os59igUMZJG5SCVHpHor1tehX07/wbnTNvdLQRZARIrwbHdQOk7gSRCGe2b1SqC1Vb4aWWZjaXTv3IEpwlxtb0Sj23Ioiin6mvOBY= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:0;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR07MB3440.namprd07.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:;DIR:OUT;SFP:1901; X-MS-Exchange-AntiSpam-MessageData: HiRPF3BcpsvLHjUoXwK1F9QUN+TbtvV4cre/Zpd8OrnYkAbTLoVgM/WiGXSeJNHFLQwaKI+D97rSjiBR931/GOK9FL4Qb04EfDVYAHPSipXCQWnCPc9DePCpU42j8GEzAXraYxmf0UCEU3OiXsX/NSaRRu4B3rLtmBHyQ/Ao8t5Cj3ImLCJxURoRSPWWeK4YiEo2ZFhKPssUgEYq0nm5BQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5b74695f-d2df-4314-af77-08d7dbe8a394 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Apr 2020 18:14:12.1471 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1NAM04HT173 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From: Sean Brogan REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D2570 Add new Azure Pipeline definitions to build and run OvmfPkg with: * Ubuntu GCC5 * Windows VS2019 Add PyTool based build of OvmfPkg Add extdep for managing the iasl dependency Add OvmfPkg.ci.yaml for Core CI Add README-pytools for details and instructions Cc: Jordan Justen Cc: Laszlo Ersek Cc: Ard Biesheuvel Signed-off-by: Sean Brogan --- OvmfPkg/.azurepipelines/Ubuntu-GCC5.yml | 133 +++++++++++ OvmfPkg/.azurepipelines/Windows-VS2019.yml | 138 +++++++++++ OvmfPkg/OvmfPkg.ci.yaml | 83 +++++++ OvmfPkg/PlatformBuild.py | 242 ++++++++++++++++++++ OvmfPkg/README-pytools.md | 238 +++++++++++++++++++ OvmfPkg/iasl_ext_dep.yaml | 21 ++ 6 files changed, 855 insertions(+) diff --git a/OvmfPkg/.azurepipelines/Ubuntu-GCC5.yml b/OvmfPkg/.azurepipeli= nes/Ubuntu-GCC5.yml new file mode 100644 index 000000000000..c2da388aba78 --- /dev/null +++ b/OvmfPkg/.azurepipelines/Ubuntu-GCC5.yml @@ -0,0 +1,133 @@ +## @file +# Azure Pipeline build file for building a platform. +# +# Platform: OVMF +# 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: 'OvmfPkg' + vm_image: 'ubuntu-latest' + should_run: true + run_flags: "MAKE_STARTUP_NSH=3DTRUE QEMU_HEADLESS=3DTRUE" + + #Use matrix to speed up the build process + strategy: + matrix: + OVMF_IA32_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32" + Build.Flags: "" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32" + Build.Flags: "" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32_NOOPT: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32" + Build.Flags: "" + Build.Target: "NOOPT" + Run.Flags: $(run_flags) + Run: $(should_run) + + OVMF_X64_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_X64_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_X64_NOOPT: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "" + Build.Target: "NOOPT" + Run.Flags: $(run_flags) + Run: $(should_run) + + OVMF_IA32X64_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32X64_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32X64_NOOPT: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "" + Build.Target: "NOOPT" + Run.Flags: $(run_flags) + Run: $(should_run) + + OVMF_IA32X64_FULL_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=3D1 BLD_*_SMM_REQUIRE= =3D1 BLD_*_TPM_ENABLE=3D1 BLD_*_TPM_CONFIG_ENABLE=3D1 BLD_*_NETWORK_TLS_ENA= BLE=3D1 BLD_*_NETWORK_IP6_ENABLE=3D1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=3D1" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32X64_FULL_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=3D1 BLD_*_SMM_REQUIRE= =3D1 BLD_*_TPM_ENABLE=3D1 BLD_*_TPM_CONFIG_ENABLE=3D1 BLD_*_NETWORK_TLS_ENA= BLE=3D1 BLD_*_NETWORK_IP6_ENABLE=3D1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=3D1" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32X64_FULL_NOOPT: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=3D1 BLD_*_SMM_REQUIRE= =3D1 BLD_*_TPM_ENABLE=3D1 BLD_*_TPM_CONFIG_ENABLE=3D1 BLD_*_NETWORK_TLS_ENA= BLE=3D1 BLD_*_NETWORK_IP6_ENABLE=3D1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=3D1" + Build.Target: "NOOPT" + Run.Flags: $(run_flags) + Run: $(should_run) + workspace: + clean: all + + pool: + vmImage: $(vm_image) + + steps: + - template: ../../.azurepipelines/templates/platform-build-run-steps.y= ml + 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) + extra_install_step: + - bash: sudo apt-get install qemu + displayName: Install qemu + condition: and(gt(variables.pkg_count, 0), succeeded()) diff --git a/OvmfPkg/.azurepipelines/Windows-VS2019.yml b/OvmfPkg/.azurepip= elines/Windows-VS2019.yml new file mode 100644 index 000000000000..0de24017a2a6 --- /dev/null +++ b/OvmfPkg/.azurepipelines/Windows-VS2019.yml @@ -0,0 +1,138 @@ +## @file +# Azure Pipeline build file for building a platform. +# +# Platform: OVMF +# 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: 'OvmfPkg' + vm_image: 'windows-latest' + should_run: true + run_flags: "MAKE_STARTUP_NSH=3DTRUE QEMU_HEADLESS=3DTRUE" + + #Use matrix to speed up the build process + strategy: + matrix: + OVMF_IA32_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32" + Build.Flags: "" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32" + Build.Flags: "" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32_NOOPT: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32" + Build.Flags: "" + Build.Target: "NOOPT" + Run.Flags: $(run_flags) + Run: $(should_run) + + OVMF_X64_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_X64_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_X64_NOOPT: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "X64" + Build.Flags: "" + Build.Target: "NOOPT" + Run.Flags: $(run_flags) + Run: $(should_run) + + OVMF_IA32X64_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32X64_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32X64_NOOPT: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "" + Build.Target: "NOOPT" + Run.Flags: $(run_flags) + Run: $(should_run) + + OVMF_IA32X64_FULL_DEBUG: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=3D1 BLD_*_SMM_REQUIRE= =3D1 BLD_*_TPM_ENABLE=3D1 BLD_*_TPM_CONFIG_ENABLE=3D1 BLD_*_NETWORK_TLS_ENA= BLE=3D1 BLD_*_NETWORK_IP6_ENABLE=3D1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=3D1" + Build.Target: "DEBUG" + Run.Flags: $(run_flags) + Run: $(should_run) + OVMF_IA32X64_FULL_RELEASE: + Build.File: "$(package)/PlatformBuild.py" + Build.Arch: "IA32,X64" + Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=3D1 BLD_*_SMM_REQUIRE= =3D1 BLD_*_TPM_ENABLE=3D1 BLD_*_TPM_CONFIG_ENABLE=3D1 BLD_*_NETWORK_TLS_ENA= BLE=3D1 BLD_*_NETWORK_IP6_ENABLE=3D1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=3D1" + Build.Target: "RELEASE" + Run.Flags: $(run_flags) + Run: $(should_run) + + # This currently creates a very large image which is too big for the F= DF declared range + # Ovmf maintainers suggest to skip this build for now. + # + # OVMF_IA32X64_FULL_NOOPT: + # Build.File: "$(package)/PlatformBuild.py" + # Build.Arch: "IA32,X64" + # Build.Flags: "BLD_*_SECURE_BOOT_ENABLE=3D1 BLD_*_SMM_REQUIRE= =3D1 BLD_*_TPM_ENABLE=3D1 BLD_*_TPM_CONFIG_ENABLE=3D1 BLD_*_NETWORK_TLS_ENA= BLE=3D1 BLD_*_NETWORK_IP6_ENABLE=3D1 BLD_*_NETWORK_HTTP_BOOT_ENABLE=3D1" + # Build.Target: "NOOPT" + # Run.Flags: $(run_flags) + # Run: $(should_run) + + workspace: + clean: all + + pool: + vmImage: $(vm_image) + + steps: + - template: ../../.azurepipelines/templates/platform-build-run-steps.y= ml + 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) + extra_install_step: + - powershell: choco install qemu; Write-Host "##vso[task.prependpa= th]c:\Program Files\qemu" + displayName: Install QEMU and Set QEMU on path # friendly name d= isplayed in the UI + condition: and(gt(variables.pkg_count, 0), succeeded()) + diff --git a/OvmfPkg/OvmfPkg.ci.yaml b/OvmfPkg/OvmfPkg.ci.yaml new file mode 100644 index 000000000000..98992f0429ff --- /dev/null +++ b/OvmfPkg/OvmfPkg.ci.yaml @@ -0,0 +1,83 @@ +## @file +# Core CI configuration for OvmfPkg +# +# OvmfPkg 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": [ + "MdePkg/MdePkg.dec", + "MdeModulePkg/MdeModulePkg.dec", + "OvmfPkg/OvmfPkg.dec", + "NetworkPkg/NetworkPkg.dec", + "SecurityPkg/SecurityPkg.dec", + "UefiCpuPkg/UefiCpuPkg.dec", + "ShellPkg/ShellPkg.dec", + "EmbeddedPkg/EmbeddedPkg.dec", + "SourceLevelDebugPkg/SourceLevelDebugPkg.dec" + ], + # 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": ["ResetVector", "XenResetVector"], # Expected du= plication for gEfiFirmwareVolumeTopFileGuid + "IgnoreGuidValue": [], + "IgnoreFoldersAndFiles": [], + "IgnoreDuplicates": [], + }, + + ## options defined .pytool/Plugin/LibraryClassCheck + "LibraryClassCheck": { + "IgnoreHeaderFile": [] + }, + + ## options defined .pytool/Plugin/SpellCheck + "SpellCheck": { + "AuditOnly": True, # Fails right now with over 270 error= s + "IgnoreFiles": [], # use gitignore syntax to ignore erro= rs in matching files + "ExtendWords": [ + + ], # words to extend to the dictionary for this package + "IgnoreStandardPaths": [], # Standard Plugin defined paths that = should be ignore + "AdditionalIncludePaths": [] # Additional paths to spell check (wi= ldcards supported) + } +} diff --git a/OvmfPkg/PlatformBuild.py b/OvmfPkg/PlatformBuild.py new file mode 100644 index 000000000000..bd7b342b6c00 --- /dev/null +++ b/OvmfPkg/PlatformBuild.py @@ -0,0 +1,242 @@ +=EF=BB=BF# @file +# Script to Build OVMF UEFI firmware +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## +import os +import logging + +from edk2toolext.environment import shell_environment +from edk2toolext.environment.uefi_build import UefiBuilder +from edk2toolext.invocables.edk2_platform_build import BuildSettingsManage= r +from edk2toolext.invocables.edk2_setup import SetupSettingsManager, Requir= edSubmodule +from edk2toolext.invocables.edk2_update import UpdateSettingsManager +from edk2toolext.invocables.edk2_pr_eval import PrEvalSettingsManager +from edk2toollib.utility_functions import RunCmd + + + # ####################################################################= ################### # + # Common Configuration = # + # ####################################################################= ################### # +class CommonPlatform(): + ''' Common settings for this platform. Define static data here and us= e + for the different parts of stuart + ''' + PackagesSupported =3D ("OvmfPkg",) + ArchSupported =3D ("IA32", "X64") + TargetsSupported =3D ("DEBUG", "RELEASE", "NOOPT") + Scopes =3D ('ovmf', 'edk2-build') + WorkspaceRoot =3D os.path.realpath(os.path.join( + os.path.dirname(os.path.abspath(__file__)), "..")) + + @classmethod + def GetDscName(cls, ArchCsv: str) -> str: + ''' return the DSC given the architectures requested. + + ArchCsv: csv string containing all architectures to build + ''' + dsc =3D "OvmfPkg" + if "IA32" in ArchCsv.upper().split(","): + dsc +=3D "Ia32" + if "X64" in ArchCsv.upper().split(","): + dsc +=3D "X64" + dsc +=3D ".dsc" + return dsc + + + # ####################################################################= ################### # + # Configuration for Update & Setup = # + # ####################################################################= ################### # +class SettingsManager(UpdateSettingsManager, SetupSettingsManager, PrEvalS= ettingsManager): + + def GetPackagesSupported(self): + ''' return iterable of edk2 packages supported by this build. + These should be edk2 workspace relative paths ''' + return CommonPlatform.PackagesSupported + + def GetArchitecturesSupported(self): + ''' return iterable of edk2 architectures supported by this build = ''' + return CommonPlatform.ArchSupported + + def GetTargetsSupported(self): + ''' return iterable of edk2 target tags supported by this build ''= ' + return CommonPlatform.TargetsSupported + + def GetRequiredSubmodules(self): + ''' return iterable containing RequiredSubmodule objects. + If no RequiredSubmodules return an empty iterable + ''' + rs =3D [] + rs.append(RequiredSubmodule( + "ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3", False)) + rs.append(RequiredSubmodule( + "CryptoPkg/Library/OpensslLib/openssl", False)) + return rs + + def SetArchitectures(self, list_of_requested_architectures): + ''' Confirm the requests architecture list is valid and configure = SettingsManager + to run only the requested architectures. + + Raise Exception if a list_of_requested_architectures is not suppor= ted + ''' + unsupported =3D set(list_of_requested_architectures) - set(self.Ge= tArchitecturesSupported()) + if(len(unsupported) > 0): + errorString =3D ( "Unsupported Architecture Requested: " + " "= .join(unsupported)) + 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 this = process ''' + return CommonPlatform.Scopes + + def FilterPackagesToTest(self, changedFilesList: list, potentialPackag= esList: 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 file changed + if ".azurepipelines" in f and "Ovmf" in f: + build_these_packages =3D possible_packages + break + + # if the azure pipeline platform template file changed + if ".azurepipelines" in f and "platforms" in f and "templates"= 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 ev= aluate if + any of the changes will be built in the dsc. + + The tuple should be (, ) + ''' + dsc =3D CommonPlatform.GetDscName(",".join(self.ActualArchitecture= s)) + return (f"OvmfPkg/{dsc}", {}) + + + # ####################################################################= ################### # + # Actual Configuration for Platform Build = # + # ####################################################################= ################### # +class PlatformBuilder( UefiBuilder, BuildSettingsManager): + def __init__(self): + UefiBuilder.__init__(self) + + def AddCommandLineOptions(self, parserObj): + ''' Add command line options to the argparser ''' + parserObj.add_argument('-a', "--arch", dest=3D"build_arch", type= =3Dstr, default=3D"IA32,X64", + help=3D"Optional - CSV of architecture to build. IA32 will us= e IA32 for Pei & Dxe. " + "X64 will use X64 for both PEI and DXE. IA32,X64 will use IA3= 2 for PEI and " + "X64 for DXE. default is IA32,X64") + + def RetrieveCommandLineOptions(self, args): + ''' Retrieve command line options from the argparser ''' + + shell_environment.GetBuildVars().SetValue("TARGET_ARCH"," ".join(a= rgs.build_arch.upper().split(",")), "From CmdLine") + dsc =3D CommonPlatform.GetDscName(args.build_arch) + shell_environment.GetBuildVars().SetValue("ACTIVE_PLATFORM", f"Ovm= fPkg/{dsc}", "From CmdLine") + + def GetWorkspaceRoot(self): + ''' get WorkspacePath ''' + return CommonPlatform.WorkspaceRoot + + def GetPackagesPath(self): + ''' Return a list of workspace relative paths that should be mappe= d as edk2 PackagesPath ''' + return () + + def GetActiveScopes(self): + ''' return tuple containing scopes that should be active for this = process ''' + return CommonPlatform.Scopes + + def GetName(self): + ''' Get the name of the repo, platform, or product being build ''' + ''' Used for naming the log file, among others ''' + # check the startup nsh flag and if set then rename the log file. + # this helps in CI so we don't overwrite the build log since runni= ng + # uses the stuart_build command. + if(shell_environment.GetBuildVars().GetValue("MAKE_STARTUP_NSH", "= FALSE") =3D=3D "TRUE"): + return "OvmfPkg_With_Run" + return "OvmfPkg" + + 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", "OVMF", "Platform Hardcoded") + self.env.SetValue("MAKE_STARTUP_NSH", "FALSE", "Default to false") + self.env.SetValue("QEMU_HEADLESS", "FALSE", "Default to false") + return 0 + + def PlatformPreBuild(self): + return 0 + + def PlatformPostBuild(self): + return 0 + + def FlashRomImage(self): + VirtualDrive =3D os.path.join(self.env.GetValue("BUILD_OUTPUT_BASE= "), "VirtualDrive") + os.makedirs(VirtualDrive, exist_ok=3DTrue) + OutputPath_FV =3D os.path.join(self.env.GetValue("BUILD_OUTPUT_BAS= E"), "FV") + + # + # QEMU must be on the path + # + cmd =3D "qemu-system-x86_64" + args =3D "-debugcon stdio" = # write messages to stdio + args +=3D " -global isa-debugcon.iobase=3D0x402" = # debug messages out thru virtual io port + args +=3D " -net none" = # turn off network + args +=3D f" -drive file=3Dfat:rw:{VirtualDrive},format=3Draw,medi= a=3Ddisk" # Mount disk with startup.nsh + + if (self.env.GetValue("QEMU_HEADLESS").upper() =3D=3D "TRUE"): + args +=3D " -display none" # no graphics + + if (self.env.GetBuildValue("SMM_REQUIRE") =3D=3D "1"): + args +=3D " -machine q35,smm=3Don" #,accel=3D(tcg|kvm)" + #args +=3D " -m ..." + #args +=3D " -smp ..." + args +=3D " -global driver=3Dcfi.pflash01,property=3Dsecure,va= lue=3Don" + args +=3D " -drive if=3Dpflash,format=3Draw,unit=3D0,file=3D" = + os.path.join(OutputPath_FV, "OVMF_CODE.fd") + ",readonly=3Don" + args +=3D " -drive if=3Dpflash,format=3Draw,unit=3D1,file=3D" = + os.path.join(OutputPath_FV, "OVMF_VARS.fd") + else: + args +=3D " -pflash " + os.path.join(OutputPath_FV, "OVMF.fd")= # path to firmware + + + if (self.env.GetValue("MAKE_STARTUP_NSH").upper() =3D=3D "TRUE"): + f =3D open(os.path.join(VirtualDrive, "startup.nsh"), "w") + f.write("BOOT SUCCESS !!! \n") + ## add commands here + f.write("reset -s\n") + f.close() + + ret =3D RunCmd(cmd, args) + + if ret =3D=3D 0xc0000005: + #for some reason getting a c0000005 on successful return + return 0 + + return ret + + + diff --git a/OvmfPkg/README-pytools.md b/OvmfPkg/README-pytools.md new file mode 100644 index 000000000000..7d8689bc2336 --- /dev/null +++ b/OvmfPkg/README-pytools.md @@ -0,0 +1,238 @@ +# OvmfPkg + +This README-pytools.md summarizes the current state of Platform CI for Ovm= fPkg. +It also describes how to _build_ OvmfPkg using the Pytools build system. +For general documentation on OvmfPkg, refer to the [local README](./README= ). + +## Platform CI Current Status + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ConfigBuild & RunNotes
DEBUGRELEASENOOPT
+ Windows VS2019 +
IA32 + + + + + + + + +
X64 + + + + + + + + +
IA32X64 + + + + + + + + +
IA32X64 Full + + + + + + + Image sizes too large. Skipping + NOOPT build out of space in FD
+ Ubuntu 18.04 GCC5 +
IA32 + + + + + + + + +
X64 + + + + + + + + +
IA32X64 + + + + + + + + +
IA32X64 Full + + + + + + + + +
+ +### Config Details + +| Config | Architectures |Additional Flags | +| :---- | :----- | :---- | +| IA32 | IA32 | None | +| X64 | X64 | None | +| IA32X64 | PEI: IA32 DXE: X64 | None | +| IA32X64 FULL | PEI: IA32 DXE: X64 | SECURE_BOOT_ENABLE=3D1 SMM_REQUIRE= =3D1 TPM_ENABLE=3D1 TPM_CONFIG_ENABLE=3D1 NETWORK_TLS_ENABLE=3D1 NETWORK_IP= 6_ENABLE=3D1 NETWORK_HTTP_BOOT_ENABLE=3D1 | + +## Setup + +### The Usual EDK2 Build Setup + +- [Python 3.8.x - Download & Install](https://www.python.org/downloads/) +- [GIT - Download & Install](https://git-scm.com/download/) +- [GIT - Configure for EDK II](https://github.com/tianocore/tianocore.gith= ub.io/wiki/Windows-systems#github-help) +- [QEMU - Download, Install, and add to your path](https://www.qemu.org/do= wnload/) +- [EDKII Source - Download/Checkout from Github](https://github.com/tianoc= ore/tianocore.github.io/wiki/Windows-systems#download) + - **NOTE:** Do _not_ follow the EDK II Compile Tools and Build instructi= ons, see below... + +### Differences from EDK Classic Build Setup + +- Build BaseTools using "`C:\git\edk2>python BaseTools\Edk2ToolsBuild.py [= -t ]`" + - This replaces "`edksetup Rebuild`" from the classic build system + - For Windows `` examples, refer to [Windows ToolChain Mat= rix](https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems-= ToolChain-Matrix), defaults to `VS2017` if not specified +- **No Action:** Submodule initialization and manual installation/setup of= NASM and iASL is **not** required, it is handled by the Pytools build syst= em + +### Install & Configure Pytools for OvmfPkg + +- Install Pytools + - `pip install --upgrade -r pip-requirements.txt` +- Initialize & Update Submodules + - `stuart_setup -c OvmfPkg\PlatformBuild.py` +- Initialize & Update Dependencies (e.g. iASL & NASM) + - `stuart_update -c OvmfPkg\PlatformBuild.py` + +## Building + +OVMF has [3 versions](https://github.com/tianocore/tianocore.github.io/wik= i/How-to-build-OVMF#choosing-which-version-of-ovmf-to-build). To build them= using Pytools: + +First set the `TOOL_CHAIN_TAG` via environment variable, Conf/target.txt, = or pass it on the command-lines below using "`TOOL_CHAIN_TAG=3D`" sy= ntax. + +| Platform | Commandline = = | +| ------------------ | ---------------------------------------------------= ---------------------------------------------------------------------------= ---------------------------------------------------- | +| OvmfPkgIa32X64.dsc | `stuart_build -c OvmfPkg\PlatformBuild.py [TOOL_CHA= IN_TAG=3D]`
**OR**
`stuart_build -c OvmfPkg\PlatformB= uild.py -a IA32,X64 [TOOL_CHAIN_TAG=3D]` | +| OvmfPkgIa32.dsc | `stuart_build -c OvmfPkg\PlatformBuild.py -a IA32 [= TOOL_CHAIN_TAG=3D]` = | +| OvmfPkgX64.dsc | `stuart_build -c OvmfPkg\PlatformBuild.py -a X64 [T= OOL_CHAIN_TAG=3D]` = | + +**NOTE:** configuring ACTIVE*PLATFORM and TARGET_ARCH in Conf/target.txt i= s *not* required. This environment is set by PlatformBuild.py based upon th= e "`[-a ]`" parameter. + +### Custom Build Options + +**MAKE_STARTUP_NSH=3DTRUE** will output a _startup.nsh_ file to the locati= on mapped as fs0. This is used in CI in combination with the --FlashOnly fe= ature to run QEMU to the UEFI shell and then execute the contents of startu= p.nsh. + +**QEMU_HEADLESS=3DTRUE** Since CI servers run headless QEMU must be told t= o run with no display otherwise an error occurs. Locally you don't need to = set this. + +### Passing Build Defines + +To pass build defines through stuart*build, prepend `BLD_*_`to the define = name and pass it on the commandline. stuart_build currently requires values= to be assigned, so add an `=3D1` suffix for bare defines. +For example, to enable the Intel E1000 NIC, instead of the traditional "-D= E1000_ENABLE", the stuart_build command-line would be: + +`stuart_build -c OvmfPkg/PlatformBuild.py BLD_*_E1000_ENABLE=3D1` + +## Running QEMU Emulator + +QEMU can be automatically launched using stuart_build. This makes path ma= nagement and quick verification easy. +QEMU must be added to your path. On Windows this is a manual process and = not part of the QEMU installer. + +1. To run as part of the build but after building add the `--FlashRom` par= ameter. +2. To run after the build process standalone use your build command mentio= ned above plus `--FlashOnly`. + +**NOTE:** Logging the execution output will be in the normal stuart log as= well as to your console. + +## References + +- [Installing Pytools](https://github.com/tianocore/edk2-pytool-extensions= /blob/master/docs/using.md#installing) +- For each workspace, consider creating & using a [Python Virtual Environm= ent](https://docs.python.org/3/library/venv.html). For example +- [stuart_build commandline parser](https://github.com/tianocore/edk2-pyto= ol-extensions/blob/56f6a7aee09995c2f22da4765e8b0a29c1cbf5de/edk2toolext/edk= 2_invocable.py#L109) diff --git a/OvmfPkg/iasl_ext_dep.yaml b/OvmfPkg/iasl_ext_dep.yaml new file mode 100644 index 000000000000..cbee0e5a5a92 --- /dev/null +++ b/OvmfPkg/iasl_ext_dep.yaml @@ -0,0 +1,21 @@ +## @file +# Download iasl executable tool from a nuget.org package +# - package contains different binaries based on host +# Add the folder with the tool to the path +# +# This is only downloaded for scope ovmf thus +# should have no impact on the asl compiler used by any +# other given platform to build. +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## +{ + "id": "iasl-ovmf-1", + "scope": "ovmf", + "type": "nuget", + "name": "iasl", + "source": "https://api.nuget.org/v3/index.json", + "version": "20190215.0.0", + "flags": ["set_path", "host_specific"], +} --=20 2.16.3.windows.1