From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.20, mailfrom: michael.a.kubacki@intel.com) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by groups.io with SMTP; Fri, 03 May 2019 19:14:45 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 May 2019 19:14:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,428,1549958400"; d="scan'208";a="167524357" Received: from orsmsx103.amr.corp.intel.com ([10.22.225.130]) by fmsmga004.fm.intel.com with ESMTP; 03 May 2019 19:14:44 -0700 Received: from orsmsx112.amr.corp.intel.com (10.22.240.13) by ORSMSX103.amr.corp.intel.com (10.22.225.130) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 3 May 2019 19:14:43 -0700 Received: from orsmsx122.amr.corp.intel.com ([169.254.11.68]) by ORSMSX112.amr.corp.intel.com ([169.254.3.109]) with mapi id 14.03.0415.000; Fri, 3 May 2019 19:14:43 -0700 From: "Kubacki, Michael A" To: "devel@edk2.groups.io" , "Agyeman, Prince" CC: "Desimone, Nathaniel L" , "Sinha, Ankit" , "Kinney, Michael D" , "Oram, Isaac W" , "Gao, Liming" , "Zhou, Bowen" , "Lu, Shifei A" Subject: Re: [edk2-devel] [edk2-platforms/devel-MinPlatform] [PATCH v3 1/2] Platform/Intel: Added python build script. Thread-Topic: [edk2-devel] [edk2-platforms/devel-MinPlatform] [PATCH v3 1/2] Platform/Intel: Added python build script. Thread-Index: AQHVAgane1FJg+e2d0mtNVhZ7UMOoaZaOiFg Date: Sat, 4 May 2019 02:14:43 +0000 Message-ID: <49AB4ACB9627B8468F29D589A27B7455888E6F96@ORSMSX122.amr.corp.intel.com> References: In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiM2YxMzc5OWMtYmQzOC00ZDAxLTg3OGQtZGViYmE5YjI0ZWVkIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiYmFwS1c5NGJUNEZMcG5lTGJHcjF0YWdIWHZVelA5c1IrMXpqQ3JGdUpwcG10U1wvSklpNVVCcjUwU1AyRzV2R0gifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.22.254.139] MIME-Version: 1.0 Return-Path: michael.a.kubacki@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Michael Kubacki > -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > Agyeman, Prince > Sent: Friday, May 3, 2019 4:19 PM > To: devel@edk2.groups.io > Cc: Kubacki, Michael A ; Desimone, > Nathaniel L ; Sinha, Ankit > ; Kinney, Michael D ; > Oram, Isaac W ; Gao, Liming > ; Zhou, Bowen ; Lu, Shifei > A > Subject: [edk2-devel] [edk2-platforms/devel-MinPlatform] [PATCH v3 1/2] > Platform/Intel: Added python build script. >=20 > This change allows building all the platforms in Platform/Intel with > a single python script. This script works with python 2.7 > and python 3.7 >=20 > Files Added: >=20 > * build_bios.py: the main build script > build.cfg: contains general/default build settings > * ClevoOpenBoardPkg/N1xxWU/build_config.cfg: contains N1xxWU specific > build settings > * KabylakeOpenBoardPkg/KabylakeRvp3/build_board.py : contains sample > custom build script > * KabylakeOpenBoardPkg/KabylakeRvp3/build_config.cfg: contains > KabylakeRvp3 build settings > * PurleyOpenBoardPkg/BoardMtOlympus/build_board.py: contains > BoardMtOlympus custom build script > * PurleyOpenBoardPkg/BoardMtOlympus/build_config.cfg: contains > BoardMtOlympus custom build settings >=20 > Cc: Michael Kubacki > Cc: Nate DeSimone > Cc: Ankit Sinha > Cc: Michael D Kinney > Cc: Isaac W Oram > Cc: Liming Gao > Cc: Bowen Zhou > Cc: Shifei A Lu >=20 > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Agyeman > --- > .../ClevoOpenBoardPkg/N1xxWU/build_config.cfg | 33 + > .../KabylakeRvp3/build_board.py | 68 ++ > .../KabylakeRvp3/build_config.cfg | 34 + > .../BoardMtOlympus/build_board.py | 177 ++++ > .../BoardMtOlympus/build_config.cfg | 32 + > Platform/Intel/build.cfg | 56 + > Platform/Intel/build_bios.py | 976 ++++++++++++++++++ > 7 files changed, 1376 insertions(+) > create mode 100644 > Platform/Intel/ClevoOpenBoardPkg/N1xxWU/build_config.cfg > create mode 100644 > Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_board.py > create mode 100644 > Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_config.cfg > create mode 100644 > Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_board.py > create mode 100644 > Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_config.cfg > create mode 100644 Platform/Intel/build.cfg > create mode 100644 Platform/Intel/build_bios.py >=20 > diff --git a/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/build_config.cfg > b/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/build_config.cfg > new file mode 100644 > index 0000000000..ee1261e700 > --- /dev/null > +++ b/Platform/Intel/ClevoOpenBoardPkg/N1xxWU/build_config.cfg > @@ -0,0 +1,33 @@ > +# @ build_config.cfg > +# This is the N1xxWU board specific build settings > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > + > +[CONFIG] > +WORKSPACE_PLATFORM_BIN =3D WORKSPACE_PLATFORM_BIN > +EDK_SETUP_OPTION =3D > +openssl_path =3D > +PLATFORM_BOARD_PACKAGE =3D ClevoOpenBoardPkg > +PROJECT =3D ClevoOpenBoardPkg/N1xxWU > +BOARD =3D N1xxWU > +FLASH_MAP_FDF =3D > ClevoOpenBoardPkg/N1xxWU/Include/Fdf/FlashMapInclude.fdf > +PROJECT_DSC =3D ClevoOpenBoardPkg/N1xxWU/OpenBoardPkg.dsc > +BOARD_PKG_PCD_DSC =3D > ClevoOpenBoardPkg/N1xxWU/OpenBoardPkgPcd.dsc > +PrepRELEASE =3D DEBUG > +SILENT_MODE =3D FALSE > +EXT_CONFIG_CLEAR =3D > +CapsuleBuild =3D FALSE > +EXT_BUILD_FLAGS =3D > +CAPSULE_BUILD =3D 0 > +TARGET =3D DEBUG > +TARGET_SHORT =3D D > +PERFORMANCE_BUILD =3D FALSE > +FSP_WRAPPER_BUILD =3D TRUE > +FSP_BIN_PKG =3D KabylakeFspBinPkg > +FSP_PKG_NAME =3D KabylakeFspPkg > +FSP_BINARY_BUILD =3D FALSE > +FSP_TEST_RELEASE =3D FALSE > +SECURE_BOOT_ENABLE =3D FALSE > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_board.py > b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_board.py > new file mode 100644 > index 0000000000..726ad85874 > --- /dev/null > +++ b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_board.py > @@ -0,0 +1,68 @@ > +# @ build_board.py > +# This is a sample code provides Optional dynamic imports > +# of build functions to the BuildBios.py script > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > +""" > +This module serves as a sample implementation of the build extension > +scripts > +""" > + > + > +def pre_build_ex(config, functions): > + """Additional Pre BIOS build function > + > + :param config: The environment variables to be used in the build pr= ocess > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: nothing > + """ > + print("pre_build_ex") > + return None > + > + > +def build_ex(config, functions): > + """Additional BIOS build function > + > + :param config: The environment variables to be used in the build pr= ocess > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + print("build_ex") > + return None > + > + > +def post_build_ex(config, functions): > + """Additional Post BIOS build function > + > + :param config: The environment variables to be used in the post > + build process > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + print("post_build_ex") > + return None > + > + > +def clean_ex(config, functions): > + """Additional clean function > + > + :param config: The environment variables to be used in the build pr= ocess > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + print("clean_ex") > + return None > diff --git > a/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_config.cfg > b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_config.cfg > new file mode 100644 > index 0000000000..5ea61dceb8 > --- /dev/null > +++ > b/Platform/Intel/KabylakeOpenBoardPkg/KabylakeRvp3/build_config.cfg > @@ -0,0 +1,34 @@ > +# @ build_config.cfg > +# This is the KabylakeRvp3 board specific build settings > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > + > +[CONFIG] > +WORKSPACE_PLATFORM_BIN =3D WORKSPACE_PLATFORM_BIN > +EDK_SETUP_OPTION =3D > +openssl_path =3D > +PLATFORM_BOARD_PACKAGE =3D KabylakeOpenBoardPkg > +PROJECT =3D KabylakeOpenBoardPkg/KabylakeRvp3 > +BOARD =3D KabylakeRvp3 > +FLASH_MAP_FDF =3D > KabylakeOpenBoardPkg/Include/Fdf/FlashMapInclude.fdf > +PROJECT_DSC =3D KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkg.dsc > +BOARD_PKG_PCD_DSC =3D > KabylakeOpenBoardPkg/KabylakeRvp3/OpenBoardPkgPcd.dsc > +ADDITIONAL_SCRIPTS =3D > KabylakeOpenBoardPkg/KabylakeRvp3/build_board.py > +PrepRELEASE =3D DEBUG > +SILENT_MODE =3D FALSE > +EXT_CONFIG_CLEAR =3D > +CapsuleBuild =3D FALSE > +EXT_BUILD_FLAGS =3D > +CAPSULE_BUILD =3D 0 > +TARGET =3D DEBUG > +TARGET_SHORT =3D D > +PERFORMANCE_BUILD =3D FALSE > +FSP_WRAPPER_BUILD =3D TRUE > +FSP_BIN_PKG =3D KabylakeFspBinPkg > +FSP_PKG_NAME =3D KabylakeFspPkg > +FSP_BINARY_BUILD =3D FALSE > +FSP_TEST_RELEASE =3D FALSE > +SECURE_BOOT_ENABLE =3D FALSE > diff --git > a/Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_board.py > b/Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_board.py > new file mode 100644 > index 0000000000..0dda929a00 > --- /dev/null > +++ b/Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_board.py > @@ -0,0 +1,177 @@ > +# @ build_board.py > +# This adds additional functions to the build_bios.py > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > +""" > +This module serves as an additional build steps for the Mt Olympus boar= d > +""" > + > +import os > +import sys > + > + > +def pre_build_ex(config, functions): > + """Additional Pre BIOS build function > + > + :param config: The environment variables to be used in the build pr= ocess > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: nothing > + """ > + print("Info: re-generating PlatformOffset header files") > + > + execute_script =3D functions.get("execute_script") > + > + command =3D ["build", "-D", "MAX_SOCKET=3D" + config.get("MAX_SOCKE= T", > "1"), > + "-m", > + os.path.join(config["PLATFORM_BOARD_PACKAGE"], > + "Acpi", "BoardAcpiDxe", "Dsdt.inf"), > + "-y", > + config.get("PRE_BUILD_REPORT", > + os.path.join(config["WORKSPACE"], > + "preBuildReport.txt")), > + "--log=3D" + config.get("PRE_BUILD_LOG", > + os.path.join(config["WORKSPACE"], > + "prebuild.log"))] > + > + _, _, _, code =3D execute_script(command, config) > + if code !=3D 0: > + print(" ".join(command)) > + print("Error re-generating PlatformOffset header files") > + sys.exit(1) > + > + config["AML_FILTER"] =3D "\"PSYS\" .MCTL\" .FIX[0-9,A-Z]\"" > + print("AML_FILTER=3D ", config.get("AML_FILTER")) > + > + # build the command with arguments > + command =3D ["python", > + os.path.join(config["MIN_PACKAGE_TOOLS"], > + "AmlGenOffset", > + "AmlGenOffset.py"), > + "-d", "--aml_filter", config["AML_FILTER"], > + "-o", os.path.join(config["WORKSPACE_PLATFORM"], > + config["PLATFORM_BOARD_PACKAGE"], > + "Acpi", "BoardAcpiDxe", > + "AmlOffsetTable.c"), > + os.path.join(config["BUILD_X64"], > + "PurleyOpenBoardPkg", > + "Acpi", > + "BoardAcpiDxe", > + "DSDT", > + "OUTPUT", > + "Dsdt", "WFPPlatform.offset.h")] > + > + # execute the command > + _, _, _, code =3D execute_script(command, config) > + if code !=3D 0: > + print(" ".join(command)) > + print("Error re-generating PlatformOffset header files") > + sys.exit(1) > + > + print("GenOffset done") > + return config > + > + > +def build_ex(config, functions): > + """Additional BIOS build function > + > + :param config: The environment variables to be used in > + the build process > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + print("build_ex") > + return None > + > + > +def post_build_ex(config, functions): > + """Additional Post BIOS build function > + > + :param config: The environment variables to be used in the post > + build process > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + print("post_build_ex") > + > + execute_script =3D functions.get("execute_script") > + > + if not execute_script: > + print("post_build_ex Error") > + sys.exit(1) > + > + common_patch_command =3D [os.path.join(config["PYTHON_HOME"], > "python"), > + os.path.join(config["MIN_PACKAGE_TOOLS"], > + "PatchFv", "PatchBinFv.py"), > + config["TARGET"], > + os.path.join(config["WORKSPACE_SILICON_BIN"= ], > + "PurleySiliconBinPkg"), > + os.path.join(config["WORKSPACE"], > + "BuildReport.log")] > + > + fvs_to_patch =3D ["FvTempMemorySilicon", > + "FvPreMemorySilicon", > + "FvPostMemorySilicon", > + "FvLateSilicon"] > + for fv in fvs_to_patch: > + patch_command =3D common_patch_command + [fv] > + _, _, _, code =3D execute_script(patch_command, config) > + if code !=3D 0: > + print(" ".join(patch_command)) > + print("Patch Error!") > + sys.exit(1) > + > + common_rebase_command =3D [os.path.join(config["PYTHON_HOME"], > "python"), > + os.path.join(config["MIN_PACKAGE_TOOLS"], > + "PatchFv", "RebaseBinFv.py"), > + config["TARGET"], > + os.path.join(config["WORKSPACE_SILICON_BIN= "], > + "PurleySiliconBinPkg"), > + os.path.join(config["WORKSPACE"], > + "BuildReport.log")] > + > + rebase_command =3D common_rebase_command +\ > + ["FvPreMemorySilicon", > + "gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspMBase"] > + > + _, _, _, code =3D execute_script(rebase_command, config) > + if code !=3D 0: > + print(" ".join(rebase_command)) > + print("Patch Error!") > + sys.exit(1) > + > + rebase_command =3D common_rebase_command +\ > + ["FvPostMemorySilicon", > + "gMinPlatformPkgTokenSpaceGuid.PcdFlashFvFspSBase"] > + > + _, _, _, code =3D execute_script(rebase_command, config) > + if code !=3D 0: > + print(" ".join(rebase_command)) > + print("Patch Error!") > + sys.exit(1) > + > + return None > + > + > +def clean_ex(config, functions): > + """Additional clean function > + > + :param config: The environment variables to be used in the build pr= ocess > + :type config: Dictionary > + :param functions: A dictionary of function pointers > + :type functions: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + print("clean_ex") > + return None > diff --git > a/Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_config.cfg > b/Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_config.cfg > new file mode 100644 > index 0000000000..dcf19d658d > --- /dev/null > +++ > b/Platform/Intel/PurleyOpenBoardPkg/BoardMtOlympus/build_config.cfg > @@ -0,0 +1,32 @@ > +# @ build_config.cfg > +# This is the main/default build configuration file > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > + > +[CONFIG] > +WORKSPACE_PLATFORM_BIN =3D WORKSPACE_PLATFORM_BIN > +EDK_SETUP_OPTION =3D > +openssl_path =3D > +PLATFORM_BOARD_PACKAGE =3D PurleyOpenBoardPkg > +PROJECT =3D PurleyOpenBoardPkg/BoardMtOlympus > +BOARD =3D BoardMtOlympus > +FLASH_MAP_FDF =3D PurleyOpenBoardPkg/Include/Fdf/FlashMapInclude.fdf > +PROJECT_DSC =3D PurleyOpenBoardPkg/BoardMtOlympus/PlatformPkg.dsc > +BOARD_PKG_PCD_DSC =3D > PurleyOpenBoardPkg/BoardMtOlympus/PlatformPkgPcd.dsc > +ADDITIONAL_SCRIPTS =3D > PurleyOpenBoardPkg/BoardMtOlympus/build_board.py > +PRE_BUILD_LOG =3D prebuild.log > +PRE_BUILD_REPORT =3D prebuildReport.log > +PrepRELEASE =3D DEBUG > +SILENT_MODE =3D FALSE > +EXT_CONFIG_CLEAR =3D > +CapsuleBuild =3D FALSE > +EXT_BUILD_FLAGS =3D > +CAPSULE_BUILD =3D 0 > +TARGET =3D DEBUG > +TARGET_SHORT =3D D > +PERFORMANCE_BUILD =3D FALSE > +FSP_WRAPPER_BUILD =3D FALSE > +MAX_SOCKET =3D 2 > diff --git a/Platform/Intel/build.cfg b/Platform/Intel/build.cfg > new file mode 100644 > index 0000000000..b6c0cca4f7 > --- /dev/null > +++ b/Platform/Intel/build.cfg > @@ -0,0 +1,56 @@ > +# @ build.cfg > +# This is the main/default build configuration file > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > + > +[DEFAULT_CONFIG] > +WORKSPACE =3D > +WORKSPACE_FSP_BIN =3D FSP > +EDK_TOOLS_BIN =3D edk2-BaseTools-win32 > +EDK_BASETOOLS =3D BaseTools > +WORKSPACE_PLATFORM =3D edk2-platforms/Platform/Intel > +WORKSPACE_SILICON =3D edk2-platforms/Silicon/Intel > +WORKSPACE_PLATFORM_BIN =3D > +WORKSPACE_SILICON_BIN =3D edk2-non-osi/Silicon/Intel > +MIN_PACKAGE_TOOLS =3D edk2- > platforms/Platform/Intel/MinPlatformPkg/Tools > +PACKAGES_PATH =3D > +EDK_SETUP_OPTION =3D > +BASE_TOOLS_PATH =3D edk2/BaseTools > +EDK_TOOLS_PATH =3D edk2/BaseTools > +openssl_path =3D > +PLATFORM_BOARD_PACKAGE =3D > +BIOS_SIZE_OPTION =3D -DBIOS_SIZE_OPTION=3DSIZE_70 > +WORKSPACE_CORE =3D edk2 > +EFI_SOURCE =3D edk2 > +PATHEXT =3D .COM;.EXE;.BAT;.CMD;.VBS;.JS;.WS;.MSC > +PROMPT =3D $P$G > +PLATFORM_PACKAGE =3D MinPlatformPkg > +BOARD =3D > +PrepRELEASE =3D DEBUG > +SILENT_MODE =3D FALSE > +EXT_CONFIG_CLEAR =3D > +CapsuleBuild =3D FALSE > +EXT_BUILD_FLAGS =3D > +CAPSULE_BUILD =3D 0 > +TARGET =3D DEBUG > +TARGET_SHORT =3D D > +PERFORMANCE_BUILD =3D FALSE > +FSP_WRAPPER_BUILD =3D FALSE > +FSP_BIN_PKG =3D > +FSP_PKG_NAME =3D > +FSP_BINARY_BUILD =3D FALSE > +FSP_TEST_RELEASE =3D FALSE > +SECURE_BOOT_ENABLE =3D FALSE > +REBUILD_MODE =3D > +BUILD_ROM_ONLY =3D > +NUMBER_OF_PROCESSORS =3D 1 > + > + > +[PLATFORMS] > +# board_name =3D path_to_board_build_config.cfg > +KabylakeRvp3 =3D KabylakeOpenBoardPkg/KabylakeRvp3/build_config.cfg > +N1xxWU =3D ClevoOpenBoardPkg/N1xxWU/build_config.cfg > +BoardMtOlympus =3D > PurleyOpenBoardPkg/BoardMtOlympus/build_config.cfg > diff --git a/Platform/Intel/build_bios.py b/Platform/Intel/build_bios.py > new file mode 100644 > index 0000000000..2edf340e0c > --- /dev/null > +++ b/Platform/Intel/build_bios.py > @@ -0,0 +1,976 @@ > + > +# @ build_bios.py > +# Builds BIOS using configuration files and dynamically > +# imported functions from board directory > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > + > +""" > +This module builds BIOS using configuration files and dynamically > +imported functions from board directory > +""" > + > + > +import os > +import re > +import sys > +import signal > +import shutil > +import argparse > +import traceback > +import subprocess > +from importlib import import_module > + > +try: > + # python 2.7 > + import ConfigParser as configparser > +except ImportError: > + # python 3 > + import configparser > + > + > +def pre_build(build_config, build_type=3D"DEBUG", silent=3DFalse, > toolchain=3DNone): > + """Sets the environment variables that shall be used for the build > + > + :param build_config: The build configuration as defined in the = JOSN > + configuration files > + :type build_config: Dictionary > + :param build_type: The build target, DEBUG, RELEASE, RELEASE_PD= B, > + TEST_RELEASE > + :type build_type: String > + :param silent: Enables build in silent mode > + :type silent: Boolean > + :param toolchain: Specifies the tool chain tag to use for the b= uild > + :type toolchain: String > + :returns: The updated environment variables > + :rtype: Dictionary > + """ > + > + # get current environment variables > + config =3D os.environ.copy() > + > + # patch the build config > + build_config =3D patch_config(build_config) > + > + # update the current config with the build config > + config.update(build_config) > + > + # make the config and build python 2.7 compartible > + config =3D py_27_fix(config) > + > + # Set WORKSPACE environment. > + config["WORKSPACE"] =3D os.path.abspath(os.path.join("..", "..", ".= .", "")) > + print("Set WORKSPACE as: {}".format(config["WORKSPACE"])) > + > + # Check whether Git has been installed and been added to system pat= h. > + try: > + subprocess.Popen(["git", "--help"], stdout=3Dsubprocess.PIPE) > + except OSError: > + print("The 'git' command is not recognized.") > + print("Please make sure that Git is installed\ > + and has been added to system path.") > + sys.exit(1) > + > + # Create the Conf directory under WORKSPACE > + if not os.path.isdir(os.path.join(config["WORKSPACE"], "Conf")): > + try: > + # create directory > + os.makedirs(os.path.join(config["WORKSPACE"], "Conf")) > + # copy files to it > + config_template_path =3D os.path.join(config["WORKSPACE"], > + config["BASE_TOOLS_PATH= "], > + "Conf") > + config_path =3D os.path.join(config["WORKSPACE"], "Conf") > + shutil.copyfile(config_template_path + > + os.sep + "target.template", > + config_path + os.sep + "target.txt") > + shutil.copyfile(config_template_path + > + os.sep + "tools_def.template", > + config_path + os.sep + "tools_def.txt") > + shutil.copyfile(config_template_path + > + os.sep + "build_rule.template", > + config_path + os.sep + "build_rule.txt") > + except OSError: > + print("Error while creating Conf") > + sys.exit(1) > + > + # Set other environments. > + # Basic Rule: > + # Platform override Silicon override Core > + # Source override Binary > + config["WORKSPACE_PLATFORM"] =3D os.path.join(config["WORKSPACE"], > + config["WORKSPACE_PLATF= ORM"]) > + config["WORKSPACE_SILICON"] =3D os.path.join(config["WORKSPACE"], > + config["WORKSPACE_SILICO= N"]) > + config["WORKSPACE_PLATFORM_BIN"] =3D \ > + os.path.join(config["WORKSPACE"], > config["WORKSPACE_PLATFORM_BIN"]) > + config["WORKSPACE_SILICON_BIN"] =3D \ > + os.path.join(config["WORKSPACE"], > config["WORKSPACE_SILICON_BIN"]) > + config["WORKSPACE_FSP_BIN"] =3D os.path.join(config["WORKSPACE"], > + config["WORKSPACE_FSP_BI= N"]) > + > + # add to package path > + config["PACKAGES_PATH"] =3D config["WORKSPACE_PLATFORM"] > + config["PACKAGES_PATH"] +=3D os.pathsep + > config["WORKSPACE_SILICON"] > + config["PACKAGES_PATH"] +=3D os.pathsep + > config["WORKSPACE_SILICON_BIN"] > + config["PACKAGES_PATH"] +=3D os.pathsep + \ > + os.path.join(config["WORKSPACE"], "FSP") > + config["PACKAGES_PATH"] +=3D os.pathsep + \ > + os.path.join(config["WORKSPACE"], "edk2") > + config["PACKAGES_PATH"] +=3D os.pathsep + > os.path.join(config["WORKSPACE"]) > + config["EDK_TOOLS_PATH"] =3D os.path.join(config["WORKSPACE"], > + config["EDK_TOOLS_PATH"]) > + config["BASE_TOOLS_PATH"] =3D config["EDK_TOOLS_PATH"] > + config["EDK_TOOLS_BIN"] =3D os.path.join(config["WORKSPACE"], > + config["EDK_TOOLS_BIN"]) > + config["PLATFORM_FSP_BIN_PACKAGE"] =3D \ > + os.path.join(config['WORKSPACE_FSP_BIN'], config['FSP_BIN_PKG']= ) > + config['PROJECT_DSC'] =3D os.path.join(config["WORKSPACE_PLATFORM"]= , > + config['PROJECT_DSC']) > + config['BOARD_PKG_PCD_DSC'] =3D > os.path.join(config["WORKSPACE_PLATFORM"], > + config['BOARD_PKG_PCD_DS= C']) > + config["CONF_PATH"] =3D os.path.join(config["WORKSPACE"], "Conf") > + > + # get the python path > + if os.environ.get("PYTHON_HOME") is None: > + config["PYTHON_HOME"] =3D None > + if os.environ.get("PYTHONPATH") is not None: > + config["PYTHON_HOME"] =3D os.environ.get("PYTHONPATH") > + else: > + print("PYTHONPATH environment variable is not found") > + sys.exit(1) > + > + # if python is installed, disable the binary base tools. > + # python is installed if this code is running :) > + if config.get("PYTHON_HOME") is not None: > + if config.get("EDK_TOOLS_BIN") is not None: > + del config["EDK_TOOLS_BIN"] > + > + # Run edk setup and update config > + if os.name =3D=3D 'nt': > + edk2_setup_cmd =3D [os.path.join(config["EFI_SOURCE"], "edksetu= p"), > + "Rebuild"] > + > + if config.get("EDK_SETUP_OPTION") and \ > + config["EDK_SETUP_OPTION"] !=3D " ": > + edk2_setup_cmd.append(config["EDK_SETUP_OPTION"]) > + > + _, _, result, return_code =3D execute_script(edk2_setup_cmd, > + config, > + collect_env=3DTrue, > + shell=3DTrue) > + if return_code =3D=3D 0 and result is not None and isinstance(r= esult, > + dict): > + config.update(result) > + > + # nmake BaseTools source > + # and enable BaseTools source build > + shell =3D True > + command =3D ["nmake", "-f", os.path.join(config["BASE_TOOLS_PATH"], > + "Makefile")] > + if os.name =3D=3D "posix": # linux > + shell =3D False > + command =3D ["make", "-C", os.path.join(config["BASE_TOOLS_PATH= "])] > + > + _, _, result, return_code =3D execute_script(command, config, shell= = =3Dshell) > + if return_code !=3D 0: > + build_failed(config) > + > + config["SILENT_MODE"] =3D 'TRUE' if silent else 'FALSE' > + > + print("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D") > + > + if os.path.isfile(os.path.join(config['WORKSPACE'], "Prep.log")): > + os.remove(os.path.join(config['WORKSPACE'], "Prep.log")) > + > + config["PROJECT"] =3D > os.path.join(config["PLATFORM_BOARD_PACKAGE"], > + config["BOARD"]) > + > + # Setup Build > + # @todo: Need better TOOL_CHAIN_TAG detection > + if toolchain is not None: > + config["TOOL_CHAIN_TAG"] =3D toolchain > + elif config.get("TOOL_CHAIN_TAG") is None: > + if os.name =3D=3D 'nt': > + config["TOOL_CHAIN_TAG"] =3D "VS2015" > + else: > + config["TOOL_CHAIN_TAG"] =3D "GCC5" > + > + # echo Show CL revision > + config["PrepRELEASE"] =3D build_type > + > + if build_type =3D=3D "DEBUG": > + config["TARGET"] =3D 'DEBUG' > + config["TARGET_SHORT"] =3D 'D' > + else: > + config["TARGET"] =3D 'RELEASE' > + config["TARGET_SHORT"] =3D 'R' > + > + # set BUILD_DIR_PATH path > + config["BUILD_DIR_PATH"] =3D os.path.join(config["WORKSPACE"], > + 'Build', > + config["PROJECT"], > + "{}_{}".format( > + config["TARGET"], > + config["TOOL_CHAIN_TAG"= ])) > + # set BUILD_DIR path > + config["BUILD_DIR"] =3D os.path.join('Build', > + config["PROJECT"], > + "{}_{}".format( > + config["TARGET"], > + config["TOOL_CHAIN_TAG"])) > + > + config["BUILD_X64"] =3D os.path.join(config["BUILD_DIR_PATH"], 'X64= ') > + config["BUILD_IA32"] =3D os.path.join(config["BUILD_DIR_PATH"], 'IA= 32') > + > + if not os.path.isdir(config["BUILD_DIR_PATH"]): > + try: > + os.makedirs(config["BUILD_DIR_PATH"]) > + except OSError: > + print("Error while creating Build folder") > + sys.exit(1) > + > + # Set FSP_WRAPPER_BUILD > + if config['FSP_WRAPPER_BUILD'] =3D=3D "TRUE": > + # Create dummy Fsp_Rebased_S_padded.fd to build the BiosInfo.in= f > + # if it is wrapper build, due to the SECTION inclusion > + open(os.path.join(config["WORKSPACE_FSP_BIN"], > + config["FSP_BIN_PKG"], > + "Fsp_Rebased_S_padded.fd"), 'w').close() > + > + if not os.path.isdir(config["BUILD_X64"]): > + try: > + os.mkdir(config["BUILD_X64"]) > + except OSError: > + print("Error while creating {}".format(config["BUILD_X64"])= ) > + sys.exit(1) > + > + # update config file with changes > + update_target_file(config) > + > + # Additional pre build scripts for this platform > + result =3D pre_build_ex(config) > + if result is not None and isinstance(result, dict): > + config.update(result) > + > + # print user settings > + print("BIOS_SIZE_OPTION =3D {}".format(config["BIOS_SIZE_OPTION= "])) > + print("EFI_SOURCE =3D {}".format(config["EFI_SOURCE"])) > + print("TARGET =3D {}".format(config["TARGET"])) > + print("TARGET_ARCH =3D {}".format("IA32 X64")) > + print("TOOL_CHAIN_TAG =3D {}".format(config["TOOL_CHAIN_TAG"]= )) > + print("WORKSPACE =3D {}".format(config["WORKSPACE"])) > + print("WORKSPACE_CORE =3D {}".format(config["WORKSPACE_CORE"]= )) > + print("EXT_BUILD_FLAGS =3D {}".format(config["EXT_BUILD_FLAGS"= ])) > + > + return config > + > + > +def build(config): > + """Builds the BIOS image > + > + :param config: The environment variables to be used > + in the build process > + :type config: Dictionary > + :returns: nothing > + """ > + > + if config["FSP_WRAPPER_BUILD"] =3D=3D "TRUE": > + pattern =3D "Fsp_Rebased.*\\.fd$" > + file_dir =3D os.path.join(config['WORKSPACE_FSP_BIN'], > + config['FSP_BIN_PKG']) > + for item in os.listdir(file_dir): > + if re.search(pattern, item): > + os.remove(os.path.join(file_dir, item)) > + > + command =3D [os.path.join(config['PYTHON_HOME'], "python"), > + os.path.join(config['WORKSPACE_PLATFORM'], > + config['PLATFORM_PACKAGE'], > + 'Tools', 'Fsp', > + 'RebaseAndPatchFspBinBaseAddress.py'), > + os.path.join(config['WORKSPACE_PLATFORM'], > + config['FLASH_MAP_FDF']), > + os.path.join(config['WORKSPACE_FSP_BIN'], > + config['FSP_BIN_PKG']), > + "Fsp.fd", > + os.path.join(config['WORKSPACE_PLATFORM'], > + config['PROJECT'], > + config['BOARD_PKG_PCD_DSC']), > + "0x0"] > + > + _, _, _, return_code =3D execute_script(command, config, shell= =3DFalse) > + > + if return_code !=3D 0: > + print("ERROR:RebaseAndPatchFspBinBaseAddress failed") > + sys.exit(return_code) > + > + # create Fsp_Rebased.fd which is Fsp_Rebased_S.fd + > + # Fsp_Rebased_M + Fsp_Rebased_T > + with open(os.path.join(file_dir, "Fsp_Rebased_S.fd"), 'rb') as = fsp_s, \ > + open(os.path.join(file_dir, > + "Fsp_Rebased_M.fd"), 'rb') as fsp_m, = \ > + open(os.path.join(file_dir, > + "Fsp_Rebased_T.fd"), 'rb') as fsp_t: > + > + fsp_rebased =3D fsp_s.read() + fsp_m.read() + fsp_t.read() > + with open(os.path.join(file_dir, > + "Fsp_Rebased.fd"), 'wb') as new_fsp: > + new_fsp.write(fsp_rebased) > + > + if not os.path.isfile(os.path.join(file_dir, "Fsp_Rebased.fd"))= : > + print("!!! ERROR:failed to create fsp!!!") > + sys.exit(1) > + > + # Output the build variables the user has selected. > + print("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D") > + print(" User Selected build options:") > + print(" SILENT_MODE =3D ", config.get("SILENT_MODE")) > + print(" REBUILD_MODE =3D ", config.get("REBUILD_MODE")) > + print(" BUILD_ROM_ONLY =3D ", config.get("BUILD_ROM_ONLY")) > + print("=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D") > + > + command =3D ["build", "-n", config["NUMBER_OF_PROCESSORS"]] > + > + if config["REBUILD_MODE"] and config["REBUILD_MODE"] !=3D "": > + command.append(config["REBUILD_MODE"]) > + > + if config["EXT_BUILD_FLAGS"] and config["EXT_BUILD_FLAGS"] !=3D "": > + command.append(config["EXT_BUILD_FLAGS"]) > + > + if config.get("SILENT_MODE", "FALSE") =3D=3D "TRUE": > + command.append("--silent") > + command.append("--quiet") > + > + else: > + command.append("--log=3D" + config.get("BUILD_LOG", "Build.log"= )) > + command.append("--report-file=3D" + > + config.get("BUILD_REPORT", "BuildReport.log")) > + > + if config.get("VERBOSE", "FALSE") =3D=3D "TRUE": > + command.append("--verbose") > + > + if config.get("MAX_SOCKET") is not None: > + command.append("-D") > + command.append("MAX_SOCKET=3D" + config["MAX_SOCKET"]) > + > + _, _, _, exit_code =3D execute_script(command, config) > + if exit_code !=3D 0: > + build_failed(config) > + > + # Additional build scripts for this platform > + result =3D build_ex(config) > + if result is not None and isinstance(result, dict): > + config.update(result) > + > + return config > + > + > +def post_build(config): > + """Post build process of BIOS image > + > + :param config: The environment variables to be used in the build pr= ocess > + :type config: Dictionary > + :returns: nothing > + """ > + print("Running post_build to complete the build process.") > + > + # Additional build scripts for this platform > + result =3D post_build_ex(config) > + if result is not None and isinstance(result, dict): > + config.update(result) > + > + # cleanup > + pattern =3D "Fsp_Rebased.*\\.fd$" > + file_dir =3D os.path.join(config['WORKSPACE_FSP_BIN'], > + config['FSP_BIN_PKG']) > + for item in os.listdir(file_dir): > + if re.search(pattern, item): > + os.remove(os.path.join(file_dir, item)) > + > + if config.get("DYNAMIC_BUILD_INIT_FILES") is not None: > + for item in config["DYNAMIC_BUILD_INIT_FILES"].split(","): > + try: > + os.remove(item) # remove __init__.py > + os.remove(item + "c") # remove __init__.pyc as well > + except OSError: > + pass > + > + > +def build_failed(config): > + """Displays results when build fails > + > + :param config: The environment variables used in the build proc= ess > + :type config: Dictionary > + :returns: nothing > + """ > + print(" The EDKII BIOS Build has failed!") > + # clean up > + if config.get("DYNAMIC_BUILD_INIT_FILES") is not None: > + for item in config["DYNAMIC_BUILD_INIT_FILES"].split(","): > + if os.path.isfile(item): > + try: > + os.remove(item) # remove __init__.py > + os.remove(item + "c") # remove __init__.pyc as wel= l > + except OSError: > + pass > + sys.exit(1) > + > + > +def import_platform_lib(path, function): > + """Imports custom functions for the platforms being built > + > + :param path: the location of the custom build script to be exec= uted > + :type path: String > + :param path: the function to be executed > + :type path: String > + :returns: nothing > + """ > + if path.endswith(".py"): > + path =3D path[:-3] > + path =3D path.replace(os.sep, ".") > + module =3D import_module(path) > + lib =3D getattr(module, function) > + return lib > + > + > +def pre_build_ex(config): > + """ An extension of the pre_build process as defined platform > + specific pre_build setup script > + > + :param config: The environment variables used in the pre build = process > + :type config: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + if config.get("ADDITIONAL_SCRIPTS"): > + try: > + platform_function =3D\ > + import_platform_lib(config["ADDITIONAL_SCRIPTS"], > + "pre_build_ex") > + functions =3D {"execute_script": execute_script} > + return platform_function(config, functions) > + except ImportError as error: > + print(config["ADDITIONAL_SCRIPTS"], str(error)) > + build_failed(config) > + return None > + > + > +def build_ex(config): > + """ An extension of the build process as defined platform > + specific build setup script > + > + :param config: The environment variables used in the build proc= ess > + :type config: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + if config.get("ADDITIONAL_SCRIPTS"): > + try: > + platform_function =3D\ > + import_platform_lib(config["ADDITIONAL_SCRIPTS"], > + "build_ex") > + functions =3D {"execute_script": execute_script} > + return platform_function(config, functions) > + except ImportError as error: > + print("error", config["ADDITIONAL_SCRIPTS"], str(error)) > + build_failed(config) > + return None > + > + > +def post_build_ex(config): > + """ An extension of the post build process as defined platform > + specific build setup script > + > + :param config: The environment variables used in the post build > + process > + :type config: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + if config.get("ADDITIONAL_SCRIPTS"): > + try: > + platform_function =3D\ > + import_platform_lib(config["ADDITIONAL_SCRIPTS"], > + "post_build_ex") > + functions =3D {"execute_script": execute_script} > + return platform_function(config, functions) > + except ImportError as error: > + print(config["ADDITIONAL_SCRIPTS"], str(error)) > + build_failed(config) > + return None > + > + > +def clean_ex(config): > + """ An extension of the platform cleanning > + > + :param config: The environment variables used in the clean proc= ess > + :type config: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + if config.get("ADDITIONAL_SCRIPTS"): > + try: > + platform_function =3D\ > + import_platform_lib(config["ADDITIONAL_SCRIPTS"], > + "clean_ex") > + functions =3D {"execute_script": execute_script} > + return platform_function(config, functions) > + except ImportError as error: > + print(config["ADDITIONAL_SCRIPTS"], str(error)) > + build_failed(config) > + return None > + > + > +def get_environment_variables(std_out_str, marker): > + """Gets the environment variables from a process > + > + :param std_out_str: The std_out pipe > + :type std_out_str: String > + :param marker: A begining and end mark of environment > + variables printed to std_out > + :type marker: String > + :returns: The environment variables read from the process' std_= out > pipe > + :rtype: Tuple > + """ > + start_env_update =3D False > + environment_vars =3D {} > + out_put =3D "" > + for line in std_out_str.split("\n"): > + if start_env_update and len(line.split("=3D")) =3D=3D 2: > + key, value =3D line.split("=3D") > + environment_vars[key] =3D value > + else: > + out_put +=3D "\n" + line.replace(marker, "") > + > + if marker in line: > + if start_env_update: > + start_env_update =3D False > + else: > + start_env_update =3D True > + return (out_put, environment_vars) > + > + > +def execute_script(command, env_variables, collect_env=3DFalse, > + enable_std_pipe=3DFalse, shell=3DTrue): > + """launches a process that executes a script/shell command passed t= o it > + > + :param command: The command/script with its commandline > + arguments to be executed > + :type command: List:String > + :param env_variables: Environment variables passed to the proce= ss > + :type env_variables: String > + :param collect_env: Enables the collection of evironment variab= les > + when process execution is done > + :type collect_env: Boolean > + :param enable_std_pipe: Enables process out to be piped to > + :type enable_std_pipe: String > + :returns: a tuple of std_out, stderr , environment variables, > + return code > + :rtype: Tuple: (std_out, stderr , enVar, return_code) > + """ > + > + print("Calling " + " ".join(command)) > + > + env_marker =3D '-----env-----' > + env =3D {} > + kwarg =3D {"env": env_variables, > + "universal_newlines": True, > + "shell": shell, > + "cwd": env_variables["WORKSPACE"]} > + > + if enable_std_pipe or collect_env: > + kwarg["stdout"] =3D subprocess.PIPE > + kwarg["stderr"] =3D subprocess.PIPE > + > + # collect environment variables > + if collect_env: > + # get the binary that prints environment variables based on os > + if os.name =3D=3D 'nt': > + get_var_command =3D "set" > + else: > + get_var_command =3D "env" > + # modify the command to print the environment variables > + if isinstance(command, list): > + command +=3D ["&&", "echo", env_marker, "&&", > + get_var_command, "&&", "echo", env_marker] > + else: > + command +=3D " " + " ".join(["&&", "echo", env_marker, > + "&&", get_var_command, > + "&&", "echo", env_marker]) > + > + # execute the command > + execute =3D subprocess.Popen(command, **kwarg) > + std_out, stderr =3D execute.communicate() > + code =3D execute.returncode > + > + # wait for process to be done > + execute.wait() > + > + # if collect enviroment variables > + if collect_env: > + # get the new environment variables > + std_out, env =3D get_environment_variables(std_out, env_marker) > + return (std_out, stderr, env, code) > + > + > +def patch_config(config): > + """ An extension of the platform cleanning > + > + :param config: The environment variables used in the build proc= ess > + :type config: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + new_config =3D {} > + for key in config: > + new_config[str(key)] =3D str(config[key].replace("/", os.sep)) > + return new_config > + > + > +def py_27_fix(config): > + """ Prepares build for python 2.7 =3D> build > + :param config: The environment variables used in the build proc= ess > + :type config: Dictionary > + :returns: config dictionary > + :rtype: Dictionary > + """ > + if not sys.version_info > (3, 0): > + path_list =3D [] > + # create __init__.py in directories in this path > + if config.get("ADDITIONAL_SCRIPTS"): > + # get the directory > + path_to_directory =3D\ > + os.path.dirname(config.get("ADDITIONAL_SCRIPTS")) > + path =3D "" > + for directories in path_to_directory.split(os.sep): > + path +=3D directories + os.sep > + init_file =3D path + os.sep + "__init__.py" > + if not os.path.isfile(init_file): > + open(init_file, 'w').close() > + path_list.append(init_file) > + config["DYNAMIC_BUILD_INIT_FILES"] =3D ",".join(path_list) > + > + return config > + > + > +def clean(build_config, board=3DFalse): > + """Cleans the build workspace > + > + :param config: The environment variables used in the build proc= ess > + :type config: Dictionary > + :param board: This flag specifies specific board clean > + :type board: Bool > + :returns: nothing > + """ > + > + # patch the config > + build_config =3D patch_config(build_config) > + > + # get current environment variables > + config =3D os.environ.copy() > + > + # update it with the build variables > + config.update(build_config) > + > + if config.get('WORKSPACE') is None or not config.get('WORKSPACE'): > + config["WORKSPACE"] =3D\ > + os.path.abspath(os.path.join("..", "..", "..", "")) > + > + # build cleanall > + print("Cleaning directories...") > + > + if board: > + platform_pkg =3D config.get("PLATFORM_BOARD_PACKAGE", None) > + if platform_pkg is None or\ > + not os.path.isdir(os.path.join(config['WORKSPACE'], > + "Build", platform_pkg)): > + print("Platform package not found") > + sys.exit(1) > + else: > + print("Removing " + os.path.join(config['WORKSPACE'], > + "Build", platform_pkg)) > + shutil.rmtree(os.path.join(config['WORKSPACE'], > + "Build", platform_pkg)) > + > + else: > + if os.path.isdir(os.path.join(config['WORKSPACE'], "Build")): > + print("Removing " + os.path.join(config['WORKSPACE'], "Buil= d")) > + shutil.rmtree(os.path.join(config['WORKSPACE'], "Build")) > + > + if os.path.isdir(os.path.join(config['WORKSPACE'], "Conf")): > + print("Removing " + os.path.join(config['WORKSPACE'], "Conf")) > + shutil.rmtree(os.path.join(config['WORKSPACE'], "Conf")) > + > + print("Cleaning files...") > + > + if os.path.isfile(os.path.join(config['WORKSPACE'], > + config.get("BUILD_REPORT", > + "BuildReport.log"))): > + print("Removing ", os.path.join(config['WORKSPACE'], > + config.get("BUILD_REPORT", > + "BuildReport.log"))) > + os.remove(os.path.join(config['WORKSPACE'], > + config.get("BUILD_REPORT", "BuildReport.= log"))) > + > + print(" All done...") > + > + sys.exit(0) > + > + > +def update_target_file(config): > + """Updates Conf's target file that will be used in the build > + > + :param config: The environment variables used in the build proc= ess > + :type config: Dictionary > + :returns: True if update was successful and False if update fai= ls > + :rtype: Boolean > + """ > + contents =3D None > + result =3D False > + with open(os.path.join(config["CONF_PATH"], "target.txt"), 'r') as = target: > + contents =3D target.readlines() > + options_list =3D ['ACTIVE_PLATFORM', 'TARGET', > + 'TARGET_ARCH', 'TOOL_CHAIN_TAG', 'BUILD_RULE_CO= NF'] > + modified =3D [] > + > + # remove these options from the config file > + for line in contents: > + if line.replace(" ", "")[0] !=3D '#' and\ > + any(opt in line for opt in options_list): > + continue > + modified.append(line) > + > + # replace with config options provided > + string =3D "{} =3D {}\n".format("ACTIVE_PLATFORM", > + os.path.join( > + config['WORKSPACE_PLATFORM'], > + config['PLATFORM_BOARD_PACKAGE'= ], > + config['BOARD'], > + config['PROJECT_DSC'])) > + modified.append(string) > + > + string =3D "{} =3D {}\n".format("TARGET", config['TARGET']) > + modified.append(string) > + > + string =3D "TARGET_ARCH =3D IA32 X64\n" > + modified.append(string) > + > + string =3D "{} =3D {}\n".format("TOOL_CHAIN_TAG", > config['TOOL_CHAIN_TAG']) > + modified.append(string) > + > + string =3D "{} =3D {}\n".format("BUILD_RULE_CONF", > + os.path.join("Conf", "build_rule.tx= t")) > + modified.append(string) > + > + if modified is not None: > + with open(os.path.join(config["WORKSPACE"], > + "Conf", "target.txt"), 'w') as target: > + for line in modified: > + target.write(line) > + result =3D True > + > + return result > + > + > +def get_config(): > + """Reads the default projects config file > + > + :returns: The config defined in the the Build.cfg file > + :rtype: Dictionary > + """ > + config_file =3D configparser.RawConfigParser() > + config_file.optionxform =3D str > + config_file.read('build.cfg') > + config_dictionary =3D {} > + for section in config_file.sections(): > + dictionary =3D dict(config_file.items(section)) > + config_dictionary[section] =3D dictionary > + return config_dictionary > + > + > +def get_platform_config(platform_name, config_data): > + """ Reads the platform specifig config file > + > + param platform_name: The name of the platform to be built > + :type platform_name: String > + param configData: The environment variables to be > + used in the build process > + :type configData: Dictionary > + :returns: The config defined in the the Build.cfg file > + :rtype: Dictionary > + """ > + config =3D {} > + > + platform_data =3D config_data.get("PLATFORMS") > + path =3D platform_data.get(platform_name) > + config_file =3D configparser.RawConfigParser() > + config_file.optionxform =3D str > + config_file.read(path) > + for section in config_file.sections(): > + config[section] =3D dict(config_file.items(section)) > + > + return config > + > + > +def get_cmd_config_arguments(arguments): > + """Get commandline config arguments > + > + param arguments: The environment variables to be used in the build > process > + :type arguments: argparse > + :returns: The config dictionary built from the commandline argument= s > + :rtype: Dictionary > + """ > + result =3D {} > + if arguments.capsule is True: > + result["CAPSULE_BUILD"] =3D "1" > + > + if arguments.performance is True: > + result["PERFORMANCE_BUILD"] =3D "TRUE" > + > + if arguments.fsp is True: > + result["FSP_WRAPPER_BUILD"] =3D "TRUE" > + > + return result > + > + > +def get_cmd_arguments(build_config): > + """ Get commandline inputs from user > + > + param config_data: The environment variables to be > + used in the build process > + :type config_data: Dictionary > + :returns: The commandline arguments input by the user > + :rtype: argparse object > + """ > + > + class PrintPlatforms(argparse.Action): > + """ this is an argparse action that lists the available platfor= ms > + """ > + def __call__(self, parser, namespace, values, option_string=3DN= one): > + print("Platforms:") > + for key in build_config.get("PLATFORMS"): > + print(" " + key) > + setattr(namespace, self.dest, values) > + sys.exit(0) > + > + # get the build commands > + parser =3D argparse.ArgumentParser(description=3D"Build Help") > + parser.add_argument('--platform', '-p', dest=3D"platform", > + help=3D'the platform to build', > + choices=3Dbuild_config.get("PLATFORMS"), > + required=3D('-l' not in sys.argv and > + '--cleanall' not in sys.argv)) > + > + parser.add_argument('--toolchain', '-t', dest=3D"toolchain", > + help=3D"using the Tool Chain Tagname to build \ > + the platform,overriding \ > + target.txt's TOOL_CHAIN_TAG definition") > + > + parser.add_argument("--DEBUG", '-d', help=3D"debug flag", > + action=3D'store_const', dest=3D"target", > + const=3D"DEBUG", default=3D"DEBUG") > + > + parser.add_argument("--RELEASE", '-r', help=3D"release flag", > + action=3D'store_const', > + dest=3D"target", const=3D"RELEASE") > + > + parser.add_argument("--TEST_RELEASE", '-tr', help=3D"test Release f= lag", > + action=3D'store_const', > + dest=3D"target", const=3D"TEST_RELEASE") > + > + parser.add_argument("--RELEASE_PDB", '-rp', help=3D"release flag", > + action=3D'store_const', dest=3D"target", > + const=3D"RELEASE_PDB") > + > + parser.add_argument('--list', '-l', action=3DPrintPlatforms, > + help=3D'lists available platforms', nargs=3D0) > + > + parser.add_argument('--cleanall', dest=3D'clean_all', > + help=3D'cleans all', action=3D'store_true') > + > + parser.add_argument('--clean', dest=3D'clean', > + help=3D'cleans specific platform', action=3D'st= ore_true') > + > + parser.add_argument("--capsule", help=3D"capsule build enabled", > + action=3D'store_true', dest=3D"capsule") > + > + parser.add_argument("--silent", help=3D"silent build enabled", > + action=3D'store_true', dest=3D"silent") > + > + parser.add_argument("--performance", help=3D"performance build > enabled", > + action=3D'store_true', dest=3D"performance") > + > + parser.add_argument("--fsp", help=3D"fsp build enabled", > + action=3D'store_true', dest=3D"fsp") > + > + return parser.parse_args() > + > + > +def keyboard_interruption(int_signal, int_frame): > + """ Catches a keyboard interruption handler > + > + param int_signal: The signal this handler is called with > + :type int_signal: Signal > + param int_frame: The signal this handler is called with > + :type int_frame: frame > + :rtype: nothing > + """ > + print("Signal #: {} Frame: {}".format(int_signal, int_frame)) > + print("Quiting...") > + sys.exit(0) > + > + > +def main(): > + """ The main function of this module > + :rtype: nothing > + """ > + # to quit the build > + signal.signal(signal.SIGINT, keyboard_interruption) > + > + # get general build configurations > + build_config =3D get_config() > + > + # get commandline parameters > + arguments =3D get_cmd_arguments(build_config) > + > + if arguments.clean_all: > + clean(build_config.get("DEFAULT_CONFIG")) > + > + # get platform specific config > + platform_config =3D get_platform_config(arguments.platform, > build_config) > + > + # update general build config with platform specific config > + config =3D build_config.get("DEFAULT_CONFIG") > + config.update(platform_config.get("CONFIG")) > + > + # if user selected clean > + if arguments.clean: > + clean(config, board=3DTrue) > + > + # Override config with cmd arguments > + cmd_config_args =3D get_cmd_config_arguments(arguments) > + config.update(cmd_config_args) > + > + # get pre_build configurations > + config =3D pre_build(config, > + build_type=3Darguments.target, > + toolchain=3Darguments.toolchain, > + silent=3Darguments.silent) > + > + # build selected platform > + config =3D build(config) > + > + # post build > + post_build(config) > + > + > +if __name__ =3D=3D "__main__": > + try: > + EXIT_CODE =3D 0 > + main() > + except Exception as error: > + EXIT_CODE =3D 1 > + traceback.print_exc() > + sys.exit(EXIT_CODE) > -- > 2.19.1.windows.1 >=20 >=20 >=20