## @file WinRcPath.py | |
# Plugin to find Windows SDK Resource Compiler rc.exe | |
## | |
# This plugin works in conjuncture with the tools_def to support rc.exe | |
# | |
# Copyright (c) Microsoft Corporation | |
# SPDX-License-Identifier: BSD-2-Clause-Patent | |
## | |
import logging | |
from edk2toolext.environment.plugintypes.uefi_build_plugin import IUefiBuildPlugin | |
import edk2toollib.windows.locate_tools as locate_tools | |
from edk2toolext.environment import shell_environment | |
from edk2toolext.environment import version_aggregator | |
from pathlib import Path | |
class WinRcPath(IUefiBuildPlugin): | |
def do_pre_build(self, thebuilder): | |
# Check if the rc.exe path is already cached and still exists | |
cache_path = Path(thebuilder.ws, "Conf", ".rc_path") | |
if cache_path.exists(): | |
with open(cache_path, "r") as f: | |
rc_path = Path(f.readline().strip()).absolute() | |
if (rc_path / "rc.exe").exists(): | |
logging.debug(f"Found rc.exe folder in cache: {rc_path}") | |
self._set_path(rc_path) | |
return 0 | |
# If it does not exist, try to find it with FindToolInWinSdk | |
path = locate_tools.FindToolInWinSdk("rc.exe") | |
if path is None: | |
logging.critical("Failed to find rc.exe") | |
return 1 | |
path = Path(path).absolute().parent | |
self._set_path(path) | |
cache_path.unlink(missing_ok=True) | |
with cache_path.open("w") as f: | |
f.write(str(path)) | |
return 0 | |
def _set_path(self, path: Path): | |
shell_environment.GetEnvironment().set_shell_var("WINSDK_PATH_FOR_RC_EXE", str(path)) | |
version_aggregator.GetVersionAggregator().ReportVersion("WINSDK_PATH_FOR_RC_EXE", str(path), version_aggregator.VersionTypes.INFO) |