]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Conf/BuildMacro.xml
Add AutoGen.h.obj to the list of files to link to resolve a link failure with VS...
[mirror_edk2.git] / Tools / Conf / BuildMacro.xml
index 472290893165cb7ff46b44b5bd2c133d6d2ea9da..b149cd69644331086e5cf808e76d23c859e585b1 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
+<?xml version="1.0" encoding="UTF-8"?>\r
 <!--\r
 Copyright (c) 2006, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
@@ -10,6 +10,17 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 -->\r
 <project name="common">\r
+  <!--\r
+    Macro for intialize some properties. This Macro build will be called before source file build.  \r
+    -->\r
+  <macrodef name="Build_Init">\r
+    <sequential>\r
+      <var name="OBJECTS" value="" />\r
+      <var name="SDB_FILES" value="" />\r
+    </sequential>\r
+  </macrodef>\r
+\r
+\r
   <!--\r
     macro definitions for building files with different types\r
     -->\r
@@ -49,17 +60,41 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         </targetfiles>\r
 \r
         <sequential>\r
+          <!-- Use pre-compiled header if available -->\r
+          <if>\r
+            <and>\r
+              <equals arg1="${CC_FAMILY}" arg2="MSFT" casesensitive="false"/>\r
+              <available file="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+            </and>\r
+            <then>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS} /Yu${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+            </then>\r
+            <else>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS}"/>\r
+            </else>\r
+          </if>\r
+\r
           <cc userdefine="on">\r
             <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"\r
-              outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">\r
+              outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${CC_DPATH}">\r
               <EXTRA.INC/>\r
-              <argument value="${CC_FLAGS}"/>\r
+              <argument value="${LOCAL_CC_FLAGS}"/>\r
               <EXTRA.ARG/>\r
-              <fileset casesensitive="off" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
             </command>\r
           </cc>\r
         </sequential>\r
       </OnDependency>\r
+      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->\r
+      <if>\r
+        <equals arg1="@{FILEPATH}" arg2="." />\r
+        <then>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />\r
+        </then>\r
+        <else>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />\r
+        </else>\r
+      </if>\r
     </sequential>\r
   </macrodef>\r
 \r
@@ -77,6 +112,44 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <var name="FILE_PATH" value="@{FILEPATH}" />\r
       <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>\r
 \r
+      <if>\r
+        <available type="file" file="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+        <then>\r
+          <makedeps DepsFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep">\r
+            <input file="${DEST_DIR_DEBUG}/AutoGen.h"/>\r
+            <EXTRA.INC/>\r
+          </makedeps>\r
+        </then>\r
+      </if>\r
+\r
+      <OnDependency>\r
+        <sourcefiles>\r
+          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>\r
+        </sourcefiles>\r
+        <targetfiles>\r
+          <file Name="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+        </targetfiles>\r
+\r
+        <sequential>\r
+          <!-- Generate pre-compiled header -->\r
+          <if>\r
+            <equals arg1="${CC_FAMILY}" arg2="MSFT" casesensitive="false"/>\r
+            <then>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS} /TC /Yc /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+              <cc userdefine="on">\r
+                <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"\r
+                    outputFile="${DEST_DIR_OUTPUT}/AutoGen.h.obj" dpath="${CC_DPATH}">\r
+                  <EXTRA.INC/>\r
+                  <argument value="${LOCAL_CC_FLAGS}"/>\r
+                  <EXTRA.ARG/>\r
+                  <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/AutoGen.h"/>\r
+                </command>\r
+              </cc>\r
+            </then>\r
+          </if>\r
+        </sequential>\r
+      </OnDependency>\r
+\r
       <if>\r
         <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>\r
         <then>\r
@@ -97,17 +170,38 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         </targetfiles>\r
 \r
         <sequential>\r
+          <!-- Generate pre-compiled header -->\r
+          <if>\r
+            <equals arg1="${CC_FAMILY}" arg2="MSFT" casesensitive="false"/>\r
+            <then>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS} /Yu${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+            </then>\r
+            <else>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS}"/>\r
+            </else>\r
+          </if>\r
+\r
           <cc userdefine="on">\r
             <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"\r
-                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">\r
+                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${CC_DPATH}">\r
               <EXTRA.INC/>\r
-              <argument value="${CC_FLAGS}"/>\r
+              <argument value="${LOCAL_CC_FLAGS}"/>\r
               <EXTRA.ARG/>\r
-              <fileset casesensitive="off" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+              <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
             </command>\r
           </cc>\r
         </sequential>\r
       </OnDependency>\r
+      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->\r
+      <if>\r
+        <equals arg1="@{FILEPATH}" arg2="." />\r
+        <then>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />\r
+        </then>\r
+        <else>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />\r
+        </else>\r
+      </if>\r
     </sequential>\r
   </macrodef>\r
 \r
@@ -134,16 +228,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         </targetfiles>\r
 \r
         <sequential>\r
-\r
           <cc userdefine="on">\r
-            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}">\r
+            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${CC_FAMILY}"\r
+                     outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i" dpath="${CC_DPATH}">\r
               <EXTRA.INC/>\r
               <argument value="${PP_FLAGS}"/>\r
-              <fileset casesensitive="off" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
             </command>\r
           </cc>\r
     \r
-          <gendepex inputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.i" outputFile="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>\r
+          <gendepex inputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i" outputFile="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>\r
         </sequential>\r
       </OnDependency>\r
     </sequential>\r
@@ -158,20 +252,27 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <element name="EXTRA.ARG" optional="yes"/>\r
     \r
     <!-- Dispath ASM file, there are three type. \r
-         asm,s   -   Build_Assembly\r
-         S       -   Build_Ipf_Assembly -->\r
+         asm     -   Build_Assembly\r
+         S       -   Build_Gcc_Assembly\r
+         s       -   Build_Ipf_Assembly -->\r
     <sequential>\r
            <if>\r
-             <or>\r
-               <equals arg1="@{FILEEXT}" arg2="asm" />\r
-               <equals arg1="@{FILEEXT}" arg2="S" />\r
-             </or>\r
+        <equals arg1="@{FILEEXT}" arg2="asm" />\r
              <then>\r
                <Build_Assembly FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">\r
             <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>\r
             <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>\r
           </Build_Assembly>\r
              </then>\r
+        <elseif>\r
+          <equals arg1="@{FILEEXT}" arg2="S" />\r
+          <then>\r
+            <Build_Gcc_Assembly FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">\r
+              <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>\r
+              <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>\r
+            </Build_Gcc_Assembly>\r
+          </then>\r
+        </elseif>\r
              <elseif>\r
                <equals arg1="@{FILEEXT}" arg2="s" />\r
                <then>\r
@@ -211,10 +312,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
         <sequential>\r
           <cc userdefine="on">\r
-            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${CC_FAMILY}">\r
+            <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}" dpath="${PP_DPATH}">\r
               <EXTRA.INC.1/>\r
               <argument value="${PP_FLAGS}"/>\r
-              <fileset casesensitive="off" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
             </command>\r
           </cc>\r
 \r
@@ -234,18 +335,78 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
           <cc userdefine="on">\r
             <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"\r
-                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">\r
+                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}">\r
+              <EXTRA.INC.1/>\r
+      \r
+              <argument value="${ASM_FLAGS}"/>\r
+              <EXTRA.ARG.1/>\r
+      \r
+              <fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>\r
+            </command>\r
+          </cc>\r
+        </sequential>\r
+      </OnDependency>\r
+      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->\r
+      <if>\r
+        <equals arg1="@{FILEPATH}" arg2="." />\r
+        <then>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />\r
+        </then>\r
+        <else>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />\r
+        </else>\r
+      </if>\r
+    </sequential>\r
+  </macrodef>\r
+\r
+  <!--\r
+    Build GCC assembly code\r
+    -->\r
+  <macrodef name="Build_Gcc_Assembly">\r
+    <attribute name="FILEPATH"/>\r
+    <attribute name="FILENAME"/>\r
+    <attribute name="FILEEXT" default="asm"/>\r
+\r
+    <element name="EXTRA.INC.1" optional="yes"/>\r
+    <element name="EXTRA.ARG.1" optional="yes"/>\r
+\r
+    <sequential>\r
+      <var name="FILE_BASENAME" value="@{FILENAME}" />\r
+      <var name="FILE_PATH" value="@{FILEPATH}" />\r
+      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>\r
+\r
+      <OnDependency>\r
+        <sourcefiles>\r
+          <file Name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+        </sourcefiles>\r
+        <targetfiles>\r
+          <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>\r
+        </targetfiles>\r
+\r
+        <sequential>\r
+          <cc userdefine="on">\r
+            <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"\r
+                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}">\r
               <EXTRA.INC.1/>\r
       \r
               <argument value="${ASM_FLAGS}"/>\r
               <EXTRA.ARG.1/>\r
       \r
-              <!-- fileset casesensitive="off" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/ -->\r
-              <fileset casesensitive="off" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>\r
+              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
             </command>\r
           </cc>\r
         </sequential>\r
       </OnDependency>\r
+      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->\r
+      <if>\r
+        <equals arg1="@{FILEPATH}" arg2="." />\r
+        <then>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />\r
+        </then>\r
+        <else>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />\r
+        </else>\r
+      </if>\r
     </sequential>\r
   </macrodef>\r
 \r
@@ -268,6 +429,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <then>\r
           <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep">\r
             <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+            <input file="${DEST_DIR_DEBUG}/AutoGen.h"/>\r
             <EXTRA.INC.1/>\r
           </makedeps>\r
         </then>\r
@@ -283,25 +445,35 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
         <sequential>\r
           <cc userdefine="on">\r
-            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${CC_FAMILY}">\r
+            <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}" dpath="${PP_DPATH}">\r
               <EXTRA.INC.1/>\r
               <argument value="${PP_FLAGS}"/>\r
-              <fileset casesensitive="off" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
             </command>\r
           </cc>\r
       \r
           <cc userdefine="on">\r
             <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"\r
-                includepathDelimiter="-I" outputDelimiter="-o"\r
+                includepathDelimiter="-I" outputDelimiter="-o" dpath="${ASM_DPATH}"\r
                 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">\r
               <EXTRA.INC.1/>\r
               <argument value="${ASM_FLAGS}"/>\r
               <EXTRA.ARG.1/>\r
-              <fileset casesensitive="off" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>\r
+              <fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>\r
             </command>\r
           </cc>\r
         </sequential>\r
       </OnDependency>\r
+      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->\r
+      <if>\r
+        <equals arg1="@{FILEPATH}" arg2="." />\r
+        <then>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />\r
+        </then>\r
+        <else>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />\r
+        </else>\r
+      </if>\r
     </sequential>\r
   </macrodef>\r
 \r
@@ -318,7 +490,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>\r
   \r
       <cc userdefine="on">\r
-        <command type="ASM" includepathDelimiter="-I">\r
+        <command type="ASM" includepathDelimiter="-I" dpath="${ASM_DPATH}">\r
           <includepath path="${WORKSPACE_DIR}"/>\r
           <includepath path="${MODULE_DIR}"/>\r
           <includepath path="${MODULE_DIR}/${ARCH}"/>\r
@@ -326,10 +498,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
   \r
           <argument value="${ASM_FLAGS}"/>\r
           <EXTRA.ARG/>\r
-          <!-- <argument value="-o ${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/> -->\r
           <OutputFile File="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>\r
   \r
-          <fileset casesensitive="off" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+          <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
         </command>\r
       </cc>\r
     </sequential>\r
@@ -346,11 +517,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <sequential>\r
       <var name="FILE_BASENAME" value="@{FILENAME}" />\r
       <var name="FILE_PATH" value="." />\r
+      <if>\r
+        <available type="file" file="${DEST_DIR_OUTPUT}/AutoGen.h.obj"/>\r
+        <then>\r
+          <var name="SLINK_FLAGS" value="${SLINK_FLAGS} ${DEST_DIR_OUTPUT}/AutoGen.h.obj"/>\r
+        </then>\r
+      </if>\r
       <mkdir dir="${BIN_DIR}"/>\r
 \r
       <OnDependency>\r
         <sourcefiles>\r
-          <file list="${OBJECTS}"/>\r
+          <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}" />\r
         </sourcefiles>\r
         <targetfiles>\r
           <file name="${BIN_DIR}/@{FILENAME}.lib"/>\r
@@ -359,10 +536,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <sequential>\r
           <cc userdefine="on">\r
             <command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}"\r
-                outputFile="${BIN_DIR}/@{FILENAME}.lib">\r
+                outputFile="${BIN_DIR}/@{FILENAME}.lib" dpath="${SLINK_DPATH}">\r
               <argument value="${SLINK_FLAGS}"/>\r
 \r
-              <fileset casesensitive="off" dir="${DEST_DIR_OUTPUT}" includes="**/*.obj"/>\r
+              <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}"/>\r
             </command>\r
           </cc>\r
         </sequential>\r
@@ -468,18 +645,42 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         </targetfiles>\r
         \r
         <sequential>\r
+          <!-- Use pre-compiled header if available -->\r
+          <if>\r
+            <and>\r
+              <equals arg1="${CC_FAMILY}" arg2="MSFT" casesensitive="false"/>\r
+              <available file="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+            </and>\r
+            <then>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS} /Yc${DEST_DIR_DEBUG}/AutoGen.h /Yu${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+            </then>\r
+            <else>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS}"/>\r
+            </else>\r
+          </if>\r
+\r
           <cc userdefine="on">\r
             <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"\r
-                     includepathDelimiter="-I"\r
+                     includepathDelimiter="-I" dpath="${CC_DPATH}"\r
                      outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Strings.obj">\r
-              <argument value="${CC_FLAGS}"/>\r
+              <argument value="${LOCAL_CC_FLAGS}"/>\r
               <EXTRA.INC />\r
-              <fileset casesensitive="off" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>\r
+              <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>\r
             </command>\r
           </cc>\r
         </sequential>\r
       </OnDependency>\r
 \r
+      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->\r
+      <if>\r
+        <equals arg1="@{FILEPATH}" arg2="." />\r
+        <then>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}Strings.obj" />\r
+        </then>\r
+        <else>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}Strings.obj" />\r
+        </else>\r
+      </if>\r
     </sequential>\r
   </macrodef>\r
 \r
@@ -502,6 +703,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <then>\r
           <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep">\r
             <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>\r
+            <input file="${DEST_DIR_DEBUG}/AutoGen.h"/>\r
             <EXTRA.INC/>\r
           </makedeps>\r
         </then>\r
@@ -520,19 +722,58 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
             <EXTRA.INC/>\r
           </vfrcompile>\r
     \r
+          <!-- Use pre-compiled header if available -->\r
+          <if>\r
+            <and>\r
+              <equals arg1="${CC_FAMILY}" arg2="MSFT" casesensitive="false"/>\r
+              <available file="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+            </and>\r
+            <then>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS} /Yu${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>\r
+            </then>\r
+            <else>\r
+              <var name="LOCAL_CC_FLAGS" value="${CC_FLAGS}"/>\r
+            </else>\r
+          </if>\r
+\r
           <cc userdefine="on">\r
             <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" \r
-                     includepathDelimiter="-I"\r
+                     includepathDelimiter="-I" family="${CC_FAMILY}" dpath="${CC_DPATH}"\r
                      outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" >\r
-              <argument value="${CC_FLAGS}"/>\r
+              <argument value="${LOCAL_CC_FLAGS}"/>\r
               <EXTRA.INC/>\r
               <EXTRA.ARG/>\r
-              <fileset casesensitive="off" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.c"/>\r
+              <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.c"/>\r
             </command>\r
           </cc>\r
-          <delete file="${PLATFORM_DIR}/@{FILENAME}.i" />\r
         </sequential>\r
       </OnDependency>\r
+      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->\r
+      <if>\r
+        <equals arg1="@{FILEPATH}" arg2="." />\r
+        <then>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />\r
+        </then>\r
+        <else>\r
+          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />\r
+        </else>\r
+      </if>\r
+    </sequential>\r
+  </macrodef>\r
+\r
+  <!--\r
+    DUMMY\r
+    -->\r
+  <macrodef name="Build_DUMMY">\r
+    <attribute name="FILEPATH"/>\r
+    <attribute name="FILENAME"/>\r
+    <attribute name="FILEEXT"/>\r
+\r
+    <element name="EXTRA.INC" optional="yes"/>\r
+    <element name="EXTRA.ARG" optional="yes"/>\r
+\r
+    <sequential>\r
+      <echo message="Ignoring ${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" level="info" />\r
     </sequential>\r
   </macrodef>\r
 \r
@@ -553,10 +794,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <sequential>\r
       <var name="FILE_BASENAME" value="@{FILENAME}" />\r
       <var name="FILE_PATH" value="@{FILEPATH}" />\r
+      <if>\r
+        <available type="file" file="${DEST_DIR_OUTPUT}/AutoGen.h.obj"/>\r
+        <then>\r
+          <var name="SLINK_FLAGS" value="${SLINK_FLAGS} ${DEST_DIR_OUTPUT}/AutoGen.h.obj"/>\r
+        </then>\r
+      </if>\r
       <OnDependency>\r
         <sourcefiles>\r
-          <!--fileset casesensitive="off" dir="${DEST_DIR_OUTPUT}" includes="**/*.obj" /-->\r
           <file list="${LIBS}"/>\r
+          <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}" />\r
         </sourcefiles>\r
         <targetfiles>\r
           <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.dll"/>\r
@@ -564,20 +811,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
         <sequential>\r
           <cc userdefine="on">\r
-            <command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}"\r
+            <command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}" dpath="${SLINK_DPATH}"\r
                 outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Local.lib">\r
               <argument value="${SLINK_FLAGS}"/>\r
 \r
-              <fileset casesensitive="off" dir="${DEST_DIR_OUTPUT}" includes="**/*.obj"/>\r
+              <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}"/>\r
             </command>\r
           </cc>\r
           <cc userdefine="on">\r
             <command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}"\r
-                     outputFile="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.dll" >\r
+                     outputFile="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.dll" dpath="${DLINK_DPATH}" >\r
               <argument value="${DLINK_FLAGS}"/>\r
-              <libset libs="${LIBS}"/>\r
-              <libset libs="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Local.lib"/>\r
-              <libset libs="${DLINK_SPATH}" />\r
+              <libset libs="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Local.lib ${LIBS} ${DLINK_SPATH}"/>\r
               <LINK.ARG/>\r
             </command>\r
           </cc>\r
@@ -604,7 +849,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         </targetfiles>\r
 \r
         <sequential>\r
-          <!-- -->\r
           <fwimage componentType="${MODULE_TYPE}" outImage="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" \r
                    peImage="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" time="0"/>\r
         </sequential>\r
@@ -668,12 +912,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
           <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${BIN_DIR}/@{FILENAME}.efi" />\r
           <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />          \r
           <genteimage Dump="false" Verbose="false" OutputDir="" OutputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" InputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>\r
-          <!-- \r
-          <exec executable="${GENTEIMAGE}">\r
-            <arg line="-o ${DEST_DIR_OUTPUT}/@{FILENAME}.te ${DEST_DIR_OUTPUT}/@{FILENAME}.efi" />\r
-          </exec>\r
-          -->\r
-          <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.te" tofile="${BIN_DIR}/@{FILENAME}.te" />\r
           <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" \r
                       outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.tes" \r
                       sectiontype="EFI_SECTION_TE"/>\r
@@ -719,7 +957,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
         <sequential>\r
           <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${BIN_DIR}/@{FILENAME}.efi" />\r
-          \r
+          <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />\r
           <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" \r
                       outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.pe32" \r
                       sectiontype="EFI_SECTION_PE32"/>\r
@@ -727,7 +965,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
           <POST.PROCESS/>\r
         </sequential>\r
       </OnDependency>\r
-      <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />\r
     </sequential>\r
   </macrodef>\r
 \r
@@ -789,24 +1026,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     </sequential>\r
   </macrodef>\r
 \r
-  <!--\r
-    EFI_SECTION_FREEFORM_SUBTYPE_GUID\r
-    <macrodef name="EFI_SECTION_FREEFORM_SUBTYPE_GUID">\r
-      <attribute name="FILEPATH"/>\r
-      <attribute name="FILENAME"/>\r
-      <attribute name="FILEEXT" default=""/>\r
-  \r
-      <element name="EXTRA.INC" optional="yes"/>\r
-      <element name="EXTRA.ARG" optional="yes"/>\r
-  \r
-      <sequential>\r
-        <gensection inputfile="" \r
-                    outputfile="" \r
-                    sectiontype="EFI_SECTION_FREEFORM_SUBTYPE_GUID"/>\r
-      </sequential>\r
-    </macrodef>\r
-    -->\r
-\r
   <!--\r
     EFI_SECTION_DXE_DEPEX\r
     -->\r
@@ -900,28 +1119,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     </sequential>\r
   </macrodef>\r
 \r
-  <!--\r
-    EFI_SECTION_PIC\r
-    <macrodef name="EFI_SECTION_PIC">\r
-      <attribute name="FILEPATH"/>\r
-      <attribute name="FILENAME"/>\r
-      <attribute name="FILEEXT" default=""/>\r
-  \r
-      <element name="EXTRA.INC" optional="yes"/>\r
-      <element name="EXTRA.ARG" optional="yes"/>\r
-  \r
-      <sequential>\r
-        <gensection inputfile="${BIN_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" \r
-                    outputfile="${BIN_DIR}/@{FILENAME}.pe32" \r
-                    sectiontype="EFI_SECTION_PIC"/>\r
-      </sequential>\r
-    </macrodef>\r
-    -->\r
-\r
-  <!-- \r
-    EFI_SECTION_TE\r
-  -->\r
-\r
 \r
   <!--\r
     EFI_SECTION_RAW\r
@@ -1006,13 +1203,29 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
             tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>\r
     </sequential>\r
   </macrodef>\r
+  <!--\r
+    Microcode\r
+   -->\r
+  <macrodef name="Build_MICROCODE">\r
+    <attribute name="FILEPATH"/>\r
+    <attribute name="FILENAME"/>\r
+    <attribute name="FILEEXT" default="TXT"/>\r
+\r
+    <element name="EXTRA.INC" optional="yes"/>\r
+    <element name="EXTRA.ARG" optional="yes"/>\r
+\r
+    <sequential>\r
+      <mkdir dir="${TARGET_DIR}/Microcode"/>\r
+      <flashmap MCIFile="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" MCOFILE="${TARGET_DIR}/Microcode/@{FILENAME}.bin"/>\r
+    </sequential>\r
+  </macrodef> \r
 \r
   <!--\r
     Graphics (bmp, ...)\r
     -->\r
   <macrodef name="Build_Graphics">\r
     <attribute name="FILEPATH"/>\r
-    <attribute name="FILENAME"/>\r
+    <attribute name="FILENAME"/> \r
     <attribute name="FILEEXT" default="bmp"/>\r
 \r
     <element name="EXTRA.INC" optional="yes"/>\r