1 | # @file
|
---|
2 | #
|
---|
3 | # Copyright (c) Microsoft Corporation.
|
---|
4 | # Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
---|
5 | # Copyright (c) 2020 - 2021, ARM Limited. All rights reserved.<BR>
|
---|
6 | # SPDX-License-Identifier: BSD-2-Clause-Patent
|
---|
7 | ##
|
---|
8 | import os
|
---|
9 | import logging
|
---|
10 | from edk2toolext.environment import shell_environment
|
---|
11 | from edk2toolext.invocables.edk2_ci_build import CiBuildSettingsManager
|
---|
12 | from edk2toolext.invocables.edk2_setup import SetupSettingsManager, RequiredSubmodule
|
---|
13 | from edk2toolext.invocables.edk2_update import UpdateSettingsManager
|
---|
14 | from edk2toolext.invocables.edk2_pr_eval import PrEvalSettingsManager
|
---|
15 | from edk2toollib.utility_functions import GetHostInfo
|
---|
16 |
|
---|
17 |
|
---|
18 | class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManager, PrEvalSettingsManager):
|
---|
19 |
|
---|
20 | def __init__(self):
|
---|
21 | self.ActualPackages = []
|
---|
22 | self.ActualTargets = []
|
---|
23 | self.ActualArchitectures = []
|
---|
24 | self.ActualToolChainTag = ""
|
---|
25 | self.UseBuiltInBaseTools = None
|
---|
26 | self.ActualScopes = None
|
---|
27 |
|
---|
28 | # ####################################################################################### #
|
---|
29 | # Extra CmdLine configuration #
|
---|
30 | # ####################################################################################### #
|
---|
31 |
|
---|
32 | def AddCommandLineOptions(self, parserObj):
|
---|
33 | group = parserObj.add_mutually_exclusive_group()
|
---|
34 | group.add_argument("-force_piptools", "--fpt", dest="force_piptools", action="store_true", default=False, help="Force the system to use pip tools")
|
---|
35 | group.add_argument("-no_piptools", "--npt", dest="no_piptools", action="store_true", default=False, help="Force the system to not use pip tools")
|
---|
36 |
|
---|
37 | def RetrieveCommandLineOptions(self, args):
|
---|
38 | super().RetrieveCommandLineOptions(args)
|
---|
39 | if args.force_piptools:
|
---|
40 | self.UseBuiltInBaseTools = True
|
---|
41 | if args.no_piptools:
|
---|
42 | self.UseBuiltInBaseTools = False
|
---|
43 |
|
---|
44 | # ####################################################################################### #
|
---|
45 | # Default Support for this Ci Build #
|
---|
46 | # ####################################################################################### #
|
---|
47 |
|
---|
48 | def GetPackagesSupported(self):
|
---|
49 | ''' return iterable of edk2 packages supported by this build.
|
---|
50 | These should be edk2 workspace relative paths '''
|
---|
51 |
|
---|
52 | return ("ArmPkg",
|
---|
53 | "ArmPlatformPkg",
|
---|
54 | "ArmVirtPkg",
|
---|
55 | "DynamicTablesPkg",
|
---|
56 | "EmbeddedPkg",
|
---|
57 | "EmulatorPkg",
|
---|
58 | "IntelFsp2Pkg",
|
---|
59 | "IntelFsp2WrapperPkg",
|
---|
60 | "MdePkg",
|
---|
61 | "MdeModulePkg",
|
---|
62 | "NetworkPkg",
|
---|
63 | "PcAtChipsetPkg",
|
---|
64 | "SecurityPkg",
|
---|
65 | "UefiCpuPkg",
|
---|
66 | "FmpDevicePkg",
|
---|
67 | "ShellPkg",
|
---|
68 | "SignedCapsulePkg",
|
---|
69 | "StandaloneMmPkg",
|
---|
70 | "FatPkg",
|
---|
71 | "CryptoPkg",
|
---|
72 | "PrmPkg",
|
---|
73 | "UnitTestFrameworkPkg",
|
---|
74 | "OvmfPkg",
|
---|
75 | "RedfishPkg",
|
---|
76 | "SourceLevelDebugPkg",
|
---|
77 | "UefiPayloadPkg"
|
---|
78 | )
|
---|
79 |
|
---|
80 | def GetArchitecturesSupported(self):
|
---|
81 | ''' return iterable of edk2 architectures supported by this build '''
|
---|
82 | return (
|
---|
83 | "IA32",
|
---|
84 | "X64",
|
---|
85 | "ARM",
|
---|
86 | "AARCH64",
|
---|
87 | "RISCV64",
|
---|
88 | "LOONGARCH64")
|
---|
89 |
|
---|
90 | def GetTargetsSupported(self):
|
---|
91 | ''' return iterable of edk2 target tags supported by this build '''
|
---|
92 | return ("DEBUG", "RELEASE", "NO-TARGET", "NOOPT")
|
---|
93 |
|
---|
94 | # ####################################################################################### #
|
---|
95 | # Verify and Save requested Ci Build Config #
|
---|
96 | # ####################################################################################### #
|
---|
97 |
|
---|
98 | def SetPackages(self, list_of_requested_packages):
|
---|
99 | ''' Confirm the requested package list is valid and configure SettingsManager
|
---|
100 | to build the requested packages.
|
---|
101 |
|
---|
102 | Raise UnsupportedException if a requested_package is not supported
|
---|
103 | '''
|
---|
104 | unsupported = set(list_of_requested_packages) - \
|
---|
105 | set(self.GetPackagesSupported())
|
---|
106 | if(len(unsupported) > 0):
|
---|
107 | logging.critical(
|
---|
108 | "Unsupported Package Requested: " + " ".join(unsupported))
|
---|
109 | raise Exception("Unsupported Package Requested: " +
|
---|
110 | " ".join(unsupported))
|
---|
111 | self.ActualPackages = list_of_requested_packages
|
---|
112 |
|
---|
113 | def SetArchitectures(self, list_of_requested_architectures):
|
---|
114 | ''' Confirm the requests architecture list is valid and configure SettingsManager
|
---|
115 | to run only the requested architectures.
|
---|
116 |
|
---|
117 | Raise Exception if a list_of_requested_architectures is not supported
|
---|
118 | '''
|
---|
119 | unsupported = set(list_of_requested_architectures) - \
|
---|
120 | set(self.GetArchitecturesSupported())
|
---|
121 | if(len(unsupported) > 0):
|
---|
122 | logging.critical(
|
---|
123 | "Unsupported Architecture Requested: " + " ".join(unsupported))
|
---|
124 | raise Exception(
|
---|
125 | "Unsupported Architecture Requested: " + " ".join(unsupported))
|
---|
126 | self.ActualArchitectures = list_of_requested_architectures
|
---|
127 |
|
---|
128 | def SetTargets(self, list_of_requested_target):
|
---|
129 | ''' Confirm the request target list is valid and configure SettingsManager
|
---|
130 | to run only the requested targets.
|
---|
131 |
|
---|
132 | Raise UnsupportedException if a requested_target is not supported
|
---|
133 | '''
|
---|
134 | unsupported = set(list_of_requested_target) - \
|
---|
135 | set(self.GetTargetsSupported())
|
---|
136 | if(len(unsupported) > 0):
|
---|
137 | logging.critical(
|
---|
138 | "Unsupported Targets Requested: " + " ".join(unsupported))
|
---|
139 | raise Exception("Unsupported Targets Requested: " +
|
---|
140 | " ".join(unsupported))
|
---|
141 | self.ActualTargets = list_of_requested_target
|
---|
142 |
|
---|
143 | # ####################################################################################### #
|
---|
144 | # Actual Configuration for Ci Build #
|
---|
145 | # ####################################################################################### #
|
---|
146 |
|
---|
147 | def GetActiveScopes(self):
|
---|
148 | ''' return tuple containing scopes that should be active for this process '''
|
---|
149 | if self.ActualScopes is None:
|
---|
150 | scopes = ("cibuild", "edk2-build", "host-based-test")
|
---|
151 |
|
---|
152 | self.ActualToolChainTag = shell_environment.GetBuildVars().GetValue("TOOL_CHAIN_TAG", "")
|
---|
153 |
|
---|
154 | is_linux = GetHostInfo().os.upper() == "LINUX"
|
---|
155 |
|
---|
156 | if self.UseBuiltInBaseTools is None:
|
---|
157 | is_linux = GetHostInfo().os.upper() == "LINUX"
|
---|
158 | # try and import the pip module for basetools
|
---|
159 | try:
|
---|
160 | import edk2basetools
|
---|
161 | self.UseBuiltInBaseTools = True
|
---|
162 | except ImportError:
|
---|
163 | self.UseBuiltInBaseTools = False
|
---|
164 | pass
|
---|
165 |
|
---|
166 | if self.UseBuiltInBaseTools == True:
|
---|
167 | scopes += ('pipbuild-unix',) if is_linux else ('pipbuild-win',)
|
---|
168 | logging.warning("Using Pip Tools based BaseTools")
|
---|
169 | else:
|
---|
170 | logging.warning("Falling back to using in-tree BaseTools")
|
---|
171 |
|
---|
172 | self.ActualScopes = scopes
|
---|
173 | return self.ActualScopes
|
---|
174 |
|
---|
175 | def GetRequiredSubmodules(self):
|
---|
176 | ''' return iterable containing RequiredSubmodule objects.
|
---|
177 | If no RequiredSubmodules return an empty iterable
|
---|
178 | '''
|
---|
179 | rs = []
|
---|
180 | rs.append(RequiredSubmodule(
|
---|
181 | "ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3", False))
|
---|
182 | rs.append(RequiredSubmodule(
|
---|
183 | "CryptoPkg/Library/OpensslLib/openssl", False))
|
---|
184 | rs.append(RequiredSubmodule(
|
---|
185 | "UnitTestFrameworkPkg/Library/CmockaLib/cmocka", False))
|
---|
186 | rs.append(RequiredSubmodule(
|
---|
187 | "UnitTestFrameworkPkg/Library/GoogleTestLib/googletest", False))
|
---|
188 | rs.append(RequiredSubmodule(
|
---|
189 | "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma", False))
|
---|
190 | rs.append(RequiredSubmodule(
|
---|
191 | "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli", False))
|
---|
192 | rs.append(RequiredSubmodule(
|
---|
193 | "BaseTools/Source/C/BrotliCompress/brotli", False))
|
---|
194 | rs.append(RequiredSubmodule(
|
---|
195 | "RedfishPkg/Library/JsonLib/jansson", False))
|
---|
196 | rs.append(RequiredSubmodule(
|
---|
197 | "UnitTestFrameworkPkg/Library/SubhookLib/subhook", False))
|
---|
198 | rs.append(RequiredSubmodule(
|
---|
199 | "MdePkg/Library/BaseFdtLib/libfdt", False))
|
---|
200 | rs.append(RequiredSubmodule(
|
---|
201 | "MdePkg/Library/MipiSysTLib/mipisyst", False))
|
---|
202 | return rs
|
---|
203 |
|
---|
204 | def GetName(self):
|
---|
205 | return "Edk2"
|
---|
206 |
|
---|
207 | def GetDependencies(self):
|
---|
208 | return [
|
---|
209 | ]
|
---|
210 |
|
---|
211 | def GetPackagesPath(self):
|
---|
212 | return ()
|
---|
213 |
|
---|
214 | def GetWorkspaceRoot(self):
|
---|
215 | ''' get WorkspacePath '''
|
---|
216 | return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
---|
217 |
|
---|
218 | def FilterPackagesToTest(self, changedFilesList: list, potentialPackagesList: list) -> list:
|
---|
219 | ''' Filter potential packages to test based on changed files. '''
|
---|
220 | build_these_packages = []
|
---|
221 | possible_packages = potentialPackagesList.copy()
|
---|
222 | for f in changedFilesList:
|
---|
223 | # split each part of path for comparison later
|
---|
224 | nodes = f.split("/")
|
---|
225 |
|
---|
226 | # python file change in .pytool folder causes building all
|
---|
227 | if f.endswith(".py") and ".pytool" in nodes:
|
---|
228 | build_these_packages = possible_packages
|
---|
229 | break
|
---|
230 |
|
---|
231 | # BaseTools files that might change the build
|
---|
232 | if "BaseTools" in nodes:
|
---|
233 | if os.path.splitext(f) not in [".txt", ".md"]:
|
---|
234 | build_these_packages = possible_packages
|
---|
235 | break
|
---|
236 | return build_these_packages
|
---|