]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/UniversalPayloadBuild.py
UefiPayloadPkg: Add script to build UniversalPayload in UefiPayloadPkg
[mirror_edk2.git] / UefiPayloadPkg / UniversalPayloadBuild.py
CommitLineData
f4e72cf9
TD
1## @file\r
2# This file contains the script to build UniversalPayload\r
3#\r
4# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
6##\r
7\r
8import argparse\r
9import subprocess\r
10import os\r
11import shutil\r
12import sys\r
13\r
14def RunCommand(cmd):\r
15 print(cmd)\r
16 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,cwd=os.environ['WORKSPACE'])\r
17 while True:\r
18 line = p.stdout.readline()\r
19 if not line:\r
20 break\r
21 print(line.strip().decode(errors='ignore'))\r
22\r
23 p.communicate()\r
24 if p.returncode != 0:\r
25 print("- Failed - error happened when run command: %s"%cmd)\r
26 raise Exception("ERROR: when run command: %s"%cmd)\r
27\r
28def BuildUniversalPayload(Args, MacroList):\r
29 BuildTarget = Args.Target\r
30 ToolChain = Args.ToolChain\r
31 ElfToolChain = 'CLANGDWARF'\r
32\r
33 EntryModuleInf = os.path.normpath("UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf")\r
34 DscPath = os.path.normpath("UefiPayloadPkg/UefiPayloadPkg.dsc")\r
35 BuildDir = os.path.join(os.environ['WORKSPACE'], os.path.normpath("Build/UefiPayloadPkgX64"))\r
36 FvOutputDir = os.path.join(BuildDir, f"{BuildTarget}_{ToolChain}", os.path.normpath("FV/DXEFV.Fv"))\r
37 EntryOutputDir = os.path.join(BuildDir, f"{BuildTarget}_{ElfToolChain}", os.path.normpath("X64/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry/DEBUG/UniversalPayloadEntry.dll"))\r
38 PayloadReportPath = os.path.join(BuildDir, "UefiUniversalPayload.txt")\r
39 ModuleReportPath = os.path.join(BuildDir, "UefiUniversalPayloadEntry.txt")\r
40\r
41 if "CLANG_BIN" in os.environ:\r
42 LlvmObjcopyPath = os.path.join(os.environ["CLANG_BIN"], "llvm-objcopy")\r
43 else:\r
44 LlvmObjcopyPath = "llvm-objcopy"\r
45 try:\r
46 RunCommand('"%s" --version'%LlvmObjcopyPath)\r
47 except:\r
48 print("- Failed - Please check if LLVM is installed or if CLANG_BIN is set correctly")\r
49 sys.exit(1)\r
50\r
51 Defines = ""\r
52 for key in MacroList:\r
53 Defines +=" -D {0}={1}".format(key, MacroList[key])\r
54\r
55 #\r
56 # Building DXE core and DXE drivers as DXEFV.\r
57 #\r
58 BuildPayload = f"build -p {DscPath} -b {BuildTarget} -a X64 -t {ToolChain} -y {PayloadReportPath}"\r
59 BuildPayload += Defines\r
60 RunCommand(BuildPayload)\r
61 #\r
62 # Building Universal Payload entry.\r
63 #\r
64 BuildModule = f"build -p {DscPath} -b {BuildTarget} -a X64 -m {EntryModuleInf} -t {ElfToolChain} -y {ModuleReportPath}"\r
65 BuildModule += Defines\r
66 RunCommand(BuildModule)\r
67\r
68 #\r
69 # Copy the DXEFV as a section in elf format Universal Payload entry.\r
70 #\r
71 remove_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --remove-section .upld.uefi_fv %s'%(LlvmObjcopyPath, EntryOutputDir)\r
72 add_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --add-section .upld.uefi_fv=%s %s'%(LlvmObjcopyPath, FvOutputDir, EntryOutputDir)\r
73 set_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --set-section-alignment .upld.uefi_fv=16 %s'%(LlvmObjcopyPath, EntryOutputDir)\r
74 RunCommand(remove_section)\r
75 RunCommand(add_section)\r
76 RunCommand(set_section)\r
77\r
78 shutil.copy (EntryOutputDir, os.path.join(BuildDir, 'UniversalPayload.elf'))\r
79\r
80def main():\r
81 parser = argparse.ArgumentParser(description='For building Universal Payload')\r
82 parser.add_argument('-t', '--ToolChain')\r
83 parser.add_argument('-b', '--Target', default='DEBUG')\r
84 parser.add_argument("-D", "--Macro", action="append", default=["UNIVERSAL_PAYLOAD=TRUE"])\r
85 MacroList = {}\r
86 args = parser.parse_args()\r
87 if args.Macro is not None:\r
88 for Argument in args.Macro:\r
89 if Argument.count('=') != 1:\r
90 print("Unknown variable passed in: %s"%Argument)\r
91 raise Exception("ERROR: Unknown variable passed in: %s"%Argument)\r
92 tokens = Argument.strip().split('=')\r
93 MacroList[tokens[0].upper()] = tokens[1]\r
94 BuildUniversalPayload(args, MacroList)\r
95 print ("Successfully build Universal Payload")\r
96\r
97if __name__ == '__main__':\r
98 main()\r