]>
Commit | Line | Data |
---|---|---|
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 | |
8 | import argparse\r | |
9 | import subprocess\r | |
10 | import os\r | |
11 | import shutil\r | |
12 | import sys\r | |
13 | \r | |
14 | def 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 | |
28 | def 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 | |
80 | def 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 | |
97 | if __name__ == '__main__':\r | |
98 | main()\r |