Add script to build UniversalPayload, which can be used after edksetup rebuild The final UPL.elf will be located at root folder of edk2
Cc: Guo Dong <guo.d...@intel.com> Cc: Ray Ni <ray...@intel.com> Cc: Maurice Ma <maurice...@intel.com> Cc: Benjamin You <benjamin....@intel.com> Cc: Zhiguang Liu <zhiguang....@intel.com> Signed-off-by: Dun Tan <dun....@intel.com> --- UefiPayloadPkg/UniversalPayloadBuild.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/UefiPayloadPkg/UniversalPayloadBuild.py b/UefiPayloadPkg/UniversalPayloadBuild.py new file mode 100644 index 0000000000..9bcc4e77a0 --- /dev/null +++ b/UefiPayloadPkg/UniversalPayloadBuild.py @@ -0,0 +1,95 @@ +## @file +# This file contains the script to build UniversalPayload +# +# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +import argparse +import subprocess +import os +import shutil +import sys + +def RunCommand(cmd): + print(cmd) + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,cwd=os.environ['WORKSPACE']) + while True: + line = p.stdout.readline() + if not line: + break + print(line.strip().decode(errors='ignore')) + + p.communicate() + if p.returncode != 0: + print("- Failed - error happened when run command: %s"%cmd) + raise Exception("ERROR: when run command: %s"%cmd) + +def BuildUniversalPayload(args, MacroList): + build_target = args.Target + tool_chain_tag = args.ToolChain + elf_tool_chain = 'CLANGDWARF' + entry_module_inf = os.path.join("UefiPayloadPkg", "UefiPayloadEntry", "UniversalPayloadEntry.inf") + fv = os.path.join(os.environ['WORKSPACE'], "Build", "UefiPayloadPkgX64", "%s_%s"%(build_target, tool_chain_tag), "FV", "DXEFV.Fv") + entry = os.path.join(os.environ['WORKSPACE'], "Build", "UefiPayloadPkgX64", "%s_%s"%(build_target, elf_tool_chain), "X64", "UefiPayloadPkg", "UefiPayloadEntry", "UniversalPayloadEntry", "DEBUG", "UniversalPayloadEntry.dll") + dsc_patch = os.path.join("UefiPayloadPkg", "UefiPayloadPkg.dsc") + + if "CLANG_BIN" in os.environ: + llvm_objcopy_path = os.path.join(os.environ["CLANG_BIN"],"llvm-objcopy") + else: + llvm_objcopy_path = "llvm-objcopy" + try: + RunCommand('"%s" --version'%llvm_objcopy_path) + except: + print("- Failed - Please check if LLVM is installed or if CLANG_BIN is set correctly") + sys.exit(1) + + macro_list = " " + for key in MacroList: + macro_list +="-D {0}={1} ".format(key, MacroList[key]) + + # + # Building DXE core and DXE drivers as DXEFV. + # + build_payload = "build -p %s -b %s -a X64 -t %s -y UplBuildReport.txt"%(dsc_patch, build_target, tool_chain_tag) + build_payload += macro_list + RunCommand(build_payload) + # + # Building Universal Payload entry. + # + build_module = "build -p %s -b %s -a X64 -m %s -t %s -y UplBuildReportEntry.txt"%(dsc_patch, build_target, entry_module_inf, elf_tool_chain) + build_module += macro_list + RunCommand(build_module) + + # + # Copy the DXEFV as a section in elf format Universal Payload entry. + # + remove_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --remove-section .upld.uefi_fv %s'%(llvm_objcopy_path,entry) + add_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --add-section .upld.uefi_fv=%s %s'%(llvm_objcopy_path,fv,entry) + set_section = '"%s" -I elf64-x86-64 -O elf64-x86-64 --set-section-alignment .upld.uefi_fv=16 %s'%(llvm_objcopy_path,entry) + RunCommand(remove_section) + RunCommand(add_section) + RunCommand(set_section) + + shutil.copy (entry, os.path.join(os.environ['WORKSPACE'], 'UPL.elf')) + +def main(): + print ("Begin to build Universal Payload...") + parser = argparse.ArgumentParser(description='For build Universal Payload') + parser.add_argument('-t', '--ToolChain', help="Using the ToolChain to build the UniversalPayload") + parser.add_argument('-b', '--Target', help="Using the TARGET to build the UniversalPayload") + parser.add_argument("-D", "--Macro", action="append", help="Macro: \"Name [= Value]\".") + MacroList = {} + args = parser.parse_args() + if args.Macro is not None: + for argument in args.Macro: + if argument.count('=') != 1: + print("Unknown variable passed in: %s"%argument) + raise Exception("ERROR: Unknown variable passed in: %s"%argument) + tokens = argument.strip().split('=') + MacroList[tokens[0].upper()] = tokens[1] + BuildUniversalPayload(args, MacroList) + print ("Successfully build Universal Payload") + +if __name__ == '__main__': + main() -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#80473): https://edk2.groups.io/g/devel/message/80473 Mute This Topic: https://groups.io/mt/85504626/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-