mirror of https://github.com/acidanthera/audk.git
1715 lines
56 KiB
Plaintext
1715 lines
56 KiB
Plaintext
#/*++
|
|
#
|
|
# Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
|
|
# 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.
|
|
#
|
|
# Module Name:
|
|
#
|
|
# Common.dsc
|
|
#
|
|
# Abstract:
|
|
#
|
|
# This is the build description file containing the platform
|
|
# independent build instructions. Platform specific instructions will
|
|
# be prepended to produce the final build DSC file.
|
|
#
|
|
#
|
|
# Notes:
|
|
#
|
|
# The info in this file is broken down into sections. The start of a section
|
|
# is designated by a "[" in the first column. So the [=====] separater ends
|
|
# a section.
|
|
#
|
|
#--*/
|
|
|
|
[=============================================================================]
|
|
#
|
|
# These get emitted at the top of the generated master makefile.
|
|
#
|
|
[=============================================================================]
|
|
[Makefile.out]
|
|
#
|
|
# From the [makefile.out] section of the DSC file
|
|
#
|
|
TOOLCHAIN =
|
|
MAKE = nmake -nologo
|
|
|
|
!INCLUDE $(BUILD_DIR)\PlatformTools.env
|
|
|
|
all : libraries fvs
|
|
|
|
[=============================================================================]
|
|
#
|
|
# These get expanded and dumped out to each component makefile after the
|
|
# component INF [defines] section gets parsed.
|
|
#
|
|
[=============================================================================]
|
|
[Makefile.Common]
|
|
#
|
|
# From the [Makefile.Common] section of the description file.
|
|
#
|
|
PROCESSOR = $(PROCESSOR)
|
|
BASE_NAME = $(BASE_NAME)
|
|
BUILD_NUMBER = $(BUILD_NUMBER)
|
|
VERSION_STRING = $(VERSION_STRING)
|
|
TOOLCHAIN = TOOLCHAIN_$(PROCESSOR)
|
|
FILE_GUID = $(FILE_GUID)
|
|
COMPONENT_TYPE = $(COMPONENT_TYPE)
|
|
FV_DIR = $(BUILD_DIR)\FV
|
|
PLATFORM = $(PROJECT_NAME)
|
|
|
|
#
|
|
# Define the global dependency files
|
|
#
|
|
!IF EXIST ($(DEST_DIR)\$(BASE_NAME)StrDefs.h)
|
|
INC_DEPS = $(INC_DEPS) $(DEST_DIR)\$(BASE_NAME)StrDefs.h
|
|
!ENDIF
|
|
#ENV_DEPS = $(ENV_DEPS) $(EDK_SOURCE)\Sample\CommonTools.env
|
|
#ENV_DEPS = $(ENV_DEPS) $(BUILD_DIR)\PlatformTools.env
|
|
#ENV_DEPS = $(ENV_DEPS) $(BUILD_DIR)\Config.env
|
|
ALL_DEPS = $(INC_DEPS) $(ENV_DEPS)
|
|
|
|
!IF "$(LANGUAGE)" != ""
|
|
LANGUAGE_FLAGS = -lang $(LANGUAGE)
|
|
!ENDIF
|
|
|
|
!INCLUDE $(BUILD_DIR)\PlatformTools.env
|
|
|
|
!IF "$(COMPONENT_TYPE)" == "PIC_PEIM" || "$(COMPONENT_TYPE)" == "PE32_PEIM" || "$(COMPONENT_TYPE)" == "RELOCATABLE_PEIM" || "$(COMPONENT_TYPE)" == "COMBINED_PEIM_DRIVER"
|
|
DEPEX_TYPE = EFI_SECTION_PEI_DEPEX
|
|
!ELSE
|
|
DEPEX_TYPE = EFI_SECTION_DXE_DEPEX
|
|
!ENDIF
|
|
|
|
!IF "$(COMPONENT_TYPE)" != "LIBRARY" && EXIST($(BUILD_DIR)\$(PROCESSOR)\CompilerStub.lib)
|
|
LIBS = $(LIBS) $(BUILD_DIR)\$(PROCESSOR)\CompilerStub.lib
|
|
!ENDIF
|
|
|
|
#
|
|
# Command flags for MAKEDEPS tool
|
|
#
|
|
DEP_FLAGS = -target $** -o $(DEP_FILE) $(INC) -ignorenotfound -q
|
|
DEP_FLAGS2 = -target $@ -o $(DEP_FILE) -cl
|
|
|
|
[=============================================================================]
|
|
#
|
|
# These are the commands to compile source files. One of these blocks gets
|
|
# emitted to the component's makefile for each source file. The section
|
|
# name is encoded as [Compile.$(PROCESSOR).source_filename_extension], where
|
|
# the source filename comes from the sources section of the component INF file.
|
|
#
|
|
# If the dependency list file already exists, then include it for this
|
|
# source file. If it doesn't exist, then this is a clean build and the
|
|
# dependency file will get created below and the source file will get
|
|
# compiled.
|
|
#
|
|
# Current behavior is that the first clean build will not create dep files.
|
|
# But the following second build has to create dep files before build source files.
|
|
# CREATEDEPS flag is used to judge whether current build is the second build or not.
|
|
#
|
|
#
|
|
[=============================================================================]
|
|
[Compile.Ia32.asm,Compile.x64.asm]
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(FILE)Asm.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF EXIST($(DEST_DIR)\$(FILE).obj)
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(FILE)Asm.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(DEST_DIR)\$(FILE).obj
|
|
$(MAKEDEPS) -f $(SOURCE_FILE_NAME) $(DEP_FLAGS) -asm
|
|
|
|
#
|
|
# Compile the file
|
|
#
|
|
$(DEST_DIR)\$(FILE).obj : $(SOURCE_FILE_NAME) $(INF_FILENAME) $(ALL_DEPS)
|
|
$(ASM) $(ASM_FLAGS) $(SOURCE_FILE_NAME)
|
|
|
|
[=============================================================================]
|
|
[Compile.Ia32.c,Compile.x64.c]
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(FILE).dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
|
|
!IF EXIST($(DEST_DIR)\$(FILE).obj)
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(FILE).dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(DEST_DIR)\$(FILE).obj
|
|
$(MAKEDEPS) -f $(SOURCE_FILE_NAME) $(DEP_FLAGS)
|
|
|
|
!ENDIF
|
|
|
|
#
|
|
# Compile the file
|
|
#
|
|
$(DEST_DIR)\$(FILE).obj : $(SOURCE_FILE_NAME) $(INF_FILENAME) $(ALL_DEPS)
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
$(CC) $(C_FLAGS) $(SOURCE_FILE_NAME)
|
|
!ELSE
|
|
-$(CC) $(C_FLAGS) $(SOURCE_FILE_NAME) /showIncludes > $(DEST_DIR)\$(FILE).cl
|
|
@$(MAKEDEPS) -f $(DEST_DIR)\$(FILE).cl $(DEP_FLAGS2)
|
|
!ENDIF
|
|
|
|
[=============================================================================]
|
|
[Compile.Ebc.c]
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(FILE).dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF EXIST($(DEST_DIR)\$(FILE).obj)
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(FILE).dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(DEST_DIR)\$(FILE).obj
|
|
$(MAKEDEPS) -f $(SOURCE_FILE_NAME) $(DEP_FLAGS)
|
|
|
|
#
|
|
# Compile the file
|
|
#
|
|
$(DEST_DIR)\$(FILE).obj : $(SOURCE_FILE_NAME) $(INF_FILENAME) $(ALL_DEPS)
|
|
$(EBC_CC) $(EBC_C_FLAGS) $(SOURCE_FILE_NAME)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# Commands for compiling a ".apr" Apriori source file.
|
|
#
|
|
[=============================================================================]
|
|
[Compile.Ia32.Apr,Compile.Ebc.Apr,Compile.x64.Apr]
|
|
#
|
|
# Create the raw binary file. If you get an error on the build saying it doesn't
|
|
# know how to create the .apr file, then you're missing (or mispelled) the
|
|
# "APRIORI=" on the component lines in components section in the DSC file.
|
|
#
|
|
$(DEST_DIR)\$(BASE_NAME).bin : $(SOURCE_FILE_NAME) $(INF_FILENAME)
|
|
$(GENAPRIORI) -v -f $(SOURCE_FILE_NAME) -o $(DEST_DIR)\$(BASE_NAME).bin
|
|
|
|
$(DEST_DIR)\$(BASE_NAME).sec : $(DEST_DIR)\$(BASE_NAME).bin
|
|
$(GENSECTION) -I $(DEST_DIR)\$(BASE_NAME).bin -O $(DEST_DIR)\$(BASE_NAME).sec -S EFI_SECTION_RAW
|
|
|
|
[=============================================================================]
|
|
[Build.Ia32.Apriori,Build.Ebc.Apriori,Build.x64.Apriori]
|
|
|
|
all : $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).FFS
|
|
|
|
#
|
|
# Run GenFfsFile on the package file and .raw file to create the firmware file
|
|
#
|
|
$(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).FFS : $(DEST_DIR)\$(BASE_NAME).sec $(PACKAGE_FILENAME)
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
[Build.Ia32.Makefile,Build.Ebc.Makefile,Build.x64.Makefile]
|
|
|
|
#
|
|
# Set some required macros
|
|
#
|
|
MAKEFILE_MACROS = SOURCE_DIR=$(SOURCE_DIR) \
|
|
BUILD_DIR=$(BUILD_DIR) \
|
|
FILE_GUID=$(FILE_GUID) \
|
|
DEST_DIR=$(DEST_DIR) \
|
|
PROCESSOR=$(PROCESSOR) \
|
|
TOOLCHAIN=TOOLCHAIN_$(PROCESSOR) \
|
|
BASE_NAME=$(BASE_NAME) \
|
|
PACKAGE_FILENAME=$(PACKAGE_FILENAME)
|
|
|
|
#
|
|
# Just call the makefile from the source directory, passing in some
|
|
# useful info.
|
|
#
|
|
all :
|
|
$(MAKE) -f $(SOURCE_DIR)\makefile.new all $(MAKEFILE_MACROS)
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
@- $(MAKE) -f $(SOURCE_DIR)\makefile.new clean $(MAKEFILE_MACROS) > NUL 2>&1
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# Instructions for building a component that uses a custom makefile. Encoding
|
|
# is [build.$(PROCESSOR).$(BUILD_TYPE)].
|
|
#
|
|
# To build these components, simply call the makefile from the source
|
|
# directory.
|
|
#
|
|
[=============================================================================]
|
|
[Build.Ia32.Custom_Makefile,Build.Ebc.Custom_Makefile,Build.x64.Custom_Makefile]
|
|
|
|
#
|
|
# Set some required macros
|
|
#
|
|
MAKEFILE_MACROS = SOURCE_DIR=$(SOURCE_DIR) \
|
|
BUILD_DIR=$(BUILD_DIR) \
|
|
DEST_DIR=$(DEST_DIR) \
|
|
FILE_GUID=$(FILE_GUID) \
|
|
PROCESSOR=$(PROCESSOR) \
|
|
TOOLCHAIN=TOOLCHAIN_$(PROCESSOR) \
|
|
BASE_NAME=$(BASE_NAME) \
|
|
PLATFORM=$(PLATFORM) \
|
|
SOURCE_FV=$(SOURCE_FV) \
|
|
PACKAGE_FILENAME=$(PACKAGE_FILENAME)
|
|
|
|
#
|
|
# Just call the makefile from the source directory, passing in some
|
|
# useful info.
|
|
#
|
|
all :
|
|
$(MAKE) -f $(SOURCE_DIR)\makefile all $(MAKEFILE_MACROS)
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
@- $(MAKE) -f $(SOURCE_DIR)\makefile clean $(MAKEFILE_MACROS) > NUL 2>&1
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# These commands are used to build libraries
|
|
#
|
|
[=============================================================================]
|
|
[Build.Ia32.LIBRARY,Build.x64.LIBRARY]
|
|
#
|
|
# LIB all the object files into to our target lib file. Put
|
|
# a dependency on the component's INF file in case it changes.
|
|
#
|
|
LIB_NAME = $(LIB_DIR)\$(BASE_NAME).lib
|
|
|
|
#
|
|
# $(DEP_TARGETS) are not needed for binary build.
|
|
#
|
|
!IF ("$(BINARY)" == "TRUE") || (("$(BINARY)" == "") && ("$(EFI_BINARY_LIBRARY)" == "YES"))
|
|
DEP_TARGETS=
|
|
CREATEDEPS=
|
|
!ENDIF
|
|
|
|
#
|
|
# Module can be built from source code or binary files.
|
|
#
|
|
!IF ((("$(BINARY)" == "TRUE") || (("$(BINARY)" == "") && ("$(EFI_BINARY_LIBRARY)" == "YES"))) \
|
|
&& EXIST($(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).lib))
|
|
$(LIB_NAME) : $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).lib
|
|
copy $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).lib $(LIB_NAME) /Y
|
|
if exist $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME)Obj.pdb \
|
|
copy $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME)Obj.pdb $(DEST_DIR)\$(BASE_NAME)Obj.pdb /Y
|
|
!ELSE
|
|
$(LIB_NAME) : $(OBJECTS) $(LIBS) $(INF_FILENAME) $(ENV_DEPS)
|
|
$(LIB) $(LIB_FLAGS) $(OBJECTS) $(LIBS) /OUT:$@
|
|
!IF ("$(EFI_BINARY_BUILD)" == "YES")
|
|
if not exist $(EFI_PLATFORM_BIN)\$(PROCESSOR) mkdir $(EFI_PLATFORM_BIN)\$(PROCESSOR)
|
|
if exist $(LIB_NAME) copy $(LIB_NAME) $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).lib /Y
|
|
if exist $(DEST_DIR)\$(BASE_NAME)Obj.pdb copy $(DEST_DIR)\$(BASE_NAME)Obj.pdb $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME)Obj.pdb /Y
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
!IF "$(CREATEDEPS)"=="YES"
|
|
all : $(DEP_TARGETS)
|
|
$(MAKE) -f $(MAKEFILE_NAME) all
|
|
!ELSE
|
|
all : $(LIB_NAME) $(DEP_TARGETS)
|
|
!ENDIF
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
[Build.Ebc.LIBRARY]
|
|
#
|
|
# LIB all the object files into to our target lib file. Put
|
|
# a dependency on the component's INF file in case it changes.
|
|
#
|
|
LIB_NAME = $(LIB_DIR)\$(BASE_NAME).lib
|
|
|
|
$(LIB_NAME) : $(OBJECTS) $(LIBS) $(INF_FILENAME) $(ENV_DEPS)
|
|
$(EBC_LIB) $(EBC_LIB_FLAGS) $(OBJECTS) $(LIBS) /OUT:$@
|
|
|
|
!IF "$(CREATEDEPS)"=="YES"
|
|
all : $(DEP_TARGETS)
|
|
$(MAKE) -f $(MAKEFILE_NAME) all
|
|
!ELSE
|
|
all : $(LIB_NAME) $(DEP_TARGETS)
|
|
!ENDIF
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# This is the Build.$(PROCESSOR).$(COMPONENT_TYPE) section that tells how to
|
|
# convert a firmware volume into an FV FFS file. Simply run it through
|
|
# GenFfsFile with the appropriate package file. SOURCE_FV must be defined
|
|
# in the component INF file Defines section.
|
|
#
|
|
[=============================================================================]
|
|
[Build.Ia32.FvImageFile,Build.x64.FvImageFile]
|
|
|
|
all : $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).Fvi
|
|
|
|
#
|
|
# Run GenFfsFile on the package file and FV file to create the firmware
|
|
# volume FFS file. This FFS file maybe contain one pad section for alignment requirement.
|
|
#
|
|
$(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).Fvi : $(DEST_DIR)\$(SOURCE_FV)Fv.sec $(PACKAGE_FILENAME) $(PAD_SECTION)
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# Since many of the steps are the same for the different component types, we
|
|
# share this section for BS_DRIVER, RT_DRIVER, .... and IFDEF the parts that
|
|
# differ. The entire section gets dumped to the output makefile.
|
|
#
|
|
[=============================================================================]
|
|
[Build.Ia32.BS_DRIVER|RT_DRIVER|SAL_RT_DRIVER|PE32_PEIM|PEI_CORE|PIC_PEIM|RELOCATABLE_PEIM|DXE_CORE|APPLICATION|COMBINED_PEIM_DRIVER, Build.x64.BS_DRIVER|RT_DRIVER|SAL_RT_DRIVER|PE32_PEIM|PEI_CORE|PIC_PEIM|RELOCATABLE_PEIM|DXE_CORE|APPLICATION|COMBINED_PEIM_DRIVER]
|
|
|
|
!IF "$(LOCALIZE)" == "YES"
|
|
|
|
!IF (("$(EFI_GENERATE_HII_RESOURCE)" == "YES") && ("$(EFI_SPECIFICATION_VERSION)" >= "0x0002000A"))
|
|
#
|
|
# This will generate HII resource section in PE/COFF image.
|
|
#
|
|
# Note: when HII package list is built into resource section, Driver no longer
|
|
# refer to C array generated by VfrCompiler ($(FILE_NAME)Bin) and StrGather
|
|
# ($(BASE_NAME)Strings); while in current build rule, those C array objects
|
|
# will still be linked with the Driver, so please turn on link flag "/OPT:REF"
|
|
# to minimize the code size.
|
|
#
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(BASE_NAME)Strings.hpk
|
|
LOCALIZE_TARGETS = $(LOCALIZE_TARGETS) $(DEST_DIR)\$(BASE_NAME).res
|
|
LINK_FLAGS_DLL = $(LINK_FLAGS_DLL) $(DEST_DIR)\$(BASE_NAME).res
|
|
|
|
$(DEST_DIR)\$(BASE_NAME).rc : $(HII_PACK_FILES)
|
|
$(HIIPACK) -g $(FILE_GUID) $(HII_PACK_FILES) -rc $(DEST_DIR)\$(BASE_NAME).rc -hii $(DEST_DIR)\$(BASE_NAME).hii
|
|
|
|
$(DEST_DIR)\$(BASE_NAME).res : $(DEST_DIR)\$(BASE_NAME).rc
|
|
$(RC) /fo $(DEST_DIR)\$(BASE_NAME).res $(DEST_DIR)\$(BASE_NAME).rc
|
|
|
|
!ENDIF
|
|
|
|
!IF (("$(EFI_GENERATE_HII_EXPORT)" == "YES") && ("$(EFI_SPECIFICATION_VERSION)" < "0x0002000A"))
|
|
#
|
|
# There will be one HII pack containing all the strings. Add that file
|
|
# to the list of HII pack files we'll use to create our final HII export file.
|
|
#
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(BASE_NAME)Strings.hpk
|
|
LOCALIZE_TARGETS = $(LOCALIZE_TARGETS) $(DEST_DIR)\$(BASE_NAME).hii
|
|
!ENDIF
|
|
|
|
!IF ("$(EFI_SPECIFICATION_VERSION)" >= "0x0002000A")
|
|
#
|
|
# Note: currently -ppflag option is only available for UefiStrGather
|
|
# Note: /GS- will cause warning for preprocess, so filter it out from STRGATHER_PPFLAG
|
|
#
|
|
STRGATHER_PPFLAG = $(C_FLAGS: /GS-=)
|
|
STRGATHER_FLAGS = $(STRGATHER_FLAGS) -ppflag "$(STRGATHER_PPFLAG)" -oh $(DEST_DIR)\$(BASE_NAME)StrDefs.h
|
|
!ENDIF
|
|
|
|
$(DEST_DIR)\$(BASE_NAME).sdb : $(SDB_FILES) $(SOURCE_FILES)
|
|
$(STRGATHER) -scan -vdbr $(STRGATHER_FLAGS) -od $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-skipext .uni -skipext .h $(SOURCE_FILES)
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)Strings.c : $(DEST_DIR)\$(BASE_NAME).sdb
|
|
$(STRGATHER) -dump $(LANGUAGE_FLAGS) -bn $(BASE_NAME)Strings -db $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-oc $(DEST_DIR)\$(BASE_NAME)Strings.c
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)StrDefs.h : $(DEST_DIR)\$(BASE_NAME).sdb
|
|
$(STRGATHER) -dump $(LANGUAGE_FLAGS) -bn $(BASE_NAME)Strings -db $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-oh $(DEST_DIR)\$(BASE_NAME)StrDefs.h
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)Strings.hpk : $(DEST_DIR)\$(BASE_NAME).sdb
|
|
$(STRGATHER) -dump $(LANGUAGE_FLAGS) -bn $(BASE_NAME)Strings -db $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-hpk $(DEST_DIR)\$(BASE_NAME)Strings.hpk
|
|
|
|
OBJECTS = $(OBJECTS) $(DEST_DIR)\$(BASE_NAME)Strings.obj
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)Strings.obj : $(DEST_DIR)\$(BASE_NAME)Strings.c $(INF_FILENAME) $(ALL_DEPS)
|
|
$(CC) $(C_FLAGS) $(DEST_DIR)\$(BASE_NAME)Strings.c
|
|
|
|
LOCALIZE_TARGETS = $(DEST_DIR)\$(BASE_NAME)StrDefs.h $(LOCALIZE_TARGETS)
|
|
|
|
!ENDIF
|
|
|
|
#
|
|
# If we have any objects associated with this component, then we're
|
|
# going to build a local library from them.
|
|
#
|
|
!IFNDEF OBJECTS
|
|
!ERROR No source files to build were defined in the INF file
|
|
!ENDIF
|
|
|
|
TARGET_LOCAL_LIB = $(DEST_DIR)\$(BASE_NAME)Local.lib
|
|
|
|
#
|
|
# LIB all the object files into our (local) target lib file. Put
|
|
# a dependency on the component's INF file in case it changes.
|
|
#
|
|
$(TARGET_LOCAL_LIB) : $(OBJECTS) $(INF_FILENAME) $(ENV_DEPS)
|
|
$(LIB) $(LIB_FLAGS) $(OBJECTS) /OUT:$@
|
|
|
|
#
|
|
# Defines for standard intermediate files and build targets
|
|
#
|
|
TARGET_DLL = $(BIN_DIR)\$(BASE_NAME).dll
|
|
TARGET_EFI = $(BIN_DIR)\$(BASE_NAME).efi
|
|
TARGET_DPX = $(DEST_DIR)\$(BASE_NAME).dpx
|
|
TARGET_UI = $(DEST_DIR)\$(BASE_NAME).ui
|
|
TARGET_VER = $(DEST_DIR)\$(BASE_NAME).ver
|
|
TARGET_MAP = $(BIN_DIR)\$(BASE_NAME).map
|
|
TARGET_PDB = $(BIN_DIR)\$(BASE_NAME).pdb
|
|
TARGET_SYM = $(BIN_DIR)\$(BASE_NAME).sym
|
|
|
|
#
|
|
# Target executable section extension depends on the component type.
|
|
# Only define "TARGET_DXE_DPX" if it's a combined peim driver.
|
|
#
|
|
!IF "$(COMPONENT_TYPE)" == "PIC_PEIM"
|
|
TARGET_PE32 = $(DEST_DIR)\$(BASE_NAME).pic
|
|
!ELSE
|
|
TARGET_PE32 = $(DEST_DIR)\$(BASE_NAME).pe32
|
|
!ENDIF
|
|
|
|
#
|
|
# Target FFS file extension depends on the component type
|
|
# Also define "TARGET_DXE_DPX" if it's a combined PEIM driver.
|
|
#
|
|
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
|
|
|
|
!IF "$(COMPONENT_TYPE)" == "APPLICATION"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).app
|
|
SUBSYSTEM = EFI_APPLICATION
|
|
!ELSE IF "$(COMPONENT_TYPE)" == "PEI_CORE"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).pei
|
|
!ELSE IF "$(COMPONENT_TYPE)" == "PE32_PEIM"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).pei
|
|
!ELSE IF "$(COMPONENT_TYPE)" == "RELOCATABLE_PEIM"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).pei
|
|
!ELSE IF "$(COMPONENT_TYPE)" == "PIC_PEIM"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).pei
|
|
!ELSE IF "$(COMPONENT_TYPE)" == "COMBINED_PEIM_DRIVER"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).pei
|
|
TARGET_DXE_DPX = $(DEST_DIR)\$(BASE_NAME).dpxd
|
|
!ELSE
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).dxe
|
|
!ENDIF
|
|
|
|
#
|
|
# Different methods to build section based on if PIC_PEIM
|
|
#
|
|
!IF "$(COMPONENT_TYPE)" == "PIC_PEIM"
|
|
|
|
$(TARGET_PE32) : $(TARGET_DLL)
|
|
$(PE2BIN) $(TARGET_DLL) $(DEST_DIR)\$(BASE_NAME).TMP
|
|
#
|
|
# BUGBUG: Build PEIM header, needs to go away with new PEI.
|
|
#
|
|
$(TEMPGENSECTION) -P $(SOURCE_DIR)\$(BASE_NAME).INF -I $(DEST_DIR)\$(BASE_NAME).TMP -O $(TARGET_PIC_PEI).tmp -M $(TARGET_MAP) -S EFI_SECTION_TYPE_NO_HEADER
|
|
$(GENSECTION) -I $(TARGET_PIC_PEI).tmp -O $(TARGET_PE32) -S EFI_SECTION_PIC
|
|
del $(DEST_DIR)\$(BASE_NAME).TMP
|
|
|
|
!ELSE
|
|
|
|
$(TARGET_PE32) : $(TARGET_EFI)
|
|
$(GENSECTION) -I $(TARGET_EFI) -O $(TARGET_PE32) -S EFI_SECTION_PE32
|
|
|
|
#
|
|
# $(DEP_TARGETS) are not needed for binary build.
|
|
#
|
|
!IF "$(BINARY)" == "TRUE"
|
|
DEP_TARGETS=
|
|
CREATEDEPS=
|
|
!ENDIF
|
|
|
|
#
|
|
# Build module to generate *.efi file from source code or binary file.
|
|
#
|
|
!IF (("$(BINARY)" == "TRUE") && EXIST($(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi))
|
|
LOCALIZE_TARGETS=
|
|
$(TARGET_EFI) : $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi
|
|
copy $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi $(TARGET_EFI) /Y
|
|
if exist $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).pdb \
|
|
copy $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).pdb $(TARGET_PDB) /Y
|
|
!ELSE
|
|
$(TARGET_EFI) : $(TARGET_DLL) $(INF_FILENAME)
|
|
$(FWIMAGE) -t 0 $(COMPONENT_TYPE) $(TARGET_DLL) $(TARGET_EFI)
|
|
!IF ("$(EFI_BINARY_BUILD)" == "YES")
|
|
if not exist $(EFI_PLATFORM_BIN)\$(PROCESSOR) mkdir $(EFI_PLATFORM_BIN)\$(PROCESSOR)
|
|
if exist $(TARGET_EFI) copy $(TARGET_EFI) $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi /Y
|
|
if exist $(TARGET_PDB) copy $(TARGET_PDB) $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).pdb /Y
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
!ENDIF
|
|
|
|
#
|
|
# Link all objects and libs to create the executable
|
|
#
|
|
$(TARGET_DLL) : $(TARGET_LOCAL_LIB) $(LIBS) $(INF_FILENAME) $(ENV_DEPS)
|
|
$(LINK) $(LINK_FLAGS_DLL) $(LIBS) /ENTRY:$(IMAGE_ENTRY_POINT) \
|
|
$(TARGET_LOCAL_LIB) /OUT:$(TARGET_DLL) /MAP:$(TARGET_MAP) \
|
|
/PDB:$(TARGET_PDB)
|
|
$(SETSTAMP) $(TARGET_DLL) $(BUILD_DIR)\GenStamp.txt
|
|
!IF "$(EFI_GENERATE_SYM_FILE)" == "YES"
|
|
if exist $(TARGET_PDB) $(PE2SYM) $(TARGET_PDB) $(TARGET_SYM)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_ZERO_DEBUG_DATA)" == "YES"
|
|
$(ZERODEBUGDATA) $(TARGET_DLL)
|
|
!ENDIF
|
|
|
|
#
|
|
# Create the user interface section
|
|
#
|
|
$(TARGET_UI) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_UI) -S EFI_SECTION_USER_INTERFACE -A "$(BASE_NAME)"
|
|
|
|
#
|
|
# Create the version section
|
|
#
|
|
!IF "$(BUILD_NUMBER)" != ""
|
|
!IF "$(VERSION_STRING)" != ""
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER) -A "$(VERSION_STRING)"
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER)
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
echo.>$(TARGET_VER)
|
|
type $(TARGET_VER)>$(TARGET_VER)
|
|
!ENDIF
|
|
|
|
#
|
|
# Makefile entries to create the dependency expression section.
|
|
# Use the DPX file from the source directory unless an override file
|
|
# was specified.
|
|
# If no DPX source file was specified, then create an empty file to
|
|
# be used.
|
|
#
|
|
!IF "$(DPX_SOURCE)" != ""
|
|
DPX_SOURCE_FILE = $(SOURCE_DIR)\$(DPX_SOURCE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_OVERRIDE)" != ""
|
|
DPX_SOURCE_FILE = $(DPX_SOURCE_OVERRIDE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_FILE)" != ""
|
|
!IF EXIST ($(DPX_SOURCE_FILE))
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
|
|
!IF EXIST($(TARGET_DPX))
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(TARGET_DPX)
|
|
$(MAKEDEPS) -f $(DPX_SOURCE_FILE) $(DEP_FLAGS)
|
|
|
|
!ENDIF
|
|
|
|
$(TARGET_DPX) : $(DPX_SOURCE_FILE) $(INF_FILENAME)
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) > $*.tmp1
|
|
!ELSE
|
|
-$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) /showIncludes > $*.tmp1 2> $(DEST_DIR)\$(BASE_NAME)dxs.cl
|
|
@$(MAKEDEPS) -f $(DEST_DIR)\$(BASE_NAME)dxs.cl $(DEP_FLAGS2)
|
|
!ENDIF
|
|
$(GENDEPEX) -I $*.tmp1 -O $*.tmp2
|
|
$(GENSECTION) -I $*.tmp2 -O $@ -S $(DEPEX_TYPE)
|
|
del $*.tmp1 > NUL
|
|
del $*.tmp2 > NUL
|
|
!ELSE
|
|
!ERROR Dependency expression source file "$(DPX_SOURCE_FILE)" does not exist.
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_DPX) : $(INF_FILENAME)
|
|
echo. > $(TARGET_DPX)
|
|
type $(TARGET_DPX) > $(TARGET_DPX)
|
|
!ENDIF
|
|
|
|
#
|
|
# Makefile entries for DXE DPX for combined PEIM drivers.
|
|
# If a DXE_DPX_SOURCE file was specified in the INF file, use it. Otherwise
|
|
# create an empty file and use it as a DPX file.
|
|
#
|
|
!IF "$(COMPONENT_TYPE)" == "COMBINED_PEIM_DRIVER"
|
|
!IF "$(DXE_DPX_SOURCE)" != ""
|
|
!IF EXIST ($(SOURCE_DIR)\$(DXE_DPX_SOURCE))
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(BASE_NAME)dxs2.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
|
|
!IF EXIST($(TARGET_DXE_DPX))
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(BASE_NAME)dxs2.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(TARGET_DXE_DPX)
|
|
$(MAKEDEPS) -f $(SOURCE_DIR)\$(DXE_DPX_SOURCE) $(DEP_FLAGS)
|
|
|
|
!ENDIF
|
|
|
|
$(TARGET_DXE_DPX) : $(SOURCE_DIR)\$(DXE_DPX_SOURCE) $(INF_FILENAME)
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
$(CC) $(C_FLAGS_DPX) $(SOURCE_DIR)\$(DXE_DPX_SOURCE) > $*.tmp1
|
|
!ELSE
|
|
-$(CC) $(C_FLAGS_DPX) $(SOURCE_DIR)\$(DXE_DPX_SOURCE) /showIncludes > $*.tmp1 2> $(DEST_DIR)\$(BASE_NAME)dxs2.cl
|
|
@$(MAKEDEPS) -f $(DEST_DIR)\$(BASE_NAME)dxs2.cl $(DEP_FLAGS2)
|
|
!ENDIF
|
|
$(GENDEPEX) -I $*.tmp1 -O $*.tmp2
|
|
$(GENSECTION) -I $*.tmp2 -O $@ -S EFI_SECTION_DXE_DEPEX
|
|
del $*.tmp1 > NUL
|
|
del $*.tmp2 > NUL
|
|
!ELSE
|
|
!ERROR Dependency expression source file "$(SOURCE_DIR)\$(DXE_DPX_SOURCE)" does not exist.
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_DXE_DPX) : $(INF_FILENAME)
|
|
echo. > $(TARGET_DXE_DPX)
|
|
type $(TARGET_DXE_DPX) > $(TARGET_DXE_DPX)
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Describe how to build the HII export file from all the input HII pack files.
|
|
# Use the FFS file GUID for the package GUID in the export file. Only used
|
|
# when multiple VFR share strings.
|
|
#
|
|
$(DEST_DIR)\$(BASE_NAME).hii : $(HII_PACK_FILES)
|
|
$(HIIPACK) create -g $(FILE_GUID) -p $(HII_PACK_FILES) -o $(DEST_DIR)\$(BASE_NAME).hii
|
|
|
|
#
|
|
# If the build calls for creating an FFS file with the IFR included as
|
|
# a separate binary (not compiled into the driver), then build the binary
|
|
# section now. Note that the PACKAGE must be set correctly to actually get
|
|
# this IFR section pulled into the FFS file.
|
|
#
|
|
!IF ("$(HII_IFR_PACK_FILES)" != "")
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)IfrBin.sec : $(HII_IFR_PACK_FILES)
|
|
$(HIIPACK) create -novarpacks -p $(HII_IFR_PACK_FILES) -o $(DEST_DIR)\$(BASE_NAME)IfrBin.hii
|
|
$(GENSECTION) -I $(DEST_DIR)\$(BASE_NAME)IfrBin.hii -O $(DEST_DIR)\$(BASE_NAME)IfrBin.sec -S EFI_SECTION_RAW
|
|
|
|
BIN_TARGETS = $(BIN_TARGETS) $(DEST_DIR)\$(BASE_NAME)IfrBin.sec
|
|
|
|
!ENDIF
|
|
|
|
#
|
|
# Build a FFS file from the sections and package
|
|
#
|
|
$(TARGET_FFS_FILE) : $(TARGET_PE32) $(TARGET_DPX) $(TARGET_UI) $(TARGET_VER) $(TARGET_DXE_DPX) $(PACKAGE_FILENAME)
|
|
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
!IF "$(CREATEDEPS)"=="YES"
|
|
all : $(DEP_TARGETS)
|
|
$(MAKE) -f $(MAKEFILE_NAME) all
|
|
!ELSE
|
|
all : $(LOCALIZE_TARGETS) $(BIN_TARGETS) $(TARGET_FFS_FILE) $(DEP_TARGETS)
|
|
!ENDIF
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
[Build.Ia32.TE_PEIM,Build.x64.TE_PEIM]
|
|
#
|
|
# Define the library file we'll build if we have any objects defined.
|
|
#
|
|
!IFDEF OBJECTS
|
|
TARGET_LOCAL_LIB = $(DEST_DIR)\$(BASE_NAME)Local.lib
|
|
#
|
|
# LIB all the object files into our (local) target lib file. Put
|
|
# a dependency on the component's INF file in case it changes.
|
|
#
|
|
$(TARGET_LOCAL_LIB) : $(OBJECTS) $(INF_FILENAME) $(ENV_DEPS)
|
|
$(LIB) $(LIB_FLAGS) $(OBJECTS) /OUT:$@
|
|
|
|
!ELSE
|
|
!ERROR No source files to build were defined in the INF file
|
|
!ENDIF
|
|
|
|
#
|
|
# Defines for standard intermediate files and build targets
|
|
#
|
|
TARGET_DLL = $(BIN_DIR)\$(BASE_NAME).dll
|
|
TARGET_EFI = $(BIN_DIR)\$(BASE_NAME).efi
|
|
TARGET_DPX = $(DEST_DIR)\$(BASE_NAME).dpx
|
|
TARGET_UI = $(DEST_DIR)\$(BASE_NAME).ui
|
|
TARGET_VER = $(DEST_DIR)\$(BASE_NAME).ver
|
|
TARGET_MAP = $(BIN_DIR)\$(BASE_NAME).map
|
|
TARGET_PDB = $(BIN_DIR)\$(BASE_NAME).pdb
|
|
TARGET_SYM = $(BIN_DIR)\$(BASE_NAME).sym
|
|
TARGET_TE = $(BIN_DIR)\$(BASE_NAME).te
|
|
TARGET_PE32 = $(DEST_DIR)\$(BASE_NAME).pe32
|
|
TARGET_TES = $(DEST_DIR)\$(BASE_NAME).tes
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).pei
|
|
|
|
#
|
|
# Create our TE section from our TE file
|
|
#
|
|
$(TARGET_TES) : $(TARGET_TE)
|
|
$(GENSECTION) -I $(TARGET_TE) -O $(TARGET_TES) -S EFI_SECTION_TE
|
|
|
|
#
|
|
# $(DEP_TARGETS) are not needed for binary build.
|
|
#
|
|
!IF "$(BINARY)" == "TRUE"
|
|
DEP_TARGETS=
|
|
CREATEDEPS=
|
|
!ENDIF
|
|
|
|
#
|
|
# Build module to generate *.efi file from source code or binary file.
|
|
#
|
|
!IF (("$(BINARY)" == "TRUE") && EXIST($(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi))
|
|
$(TARGET_EFI) : $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi
|
|
copy $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi $(TARGET_EFI) /Y
|
|
if exist $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).pdb \
|
|
copy $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).pdb $(TARGET_PDB) /Y
|
|
!ELSE
|
|
$(TARGET_EFI) : $(TARGET_DLL) $(INF_FILENAME)
|
|
$(FWIMAGE) $(COMPONENT_TYPE) $(TARGET_DLL) $(TARGET_EFI)
|
|
!IF ("$(EFI_BINARY_BUILD)" == "YES")
|
|
if not exist $(EFI_PLATFORM_BIN)\$(PROCESSOR) mkdir $(EFI_PLATFORM_BIN)\$(PROCESSOR)
|
|
if exist $(TARGET_EFI) copy $(TARGET_EFI) $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).efi /Y
|
|
if exist $(TARGET_PDB) copy $(TARGET_PDB) $(EFI_PLATFORM_BIN)\$(PROCESSOR)\$(BASE_NAME).pdb /Y
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Run GenTEImage on the built .efi file to create our TE file.
|
|
#
|
|
$(TARGET_TE) : $(TARGET_EFI)
|
|
$(GENTEIMAGE) -o $(TARGET_TE) $(TARGET_EFI)
|
|
|
|
#
|
|
# Link all objects and libs to create the executable
|
|
#
|
|
$(TARGET_DLL) : $(TARGET_LOCAL_LIB) $(LIBS) $(INF_FILENAME) $(ENV_DEPS)
|
|
$(LINK) $(LINK_FLAGS_DLL) $(LIBS) /ENTRY:$(IMAGE_ENTRY_POINT) \
|
|
$(TARGET_LOCAL_LIB) /OUT:$(TARGET_DLL) /MAP:$(TARGET_MAP) \
|
|
/PDB:$(TARGET_PDB)
|
|
$(SETSTAMP) $(TARGET_DLL) $(BUILD_DIR)\GenStamp.txt
|
|
!IF "$(EFI_GENERATE_SYM_FILE)" == "YES"
|
|
if exist $(TARGET_PDB) $(PE2SYM) $(TARGET_PDB) $(TARGET_SYM)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_ZERO_DEBUG_DATA)" == "YES"
|
|
$(ZERODEBUGDATA) $(TARGET_DLL)
|
|
!ENDIF
|
|
|
|
#
|
|
# Create the user interface section
|
|
#
|
|
$(TARGET_UI) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_UI) -S EFI_SECTION_USER_INTERFACE -A "$(BASE_NAME)"
|
|
|
|
#
|
|
# Create the version section
|
|
#
|
|
!IF "$(BUILD_NUMBER)" != ""
|
|
!IF "$(VERSION_STRING)" != ""
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER) -A "$(VERSION_STRING)"
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER)
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
echo.>$(TARGET_VER)
|
|
type $(TARGET_VER)>$(TARGET_VER)
|
|
!ENDIF
|
|
|
|
#
|
|
# Makefile entries to create the dependency expression section.
|
|
# Use the DPX file from the source directory unless an override file
|
|
# was specified.
|
|
# If no DPX source file was specified, then create an empty file to
|
|
# be used.
|
|
#
|
|
!IF "$(DPX_SOURCE)" != ""
|
|
DPX_SOURCE_FILE = $(SOURCE_DIR)\$(DPX_SOURCE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_OVERRIDE)" != ""
|
|
DPX_SOURCE_FILE = $(DPX_SOURCE_OVERRIDE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_FILE)" != ""
|
|
!IF EXIST ($(DPX_SOURCE_FILE))
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
|
|
!IF EXIST($(TARGET_DPX))
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(TARGET_DPX)
|
|
$(MAKEDEPS) -f $(DPX_SOURCE_FILE) $(DEP_FLAGS)
|
|
|
|
!ENDIF
|
|
|
|
$(TARGET_DPX) : $(DPX_SOURCE_FILE) $(INF_FILENAME)
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) > $*.tmp1
|
|
!ELSE
|
|
-$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) /showIncludes > $*.tmp1 2> $(DEST_DIR)\$(BASE_NAME)dxs.cl
|
|
@$(MAKEDEPS) -f $(DEST_DIR)\$(BASE_NAME)dxs.cl $(DEP_FLAGS2)
|
|
!ENDIF
|
|
$(GENDEPEX) -I $*.tmp1 -O $*.tmp2
|
|
$(GENSECTION) -I $*.tmp2 -O $@ -S $(DEPEX_TYPE)
|
|
del $*.tmp1 > NUL
|
|
del $*.tmp2 > NUL
|
|
!ELSE
|
|
!ERROR Dependency expression source file "$(DPX_SOURCE_FILE)" does not exist.
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_DPX) : $(INF_FILENAME)
|
|
echo. > $(TARGET_DPX)
|
|
type $(TARGET_DPX) > $(TARGET_DPX)
|
|
!ENDIF
|
|
|
|
#
|
|
# Build an FFS file from the sections and package
|
|
#
|
|
$(TARGET_FFS_FILE) : $(TARGET_TES) $(TARGET_DPX) $(TARGET_UI) $(TARGET_VER) $(PACKAGE_FILENAME)
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
!IF "$(CREATEDEPS)"=="YES"
|
|
all : $(DEP_TARGETS)
|
|
$(MAKE) -f $(MAKEFILE_NAME) all
|
|
!ELSE
|
|
all : $(TARGET_FFS_FILE) $(DEP_TARGETS)
|
|
!ENDIF
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# These are the commands to build EBC EFI targets
|
|
#
|
|
[=============================================================================]
|
|
[Build.Ebc.BS_DRIVER|RT_DRIVER|APPLICATION]
|
|
|
|
#
|
|
# Add the EBC library to our list of libs
|
|
#
|
|
LIBS = $(LIBS) $(EBC_TOOLS_PATH)\lib\EbcLib.lib
|
|
|
|
!IF "$(LOCALIZE)" == "YES"
|
|
|
|
!IF (("$(EFI_GENERATE_HII_RESOURCE)" == "YES") && ("$(EFI_SPECIFICATION_VERSION)" >= "0x0002000A"))
|
|
#
|
|
# This will generate HII resource section in PE/COFF image.
|
|
#
|
|
# Note: when HII package list is built into resource section, Driver no longer
|
|
# refer to C array generated by VfrCompiler ($(FILE_NAME)Bin) and StrGather
|
|
# ($(BASE_NAME)Strings); while in current build rule, those C array objects
|
|
# will still be linked with the Driver, so please turn on link flag "/OPT:REF"
|
|
# to minimize the code size.
|
|
#
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(BASE_NAME)Strings.hpk
|
|
LOCALIZE_TARGETS = $(LOCALIZE_TARGETS) $(DEST_DIR)\$(BASE_NAME).res
|
|
OBJECTS = $(OBJECTS) $(DEST_DIR)\$(BASE_NAME).res
|
|
|
|
$(DEST_DIR)\$(BASE_NAME).rc : $(HII_PACK_FILES)
|
|
$(HIIPACK) -g $(FILE_GUID) $(HII_PACK_FILES) -rc $(DEST_DIR)\$(BASE_NAME).rc -hii $(DEST_DIR)\$(BASE_NAME).hii
|
|
|
|
$(DEST_DIR)\$(BASE_NAME).res : $(DEST_DIR)\$(BASE_NAME).rc
|
|
$(RC) /fo $(DEST_DIR)\$(BASE_NAME).res $(DEST_DIR)\$(BASE_NAME).rc
|
|
|
|
!ENDIF
|
|
|
|
!IF (("$(EFI_GENERATE_HII_EXPORT)" == "YES") && ("$(EFI_SPECIFICATION_VERSION)" < "0x0002000A"))
|
|
#
|
|
# There will be one HII pack containing all the strings. Add that file
|
|
# to the list of HII pack files we'll use to create our final HII export file.
|
|
#
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(BASE_NAME)Strings.hpk
|
|
|
|
LOCALIZE_TARGETS = $(LOCALIZE_TARGETS) $(DEST_DIR)\$(BASE_NAME).hii
|
|
!ENDIF
|
|
|
|
!IF ("$(EFI_SPECIFICATION_VERSION)" >= "0x0002000A")
|
|
#
|
|
# Note: currently -ppflag option is only available for UefiStrGather
|
|
# Note: /GS- will cause warning for preprocess, so filter it out from STRGATHER_PPFLAG
|
|
#
|
|
STRGATHER_PPFLAG = $(EBC_C_FLAGS: /GS-=)
|
|
STRGATHER_FLAGS = $(STRGATHER_FLAGS) -ppflag "$(STRGATHER_PPFLAG)" -oh $(DEST_DIR)\$(BASE_NAME)StrDefs.h
|
|
!ENDIF
|
|
|
|
$(DEST_DIR)\$(BASE_NAME).sdb : $(SDB_FILES) $(SOURCE_FILES)
|
|
$(STRGATHER) -scan -vdbr $(STRGATHER_FLAGS) -od $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-skipext .uni -skipext .h $(SOURCE_FILES)
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)Strings.c : $(DEST_DIR)\$(BASE_NAME).sdb
|
|
$(STRGATHER) -dump $(LANGUAGE_FLAGS) -bn $(BASE_NAME)Strings -db $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-oc $(DEST_DIR)\$(BASE_NAME)Strings.c
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)StrDefs.h : $(DEST_DIR)\$(BASE_NAME).sdb
|
|
$(STRGATHER) -dump $(LANGUAGE_FLAGS) -bn $(BASE_NAME)Strings -db $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-oh $(DEST_DIR)\$(BASE_NAME)StrDefs.h
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)Strings.hpk : $(DEST_DIR)\$(BASE_NAME).sdb
|
|
$(STRGATHER) -dump $(LANGUAGE_FLAGS) -bn $(BASE_NAME)Strings -db $(DEST_DIR)\$(BASE_NAME).sdb \
|
|
-hpk $(DEST_DIR)\$(BASE_NAME)Strings.hpk
|
|
|
|
OBJECTS = $(OBJECTS) $(DEST_DIR)\$(BASE_NAME)Strings.obj
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)Strings.obj : $(DEST_DIR)\$(BASE_NAME)Strings.c $(INF_FILENAME) $(ALL_DEPS)
|
|
$(EBC_CC) $(EBC_C_FLAGS) $(DEST_DIR)\$(BASE_NAME)Strings.c
|
|
|
|
LOCALIZE_TARGETS = $(DEST_DIR)\$(BASE_NAME)StrDefs.h $(LOCALIZE_TARGETS)
|
|
|
|
!ENDIF
|
|
|
|
#
|
|
# If building an application, then the target is a .app, not .dxe
|
|
#
|
|
!IF "$(COMPONENT_TYPE)" == "APPLICATION"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).app
|
|
SUBSYSTEM = EFI_APPLICATION
|
|
!ELSE
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).dxe
|
|
SUBSYSTEM = EFI_BOOT_SERVICE_DRIVER
|
|
!ENDIF
|
|
|
|
#
|
|
# Defines for standard intermediate files and build targets
|
|
#
|
|
TARGET_EFI = $(BIN_DIR)\$(BASE_NAME).efi
|
|
TARGET_DPX = $(DEST_DIR)\$(BASE_NAME).dpx
|
|
TARGET_UI = $(DEST_DIR)\$(BASE_NAME).ui
|
|
TARGET_VER = $(DEST_DIR)\$(BASE_NAME).ver
|
|
TARGET_MAP = $(BIN_DIR)\$(BASE_NAME).map
|
|
TARGET_PDB = $(BIN_DIR)\$(BASE_NAME).pdb
|
|
TARGET_PE32 = $(DEST_DIR)\$(BASE_NAME).pe32
|
|
TARGET_DLL = $(BIN_DIR)\$(BASE_NAME).dll
|
|
|
|
#
|
|
# First link all the objects and libs together to make a .dll file
|
|
#
|
|
$(TARGET_DLL) : $(OBJECTS) $(LIBS) $(INF_FILENAME) $(ENV_DEPS)
|
|
$(EBC_LINK) $(EBC_LINK_FLAGS) /SUBSYSTEM:$(SUBSYSTEM) /ENTRY:EfiStart \
|
|
$(OBJECTS) $(LIBS) /OUT:$(TARGET_DLL) /MAP:$(TARGET_MAP)
|
|
$(SETSTAMP) $(TARGET_DLL) $(BUILD_DIR)\GenStamp.txt
|
|
!IF "$(EFI_ZERO_DEBUG_DATA)" == "YES"
|
|
$(ZERODEBUGDATA) $(TARGET_DLL)
|
|
!ENDIF
|
|
|
|
#
|
|
# Now take the .dll file and make a .efi file
|
|
#
|
|
$(TARGET_EFI) : $(TARGET_DLL) $(INF_FILENAME)
|
|
$(FWIMAGE) -t 0 $(COMPONENT_TYPE) $(TARGET_DLL) $(TARGET_EFI)
|
|
|
|
#
|
|
# Now take the .efi file and make a .pe32 section
|
|
#
|
|
$(TARGET_PE32) : $(TARGET_EFI)
|
|
$(GENSECTION) -I $(TARGET_EFI) -O $(TARGET_PE32) -S EFI_SECTION_PE32
|
|
|
|
#
|
|
# Create the user interface section
|
|
#
|
|
$(TARGET_UI) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_UI) -S EFI_SECTION_USER_INTERFACE -A "$(BASE_NAME)"
|
|
|
|
#
|
|
# Create the version section
|
|
#
|
|
!IF "$(BUILD_NUMBER)" != ""
|
|
!IF "$(VERSION_STRING)" != ""
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER) -A "$(VERSION_STRING)"
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER)
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
echo. > $(TARGET_VER)
|
|
type $(TARGET_VER) > $(TARGET_VER)
|
|
!ENDIF
|
|
|
|
#
|
|
# Makefile entries to create the dependency expression section.
|
|
# Use the DPX file from the source directory unless an override file
|
|
# was specified.
|
|
# If no DPX source file was specified, then create an empty file to
|
|
# be used.
|
|
#
|
|
!IF "$(DPX_SOURCE)" != ""
|
|
DPX_SOURCE_FILE = $(SOURCE_DIR)\$(DPX_SOURCE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_OVERRIDE)" != ""
|
|
DPX_SOURCE_FILE = $(DPX_SOURCE_OVERRIDE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_FILE)" != ""
|
|
!IF EXIST ($(DPX_SOURCE_FILE))
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
|
|
!IF EXIST($(TARGET_DPX))
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(TARGET_DPX)
|
|
$(MAKEDEPS) -f $(DPX_SOURCE_FILE) $(DEP_FLAGS)
|
|
|
|
!ENDIF
|
|
|
|
$(TARGET_DPX) : $(DPX_SOURCE_FILE) $(INF_FILENAME)
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) > $*.tmp1
|
|
!ELSE
|
|
-$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) /showIncludes > $*.tmp1 2> $(DEST_DIR)\$(BASE_NAME)dxs.cl
|
|
@$(MAKEDEPS) -f $(DEST_DIR)\$(BASE_NAME)dxs.cl $(DEP_FLAGS2)
|
|
!ENDIF
|
|
$(GENDEPEX) -I $*.tmp1 -O $*.tmp2
|
|
$(GENSECTION) -I $*.tmp2 -O $@ -S $(DEPEX_TYPE)
|
|
del $*.tmp1 > NUL
|
|
del $*.tmp2 > NUL
|
|
!ELSE
|
|
!ERROR Dependency expression source file "$(DPX_SOURCE_FILE)" does not exist.
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_DPX) : $(INF_FILENAME)
|
|
echo. > $(TARGET_DPX)
|
|
type $(TARGET_DPX) > $(TARGET_DPX)
|
|
!ENDIF
|
|
|
|
#
|
|
# Describe how to build the HII export file from all the input HII pack files.
|
|
# Use the FFS file GUID for the package GUID in the export file. Only used
|
|
# when multiple VFR share strings.
|
|
#
|
|
$(DEST_DIR)\$(BASE_NAME).hii : $(HII_PACK_FILES)
|
|
$(HIIPACK) create -g $(FILE_GUID) -p $(HII_PACK_FILES) -o $(DEST_DIR)\$(BASE_NAME).hii
|
|
|
|
#
|
|
# If the build calls for creating an FFS file with the IFR included as
|
|
# a separate binary (not compiled into the driver), then build the binary
|
|
# section now. Note that the PACKAGE must be set correctly to actually get
|
|
# this IFR section pulled into the FFS file.
|
|
#
|
|
!IF ("$(HII_IFR_PACK_FILES)" != "")
|
|
|
|
$(DEST_DIR)\$(BASE_NAME)IfrBin.sec : $(HII_IFR_PACK_FILES)
|
|
$(HIIPACK) create -novarpacks -p $(HII_IFR_PACK_FILES) -o $(DEST_DIR)\$(BASE_NAME)IfrBin.hii
|
|
$(GENSECTION) -I $(DEST_DIR)\$(BASE_NAME)IfrBin.hii -O $(DEST_DIR)\$(BASE_NAME)IfrBin.sec -S EFI_SECTION_RAW
|
|
|
|
BIN_TARGETS = $(BIN_TARGETS) $(DEST_DIR)\$(BASE_NAME)IfrBin.sec
|
|
|
|
!ENDIF
|
|
|
|
#
|
|
# Build an FFS file from the sections and package
|
|
#
|
|
$(TARGET_FFS_FILE) : $(TARGET_PE32) $(TARGET_DPX) $(TARGET_UI) $(TARGET_VER) $(PACKAGE_FILENAME)
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
!IF "$(CREATEDEPS)"=="YES"
|
|
all : $(DEP_TARGETS)
|
|
$(MAKE) -f $(MAKEFILE_NAME) all
|
|
!ELSE
|
|
all : $(LOCALIZE_TARGETS) $(BIN_TARGETS) $(TARGET_FFS_FILE) $(DEP_TARGETS)
|
|
!ENDIF
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# These are the commands to build vendor-provided *.EFI files into an FV.
|
|
# To use them, create an INF file with BUILD_TYPE=BS_DRIVER_EFI.
|
|
# This section, as it now exists, only supports boot service drivers.
|
|
#
|
|
[=============================================================================]
|
|
[Build.Ia32.BS_DRIVER_EFI|RT_DRIVER_EFI|APPLICATION_EFI|PE32_PEIM_EFI,Build.x64.BS_DRIVER_EFI|RT_DRIVER_EFI|APPLICATION_EFI|PE32_PEIM_EFI]
|
|
#
|
|
# Defines for standard intermediate files and build targets. For the source
|
|
# .efi file, take the one in the source directory if it exists. If there's not
|
|
# one there, look for one in the processor-specfic subdirectory.
|
|
#
|
|
!IF EXIST ("$(SOURCE_DIR)\$(BASE_NAME).efi")
|
|
TARGET_EFI = $(SOURCE_DIR)\$(BASE_NAME).efi
|
|
!ELSEIF EXIST ("$(SOURCE_DIR)\$(PROCESSOR)\$(BASE_NAME).efi")
|
|
TARGET_EFI = $(SOURCE_DIR)\$(PROCESSOR)\$(BASE_NAME).efi
|
|
!ELSE
|
|
!ERROR Pre-existing $(BASE_NAME).efi file not found in $(SOURCE_DIR) nor $(SOURCE_DIR)\$(PROCESSOR)
|
|
!ENDIF
|
|
|
|
TARGET_DPX = $(DEST_DIR)\$(BASE_NAME).dpx
|
|
TARGET_UI = $(DEST_DIR)\$(BASE_NAME).ui
|
|
TARGET_VER = $(DEST_DIR)\$(BASE_NAME).ver
|
|
TARGET_MAP = $(BIN_DIR)\$(BASE_NAME).map
|
|
TARGET_PDB = $(BIN_DIR)\$(BASE_NAME).pdb
|
|
TARGET_PE32 = $(DEST_DIR)\$(BASE_NAME).pe32
|
|
TARGET_DLL = $(BIN_DIR)\$(BASE_NAME).dll
|
|
|
|
#
|
|
# If building an application, then the target is a .app, not .dxe
|
|
#
|
|
!IF "$(COMPONENT_TYPE)" == "APPLICATION"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).app
|
|
!ELSE IF "$(COMPONENT_TYPE)" == "PE32_PEIM"
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).pei
|
|
!ELSE
|
|
TARGET_FFS_FILE = $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).dxe
|
|
!ENDIF
|
|
|
|
#
|
|
# Take the .efi file and make a .pe32 file
|
|
#
|
|
$(TARGET_PE32) : $(TARGET_EFI)
|
|
$(GENSECTION) -I $(TARGET_EFI) -O $(TARGET_PE32) -S EFI_SECTION_PE32
|
|
|
|
#
|
|
# Create the user interface section
|
|
#
|
|
$(TARGET_UI) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_UI) -S EFI_SECTION_USER_INTERFACE -A "$(BASE_NAME)"
|
|
|
|
#
|
|
# Create the version section
|
|
#
|
|
!IF "$(BUILD_NUMBER)" != ""
|
|
!IF "$(VERSION_STRING)" != ""
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER) -A "$(VERSION_STRING)"
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
$(GENSECTION) -O $(TARGET_VER) -S EFI_SECTION_VERSION -V $(BUILD_NUMBER)
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_VER) : $(INF_FILENAME)
|
|
echo. > $(TARGET_VER)
|
|
type $(TARGET_VER) > $(TARGET_VER)
|
|
!ENDIF
|
|
|
|
#
|
|
# Makefile entries to create the dependency expression section.
|
|
# Use the DPX file from the source directory unless an override file
|
|
# was specified.
|
|
# If no DPX source file was specified, then create an empty file to
|
|
# be used.
|
|
#
|
|
!IF "$(DPX_SOURCE)" != ""
|
|
DPX_SOURCE_FILE = $(SOURCE_DIR)\$(DPX_SOURCE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_OVERRIDE)" != ""
|
|
DPX_SOURCE_FILE = $(DPX_SOURCE_OVERRIDE)
|
|
!ENDIF
|
|
|
|
!IF "$(DPX_SOURCE_FILE)" != ""
|
|
!IF EXIST ($(DPX_SOURCE_FILE))
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
|
|
!IF EXIST($(TARGET_DPX))
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(BASE_NAME)dxs.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(TARGET_DPX)
|
|
$(MAKEDEPS) -f $(DPX_SOURCE_FILE) $(DEP_FLAGS)
|
|
|
|
!ENDIF
|
|
|
|
$(TARGET_DPX) : $(DPX_SOURCE_FILE) $(INF_FILENAME)
|
|
!IF "$(EFI_USE_CL_FOR_DEP)" != "YES"
|
|
$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) > $*.tmp1
|
|
!ELSE
|
|
-$(CC) $(C_FLAGS_DPX) $(DPX_SOURCE_FILE) /showIncludes > $*.tmp1 2> $(DEST_DIR)\$(BASE_NAME)dxs.cl
|
|
@$(MAKEDEPS) -f $(DEST_DIR)\$(BASE_NAME)dxs.cl $(DEP_FLAGS2)
|
|
!ENDIF
|
|
$(GENDEPEX) -I $*.tmp1 -O $*.tmp2
|
|
$(GENSECTION) -I $*.tmp2 -O $@ -S $(DEPEX_TYPE)
|
|
del $*.tmp1 > NUL
|
|
del $*.tmp2 > NUL
|
|
!ELSE
|
|
!ERROR Dependency expression source file "$(DPX_SOURCE_FILE)" does not exist.
|
|
!ENDIF
|
|
!ELSE
|
|
$(TARGET_DPX) : $(INF_FILENAME)
|
|
echo. > $(TARGET_DPX)
|
|
type $(TARGET_DPX) > $(TARGET_DPX)
|
|
!ENDIF
|
|
|
|
#
|
|
# Build a FFS file from the sections and package
|
|
#
|
|
$(TARGET_FFS_FILE) : $(TARGET_PE32) $(TARGET_DPX) $(TARGET_UI) $(TARGET_VER) $(PACKAGE_FILENAME)
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
all : $(TARGET_FFS_FILE)
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
[Compile.Ia32.Bin|Bmp,Compile.x64.Bin|Bmp]
|
|
#
|
|
# We simply define the binary source file name
|
|
#
|
|
BINARY_SOURCE_FILE = $(SOURCE_FILE_NAME)
|
|
|
|
[=============================================================================]
|
|
[Build.Ia32.BINARY|Legacy16|Logo,Build.x64.BINARY|Legacy16|Logo]
|
|
#
|
|
# Use GenFfsFile to convert it to an FFS file
|
|
#
|
|
$(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).ffs : $(BINARY_SOURCE_FILE) $(PACKAGE_FILENAME) $(INF_FILENAME)
|
|
$(GENSECTION) -I $(BINARY_SOURCE_FILE) -O $(DEST_DIR)\$(BASE_NAME).sec -S EFI_SECTION_RAW
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
all : $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).ffs
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
[Build.Ia32.RAWFILE|CONFIG,Build.x64.RAWFILE|CONFIG]
|
|
#
|
|
# Use GenFfsFile to convert it to an raw FFS file
|
|
#
|
|
$(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).raw : $(BINARY_SOURCE_FILE) $(PACKAGE_FILENAME) $(INF_FILENAME)
|
|
copy $(BINARY_SOURCE_FILE) $(DEST_DIR)\$(BASE_NAME).bin /Y
|
|
$(GENFFSFILE) -B $(DEST_DIR) -P1 $(PACKAGE_FILENAME) -V
|
|
|
|
all : $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).raw
|
|
|
|
#
|
|
# Remove the generated temp and final files for this modules.
|
|
#
|
|
clean :
|
|
!IF ("$(FILE_GUID)" != "")
|
|
@if exist $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).* del $(BIN_DIR)\$(FILE_GUID)-$(BASE_NAME).*
|
|
!ENDIF
|
|
@if exist $(BIN_DIR)\$(BASE_NAME).* del $(BIN_DIR)\$(BASE_NAME).*
|
|
@del /q $(DEST_OUTPUT_DIRS)
|
|
|
|
[=============================================================================]
|
|
#
|
|
# These are commands to compile unicode .uni files.
|
|
#
|
|
[=============================================================================]
|
|
[Compile.Ia32.Uni,Compile.Ebc.Uni,Compile.x64.Uni]
|
|
#
|
|
# Emit an error message if the file's base name is the same as the
|
|
# component base name. This causes build issues.
|
|
#
|
|
!IF "$(FILE)" == "$(BASE_NAME)"
|
|
!ERROR Component Unicode string file name cannot be the same as the component BASE_NAME.
|
|
!ENDIF
|
|
|
|
#
|
|
# Always create dep file for uni file as it can be created at the same time when
|
|
# strgather is parsing uni file.
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(FILE)Uni.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
$(DEST_DIR)\$(FILE).sdb : $(SOURCE_FILE_NAME) $(INF_FILENAME)
|
|
$(STRGATHER) -parse -newdb -db $(DEST_DIR)\$(FILE).sdb -dep $(DEP_FILE) $(INC) $(SOURCE_FILE_NAME)
|
|
|
|
SDB_FILES = $(SDB_FILES) $(DEST_DIR)\$(FILE).sdb
|
|
STRGATHER_FLAGS = $(STRGATHER_FLAGS) -db $(DEST_DIR)\$(FILE).sdb
|
|
LOCALIZE = YES
|
|
|
|
[=============================================================================]
|
|
[Compile.Ia32.hfr,Compile.Ebc.hfr,Compile.x64.hfr]
|
|
[=============================================================================]
|
|
[Compile.Ia32.Vfr,Compile.x64.Vfr]
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(FILE)Vfr.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF EXIST($(DEST_DIR)\$(FILE).obj)
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(FILE)Vfr.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(DEST_DIR)\$(FILE).obj
|
|
$(MAKEDEPS) -f $(SOURCE_FILE_NAME) $(DEP_FLAGS)
|
|
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(FILE).hpk
|
|
|
|
#
|
|
# Add a dummy command for building the HII pack file. In reality, it's built
|
|
# below, but the C_FLAGS macro reference the target as $@, so you can't specify
|
|
# the obj and hpk files as dual targets of the same command.
|
|
#
|
|
$(DEST_DIR)\$(FILE).hpk : $(DEST_DIR)\$(FILE).obj
|
|
|
|
$(DEST_DIR)\$(FILE).obj : $(SOURCE_FILE_NAME) $(INF_FILENAME) $(ALL_DEPS)
|
|
$(VFRCOMPILE) $(VFRCOMPILE_FLAGS) $(INC) -ibin -od $(DEST_DIR)\$(SOURCE_RELATIVE_PATH) \
|
|
-l $(VFR_FLAGS) $(SOURCE_FILE_NAME)
|
|
$(CC) $(C_FLAGS) $(DEST_DIR)\$(FILE).c
|
|
|
|
[=============================================================================]
|
|
[Compile.Ebc.Vfr]
|
|
|
|
DEP_FILE = $(DEST_DIR)\$(FILE)Vfr.dep
|
|
|
|
!IF EXIST($(DEST_DIR)\$(FILE).obj)
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(FILE)Vfr.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(DEST_DIR)\$(FILE).obj
|
|
$(MAKEDEPS) -f $(SOURCE_FILE_NAME) $(DEP_FLAGS)
|
|
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(FILE).hpk
|
|
|
|
#
|
|
# Add a dummy command for building the HII pack file. In reality, it's built
|
|
# below, but the C_FLAGS macro reference the target as $@, so you can't specify
|
|
# the obj and hpk files as dual targets of the same command.
|
|
#
|
|
$(DEST_DIR)\$(FILE).hpk : $(DEST_DIR)\$(FILE).obj
|
|
|
|
$(DEST_DIR)\$(FILE).obj : $(SOURCE_FILE_NAME) $(INF_FILENAME) $(ALL_DEPS)
|
|
$(VFRCOMPILE) $(VFRCOMPILE_FLAGS) $(INC) -ibin -od $(DEST_DIR)\$(SOURCE_RELATIVE_PATH) \
|
|
-l $(VFR_FLAGS) $(SOURCE_FILE_NAME)
|
|
$(EBC_CC) $(EBC_C_FLAGS) $(DEST_DIR)\$(FILE).c
|
|
|
|
[=============================================================================]
|
|
#
|
|
# Commands for building IFR as uncompressed binary into the FFS file. To
|
|
# use it, set COMPILE_SELECT=.vfr=Ifr_Bin for the component in the DSC file.
|
|
#
|
|
[=============================================================================]
|
|
[Compile.Ia32.Ifr_Bin,Compile.x64.Ifr_Bin]
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(FILE)Vfr.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF EXIST($(DEST_DIR)\$(FILE).obj)
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(FILE)Vfr.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(DEST_DIR)\$(FILE).obj
|
|
$(MAKEDEPS) -f $(SOURCE_FILE_NAME) $(DEP_FLAGS)
|
|
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(FILE).hpk
|
|
|
|
#
|
|
# Add a dummy command for building the HII pack file. In reality, it's built
|
|
# below, but the C_FLAGS macro reference the target as $@, so you can't specify
|
|
# the obj and hpk files as dual targets of the same command.
|
|
#
|
|
$(DEST_DIR)\$(FILE).hpk : $(DEST_DIR)\$(FILE).obj
|
|
|
|
$(DEST_DIR)\$(FILE).obj : $(SOURCE_FILE_NAME) $(INF_FILENAME) $(ALL_DEPS)
|
|
$(VFRCOMPILE) $(VFRCOMPILE_FLAGS) $(INC) -ibin -od $(DEST_DIR)\$(SOURCE_RELATIVE_PATH) \
|
|
-l $(VFR_FLAGS) $(SOURCE_FILE_NAME)
|
|
$(CC) $(C_FLAGS) $(DEST_DIR)\$(FILE).c
|
|
|
|
#
|
|
# Add to the variable that contains the list of VFR binary files we're going
|
|
# to merge together at the end of the build.
|
|
#
|
|
HII_IFR_PACK_FILES = $(HII_IFR_PACK_FILES) $(DEST_DIR)\$(FILE).hpk
|
|
|
|
[=============================================================================]
|
|
#
|
|
# Commands for building IFR as uncompressed binary into the FFS file. To
|
|
# use it, set COMPILE_SELECT=.vfr=Ifr_Bin for the component in the DSC file.
|
|
#
|
|
[=============================================================================]
|
|
[Compile.Ebc.Ifr_Bin]
|
|
|
|
#
|
|
# Add build dependency check
|
|
#
|
|
DEP_FILE = $(DEST_DIR)\$(FILE)Vfr.dep
|
|
|
|
!IF EXIST($(DEP_FILE))
|
|
!INCLUDE $(DEP_FILE)
|
|
!ENDIF
|
|
|
|
!IF EXIST($(DEST_DIR)\$(FILE).obj)
|
|
DEP_TARGETS = $(DEP_TARGETS) $(DEST_DIR)\$(FILE)Vfr.dep
|
|
!IF !EXIST($(DEP_FILE))
|
|
CREATEDEPS = YES
|
|
!ENDIF
|
|
!ENDIF
|
|
|
|
#
|
|
# Update dep file for next round incremental build
|
|
#
|
|
$(DEP_FILE) : $(DEST_DIR)\$(FILE).obj
|
|
$(MAKEDEPS) -f $(SOURCE_FILE_NAME) $(DEP_FLAGS)
|
|
|
|
HII_PACK_FILES = $(HII_PACK_FILES) $(DEST_DIR)\$(FILE).hpk
|
|
|
|
#
|
|
# Add a dummy command for building the HII pack file. In reality, it's built
|
|
# below, but the C_FLAGS macro reference the target as $@, so you can't specify
|
|
# the obj and hpk files as dual targets of the same command.
|
|
#
|
|
$(DEST_DIR)\$(FILE).hpk : $(DEST_DIR)\$(FILE).obj
|
|
|
|
$(DEST_DIR)\$(FILE).obj : $(SOURCE_FILE_NAME) $(INF_FILENAME) $(ALL_DEPS)
|
|
$(VFRCOMPILE) $(VFRCOMPILE_FLAGS) $(INC) -ibin -od $(DEST_DIR)\$(SOURCE_RELATIVE_PATH) \
|
|
-l $(VFR_FLAGS) $(SOURCE_FILE_NAME)
|
|
$(EBC_CC) $(EBC_C_FLAGS) $(DEST_DIR)\$(FILE).c
|
|
|
|
#
|
|
# Add to the variable that contains the list of VFR binary files we're going
|
|
# to merge together at the end of the build.
|
|
#
|
|
HII_IFR_PACK_FILES = $(HII_IFR_PACK_FILES) $(DEST_DIR)\$(FILE).hpk
|
|
|
|
[=============================================================================]
|
|
[Compile.Ia32.Fv,Compile.x64.Fv]
|
|
#
|
|
# Run GenSection on the firmware volume image.
|
|
#
|
|
$(DEST_DIR)\$(SOURCE_FV)Fv.sec : $(SOURCE_FILE_NAME) $(INF_FILENAME)
|
|
$(GENSECTION) -I $(SOURCE_FILE_NAME) -O $(DEST_DIR)\$(SOURCE_FV)Fv.sec -S EFI_SECTION_FIRMWARE_VOLUME_IMAGE
|
|
|
|
[=============================================================================]
|