]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Edk2ToolsBuild.py
BaseTools: Switch to GNU mode for CLANGPDB
[mirror_edk2.git] / BaseTools / Edk2ToolsBuild.py
CommitLineData
f7978bb2
SB
1# @file Edk2ToolsBuild.py\r
2# Invocable class that builds the basetool c files.\r
3#\r
4# Supports VS2017, VS2019, and GCC5\r
5##\r
6# Copyright (c) Microsoft Corporation\r
7#\r
8# SPDX-License-Identifier: BSD-2-Clause-Patent\r
9##\r
10import os\r
11import sys\r
12import logging\r
13import argparse\r
14from edk2toolext import edk2_logging\r
15from edk2toolext.environment import self_describing_environment\r
16from edk2toolext.base_abstract_invocable import BaseAbstractInvocable\r
17from edk2toollib.utility_functions import RunCmd\r
18from edk2toollib.windows.locate_tools import QueryVcVariables\r
19\r
20\r
21class Edk2ToolsBuild(BaseAbstractInvocable):\r
22\r
23 def ParseCommandLineOptions(self):\r
24 ''' parse arguments '''\r
25 ParserObj = argparse.ArgumentParser()\r
26 ParserObj.add_argument("-t", "--tool_chain_tag", dest="tct", default="VS2017",\r
27 help="Set the toolchain used to compile the build tools")\r
28 args = ParserObj.parse_args()\r
29 self.tool_chain_tag = args.tct\r
30\r
31 def GetWorkspaceRoot(self):\r
32 ''' Return the workspace root for initializing the SDE '''\r
33\r
34 # this is the bastools dir...not the traditional EDK2 workspace root\r
35 return os.path.dirname(os.path.abspath(__file__))\r
36\r
37 def GetActiveScopes(self):\r
38 ''' return tuple containing scopes that should be active for this process '''\r
39\r
40 # for now don't use scopes\r
41 return ('global',)\r
42\r
43 def GetLoggingLevel(self, loggerType):\r
44 ''' Get the logging level for a given type (return Logging.Level)\r
45 base == lowest logging level supported\r
46 con == Screen logging\r
47 txt == plain text file logging\r
48 md == markdown file logging\r
49 '''\r
50 if(loggerType == "con"):\r
51 return logging.ERROR\r
52 else:\r
53 return logging.DEBUG\r
54\r
55 def GetLoggingFolderRelativeToRoot(self):\r
56 ''' Return a path to folder for log files '''\r
57 return "BaseToolsBuild"\r
58\r
59 def GetVerifyCheckRequired(self):\r
60 ''' Will call self_describing_environment.VerifyEnvironment if this returns True '''\r
61 return True\r
62\r
63 def GetLoggingFileName(self, loggerType):\r
64 ''' Get the logging file name for the type.\r
65 Return None if the logger shouldn't be created\r
66\r
67 base == lowest logging level supported\r
68 con == Screen logging\r
69 txt == plain text file logging\r
70 md == markdown file logging\r
71 '''\r
72 return "BASETOOLS_BUILD"\r
73\r
74 def WritePathEnvFile(self, OutputDir):\r
75 ''' Write a PyTool path env file for future PyTool based edk2 builds'''\r
76 content = '''##\r
77# Set shell variable EDK_TOOLS_BIN to this folder\r
78#\r
79# Autogenerated by Edk2ToolsBuild.py\r
80#\r
81# Copyright (c), Microsoft Corporation\r
82# SPDX-License-Identifier: BSD-2-Clause-Patent\r
83##\r
84{\r
85 "id": "You-Built-BaseTools",\r
86 "scope": "edk2-build",\r
87 "flags": ["set_shell_var", "set_path"],\r
88 "var_name": "EDK_TOOLS_BIN"\r
89}\r
90'''\r
91 with open(os.path.join(OutputDir, "basetoolsbin_path_env.yaml"), "w") as f:\r
92 f.write(content)\r
93\r
94 def Go(self):\r
95 logging.info("Running Python version: " + str(sys.version_info))\r
96\r
97 (build_env, shell_env) = self_describing_environment.BootstrapEnvironment(\r
98 self.GetWorkspaceRoot(), self.GetActiveScopes())\r
99\r
100 # # Bind our current execution environment into the shell vars.\r
101 ph = os.path.dirname(sys.executable)\r
102 if " " in ph:\r
103 ph = '"' + ph + '"'\r
104 shell_env.set_shell_var("PYTHON_HOME", ph)\r
105 # PYTHON_COMMAND is required to be set for using edk2 python builds.\r
106 pc = sys.executable\r
107 if " " in pc:\r
108 pc = '"' + pc + '"'\r
109 shell_env.set_shell_var("PYTHON_COMMAND", pc)\r
110\r
111 if self.tool_chain_tag.lower().startswith("vs"):\r
112\r
113 # # Update environment with required VC vars.\r
114 interesting_keys = ["ExtensionSdkDir", "INCLUDE", "LIB"]\r
115 interesting_keys.extend(\r
116 ["LIBPATH", "Path", "UniversalCRTSdkDir", "UCRTVersion", "WindowsLibPath", "WindowsSdkBinPath"])\r
117 interesting_keys.extend(\r
118 ["WindowsSdkDir", "WindowsSdkVerBinPath", "WindowsSDKVersion", "VCToolsInstallDir"])\r
119 vc_vars = QueryVcVariables(\r
120 interesting_keys, 'x86', vs_version=self.tool_chain_tag.lower())\r
121 for key in vc_vars.keys():\r
122 logging.debug(f"Var - {key} = {vc_vars[key]}")\r
123 if key.lower() == 'path':\r
124 shell_env.insert_path(vc_vars[key])\r
125 else:\r
126 shell_env.set_shell_var(key, vc_vars[key])\r
127\r
128 self.OutputDir = os.path.join(\r
129 shell_env.get_shell_var("EDK_TOOLS_PATH"), "Bin", "Win32")\r
130\r
131 # compiled tools need to be added to path because antlr is referenced\r
132 shell_env.insert_path(self.OutputDir)\r
133\r
134 # Actually build the tools.\r
135 ret = RunCmd('nmake.exe', None,\r
136 workingdir=shell_env.get_shell_var("EDK_TOOLS_PATH"))\r
137 if ret != 0:\r
138 raise Exception("Failed to build.")\r
139\r
140 self.WritePathEnvFile(self.OutputDir)\r
141 return ret\r
142\r
143 elif self.tool_chain_tag.lower().startswith("gcc"):\r
144 ret = RunCmd("make", "-C .", workingdir=shell_env.get_shell_var("EDK_TOOLS_PATH"))\r
145 if ret != 0:\r
146 raise Exception("Failed to build.")\r
147\r
148 self.OutputDir = os.path.join(\r
149 shell_env.get_shell_var("EDK_TOOLS_PATH"), "Source", "C", "bin")\r
150\r
151 self.WritePathEnvFile(self.OutputDir)\r
152 return ret\r
153\r
154 logging.critical("Tool Chain not supported")\r
155 return -1\r
156\r
157\r
158def main():\r
159 Edk2ToolsBuild().Invoke()\r
160\r
161\r
162if __name__ == "__main__":\r
163 main()\r