TargetDict = {"target": self.PlaceMacro(T.Target.Path, self.Macros), "cmd": "\n\t".join(T.Commands),"deps": Deps}\r
self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(TargetDict))\r
\r
+ # Add a Makefile rule for targets generating multiple files.\r
+ # The main output is a prerequisite for the other output files.\r
+ for i in T.Outputs[1:]:\r
+ AnnexeTargetDict = {"target": self.PlaceMacro(i.Path, self.Macros), "cmd": "", "deps": self.PlaceMacro(T.Target.Path, self.Macros)}\r
+ self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(AnnexeTargetDict))\r
+\r
def ParserCCodeFile(self, T, Type, CmdSumDict, CmdTargetDict, CmdCppDict, DependencyDict):\r
if not CmdSumDict:\r
for item in self._AutoGenObject.Targets[Type]:\r
SubDirectory = os.path.join(self.OutputDir, File.SubDir)\r
if not os.path.exists(SubDirectory):\r
CreateDirectory(SubDirectory)\r
- LastTarget = None\r
+ TargetList = set()\r
+ FinalTargetName = set()\r
RuleChain = set()\r
SourceList = [File]\r
Index = 0\r
self.BuildOption\r
\r
while Index < len(SourceList):\r
+ # Reset the FileType if not the first iteration.\r
+ if Index > 0:\r
+ FileType = TAB_UNKNOWN_FILE\r
Source = SourceList[Index]\r
Index = Index + 1\r
\r
elif Source.Ext in self.BuildRules:\r
RuleObject = self.BuildRules[Source.Ext]\r
else:\r
- # stop at no more rules\r
- if LastTarget:\r
- self._FinalBuildTargetList.add(LastTarget)\r
- break\r
+ # No more rule to apply: Source is a final target.\r
+ FinalTargetName.add(Source)\r
+ continue\r
\r
FileType = RuleObject.SourceFileType\r
self._FileTypes[FileType].add(Source)\r
\r
# stop at STATIC_LIBRARY for library\r
if self.IsLibrary and FileType == TAB_STATIC_LIBRARY:\r
- if LastTarget:\r
- self._FinalBuildTargetList.add(LastTarget)\r
- break\r
+ FinalTargetName.add(Source)\r
+ continue\r
\r
Target = RuleObject.Apply(Source, self.BuildRuleOrder)\r
if not Target:\r
- if LastTarget:\r
- self._FinalBuildTargetList.add(LastTarget)\r
- break\r
- elif not Target.Outputs:\r
- # Only do build for target with outputs\r
- self._FinalBuildTargetList.add(Target)\r
+ # No Target: Source is a final target.\r
+ FinalTargetName.add(Source)\r
+ continue\r
\r
+ TargetList.add(Target)\r
self._BuildTargets[FileType].add(Target)\r
\r
if not Source.IsBinary and Source == File:\r
\r
# to avoid cyclic rule\r
if FileType in RuleChain:\r
- break\r
+ EdkLogger.error("build", ERROR_STATEMENT, "Cyclic dependency detected while generating rule for %s" % str(Source))\r
\r
RuleChain.add(FileType)\r
SourceList.extend(Target.Outputs)\r
- LastTarget = Target\r
- FileType = TAB_UNKNOWN_FILE\r
+\r
+ # For each final target name, retrieve the corresponding TargetDescBlock instance.\r
+ for FTargetName in FinalTargetName:\r
+ for Target in TargetList:\r
+ if FTargetName == Target.Target:\r
+ self._FinalBuildTargetList.add(Target)\r
\r
@cached_property\r
def Targets(self):\r