Performs Integration instructions necessary to upgrade edk2-pytool-library to 0.19.3 and edk2-pytool-extensions to 0.25.1. This includes resolving the deprecation of builder.mws and replacing it with builder.edk2path functionality. Cc: Sean Brogan <sean.brogan@microsoft.com> Cc: Michael Kubacki <mikuback@linux.microsoft.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Signed-off-by: Joey Vagedes <joeyvagedes@gmail.com> Message-Id: <20231027151551.1043941-3-joeyvagedes@microsoft.com> Reviewed-by: Rebecca Cran <rebecca@os.amperecomputing.com> Reviewed-by: Michael Kubacki <michael.kubacki@microsoft.com>
		
			
				
	
	
		
			128 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# @file DebugMacroCheckBuildPlugin.py
 | 
						|
#
 | 
						|
# A build plugin that checks if DEBUG macros are formatted properly.
 | 
						|
#
 | 
						|
# In particular, that print format specifiers are defined
 | 
						|
# with the expected number of arguments in the variable
 | 
						|
# argument list.
 | 
						|
#
 | 
						|
# Copyright (c) Microsoft Corporation. All rights reserved.
 | 
						|
# SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
##
 | 
						|
 | 
						|
import logging
 | 
						|
import os
 | 
						|
import pathlib
 | 
						|
import sys
 | 
						|
import yaml
 | 
						|
 | 
						|
# Import the build plugin
 | 
						|
plugin_file = pathlib.Path(__file__)
 | 
						|
sys.path.append(str(plugin_file.parent.parent))
 | 
						|
 | 
						|
# flake8 (E402): Ignore flake8 module level import not at top of file
 | 
						|
import DebugMacroCheck                          # noqa: E402
 | 
						|
 | 
						|
from edk2toolext import edk2_logging                               # noqa: E402
 | 
						|
from edk2toolext.environment.plugintypes.uefi_build_plugin import \
 | 
						|
    IUefiBuildPlugin                                               # noqa: E402
 | 
						|
from edk2toolext.environment.uefi_build import UefiBuilder         # noqa: E402
 | 
						|
from edk2toollib.uefi.edk2.path_utilities import Edk2Path          # noqa: E402
 | 
						|
from pathlib import Path                                           # noqa: E402
 | 
						|
 | 
						|
 | 
						|
class DebugMacroCheckBuildPlugin(IUefiBuildPlugin):
 | 
						|
 | 
						|
    def do_pre_build(self, builder: UefiBuilder) -> int:
 | 
						|
        """Debug Macro Check pre-build functionality.
 | 
						|
 | 
						|
        The plugin is invoked in pre-build since it can operate independently
 | 
						|
        of build tools and to notify the user of any errors earlier in the
 | 
						|
        build process to reduce feedback time.
 | 
						|
 | 
						|
        Args:
 | 
						|
            builder (UefiBuilder): A UEFI builder object for this build.
 | 
						|
 | 
						|
        Returns:
 | 
						|
            int: The number of debug macro errors found. Zero indicates the
 | 
						|
            check either did not run or no errors were found.
 | 
						|
        """
 | 
						|
 | 
						|
        # Check if disabled in the environment
 | 
						|
        env_disable = builder.env.GetValue("DISABLE_DEBUG_MACRO_CHECK")
 | 
						|
        if env_disable:
 | 
						|
            return 0
 | 
						|
 | 
						|
        # Only run on targets with compilation
 | 
						|
        build_target = builder.env.GetValue("TARGET").lower()
 | 
						|
        if "no-target" in build_target:
 | 
						|
            return 0
 | 
						|
 | 
						|
        edk2 = builder.edk2path
 | 
						|
        package = edk2.GetContainingPackage(
 | 
						|
            builder.edk2path.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
 | 
						|
                builder.env.GetValue("ACTIVE_PLATFORM")
 | 
						|
            )
 | 
						|
        )
 | 
						|
        package_path = Path(
 | 
						|
                          edk2.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
 | 
						|
                                package))
 | 
						|
 | 
						|
        # Every debug macro is printed at DEBUG logging level.
 | 
						|
        # Ensure the level is above DEBUG while executing the macro check
 | 
						|
        # plugin to avoid flooding the log handler.
 | 
						|
        handler_level_context = []
 | 
						|
        for h in logging.getLogger().handlers:
 | 
						|
            if h.level < logging.INFO:
 | 
						|
                handler_level_context.append((h, h.level))
 | 
						|
                h.setLevel(logging.INFO)
 | 
						|
 | 
						|
        edk2_logging.log_progress("Checking DEBUG Macros")
 | 
						|
 | 
						|
        # There are two ways to specify macro substitution data for this
 | 
						|
        # plugin. If multiple options are present, data is appended from
 | 
						|
        # each option.
 | 
						|
        #
 | 
						|
        # 1. Specify the substitution data in the package CI YAML file.
 | 
						|
        # 2. Specify a standalone substitution data YAML file.
 | 
						|
        ##
 | 
						|
        sub_data = {}
 | 
						|
 | 
						|
        # 1. Allow substitution data to be specified in a "DebugMacroCheck" of
 | 
						|
        # the package CI YAML file. This is used to provide a familiar per-
 | 
						|
        # package customization flow for a package maintainer.
 | 
						|
        package_config_file = Path(
 | 
						|
                                os.path.join(
 | 
						|
                                    package_path, package + ".ci.yaml"))
 | 
						|
        if package_config_file.is_file():
 | 
						|
            with open(package_config_file, 'r') as cf:
 | 
						|
                package_config_file_data = yaml.safe_load(cf)
 | 
						|
                if "DebugMacroCheck" in package_config_file_data and \
 | 
						|
                   "StringSubstitutions" in \
 | 
						|
                   package_config_file_data["DebugMacroCheck"]:
 | 
						|
                    logging.info(f"Loading substitution data in "
 | 
						|
                                 f"{str(package_config_file)}")
 | 
						|
                    sub_data |= package_config_file_data["DebugMacroCheck"]["StringSubstitutions"] # noqa
 | 
						|
 | 
						|
        # 2. Allow a substitution file to be specified as an environment
 | 
						|
        # variable. This is used to provide flexibility in how to specify a
 | 
						|
        # substitution file. The value can be set anywhere prior to this plugin
 | 
						|
        # getting called such as pre-existing build script.
 | 
						|
        sub_file = builder.env.GetValue("DEBUG_MACRO_CHECK_SUB_FILE")
 | 
						|
        if sub_file:
 | 
						|
            logging.info(f"Loading substitution file {sub_file}")
 | 
						|
            with open(sub_file, 'r') as sf:
 | 
						|
                sub_data |= yaml.safe_load(sf)
 | 
						|
 | 
						|
        try:
 | 
						|
            error_count = DebugMacroCheck.check_macros_in_directory(
 | 
						|
                                            package_path,
 | 
						|
                                            ignore_git_submodules=False,
 | 
						|
                                            show_progress_bar=False,
 | 
						|
                                            **sub_data)
 | 
						|
        finally:
 | 
						|
            for h, l in handler_level_context:
 | 
						|
                h.setLevel(l)
 | 
						|
 | 
						|
        return error_count
 |