3 # Copyright (c) Microsoft Corporation.
4 # Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
9 from edk2toolext
.environment
import shell_environment
10 from edk2toolext
.invocables
.edk2_ci_build
import CiBuildSettingsManager
11 from edk2toolext
.invocables
.edk2_setup
import SetupSettingsManager
, RequiredSubmodule
12 from edk2toolext
.invocables
.edk2_update
import UpdateSettingsManager
13 from edk2toolext
.invocables
.edk2_pr_eval
import PrEvalSettingsManager
14 from edk2toollib
.utility_functions
import GetHostInfo
17 class Settings(CiBuildSettingsManager
, UpdateSettingsManager
, SetupSettingsManager
, PrEvalSettingsManager
):
20 self
.ActualPackages
= []
21 self
.ActualTargets
= []
22 self
.ActualArchitectures
= []
23 self
.ActualToolChainTag
= ""
25 # ####################################################################################### #
26 # Extra CmdLine configuration #
27 # ####################################################################################### #
29 def AddCommandLineOptions(self
, parserObj
):
32 def RetrieveCommandLineOptions(self
, args
):
35 # ####################################################################################### #
36 # Default Support for this Ci Build #
37 # ####################################################################################### #
39 def GetPackagesSupported(self
):
40 ''' return iterable of edk2 packages supported by this build.
41 These should be edk2 workspace relative paths '''
55 "UnitTestFrameworkPkg",
59 def GetArchitecturesSupported(self
):
60 ''' return iterable of edk2 architectures supported by this build '''
68 def GetTargetsSupported(self
):
69 ''' return iterable of edk2 target tags supported by this build '''
70 return ("DEBUG", "RELEASE", "NO-TARGET", "NOOPT")
72 # ####################################################################################### #
73 # Verify and Save requested Ci Build Config #
74 # ####################################################################################### #
76 def SetPackages(self
, list_of_requested_packages
):
77 ''' Confirm the requested package list is valid and configure SettingsManager
78 to build the requested packages.
80 Raise UnsupportedException if a requested_package is not supported
82 unsupported
= set(list_of_requested_packages
) - \
83 set(self
.GetPackagesSupported())
84 if(len(unsupported
) > 0):
86 "Unsupported Package Requested: " + " ".join(unsupported
))
87 raise Exception("Unsupported Package Requested: " +
88 " ".join(unsupported
))
89 self
.ActualPackages
= list_of_requested_packages
91 def SetArchitectures(self
, list_of_requested_architectures
):
92 ''' Confirm the requests architecture list is valid and configure SettingsManager
93 to run only the requested architectures.
95 Raise Exception if a list_of_requested_architectures is not supported
97 unsupported
= set(list_of_requested_architectures
) - \
98 set(self
.GetArchitecturesSupported())
99 if(len(unsupported
) > 0):
101 "Unsupported Architecture Requested: " + " ".join(unsupported
))
103 "Unsupported Architecture Requested: " + " ".join(unsupported
))
104 self
.ActualArchitectures
= list_of_requested_architectures
106 def SetTargets(self
, list_of_requested_target
):
107 ''' Confirm the request target list is valid and configure SettingsManager
108 to run only the requested targets.
110 Raise UnsupportedException if a requested_target is not supported
112 unsupported
= set(list_of_requested_target
) - \
113 set(self
.GetTargetsSupported())
114 if(len(unsupported
) > 0):
116 "Unsupported Targets Requested: " + " ".join(unsupported
))
117 raise Exception("Unsupported Targets Requested: " +
118 " ".join(unsupported
))
119 self
.ActualTargets
= list_of_requested_target
121 # ####################################################################################### #
122 # Actual Configuration for Ci Build #
123 # ####################################################################################### #
125 def GetActiveScopes(self
):
126 ''' return tuple containing scopes that should be active for this process '''
127 scopes
= ("cibuild", "edk2-build", "host-based-test")
129 self
.ActualToolChainTag
= shell_environment
.GetBuildVars().GetValue("TOOL_CHAIN_TAG", "")
131 if GetHostInfo().os
.upper() == "WINDOWS":
132 scopes
+= ('host-test-win',)
134 if GetHostInfo().os
.upper() == "LINUX" and self
.ActualToolChainTag
.upper().startswith("GCC"):
135 if "AARCH64" in self
.ActualArchitectures
:
136 scopes
+= ("gcc_aarch64_linux",)
137 if "ARM" in self
.ActualArchitectures
:
138 scopes
+= ("gcc_arm_linux",)
139 if "RISCV64" in self
.ActualArchitectures
:
140 scopes
+= ("gcc_riscv64_unknown",)
144 def GetRequiredSubmodules(self
):
145 ''' return iterable containing RequiredSubmodule objects.
146 If no RequiredSubmodules return an empty iterable
149 rs
.append(RequiredSubmodule(
150 "ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3", False))
151 rs
.append(RequiredSubmodule(
152 "CryptoPkg/Library/OpensslLib/openssl", False))
153 rs
.append(RequiredSubmodule(
154 "UnitTestFrameworkPkg/Library/CmockaLib/cmocka", False))
155 rs
.append(RequiredSubmodule(
156 "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma", False))
157 rs
.append(RequiredSubmodule(
158 "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli", False))
159 rs
.append(RequiredSubmodule(
160 "BaseTools/Source/C/BrotliCompress/brotli", False))
166 def GetDependencies(self
):
170 def GetPackagesPath(self
):
173 def GetWorkspaceRoot(self
):
174 ''' get WorkspacePath '''
175 return os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
)))
177 def FilterPackagesToTest(self
, changedFilesList
: list, potentialPackagesList
: list) -> list:
178 ''' Filter potential packages to test based on changed files. '''
179 build_these_packages
= []
180 possible_packages
= potentialPackagesList
.copy()
181 for f
in changedFilesList
:
182 # split each part of path for comparison later
185 # python file change in .pytool folder causes building all
186 if f
.endswith(".py") and ".pytool" in nodes
:
187 build_these_packages
= possible_packages
190 # BaseTools files that might change the build
191 if "BaseTools" in nodes
:
192 if os
.path
.splitext(f
) not in [".txt", ".md"]:
193 build_these_packages
= possible_packages
195 return build_these_packages