]> git.proxmox.com Git - mirror_edk2.git/blob - .pytool/CISettings.py
.pytool: Add RISC-V architecture on RISC-V EDK2 CI.
[mirror_edk2.git] / .pytool / CISettings.py
1 # @file
2 #
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
6 ##
7 import os
8 import logging
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
15
16
17 class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManager, PrEvalSettingsManager):
18
19 def __init__(self):
20 self.ActualPackages = []
21 self.ActualTargets = []
22 self.ActualArchitectures = []
23 self.ActualToolChainTag = ""
24
25 # ####################################################################################### #
26 # Extra CmdLine configuration #
27 # ####################################################################################### #
28
29 def AddCommandLineOptions(self, parserObj):
30 pass
31
32 def RetrieveCommandLineOptions(self, args):
33 pass
34
35 # ####################################################################################### #
36 # Default Support for this Ci Build #
37 # ####################################################################################### #
38
39 def GetPackagesSupported(self):
40 ''' return iterable of edk2 packages supported by this build.
41 These should be edk2 workspace relative paths '''
42
43 return ("ArmVirtPkg",
44 "EmulatorPkg",
45 "MdePkg",
46 "MdeModulePkg",
47 "NetworkPkg",
48 "PcAtChipsetPkg",
49 "SecurityPkg",
50 "UefiCpuPkg",
51 "FmpDevicePkg",
52 "ShellPkg",
53 "FatPkg",
54 "CryptoPkg",
55 "UnitTestFrameworkPkg",
56 "OvmfPkg"
57 )
58
59 def GetArchitecturesSupported(self):
60 ''' return iterable of edk2 architectures supported by this build '''
61 return (
62 "IA32",
63 "X64",
64 "ARM",
65 "AARCH64",
66 "RISCV64")
67
68 def GetTargetsSupported(self):
69 ''' return iterable of edk2 target tags supported by this build '''
70 return ("DEBUG", "RELEASE", "NO-TARGET", "NOOPT")
71
72 # ####################################################################################### #
73 # Verify and Save requested Ci Build Config #
74 # ####################################################################################### #
75
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.
79
80 Raise UnsupportedException if a requested_package is not supported
81 '''
82 unsupported = set(list_of_requested_packages) - \
83 set(self.GetPackagesSupported())
84 if(len(unsupported) > 0):
85 logging.critical(
86 "Unsupported Package Requested: " + " ".join(unsupported))
87 raise Exception("Unsupported Package Requested: " +
88 " ".join(unsupported))
89 self.ActualPackages = list_of_requested_packages
90
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.
94
95 Raise Exception if a list_of_requested_architectures is not supported
96 '''
97 unsupported = set(list_of_requested_architectures) - \
98 set(self.GetArchitecturesSupported())
99 if(len(unsupported) > 0):
100 logging.critical(
101 "Unsupported Architecture Requested: " + " ".join(unsupported))
102 raise Exception(
103 "Unsupported Architecture Requested: " + " ".join(unsupported))
104 self.ActualArchitectures = list_of_requested_architectures
105
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.
109
110 Raise UnsupportedException if a requested_target is not supported
111 '''
112 unsupported = set(list_of_requested_target) - \
113 set(self.GetTargetsSupported())
114 if(len(unsupported) > 0):
115 logging.critical(
116 "Unsupported Targets Requested: " + " ".join(unsupported))
117 raise Exception("Unsupported Targets Requested: " +
118 " ".join(unsupported))
119 self.ActualTargets = list_of_requested_target
120
121 # ####################################################################################### #
122 # Actual Configuration for Ci Build #
123 # ####################################################################################### #
124
125 def GetActiveScopes(self):
126 ''' return tuple containing scopes that should be active for this process '''
127 scopes = ("cibuild", "edk2-build", "host-based-test")
128
129 self.ActualToolChainTag = shell_environment.GetBuildVars().GetValue("TOOL_CHAIN_TAG", "")
130
131 if GetHostInfo().os.upper() == "WINDOWS":
132 scopes += ('host-test-win',)
133
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",)
141
142 return scopes
143
144 def GetRequiredSubmodules(self):
145 ''' return iterable containing RequiredSubmodule objects.
146 If no RequiredSubmodules return an empty iterable
147 '''
148 rs = []
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))
161 return rs
162
163 def GetName(self):
164 return "Edk2"
165
166 def GetDependencies(self):
167 return [
168 ]
169
170 def GetPackagesPath(self):
171 return ()
172
173 def GetWorkspaceRoot(self):
174 ''' get WorkspacePath '''
175 return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
176
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
183 nodes = f.split("/")
184
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
188 break
189
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
194 break
195 return build_these_packages