EdkLogger.error("build", AUTOGEN_ERROR, "Nothing to build",\r
ExtraData="[%s]" % str(MyAgo))\r
\r
- self.ProcessBuildTargetList()\r
+ self.ProcessBuildTargetList(MyAgo.OutputDir, ToolsDef)\r
self.ParserGenerateFfsCmd()\r
\r
# Generate macros used to represent input files\r
BuildTargets[Target].Commands[i] = SingleCommand.replace('$(INC)', '').replace(FlagDict[Flag]['Macro'], RespMacro)\r
return RespDict\r
\r
- def ProcessBuildTargetList(self):\r
+ def ProcessBuildTargetList(self, RespFile, ToolsDef):\r
#\r
# Search dependency file list for each source file\r
#\r
self.ObjTargetDict[T.Target.SubDir] = set()\r
self.ObjTargetDict[T.Target.SubDir].add(NewFile)\r
for Type in self._AutoGenObject.Targets:\r
+ resp_file_number = 0\r
for T in self._AutoGenObject.Targets[Type]:\r
# Generate related macros if needed\r
if T.GenFileListMacro and T.FileListMacro not in self.FileListMacros:\r
Deps.append("$(%s)" % T.ListFileMacro)\r
\r
if self._AutoGenObject.BuildRuleFamily == TAB_COMPILER_MSFT and Type == TAB_C_CODE_FILE:\r
- T, CmdTarget, CmdTargetDict, CmdCppDict = self.ParserCCodeFile(T, Type, CmdSumDict, CmdTargetDict, CmdCppDict, DependencyDict)\r
+ T, CmdTarget, CmdTargetDict, CmdCppDict = self.ParserCCodeFile(T, Type, CmdSumDict, CmdTargetDict,\r
+ CmdCppDict, DependencyDict, RespFile,\r
+ ToolsDef, resp_file_number)\r
+ resp_file_number += 1\r
TargetDict = {"target": self.PlaceMacro(T.Target.Path, self.Macros), "cmd": "\n\t".join(T.Commands),"deps": CCodeDeps}\r
CmdLine = self._BUILD_TARGET_TEMPLATE.Replace(TargetDict).rstrip().replace('\t$(OBJLIST', '$(OBJLIST')\r
if T.Commands:\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
+ def ParserCCodeFile(self, T, Type, CmdSumDict, CmdTargetDict, CmdCppDict, DependencyDict, RespFile, ToolsDef,\r
+ resp_file_number):\r
+ SaveFilePath = os.path.join(RespFile, "cc_resp_%s.txt" % resp_file_number)\r
if not CmdSumDict:\r
for item in self._AutoGenObject.Targets[Type]:\r
CmdSumDict[item.Target.SubDir] = item.Target.BaseName\r
if Temp.startswith('/Fo'):\r
CmdSign = '%s%s' % (Temp.rsplit(TAB_SLASH, 1)[0], TAB_SLASH)\r
break\r
- else: continue\r
+ else:\r
+ continue\r
if CmdSign not in list(CmdTargetDict.keys()):\r
- CmdTargetDict[CmdSign] = Item.replace(Temp, CmdSign)\r
+ cmd = Item.replace(Temp, CmdSign)\r
+ if SingleCommandList[-1] in cmd:\r
+ CmdTargetDict[CmdSign] = [cmd.replace(SingleCommandList[-1], "").rstrip(), SingleCommandList[-1]]\r
else:\r
- CmdTargetDict[CmdSign] = "%s %s" % (CmdTargetDict[CmdSign], SingleCommandList[-1])\r
+ # CmdTargetDict[CmdSign] = "%s %s" % (CmdTargetDict[CmdSign], SingleCommandList[-1])\r
+ CmdTargetDict[CmdSign].append(SingleCommandList[-1])\r
Index = CommandList.index(Item)\r
CommandList.pop(Index)\r
if SingleCommandList[-1].endswith("%s%s.c" % (TAB_SLASH, CmdSumDict[CmdSign[3:].rsplit(TAB_SLASH, 1)[0]])):\r
Cpplist = CmdCppDict[T.Target.SubDir]\r
Cpplist.insert(0, '$(OBJLIST_%d): ' % list(self.ObjTargetDict.keys()).index(T.Target.SubDir))\r
- T.Commands[Index] = '%s\n\t%s' % (' \\\n\t'.join(Cpplist), CmdTargetDict[CmdSign])\r
+ source_files = CmdTargetDict[CmdSign][1:]\r
+ source_files.insert(0, " ")\r
+ if len(source_files)>2:\r
+ SaveFileOnChange(SaveFilePath, " ".join(source_files), False)\r
+ T.Commands[Index] = '%s\n\t%s $(cc_resp_%s)' % (\r
+ ' \\\n\t'.join(Cpplist), CmdTargetDict[CmdSign][0], resp_file_number)\r
+ ToolsDef.append("cc_resp_%s = @%s" % (resp_file_number, SaveFilePath))\r
+\r
+ elif len(source_files)<=2 and len(" ".join(CmdTargetDict[CmdSign][:2]))>GlobalData.gCommandMaxLength:\r
+ SaveFileOnChange(SaveFilePath, " ".join(source_files), False)\r
+ T.Commands[Index] = '%s\n\t%s $(cc_resp_%s)' % (\r
+ ' \\\n\t'.join(Cpplist), CmdTargetDict[CmdSign][0], resp_file_number)\r
+ ToolsDef.append("cc_resp_%s = @%s" % (resp_file_number, SaveFilePath))\r
+\r
+ else:\r
+ T.Commands[Index] = '%s\n\t%s' % (' \\\n\t'.join(Cpplist), " ".join(CmdTargetDict[CmdSign]))\r
else:\r
T.Commands.pop(Index)\r
return T, CmdSumDict, CmdTargetDict, CmdCppDict\r