summaryrefslogtreecommitdiff
path: root/BaseTools/Source/Python/Workspace
diff options
context:
space:
mode:
authorRay Ni <ray.ni@intel.com>2025-03-26 12:30:08 +0300
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2025-04-08 11:40:49 +0300
commitd0b64b21a3fb71a10f15987c73c135b9069bdd69 (patch)
tree9cacae55671e4e8d4af1fce4bf8327799abcb161 /BaseTools/Source/Python/Workspace
parentc9ff19705972e50ff84c52ba726008e37f7ba699 (diff)
downloadedk2-d0b64b21a3fb71a10f15987c73c135b9069bdd69.tar.xz
BaseTools: Dump library dependency chain on build failure
When a module M depends on L1, which depends on L2, which depends on L3, the build fails when the library instance of L3 cannot be found according to the library class-instance mapping configuration specified in the DSC file. When such failure happens, the build tool only prints that the instance of L3 required by module M cannot be found. But it does not tell how L3 is required by M. The change enhances build tool to print the entire dependency chain when such failure happens. With the change, the new error message will be as follows: <dsc-path>(...): error 4000: Instance of library class [L3] is not found for module [M], [L3] is: consumed by <instance of L2> consumed by <instance of L1> Signed-off-by: Ray Ni <ray.ni@intel.com>
Diffstat (limited to 'BaseTools/Source/Python/Workspace')
-rw-r--r--BaseTools/Source/Python/Workspace/WorkspaceCommon.py16
1 files changed, 14 insertions, 2 deletions
diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
index 7ac3b5bbe8..1bfd137806 100644
--- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
+++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py
@@ -90,6 +90,16 @@ def GetDeclaredPcd(Platform, BuildDatabase, Arch, Target, Toolchain, additionalP
def GetLibraryInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain):
return GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain,Platform.MetaFile,EdkLogger)
+def GenerateDependencyDump(ConsumedByList, M, Level, Visited):
+ if M in Visited:
+ return []
+ Visited.add(M)
+ Indentation = "\t" * Level
+ DependencyDump = [f"{Indentation}consumed by {M}"]
+ for m in ConsumedByList[M]:
+ DependencyDump.extend(GenerateDependencyDump(ConsumedByList, m, Level + 1, Visited))
+ return DependencyDump
+
def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolchain, FileName = '', EdkLogger = None):
if Module.LibInstances:
return Module.LibInstances
@@ -133,9 +143,11 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha
if LibraryPath is None:
if not Module.LibraryClass:
EdkLogger.error("build", RESOURCE_NOT_AVAILABLE,
- "Instance of library class [%s] is not found" % LibraryClassName,
+ f"Instance of library class [{LibraryClassName}] is not found for"
+ f" module [{Module}], [{LibraryClassName}] is:",
File=FileName,
- ExtraData="in [%s] [%s]\n\tconsumed by module [%s]" % (str(M), Arch, str(Module)))
+ ExtraData="\n\t".join(GenerateDependencyDump(ConsumedByList, M, 0, set()))
+ )
else:
return []