<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-->
<project name="common">
  <!-- for user extended tasks or macros -->
  <import file="UserExtension.xml" optional="true"/>

  <!--
    Macro for intialize some properties. This Macro build will be called before source file build.  
    -->
  <macrodef name="Build_Init">
    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
    
    <sequential>
      <var name="OBJECTS" value="" />
      <var name="SDB_FILES" value="" />

      <mkdir dir="${DEST_DIR_DEBUG}"/>
      <mkdir dir="${DEST_DIR_OUTPUT}"/>

      <if>
        <and>
          <isset property="PCH"/>
          <not>
            <equals arg1="${PCH}" arg2=""/>
          </not>
        </and>
        <then>
          <makedeps DepsFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep" 
                    TargetFile="${DEST_DIR_OUTPUT}/AutoGen.h.gch">
            <input file="${DEST_DIR_DEBUG}/AutoGen.h"/>
            <EXTRA.INC/>
          </makedeps>
    
          <OnDependency>
            <sourcefiles>
              <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
            </sourcefiles>
            <targetfiles>
              <file Name="${DEST_DIR_OUTPUT}/AutoGen.h.gch"/>
            </targetfiles>
    
            <sequential>
              <!-- Generate pre-compiled header -->
              <cc userdefine="on">
                <command type="CC" cmd="${PCH}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
                    outputFile="${DEST_DIR_OUTPUT}/AutoGen.h.obj" dpath="${CC_DPATH}" libpath="${CC_LIBPATH}" 
                    include="${CC_INCLUDEPATH}">
                  <EXTRA.INC/>
                  <argument value="${PCH_FLAGS}"/>
                  <EXTRA.ARG/>
                  <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/AutoGen.h"/>
                </command>
              </cc>

              <if>
                <equals arg1="${CC_FAMILY}" arg2="GCC"/>
                <then>
                  <move file="${DEST_DIR_OUTPUT}/AutoGen.h.obj" tofile="${DEST_DIR_DEBUG}/AutoGen.h.gch" overwrite="true"/>
                </then>
              </if>
            </sequential>
          </OnDependency>

          <if>
            <not>
              <equals arg1="${CC_FAMILY}" arg2="GCC"/>
            </not>
            <then>
              <var name="OBJECTS" value="${OBJECTS} AutoGen.h.obj"/>
            </then>
          </if>
        </then>
        <else>
          <makedeps DepsFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep">
            <input file="${DEST_DIR_DEBUG}/AutoGen.h"/>
            <EXTRA.INC/>
          </makedeps>
        </else>
      </if>
    </sequential>
  </macrodef>


  <!--
    macro definitions for building files with different types
    -->
  <!--
    C Code
    -->
  <macrodef name="Build_CCode">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="c"/>
    
    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
    
    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="@{FILEPATH}" />
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>

      <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"
                TargetFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
        <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        <EXTRA.INC/>
      </makedeps>

      <OnDependency>
        <sourcefiles>
          <file ListFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
        </sourcefiles>
        <targetfiles>
          <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${CC_DPATH}" 
                libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
              <EXTRA.INC/>
              <argument value="${CC_FLAGS}"/>
              <EXTRA.ARG/>
              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>
      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
      <if>
        <equals arg1="@{FILEPATH}" arg2="." />
        <then>
          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
        </then>
        <else>
          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
        </else>
      </if>
    </sequential>
  </macrodef>


  <macrodef name="Build_AUTOGEN">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="c"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="@{FILEPATH}" />
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>

      <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"
                TargetFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
        <input file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        <EXTRA.INC/>
      </makedeps>

      <OnDependency>
        <sourcefiles>
          <file ListFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
        </sourcefiles>
        <targetfiles>
          <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${CC_DPATH}"
                libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
              <EXTRA.INC/>
              <argument value="${CC_FLAGS}"/>
              <EXTRA.ARG/>
              <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>
      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
      <if>
        <equals arg1="@{FILEPATH}" arg2="." />
        <then>
          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
        </then>
        <else>
          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
        </else>
      </if>
    </sequential>
  </macrodef>

  <macrodef name="Build_DPX">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="dxs"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
        

    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="@{FILEPATH}" />
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>

      <OnDependency>
        <sourcefiles>
          <file name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${CC_FAMILY}"
                     outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i" dpath="${CC_DPATH}"
                     libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
              <EXTRA.INC/>
              <argument value="${PP_FLAGS}"/>
              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>
    
          <gendepex inputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i" outputFile="${DEST_DIR_OUTPUT}/${BASE_NAME}.depex"/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>
  
  <macrodef name="Build_ASM">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="asm"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
    
    <!-- Dispath ASM file, there are three type. 
         asm     -   Build_Assembly
         S       -   Build_Gcc_Assembly
         s       -   Build_Ipf_Assembly -->
    <sequential>
	    <if>
        <equals arg1="@{FILEEXT}" arg2="asm" />
	      <then>
	        <Build_Assembly FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">
            <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>
            <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>
          </Build_Assembly>
	      </then>
        <elseif>
          <equals arg1="@{FILEEXT}" arg2="S" />
          <then>
            <Build_Gcc_Assembly FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">
              <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>
              <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>
            </Build_Gcc_Assembly>
          </then>
        </elseif>
	      <elseif>
	        <equals arg1="@{FILEEXT}" arg2="s" />
	        <then>
	          <Build_IPF_Assembly_Code FILEPATH="@{FILEPATH}" FILENAME="@{FILENAME}" FILEEXT="@{FILEEXT}">
	            <EXTRA.INC.1><EXTRA.INC /></EXTRA.INC.1>
              <EXTRA.ARG.1><EXTRA.ARG /></EXTRA.ARG.1>
            </Build_IPF_Assembly_Code>
	        </then>
	      </elseif>
	    </if>
    </sequential>
  </macrodef>
  
  <!--
    IA32/x64 Assembly
    -->
  <macrodef name="Build_Assembly">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="asm"/>

    <element name="EXTRA.INC.1" optional="yes"/>
    <element name="EXTRA.ARG.1" optional="yes"/>

    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="@{FILEPATH}" />
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>

      <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"
                TargetFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
        <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        <EXTRA.INC.1/>
      </makedeps>

      <OnDependency>
        <sourcefiles>
          <file Listfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
        </sourcefiles>
        <targetfiles>
          <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}" 
                dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
              <EXTRA.INC.1/>
              <argument value="${PP_FLAGS}"/>
              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>

          <replaceregexp file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"
                         match="^(#line +1 +.*@{FILEPATH}/@{FILENAME}\.@{FILEEXT}&quot;).+\1"
                         replace=";"
                         flags="gs"/>
          <replaceregexp file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"
                         match="^(#line .*)$"
                         replace="; \1"
                         byline="true"/>
          <replaceregexp file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"
                         match="([^_a-zA-Z])0x([0-9a-fA-F]+)"
                         replace="\10\2h"
                         flags="g"
                         byline="true"/>

          <cc userdefine="on">
            <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}"
                libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
              <EXTRA.INC.1/>
      
              <argument value="${ASM_FLAGS}"/>
              <EXTRA.ARG.1/>
      
              <fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>
      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
      <if>
        <equals arg1="@{FILEPATH}" arg2="." />
        <then>
          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
        </then>
        <else>
          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
        </else>
      </if>
    </sequential>
  </macrodef>

  <!--
    Build GCC assembly code
    -->
  <macrodef name="Build_Gcc_Assembly">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="asm"/>

    <element name="EXTRA.INC.1" optional="yes"/>
    <element name="EXTRA.ARG.1" optional="yes"/>

    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="@{FILEPATH}" />
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>

      <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"
                TargetFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
        <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        <EXTRA.INC.1/>
      </makedeps>

      <OnDependency>
        <sourcefiles>
          <file Listfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
        </sourcefiles>
        <targetfiles>
          <file Name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" dpath="${ASM_DPATH}"
                libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
              <EXTRA.INC.1/>
      
              <argument value="${ASM_FLAGS}"/>
              <EXTRA.ARG.1/>
      
              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>
      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
      <if>
        <equals arg1="@{FILEPATH}" arg2="." />
        <then>
          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
        </then>
        <else>
          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
        </else>
      </if>
    </sequential>
  </macrodef>

  <!--
    IPF Assembly
    -->
  <macrodef name="Build_IPF_Assembly_Code">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="s"/>

    <element name="EXTRA.INC.1" optional="yes"/>
    <element name="EXTRA.ARG.1" optional="yes"/>

    <sequential>
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>

      <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"
                TargetFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
        <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        <EXTRA.INC.1/>
      </makedeps>

      <OnDependency>
        <sourcefiles>
          <file listfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="PP" cmd="${APP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${APP_FAMILY}" 
                dpath="${APP_DPATH}" libpath="${APP_LIBPATH}" include="${APP_INCLUDEPATH}">
              <EXTRA.INC.1/>
              <argument value="${APP_FLAGS}"/>
              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>
      
          <cc userdefine="on">
            <command type="ASM" cmd="${ASM}" workdir="${DEST_DIR_OUTPUT}" family="${ASM_FAMILY}"
                includepathDelimiter="-I" outputDelimiter="-o" dpath="${ASM_DPATH}"
                libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}"
                outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
              <EXTRA.INC.1/>
              <argument value="${ASM_FLAGS}"/>
              <EXTRA.ARG.1/>
              <fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>
      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
      <if>
        <equals arg1="@{FILEPATH}" arg2="." />
        <then>
          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
        </then>
        <else>
          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
        </else>
      </if>
    </sequential>
  </macrodef>


  <!-- 
    Assembly the preprocessed IPF assembly code
  -->
  <macrodef name="Build_IPF_PP_Code">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="i"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
  
      <cc userdefine="on">
        <command type="ASM" includepathDelimiter="-I" dpath="${ASM_DPATH}"
             libpath="${ASM_LIBPATH}" include="${ASM_INCLUDEPATH}">
          <includepath path="${WORKSPACE_DIR}"/>
          <includepath path="${MODULE_DIR}"/>
          <includepath path="${MODULE_DIR}/${ARCH}"/>
          <EXTRA.INC/>
  
          <argument value="${ASM_FLAGS}"/>
          <EXTRA.ARG/>
          <OutputFile File="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
  
          <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </command>
      </cc>
    </sequential>
  </macrodef>
  
  
  <!--
    Library
  -->
  <macrodef name="Build_Library">
    <attribute name="FILENAME" />
    <attribute name="FILEEXT" default="obj"/>
    
    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="." />
      <mkdir dir="${BIN_DIR}"/>

      <if>
        <equals arg1="${OBJECTS}" arg2="" trim="true"/>
        <then>
          <fail message="No object files"/>
        </then>
      </if>

      <OnDependency>
        <sourcefiles>
          <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}" />
        </sourcefiles>
        <targetfiles>
          <file name="${BIN_DIR}/@{FILENAME}.lib"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}"
                outputFile="${BIN_DIR}/@{FILENAME}.lib" dpath="${SLINK_DPATH}"
                libpath="${SLINK_LIBPATH}" include="${SLINK_INCLUDEPATH}">
              <argument value="${SLINK_FLAGS}"/>

              <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>

  <!--
    Unicode -> .sdb
    -->
  <macrodef name="Build_UNI">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="uni"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <mkdir dir="${DEST_DIR_OUTPUT}/@{FILEPATH}"/>
      <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"
                TargetFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb">
        <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        <EXTRA.INC/>
      </makedeps>

      <OnDependency>
        <sourcefiles>
          <file listfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
        </targetfiles>

        <sequential>
          <strgather commandtype="parse" newdatabase="true">
            <database name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
            <EXTRA.INC/>
            <EXTRA.ARG/>
            <inputfile name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
          </strgather>
        </sequential>
      </OnDependency>

      <var name="SDB_FILES" value="${SDB_FILES}, ${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
    </sequential>
  </macrodef>

  <!--
    .sdb(s) -> .c, .h -> .obj
    -->
  <macrodef name="Build_Unicode_Database">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="sdb"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="@{FILEPATH}" />
      <OnDependency>
        <sourcefiles>
          <file list="${SDB_FILES}"/>
          <file list="${SOURCE_FILES}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
        </targetfiles>
        
        <sequential>
          <strgather commandtype="scan" outputdatabase="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb" verbose="read">
            <skipext name=".uni"/>
            <skipext name=".h"/>
            <database list="${SDB_FILES}"/>
            <inputfile name="${SOURCE_FILES}"/>
          </strgather>
        </sequential>
      </OnDependency>

      <OnDependency>
        <sourcefiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}StrDefs.h"/>
          <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.hpk"/>
          <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
        </targetfiles>
        
        <sequential>
          <strgather basename="@{FILENAME}Strings" commandtype="dump"
                     outputdefines="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}StrDefs.h"
                     outputhpk="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.hpk"
                     outputstring="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c">
            <database name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.sdb"/>
          </strgather>
        </sequential>
      </OnDependency>

      <OnDependency>
        <sourcefiles>
          <file name="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Strings.obj"/>
        </targetfiles>
        
        <sequential>
          <cc userdefine="on">
            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
                     includepathDelimiter="-I" dpath="${CC_DPATH}"
                     libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}"
                     outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}Strings.obj">
              <argument value="${CC_FLAGS}"/>
              <EXTRA.INC />
              <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}Strings.c"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>

      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
      <if>
        <equals arg1="@{FILEPATH}" arg2="." />
        <then>
          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}Strings.obj" />
        </then>
        <else>
          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}Strings.obj" />
        </else>
      </if>
    </sequential>
  </macrodef>

  <!--
    Vfr
    -->
  <macrodef name="Build_VFR">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="vfr"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <mkdir dir="${DEST_DIR_DEBUG}/@{FILEPATH}"/>

      <makedeps DepsFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"
                TargetFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj">
        <input file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        <EXTRA.INC/>
      </makedeps>

      <OnDependency>
        <sourcefiles>
          <file listfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}.dep"/>
          <file ListFile="${DEST_DIR_OUTPUT}/AutoGen.h.dep"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj"/>
        </targetfiles>

        <sequential>
          <!-- if "TOOLCHIAN FAMILY" is "GCC", it should point the ouput file for preprocess compiler -->         
          <if>
            <equals arg1="${CC_FAMILY}" arg2="GCC"/>
            <then>
              <cc userdefine="on">
                <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}" 
                         dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
                  <argument value="${VFRPP_FLAGS} -o ${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i"/>
                  <!-- Output file of the preprocess -->   
                  <EXTRA.INC/>            
                  <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>              
                </command>
              </cc>
            </then>
            <else>
              <cc userdefine="on">
                <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}/@{FILEPATH}" family="${PP_FAMILY}" 
                         dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
                  <argument value="${VFRPP_FLAGS}"/>
                  <!-- Output file of the preprocess -->   
                  <EXTRA.INC/>            
                  <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>              
                </command>
              </cc>
            </else>
          </if>
          
          <vfrcompile createIfrBinFile="on" createListFile="on" outPutDir="${DEST_DIR_DEBUG}/@{FILEPATH}" vfrFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.i">
            <EXTRA.INC/>
          </vfrcompile>
    
          <cc userdefine="on">
            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" 
                     includepathDelimiter="-I" family="${CC_FAMILY}" dpath="${CC_DPATH}"
                     libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}"
                     outputFile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.obj" >
              <argument value="${CC_FLAGS}"/>
              <EXTRA.INC/>
              <EXTRA.ARG/>
              <fileset casesensitive="on" file="${DEST_DIR_DEBUG}/@{FILEPATH}/@{FILENAME}.c"/>
            </command>
          </cc>
        </sequential>
      </OnDependency>
      <!-- Since fileset can't scan file start with ./, remove ./ in previous. -->
      <if>
        <equals arg1="@{FILEPATH}" arg2="." />
        <then>
          <var name="OBJECTS" value="${OBJECTS} @{FILENAME}.obj" />
        </then>
        <else>
          <var name="OBJECTS" value="${OBJECTS} @{FILEPATH}/@{FILENAME}.obj" />
        </else>
      </if>
    </sequential>
  </macrodef>

  <!--
      Build the real mode ASM file
    -->
  <macrodef name="Build_RealAsm">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="asm"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
    
    <sequential>
      <OnDependency>
        <sourcefiles>
          <file name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.cat"/>
        </targetfiles>
  
        <sequential>
          <exec dir="${DEST_DIR_OUTPUT}" executable="${ASM}" failonerror="true">
            <arg line="/nologo /omf ${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT} /Bl${ASMLINK} ${ASMLINK_FLAGS}"/>
          </exec>
          <concat destfile="${DEST_DIR_OUTPUT}/@{FILENAME}.cat" binary="yes">
            <filelist dir="${MODULE_DIR}" files="Blank2.pad"/>
            <filelist dir="${DEST_DIR_OUTPUT}" files="@{FILENAME}.com"/>
          </concat>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>

  <!--
      Build Asl table file
    -->
  <macrodef name="Build_ASL">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="asl"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
    
    <sequential>
      <mkdir dir="${DEST_DIR_OUTPUT}"/>

      <OnDependency>
        <sourcefiles>
          <file name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"/>
        </targetfiles>

        <sequential>
          <cc userdefine="on">
            <command type="PP" cmd="${PP}" workdir="${DEST_DIR_OUTPUT}" family="${PP_FAMILY}" 
                dpath="${PP_DPATH}" libpath="${PP_LIBPATH}" include="${PP_INCLUDEPATH}">
              <argument value="${APP_FLAGS}"/>
              <EXTRA.INC/>              
              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>

          <exec dir="${DEST_DIR_OUTPUT}" executable="${ASL}" failonerror="true" outputproperty="ASL_OUTPUT">
            <arg line="${DEST_DIR_OUTPUT}/@{FILENAME}.i"/>
          </exec>

          <if>
            <or>
              <contains string="${ASL_OUTPUT}" substring="Supports ACPI Specification Revision 2.0"/>
              <contains string="${ASL_OUTPUT}" substring="Supports ACPI Specification Revision 1.0"/>
            </or>
            <then>
              <fail message="Current Asl tool not support Acpi Spec 3.0. Pls update your Asl compiler."/>
            </then>
          </if>

          <EFI_SECTION_RAW FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="aml"/>
          
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>  

  <!--
      Build Asl table c file
    -->
  <macrodef name="Build_CCASL">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="c"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
    
    <sequential>
      <mkdir dir="${DEST_DIR_OUTPUT}"/>

      <OnDependency>
        <sourcefiles>
          <file name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"/>
        </targetfiles>

        <sequential>

          <cc userdefine="on">
            <command type="CC" cmd="${CC}" workdir="${DEST_DIR_OUTPUT}" family="${CC_FAMILY}"
                outputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.obj" dpath="${CC_DPATH}" 
                libpath="${CC_LIBPATH}" include="${CC_INCLUDEPATH}">
              <EXTRA.INC/>
              <argument value="${CC_FLAGS}"/>
              <EXTRA.ARG/>
              <fileset casesensitive="on" file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
            </command>
          </cc>

          <cc userdefine="on">
            <command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}" 
                     outputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.exe" dpath="${DLINK_DPATH}" >
              <argument value="${SLINK_FLAGS}"/>
              <fileset casesensitive="on" file="${DEST_DIR_OUTPUT}/@{FILENAME}.obj"/>
            </command>
          </cc>
          
          <genacpitable inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.exe" outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.acpi" />     
     
          <EFI_SECTION_RAW FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="acpi"/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef> 
 <!--
      Build ACPI Bin File
    -->
  <macrodef name="Build_ACPIBIN">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="bin"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>
    
    <sequential>
      <mkdir dir="${DEST_DIR_OUTPUT}"/>

      <OnDependency>
        <sourcefiles>
          <file name="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"/>
        </targetfiles>

        <sequential>
          <copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" tofile="${DEST_DIR_OUTPUT}/@{FILENAME}.acpi" />
  
          <exec executable="attrib">
            <arg line="-r ${DEST_DIR_OUTPUT}/@{FILENAME}.acpi"/>
          </exec>

          <EFI_SECTION_RAW FILEPATH="." FILENAME="@{FILENAME}" FILEEXT="acpi"/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef> 
  
  <!--
    DUMMY - for skipping the source file which should not be built
    -->
  <macrodef name="Build_DUMMY">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <!--echo message="Ignoring ${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" level="info" /-->
    </sequential>
  </macrodef>

  <!--
    Generate efi file
    -->
  <macrodef name="GenEfi">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="efi"/>

    <element name="LIB.ARG" optional="yes"/>
    <element name="LINK.ARG" optional="yes"/>

    <sequential>
      <var name="FILE_BASENAME" value="@{FILENAME}" />
      <var name="FILE_PATH" value="@{FILEPATH}" />
      <OnDependency>
        <sourcefiles>
          <file list="${LIBS}"/>
          <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}" />
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_DEBUG}/@{FILENAME}.efi"/>
        </targetfiles>

        <sequential>
          <!-- Generate a temporary lib file for object files -->
          <cc userdefine="on">
            <command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}" dpath="${SLINK_DPATH}"
                outputFile="${DEST_DIR_OUTPUT}/@{FILENAME}Local.lib"
                libpath="${SLINKLIBPATH}" include="${SLINK_INCLUDEPATH}">
              <argument value="${SLINK_FLAGS}"/>

              <fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}"/>
            </command>
          </cc>

          <!-- Link the temporary lib file with dependent libraries -->
          <cc userdefine="on">
            <command type="DLINK" cmd="${DLINK}" family="${DLINK_FAMILY}"
                     outputFile="${DEST_DIR_DEBUG}/@{FILENAME}.dll" dpath="${DLINK_DPATH}" 
                     libpath="${DLINK_LIBPATH}" include="${DLINK_INCLUDEPATH}">
              <argument value="${DLINK_FLAGS}"/>
              <libset libs="${DEST_DIR_OUTPUT}/@{FILENAME}Local.lib ${LIBS} ${DLINK_SPATH}"/>
              <LINK.ARG/>
            </command>
          </cc>

          <!-- Convert the dll file to efi file -->
          <fwimage componentType="${MODULE_TYPE}" outImage="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" 
                   peImage="${DEST_DIR_DEBUG}/@{FILENAME}.dll" time="0"/>

          <!-- Copy the efi file to BIN and OUTPUT directory -->
          <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${BIN_DIR}/@{FILENAME}.efi" />
          <copy file="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" tofile="${DEST_DIR_DEBUG}/@{FILENAME}.efi" />          
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>

  <!--
    Binary
    -->
  <macrodef name="Build_Binary">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="bin"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
            tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
    </sequential>
  </macrodef>
  
  <!--
    Microcode
   -->
  <macrodef name="Build_MICROCODE">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="TXT"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <mkdir dir="${TARGET_DIR}/Microcode"/>
      <flashmap MCIFile="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" MCOFILE="${TARGET_DIR}/Microcode/@{FILENAME}.bin"/>
    </sequential>
  </macrodef> 

  <!--
    Graphics (bmp, ...)
    -->
  <macrodef name="Build_BMP">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/> 
    <attribute name="FILEEXT" default="bmp"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
            tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.bin"/>
    </sequential>
  </macrodef> 

  <!--
    build EFI file
  -->
  <macrodef name="Build_EFI">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="efi"/>

    <element name="EXTRA.INC" optional="yes"/>
    <element name="EXTRA.ARG" optional="yes"/>

    <sequential>
      <mkdir dir="${MODULE_DIR}/@{FILEPATH}" /> 
      <copy file="${MODULE_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
        tofile="${DEST_DIR_OUTPUT}/${BASE_NAME}.efi"/>
    </sequential>
  </macrodef>
  
  <!-- 
    Build macro for Apriori
  -->
  <macrodef name="Build_Apriori">
    <attribute name="FILEPATH" default="."/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="apr"/>
    <attribute name="GUID"/>

    <sequential>
      <mkdir dir="${FV_DIR}/Apriori" />
      <gensection inputfile="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
                  outputfile="${FV_DIR}/Apriori/@{FILENAME}.sec" 
                  sectiontype="EFI_SECTION_RAW"/>

      <genffsfile BaseName="@{FILENAME}" ffsATTRIBCHECKSUM="TRUE" ffsFILETYPE="EFI_FV_FILETYPE_FREEFORM" 
                  fileGuid="@{GUID}" moduleType="BASE" outputDir="${FV_DIR}">
        <sectFile fileName="${FV_DIR}/Apriori/@{FILENAME}.sec"/>
      </genffsfile>
      
    </sequential>
  </macrodef>

<!--############################################################################
  Build Sections
#############################################################################-->
  <!--
    EFI_SECTION_TE
    -->

  <macrodef name="EFI_SECTION_TE">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="efi" />

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <OnDependency>
        <sourcefiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.tes"/>
        </targetfiles>

        <sequential>
          <PRE.PROCESS/>

          <genteimage Dump="false" Verbose="false" OutputDir="" OutputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" InputFile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
          <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" 
                      outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.tes" 
                      sectiontype="EFI_SECTION_TE"/>

          <POST.PROCESS/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>

  <!--
    EFI_SECTION_PE32
    -->
  <macrodef name="EFI_SECTION_PE32">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="efi"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <OnDependency>
        <sourcefiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.efi"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.pe32"/>
        </targetfiles>

        <sequential>
          <PRE.PROCESS/>

          <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.efi" 
                      outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.pe32" 
                      sectiontype="EFI_SECTION_PE32"/>
    
          <POST.PROCESS/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>

  <!--
    EFI_SECTION_VERSION
    -->
  <macrodef name="EFI_SECTION_VERSION">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="" />
    <attribute name="VERSION" default="0000"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <if>
        <not>
          <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ver"/>
        </not>

        <then>
          <PRE.PROCESS/>
          <gensection outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ver" 
                      versionnum="@{VERSION}"
                      sectiontype="EFI_SECTION_VERSION"/>
          <POST.PROCESS/>
        </then>
      </if>
    </sequential>
  </macrodef>

  <!--
    EFI_SECTION_USER_INTERFACE
    -->
  <macrodef name="EFI_SECTION_USER_INTERFACE">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="" />
    <attribute name="UI" default="${BASE_NAME}"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <if>
        <not>
          <available type="file" file="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ui"/>
        </not>

        <then>
          <PRE.PROCESS/>
          <gensection interfacestring="@{UI}"
                      outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.ui" 
                      sectiontype="EFI_SECTION_USER_INTERFACE"/>
          <POST.PROCESS/>
        </then>
      </if>
    </sequential>
  </macrodef>

  <!--
    EFI_SECTION_DXE_DEPEX
    -->
  <macrodef name="EFI_SECTION_DXE_DEPEX">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="dxs"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <PRE.PROCESS/>

      <if>
        <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
        <then>
          <OnDependency>
            <sourcefiles>
              <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
            </sourcefiles>
            <targetfiles>
              <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
            </targetfiles>
            <sequential>
              <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex" 
                          outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx" 
                          sectiontype="EFI_SECTION_DXE_DEPEX"/>
            </sequential>
          </OnDependency>
        </then>
        <else>
          <if>
            <not>
              <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
            </not>
            <then>
              <touch file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
            </then>
          </if>
        </else>
      </if>

      <POST.PROCESS/>
    </sequential>
  </macrodef>

  <!--
    EFI_SECTION_PEI_DEPEX
    -->
  <macrodef name="EFI_SECTION_PEI_DEPEX">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="dxs"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>
    <sequential>
      <PRE.PROCESS/>
      <if>
        <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
        <then>
          <OnDependency>
            <sourcefiles>
              <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.depex"/>
            </sourcefiles>
            <targetfiles>
              <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
            </targetfiles>

            <sequential>
              <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.depex" 
                          outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx" 
                          sectiontype="EFI_SECTION_PEI_DEPEX"/>
            </sequential>
          </OnDependency>
          
        </then>
        <else>
          <if>
            <not>
              <available type="file" file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
            </not>
            <then>
              <touch file="${DEST_DIR_OUTPUT}/@{FILENAME}.dpx"/>
            </then>
          </if>
        </else>
      </if>
      <POST.PROCESS/>
    </sequential>
  </macrodef>


  <!--
    EFI_SECTION_RAW
    -->
  <macrodef name="EFI_SECTION_RAW">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="bin"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <OnDependency>
        <sourcefiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"/>
        </targetfiles>

        <sequential>
          <PRE.PROCESS/>
          <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
                      outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.sec" 
                      sectiontype="EFI_SECTION_RAW"/>
          <POST.PROCESS/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>

  <!--
    EFI_SECTION_RAW_SEC
    -->
  <macrodef name="EFI_SECTION_RAW_SEC">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="cat"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <OnDependency>
        <sourcefiles>
          <file name="${DEST_DIR_OUTPUT}/ResetVec.@{FILEEXT}"/>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.te"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILENAME}.sec"/>
        </targetfiles>

        <sequential>
          <PRE.PROCESS/>
          <secfixup secexefile="${DEST_DIR_OUTPUT}/@{FILENAME}.te" resetvectorDatafile="${DEST_DIR_OUTPUT}/ResetVec.@{FILEEXT}"
                   outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.bin"/>
                   
          <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.bin" 
                      outputfile="${DEST_DIR_OUTPUT}/@{FILENAME}.sec" 
                      sectiontype="EFI_SECTION_RAW"/>
          <POST.PROCESS/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>
  
  <!--
    EFI_SECTION_FIRMWARE_VOLUME_IMAGE
    -->
  <macrodef name="EFI_SECTION_FIRMWARE_VOLUME_IMAGE">
    <attribute name="FILEPATH"/>
    <attribute name="FILENAME"/>
    <attribute name="FILEEXT" default="fv"/>

    <element name="PRE.PROCESS" optional="yes"/>
    <element name="POST.PROCESS" optional="yes"/>

    <sequential>
      <OnDependency>
        <sourcefiles>
          <file name="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}"/>
        </sourcefiles>
        <targetfiles>
          <file name="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}fv.sec"/>
        </targetfiles>

        <sequential>
          <PRE.PROCESS/>
    
          <copy file="${FV_DIR}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
                tofile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
                overwrite="true"/>
          <gensection inputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}.@{FILEEXT}" 
                      outputfile="${DEST_DIR_OUTPUT}/@{FILEPATH}/@{FILENAME}fv.sec" 
                      sectiontype="EFI_SECTION_FIRMWARE_VOLUME_IMAGE"/>
    
          <POST.PROCESS/>
        </sequential>
      </OnDependency>
    </sequential>
  </macrodef>

</project>
