+## Trim ASM file\r
+#\r
+# Output ASM include statement with the content the included file\r
+#\r
+# @param Source File to be trimmed\r
+# @param Target File to store the trimmed content\r
+# @param IncludePathFile The file to log the external include path\r
+#\r
+def TrimAsmFile(Source, Target, IncludePathFile):\r
+ CreateDirectory(os.path.dirname(Target))\r
+\r
+ SourceDir = os.path.dirname(Source)\r
+ if SourceDir == '':\r
+ SourceDir = '.'\r
+\r
+ #\r
+ # Add source directory as the first search directory\r
+ #\r
+ IncludePathList = [SourceDir]\r
+ #\r
+ # If additional include path file is specified, append them all\r
+ # to the search directory list.\r
+ #\r
+ if IncludePathFile:\r
+ try:\r
+ LineNum = 0\r
+ with open(IncludePathFile, 'r') as File:\r
+ FileLines = File.readlines()\r
+ for Line in FileLines:\r
+ LineNum += 1\r
+ if Line.startswith("/I") or Line.startswith ("-I"):\r
+ IncludePathList.append(Line[2:].strip())\r
+ else:\r
+ EdkLogger.warn("Trim", "Invalid include line in include list file.", IncludePathFile, LineNum)\r
+ except:\r
+ EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=IncludePathFile)\r
+ AsmIncludes = []\r
+ Lines = DoInclude(Source, '', IncludePathList,IncludeFileList=AsmIncludes,filetype='ASM')\r
+ AsmIncludes = [item for item in AsmIncludes if item != Source]\r
+ if AsmIncludes:\r
+ SaveFileOnChange(os.path.join(os.path.dirname(Target),os.path.basename(Source))+".trim.deps", " \\\n".join([Source+":"] +AsmIncludes),False)\r
+ # save all lines trimmed\r
+ try:\r
+ with open(Target, 'w') as File:\r
+ File.writelines(Lines)\r
+ except:\r
+ EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target)\r
+\r