mirror of https://github.com/acidanthera/audk.git
Sync BaseTool trunk (version r2423) into EDKII BaseTools. The change mainly includes:
1. Fix !include issues 2. Fix Trim to skip the postfix 'U' for hexadecimal and decimal numbers 3. Fix building error C2733 when building C++ code. 4. Add GCC46 tool chain definition 5. Add new RVCT and RVCTLINUX tool chains Signed-off-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12782 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
c32dcd284c
commit
2bcc713e74
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -129,7 +129,7 @@
|
|||
"$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}
|
||||
"$(SYMRENAME)" $(SYMRENAME_FLAGS) ${dst}
|
||||
|
||||
<Command.ARMGCC>
|
||||
<Command.ARMGCC, Command.ARMLINUXGCC>
|
||||
"$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}
|
||||
|
||||
|
||||
|
@ -195,10 +195,8 @@
|
|||
$(DEBUG_DIR)(+)${s_dir}(+)${s_base}.c
|
||||
|
||||
<Command>
|
||||
-$(MD) $(OUTPUT_DIR)(+)${s_dir} > NUL 2>&1
|
||||
"$(VFRPP)" $(VFRPP_FLAGS) $(INC) ${src} > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i
|
||||
-$(MD) ${d_path} > NUL 2>&1
|
||||
"$(VFR)" $(VFR_FLAGS) --string-db $(OUTPUT_DIR)(+)$(MODULE_NAME)StrDefs.hpk --output-directory ${d_path} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i
|
||||
"$(VFRPP)" $(VFRPP_FLAGS) $(INC) ${src} > $(OUTPUT_DIR)(+)${s_base}.i
|
||||
"$(VFR)" $(VFR_FLAGS) --string-db $(OUTPUT_DIR)(+)$(MODULE_NAME)StrDefs.hpk --output-directory ${d_path} $(OUTPUT_DIR)(+)${s_base}.i
|
||||
|
||||
[Object-File]
|
||||
<InputFile>
|
||||
|
@ -217,7 +215,7 @@
|
|||
<Command.RVCT>
|
||||
"$(SLINK)" $(SLINK_FLAGS) ${dst} --via $(OBJECT_FILES_LIST)
|
||||
|
||||
<Command.RVCTCYGWIN, Command.ARMGCC>
|
||||
<Command.RVCTCYGWIN, Command.ARMGCC, Command.ARMLINUXGCC>
|
||||
# $(OBJECT_FILES_LIST) has wrong paths for cygwin
|
||||
"$(SLINK)" $(SLINK_FLAGS) ${dst} $(OBJECT_FILES)
|
||||
|
||||
|
@ -241,7 +239,7 @@
|
|||
"$(DLINK)" -o ${dst} $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)
|
||||
"$(OBJCOPY)" $(OBJCOPY_FLAGS) ${dst}
|
||||
|
||||
<Command.ARMGCC>
|
||||
<Command.ARMGCC, Command.ARMLINUXGCC>
|
||||
"$(DLINK)" -o ${dst} $(DLINK_FLAGS) -\( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -\) $(DLINK2_FLAGS)
|
||||
|
||||
<Command.RVCT>
|
||||
|
@ -271,7 +269,7 @@
|
|||
<Command.GCC>
|
||||
"$(DLINK)" $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)
|
||||
|
||||
<Command.ARMGCC>
|
||||
<Command.ARMGCC, Command.ARMLINUXGCC>
|
||||
"$(DLINK)" $(DLINK_FLAGS) -\( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -\) $(DLINK2_FLAGS)
|
||||
|
||||
<Command.RVCT>
|
||||
|
@ -292,7 +290,7 @@
|
|||
<OutputFile>
|
||||
$(DEBUG_DIR)(+)$(MODULE_NAME).efi
|
||||
|
||||
<Command.MSFT, Command.INTEL, Command.RVCT, Command.ARMGCC>
|
||||
<Command.MSFT, Command.INTEL, Command.RVCT, Command.ARMGCC, Command.ARMLINUXGCC>
|
||||
"$(GENFW)" -e $(MODULE_TYPE) -o ${dst} ${src} $(GENFW_FLAGS)
|
||||
$(CP) ${dst} $(OUTPUT_DIR)
|
||||
$(CP) ${dst} $(BIN_DIR)
|
||||
|
@ -513,9 +511,7 @@
|
|||
$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.hpk
|
||||
|
||||
<Command>
|
||||
-$(MD) $(OUTPUT_DIR)(+)${s_dir} > NUL 2>&1
|
||||
"$(VFRPP)" $(VFRPP_FLAGS) $(INC) ${src} > $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i
|
||||
-$(MD) $(OUTPUT_DIR)(+)${s_dir} > NUL 2>&1
|
||||
"$(VFR)" $(VFR_FLAGS) --create-ifr-package --string-db $(OUTPUT_DIR)(+)$(MODULE_NAME)StrDefs.hpk --output-directory $(OUTPUT_DIR)(+)${s_dir} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.i
|
||||
|
||||
[Hii-Binary-Package.UEFI_HII]
|
||||
|
@ -536,7 +532,7 @@
|
|||
"$(GENFW)" -o $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc -g $(MODULE_GUID) --hiibinpackage $(HII_BINARY_PACKAGES) $(GENFW_FLAGS)
|
||||
"$(RC)" $(RC_FLAGS) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc ${dst}
|
||||
|
||||
<Command.XCODE, Command.RVCT, Command.ARMGCC>
|
||||
<Command.XCODE, Command.RVCT, Command.ARMGCC, Command.ARMLINUXGCC>
|
||||
GenFw -o $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc -g $(MODULE_GUID) --hiibinpackage $(HII_BINARY_PACKAGES)
|
||||
|
||||
|
||||
|
|
|
@ -134,6 +134,9 @@ DEFINE GCC44_X64_PREFIX = /usr/bin/
|
|||
DEFINE GCC45_IA32_PREFIX = /usr/bin/
|
||||
DEFINE GCC45_X64_PREFIX = /usr/bin/
|
||||
|
||||
DEFINE GCC46_IA32_PREFIX = /usr/bin/
|
||||
DEFINE GCC46_X64_PREFIX = /usr/bin/
|
||||
|
||||
DEFINE UNIX_IASL_BIN = /usr/bin/iasl
|
||||
#DEFINE UNIX_IASL_BIN = $(HOME)/programs/iasl
|
||||
DEFINE WIN_ASL_BIN_DIR = C:\ASL
|
||||
|
@ -243,6 +246,18 @@ DEFINE CLANG_BIN = /usr/bin/
|
|||
# Required to build platforms or ACPI tables:
|
||||
# Intel(r) ACPI Compiler v20101013 from
|
||||
# http://www.acpica.org/downloads/previous_releases.php
|
||||
# GCC45 -Linux- Requires:
|
||||
# GCC 4.5 (Native)
|
||||
# Optional:
|
||||
# Required to build platforms or ACPI tables:
|
||||
# Intel(r) ACPI Compiler v20101013 from
|
||||
# http://www.acpica.org/downloads/previous_releases.php
|
||||
# GCC46 -Linux- Requires:
|
||||
# GCC 4.6 (Native)
|
||||
# Optional:
|
||||
# Required to build platforms or ACPI tables:
|
||||
# Intel(r) ACPI Compiler v20101013 from
|
||||
# http://www.acpica.org/downloads/previous_releases.php
|
||||
# ELFGCC -Linux- Requires:
|
||||
# GCC(this tool chain uses whatever version of gcc and binutils that is installed in /usr/bin)
|
||||
# Optional:
|
||||
|
@ -467,6 +482,7 @@ DEFINE CLANG_BIN = /usr/bin/
|
|||
# MSFT - Microsoft
|
||||
# GCC - GNU GCC
|
||||
# INTEL - INTEL
|
||||
# RVCT - ARM RealView Toolchain
|
||||
####################################################################################
|
||||
####################################################################################
|
||||
#
|
||||
|
@ -2011,6 +2027,14 @@ DEFINE GCC45_IA32_X64_DLINK_FLAGS = DEF(GCC44_IA32_X64_DLINK_FLAGS)
|
|||
DEFINE GCC45_X64_DLINK_FLAGS = DEF(GCC44_X64_DLINK_FLAGS)
|
||||
DEFINE GCC45_ASM_FLAGS = DEF(GCC44_ASM_FLAGS)
|
||||
|
||||
DEFINE GCC46_IA32_CC_FLAGS = DEF(GCC45_IA32_CC_FLAGS) -Wno-address -Wno-unused-but-set-variable
|
||||
DEFINE GCC46_X64_CC_FLAGS = DEF(GCC45_X64_CC_FLAGS) -Wno-address -Wno-unused-but-set-variable
|
||||
DEFINE GCC46_IA32_X64_DLINK_COMMON = DEF(GCC45_IA32_X64_DLINK_COMMON)
|
||||
DEFINE GCC46_IA32_X64_ASLDLINK_FLAGS = DEF(GCC45_IA32_X64_ASLDLINK_FLAGS)
|
||||
DEFINE GCC46_IA32_X64_DLINK_FLAGS = DEF(GCC45_IA32_X64_DLINK_FLAGS)
|
||||
DEFINE GCC46_X64_DLINK_FLAGS = DEF(GCC45_X64_DLINK_FLAGS)
|
||||
DEFINE GCC46_ASM_FLAGS = DEF(GCC45_ASM_FLAGS)
|
||||
|
||||
####################################################################################
|
||||
#
|
||||
# Unix GCC And Intel Linux ACPI Compiler
|
||||
|
@ -2227,6 +2251,71 @@ DEFINE GCC45_ASM_FLAGS = DEF(GCC44_ASM_FLAGS)
|
|||
*_GCC45_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS)
|
||||
*_GCC45_X64_OBJCOPY_FLAGS =
|
||||
|
||||
####################################################################################
|
||||
#
|
||||
# GCC 4.6 - This configuration is used to compile under Linux to produce
|
||||
# PE/COFF binaries using GCC 4.6.
|
||||
#
|
||||
####################################################################################
|
||||
*_GCC46_*_*_FAMILY = GCC
|
||||
|
||||
*_GCC46_*_MAKE_PATH = make
|
||||
*_GCC46_*_ASL_PATH = DEF(UNIX_IASL_BIN)
|
||||
|
||||
*_GCC46_*_PP_FLAGS = DEF(GCC_PP_FLAGS)
|
||||
*_GCC46_*_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS)
|
||||
*_GCC46_*_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS)
|
||||
*_GCC46_*_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS)
|
||||
*_GCC46_*_APP_FLAGS =
|
||||
*_GCC46_*_ASL_FLAGS = DEF(IASL_FLAGS)
|
||||
*_GCC46_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS)
|
||||
|
||||
##################
|
||||
# GCC46 IA32 definitions
|
||||
##################
|
||||
*_GCC46_IA32_OBJCOPY_PATH = DEF(GCC46_IA32_PREFIX)objcopy
|
||||
*_GCC46_IA32_CC_PATH = DEF(GCC46_IA32_PREFIX)gcc
|
||||
*_GCC46_IA32_SLINK_PATH = DEF(GCC46_IA32_PREFIX)ar
|
||||
*_GCC46_IA32_DLINK_PATH = DEF(GCC46_IA32_PREFIX)ld
|
||||
*_GCC46_IA32_ASLDLINK_PATH = DEF(GCC46_IA32_PREFIX)ld
|
||||
*_GCC46_IA32_ASM_PATH = DEF(GCC46_IA32_PREFIX)gcc
|
||||
*_GCC46_IA32_PP_PATH = DEF(GCC46_IA32_PREFIX)gcc
|
||||
*_GCC46_IA32_VFRPP_PATH = DEF(GCC46_IA32_PREFIX)gcc
|
||||
*_GCC46_IA32_ASLCC_PATH = DEF(GCC46_IA32_PREFIX)gcc
|
||||
*_GCC46_IA32_ASLPP_PATH = DEF(GCC46_IA32_PREFIX)gcc
|
||||
*_GCC46_IA32_RC_PATH = DEF(GCC46_IA32_PREFIX)objcopy
|
||||
|
||||
*_GCC46_IA32_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m32
|
||||
*_GCC46_IA32_ASLDLINK_FLAGS = DEF(GCC46_IA32_X64_ASLDLINK_FLAGS) -m elf_i386
|
||||
*_GCC46_IA32_ASM_FLAGS = DEF(GCC46_ASM_FLAGS) -m32 -march=i386
|
||||
*_GCC46_IA32_CC_FLAGS = DEF(GCC46_IA32_CC_FLAGS) -Os
|
||||
*_GCC46_IA32_DLINK_FLAGS = DEF(GCC46_IA32_X64_DLINK_FLAGS) -m elf_i386 --oformat=elf32-i386
|
||||
*_GCC46_IA32_RC_FLAGS = DEF(GCC_IA32_RC_FLAGS)
|
||||
*_GCC46_IA32_OBJCOPY_FLAGS =
|
||||
|
||||
##################
|
||||
# GCC46 X64 definitions
|
||||
##################
|
||||
*_GCC46_X64_OBJCOPY_PATH = DEF(GCC46_X64_PREFIX)objcopy
|
||||
*_GCC46_X64_CC_PATH = DEF(GCC46_X64_PREFIX)gcc
|
||||
*_GCC46_X64_SLINK_PATH = DEF(GCC46_X64_PREFIX)ar
|
||||
*_GCC46_X64_DLINK_PATH = DEF(GCC46_X64_PREFIX)ld
|
||||
*_GCC46_X64_ASLDLINK_PATH = DEF(GCC46_X64_PREFIX)ld
|
||||
*_GCC46_X64_ASM_PATH = DEF(GCC46_X64_PREFIX)gcc
|
||||
*_GCC46_X64_PP_PATH = DEF(GCC46_X64_PREFIX)gcc
|
||||
*_GCC46_X64_VFRPP_PATH = DEF(GCC46_X64_PREFIX)gcc
|
||||
*_GCC46_X64_ASLCC_PATH = DEF(GCC46_X64_PREFIX)gcc
|
||||
*_GCC46_X64_ASLPP_PATH = DEF(GCC46_X64_PREFIX)gcc
|
||||
*_GCC46_X64_RC_PATH = DEF(GCC46_X64_PREFIX)objcopy
|
||||
|
||||
*_GCC46_X64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m64
|
||||
*_GCC46_X64_ASLDLINK_FLAGS = DEF(GCC46_IA32_X64_ASLDLINK_FLAGS) -m elf_x86_64
|
||||
*_GCC46_X64_ASM_FLAGS = DEF(GCC46_ASM_FLAGS) -m64 -melf_x86_64
|
||||
*_GCC46_X64_CC_FLAGS = DEF(GCC46_X64_CC_FLAGS)
|
||||
*_GCC46_X64_DLINK_FLAGS = DEF(GCC46_X64_DLINK_FLAGS)
|
||||
*_GCC46_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS)
|
||||
*_GCC46_X64_OBJCOPY_FLAGS =
|
||||
|
||||
####################################################################################
|
||||
#
|
||||
# Cygwin GCC And Intel ACPI Compiler
|
||||
|
@ -4173,11 +4262,69 @@ RELEASE_ARMGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittle-end
|
|||
*_ARMGCC_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
|
||||
|
||||
*_ARMGCC_ARM_SLINK_FLAGS = -rc
|
||||
*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) --oformat=elf32-littlearm --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
|
||||
*_ARMGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) -Ttext=0x0 --oformat=elf32-littlearm --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
|
||||
|
||||
DEBUG_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -combine -O0
|
||||
RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -combine -Wno-unused
|
||||
|
||||
####################################################################################
|
||||
#
|
||||
# ARM GNU/Linux GCC
|
||||
#
|
||||
####################################################################################
|
||||
# ARMLINUXGCC - ARM version of the GCC cross compiler
|
||||
|
||||
*_ARMLINUXGCC_*_*_FAMILY = GCC
|
||||
*_ARMLINUXGCC_*_*_BUILDRULEFAMILY = ARMLINUXGCC
|
||||
|
||||
*_ARMLINUXGCC_*_MAKE_PATH = make
|
||||
*_ARMLINUXGCC_*_MAKE_FLAGS = --no-print-directory
|
||||
|
||||
##################
|
||||
# ASL definitions
|
||||
##################
|
||||
*_ARMLINUXGCC_*_ASL_PATH = DEF(UNIX_IASL_BIN)
|
||||
*_ARMLINUXGCC_*_ASL_FLAGS = DEF(IASL_FLAGS)
|
||||
*_ARMLINUXGCC_*_ASL_OUTFLAGS = DEF(IASL_OUTFLAGS)
|
||||
*_ARMLINUXGCC_*_ASLPP_FLAGS = -x c -E -P
|
||||
*_ARMLINUXGCC_*_ASLCC_FLAGS = -x c
|
||||
*_ARMLINUXGCC_*_ASLDLINK_FLAGS = DEF(GCC_DLINK_FLAGS_COMMON) --entry _ReferenceAcpiTable
|
||||
|
||||
##################
|
||||
# ARM definitions
|
||||
##################
|
||||
|
||||
*_ARMLINUXGCC_ARM_ASLCC_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
|
||||
*_ARMLINUXGCC_ARM_ASLDLINK_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-ld
|
||||
*_ARMLINUXGCC_ARM_ASLPP_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
|
||||
|
||||
*_ARMLINUXGCC_ARM_CC_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
|
||||
*_ARMLINUXGCC_ARM_SLINK_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-ar
|
||||
*_ARMLINUXGCC_ARM_DLINK_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-ld
|
||||
*_ARMLINUXGCC_ARM_ASM_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-as
|
||||
*_ARMLINUXGCC_ARM_PP_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
|
||||
*_ARMLINUXGCC_ARM_VFRPP_PATH = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
|
||||
|
||||
#
|
||||
# Use default values, or override in DSC file
|
||||
#
|
||||
*_ARMLINUXGCC_ARM_ARCHCC_FLAGS = -mthumb
|
||||
*_ARMLINUXGCC_ARM_ARCHASM_FLAGS =
|
||||
*_ARMLINUXGCC_ARM_ARCHDLINK_FLAGS =
|
||||
*_ARMLINUXGCC_ARM_PLATFORM_FLAGS = -march=armv7-a
|
||||
|
||||
DEBUG_ARMLINUXGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittle-endian -g
|
||||
RELEASE_ARMLINUXGCC_ARM_ASM_FLAGS = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittle-endian
|
||||
|
||||
*_ARMLINUXGCC_ARM_PP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
|
||||
*_ARMLINUXGCC_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
|
||||
|
||||
*_ARMLINUXGCC_ARM_SLINK_FLAGS = -rc
|
||||
*_ARMLINUXGCC_ARM_DLINK_FLAGS = $(ARCHDLINK_FLAGS) --oformat=elf32-littlearm --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
|
||||
|
||||
DEBUG_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -Wno-address -O0
|
||||
RELEASE_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -Wno-address -Wno-unused-but-set-variable
|
||||
|
||||
#################
|
||||
# ASM 16 linker defintions
|
||||
#################
|
||||
|
|
|
@ -553,7 +553,7 @@ Returns:
|
|||
EFI_FIRMWARE_VOLUME_HEADER *hdr = (EFI_FIRMWARE_VOLUME_HEADER*)Fv;
|
||||
|
||||
EFI_FFS_FILE_HEADER *fhdr = NULL;
|
||||
EFI_FVB_ATTRIBUTES FvbAttributes;
|
||||
EFI_FVB_ATTRIBUTES_2 FvbAttributes;
|
||||
UINTN offset;
|
||||
UINTN fsize;
|
||||
UINTN newSize;
|
||||
|
@ -869,7 +869,7 @@ Returns:
|
|||
EFI_FIRMWARE_VOLUME_HEADER *hdr = (EFI_FIRMWARE_VOLUME_HEADER*)Fv;
|
||||
|
||||
EFI_FFS_FILE_HEADER *fhdr = NULL;
|
||||
EFI_FVB_ATTRIBUTES FvbAttributes;
|
||||
EFI_FVB_ATTRIBUTES_2 FvbAttributes;
|
||||
UINTN fsize;
|
||||
|
||||
EFI_STATUS Status;
|
||||
|
|
|
@ -84,7 +84,7 @@ CHAR8 *mFvbAlignmentName[] = {
|
|||
EFI_FVB2_ALIGNMENT_64K_STRING,
|
||||
EFI_FVB2_ALIGNMENT_128K_STRING,
|
||||
EFI_FVB2_ALIGNMENT_256K_STRING,
|
||||
EFI_FVB2_ALIGNMNET_512K_STRING,
|
||||
EFI_FVB2_ALIGNMENT_512K_STRING,
|
||||
EFI_FVB2_ALIGNMENT_1M_STRING,
|
||||
EFI_FVB2_ALIGNMENT_2M_STRING,
|
||||
EFI_FVB2_ALIGNMENT_4M_STRING,
|
||||
|
@ -1535,7 +1535,7 @@ Returns:
|
|||
//
|
||||
Status = FindApResetVectorPosition (FvImage, &BytePointer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Error (NULL, 0, 3000, "Invalid", "Cannot find the appropriate location in FvImage to add Ap reset vector!");
|
||||
Error (NULL, 0, 3000, "Invalid", "FV image does not have enough space to place AP reset vector. The FV image needs to reserve at least 4KB of unused space.");
|
||||
return EFI_ABORTED;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2004 - 2011, 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
|
||||
|
@ -130,7 +130,7 @@ Abstract:
|
|||
#define EFI_FVB2_ALIGNMENT_64K_STRING "EFI_FVB2_ALIGNMENT_64K"
|
||||
#define EFI_FVB2_ALIGNMENT_128K_STRING "EFI_FVB2_ALIGNMENT_128K"
|
||||
#define EFI_FVB2_ALIGNMENT_256K_STRING "EFI_FVB2_ALIGNMENT_256K"
|
||||
#define EFI_FVB2_ALIGNMNET_512K_STRING "EFI_FVB2_ALIGNMENT_512K"
|
||||
#define EFI_FVB2_ALIGNMENT_512K_STRING "EFI_FVB2_ALIGNMENT_512K"
|
||||
#define EFI_FVB2_ALIGNMENT_1M_STRING "EFI_FVB2_ALIGNMENT_1M"
|
||||
#define EFI_FVB2_ALIGNMENT_2M_STRING "EFI_FVB2_ALIGNMENT_2M"
|
||||
#define EFI_FVB2_ALIGNMENT_4M_STRING "EFI_FVB2_ALIGNMENT_4M"
|
||||
|
@ -226,7 +226,7 @@ typedef struct {
|
|||
BOOLEAN FvNameGuidSet;
|
||||
CHAR8 FvExtHeaderFile[_MAX_PATH];
|
||||
UINTN Size;
|
||||
EFI_FVB_ATTRIBUTES FvAttributes;
|
||||
EFI_FVB_ATTRIBUTES_2 FvAttributes;
|
||||
CHAR8 FvName[_MAX_PATH];
|
||||
EFI_FV_BLOCK_MAP_ENTRY FvBlocks[MAX_NUMBER_OF_FV_BLOCKS];
|
||||
CHAR8 FvFiles[MAX_NUMBER_OF_FILES_IN_FV][_MAX_PATH];
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
//This file is for build version number auto generation
|
||||
//
|
||||
#define __BUILD_VERSION "Build 2396"
|
||||
#define __BUILD_VERSION "Build 2423"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
The firmware volume related definitions in PI.
|
||||
|
||||
Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2011, 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
|
||||
|
@ -14,7 +14,7 @@
|
|||
File Name: PiFirmwareVolume.h
|
||||
|
||||
@par Revision Reference:
|
||||
Version 1.0.
|
||||
Version 1.2C
|
||||
|
||||
**/
|
||||
|
||||
|
@ -33,7 +33,7 @@ typedef UINT32 EFI_FV_FILE_ATTRIBUTES;
|
|||
#define EFI_FV_FILE_ATTRIB_FIXED 0x00000100
|
||||
#define EFI_FV_FILE_ATTRIB_MEMORY_MAPPED 0x00000200
|
||||
|
||||
typedef UINT32 EFI_FVB_ATTRIBUTES;
|
||||
typedef UINT32 EFI_FVB_ATTRIBUTES_2;
|
||||
|
||||
//
|
||||
// Attributes bit definitions
|
||||
|
@ -73,7 +73,7 @@ typedef UINT32 EFI_FVB_ATTRIBUTES;
|
|||
#define EFI_FVB2_ALIGNMENT_64K 0x00100000
|
||||
#define EFI_FVB2_ALIGNMENT_128K 0x00110000
|
||||
#define EFI_FVB2_ALIGNMENT_256K 0x00120000
|
||||
#define EFI_FVB2_ALIGNMNET_512K 0x00130000
|
||||
#define EFI_FVB2_ALIGNMENT_512K 0x00130000
|
||||
#define EFI_FVB2_ALIGNMENT_1M 0x00140000
|
||||
#define EFI_FVB2_ALIGNMENT_2M 0x00150000
|
||||
#define EFI_FVB2_ALIGNMENT_4M 0x00160000
|
||||
|
@ -101,7 +101,7 @@ typedef struct {
|
|||
EFI_GUID FileSystemGuid;
|
||||
UINT64 FvLength;
|
||||
UINT32 Signature;
|
||||
EFI_FVB_ATTRIBUTES Attributes;
|
||||
EFI_FVB_ATTRIBUTES_2 Attributes;
|
||||
UINT16 HeaderLength;
|
||||
UINT16 Checksum;
|
||||
UINT16 ExtHeaderOffset;
|
||||
|
@ -139,8 +139,20 @@ typedef struct {
|
|||
// Array of GUIDs.
|
||||
// Each GUID represents an OEM file type.
|
||||
//
|
||||
EFI_GUID Types[1];
|
||||
// EFI_GUID Types[1];
|
||||
//
|
||||
} EFI_FIRMWARE_VOLUME_EXT_ENTRY_OEM_TYPE;
|
||||
|
||||
#define EFI_FV_EXT_TYPE_GUID_TYPE 0x0002
|
||||
typedef struct {
|
||||
EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr;
|
||||
EFI_GUID FormatType;
|
||||
|
||||
//
|
||||
// An arry of bytes of length Length.
|
||||
//
|
||||
// UINT8 Data[1];
|
||||
//
|
||||
} EFI_FIRMWARE_VOLUME_EXT_ENTRY_GUID_TYPE;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -670,6 +670,25 @@ CFormPkg::DeclarePendingQuestion (
|
|||
Info.mVarType = EFI_IFR_TYPE_NUM_SIZE_8;
|
||||
}
|
||||
CNObj.SetFlags (0, Info.mVarType);
|
||||
//
|
||||
// Use maximum value not to limit the vaild value for the undefined question.
|
||||
//
|
||||
switch (Info.mVarType) {
|
||||
case EFI_IFR_TYPE_NUM_SIZE_64:
|
||||
CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0);
|
||||
break;
|
||||
case EFI_IFR_TYPE_NUM_SIZE_32:
|
||||
CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0);
|
||||
break;
|
||||
case EFI_IFR_TYPE_NUM_SIZE_16:
|
||||
CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0);
|
||||
break;
|
||||
case EFI_IFR_TYPE_NUM_SIZE_8:
|
||||
CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// For undefined Efi VarStore type question
|
||||
|
|
|
@ -1989,6 +1989,7 @@ vfrStatementDate :
|
|||
Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","
|
||||
Help "=" "STRING_TOKEN" "\(" DH:Number "\)" ","
|
||||
minMaxDateStepDefault[Val.date, 2]
|
||||
{ G:FLAGS "=" vfrDateFlags[DObj, G->getLine()] "," }
|
||||
<<
|
||||
mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);
|
||||
DObj.SetQuestionId (QId);
|
||||
|
@ -2449,6 +2450,7 @@ vfrStatementTime :
|
|||
Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","
|
||||
Help "=" "STRING_TOKEN" "\(" SH:Number "\)" ","
|
||||
minMaxTimeStepDefault[Val.time, 2]
|
||||
{ G:FLAGS "=" vfrTimeFlags[TObj, G->getLine()] "," }
|
||||
<<
|
||||
mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId);
|
||||
TObj.SetQuestionId (QId);
|
||||
|
@ -3216,7 +3218,7 @@ vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
|||
| ideqvalExp[$RootLevel, $ExpOpCount]
|
||||
| ideqidExp[$RootLevel, $ExpOpCount]
|
||||
| ideqvallistExp[$RootLevel, $ExpOpCount]
|
||||
| questionref13Exp[$RootLevel, $ExpOpCount]
|
||||
| questionref1Exp[$RootLevel, $ExpOpCount]
|
||||
| rulerefExp[$RootLevel, $ExpOpCount]
|
||||
| stringref1Exp[$RootLevel, $ExpOpCount]
|
||||
| pushthisExp[$RootLevel, $ExpOpCount]
|
||||
|
@ -3451,50 +3453,26 @@ ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
|||
>>
|
||||
;
|
||||
|
||||
questionref13Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
||||
questionref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
||||
<<
|
||||
UINT8 Type = 0x1;
|
||||
EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;
|
||||
EFI_GUID Guid = {0,};
|
||||
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
|
||||
UINT32 BitMask;
|
||||
CHAR8 *QName = NULL;
|
||||
UINT32 LineNo = 0;
|
||||
>>
|
||||
L:QuestionRef
|
||||
(
|
||||
(
|
||||
<< Type = 0x3; >>
|
||||
{
|
||||
Path "=" "STRING_TOKEN" "\(" S:Number "\)" << Type = 0x4; DevPath = _STOSID(S->getText()); >>
|
||||
}
|
||||
{
|
||||
Uuid "=" guidDefinition[Guid] << Type = 0x5; >>
|
||||
}
|
||||
)
|
||||
|
|
||||
(
|
||||
"\("
|
||||
(
|
||||
"\("
|
||||
(
|
||||
QN:StringIdentifier <<
|
||||
QName = QN->getText();
|
||||
LineNo = QN->getLine();
|
||||
LineNo = QN->getLine();
|
||||
mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);
|
||||
>>
|
||||
| ID:Number << QId = _STOQID(ID->getText()); >>
|
||||
)
|
||||
"\)"
|
||||
)
|
||||
)
|
||||
"\)"
|
||||
<<
|
||||
switch (Type) {
|
||||
case 0x1: {CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); break;}
|
||||
case 0x3: {CIfrQuestionRef3 QR3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3Obj, ($ExpOpCount == 0), L->getLine()); break;}
|
||||
case 0x4: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}
|
||||
case 0x5: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0), L->getLine()); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}
|
||||
}
|
||||
$ExpOpCount++;
|
||||
>>
|
||||
{ CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0), L->getLine()); QR1Obj.SetQuestionId (QId, QName, LineNo); } $ExpOpCount++; >>
|
||||
;
|
||||
|
||||
rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
||||
|
@ -3626,7 +3604,7 @@ vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
|||
vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
||||
lengthExp[$RootLevel, $ExpOpCount]
|
||||
| bitwisenotExp[$RootLevel, $ExpOpCount]
|
||||
| question2refExp[$RootLevel, $ExpOpCount]
|
||||
| question23refExp[$RootLevel, $ExpOpCount]
|
||||
| stringref2Exp[$RootLevel, $ExpOpCount]
|
||||
| toboolExp[$RootLevel, $ExpOpCount]
|
||||
| tostringExp[$RootLevel, $ExpOpCount]
|
||||
|
@ -3648,10 +3626,30 @@ bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
|||
<< { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>
|
||||
;
|
||||
|
||||
question2refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
||||
question23refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
||||
<<
|
||||
UINT8 Type = 0x1;
|
||||
EFI_STRING_ID DevPath = EFI_STRING_ID_INVALID;
|
||||
EFI_GUID Guid = {0,};
|
||||
>>
|
||||
L:QuestionRefVal
|
||||
"\(" vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount] "\)"
|
||||
<< { CIfrQuestionRef2 QR2Obj(L->getLine()); $ExpOpCount++; } >>
|
||||
"\("
|
||||
{
|
||||
DevicePath "=" "STRING_TOKEN" "\(" S:Number "\)" "," << Type = 0x2; DevPath = _STOSID(S->getText()); >>
|
||||
}
|
||||
{
|
||||
Uuid "=" guidDefinition[Guid] "," << Type = 0x3; >>
|
||||
}
|
||||
vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]
|
||||
"\)"
|
||||
<<
|
||||
switch (Type) {
|
||||
case 0x1: {CIfrQuestionRef2 QR2Obj(L->getLine()); _SAVE_OPHDR_COND (QR2Obj, ($ExpOpCount == 0), L->getLine()); break;}
|
||||
case 0x2: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0), L->getLine()); QR3_2Obj.SetDevicePath (DevPath); break;}
|
||||
case 0x3: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0), L->getLine()); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}
|
||||
}
|
||||
$ExpOpCount++;
|
||||
>>
|
||||
;
|
||||
|
||||
stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 1999 - 2011, 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
|
||||
|
@ -845,8 +845,8 @@ Returns:
|
|||
printf (" EFI_FVB2_ALIGNMENT_256K\n");
|
||||
}
|
||||
|
||||
if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMNET_512K) {
|
||||
printf (" EFI_FVB2_ALIGNMNET_512K\n");
|
||||
if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512K) {
|
||||
printf (" EFI_FVB2_ALIGNMENT_512K\n");
|
||||
}
|
||||
|
||||
if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1M) {
|
||||
|
|
|
@ -310,11 +310,14 @@ gAutoGenHPrologueString = TemplateString("""
|
|||
#ifndef _${File}_${Guid}
|
||||
#define _${File}_${Guid}
|
||||
|
||||
""")
|
||||
|
||||
gAutoGenHCppPrologueString = """
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
""")
|
||||
"""
|
||||
|
||||
gAutoGenHEpilogueString = """
|
||||
|
||||
|
@ -1970,6 +1973,7 @@ def CreateHeaderCode(Info, AutoGenC, AutoGenH):
|
|||
AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'}))
|
||||
# header file Prologue
|
||||
AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')}))
|
||||
AutoGenH.Append(gAutoGenHCppPrologueString)
|
||||
if Info.AutoGenVersion >= 0x00010005:
|
||||
# header files includes
|
||||
AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile)
|
||||
|
|
|
@ -31,6 +31,8 @@ gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n
|
|||
## Regular expression for matching macro used in header file inclusion
|
||||
gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE)
|
||||
|
||||
gIsFileMap = {}
|
||||
|
||||
## pattern for include style in Edk.x code
|
||||
gProtocolDefinition = "Protocol/%(HeaderKey)s/%(HeaderKey)s.h"
|
||||
gGuidDefinition = "Guid/%(HeaderKey)s/%(HeaderKey)s.h"
|
||||
|
@ -421,6 +423,7 @@ cleanlib:
|
|||
self.FileListMacros = {}
|
||||
self.ListFileMacros = {}
|
||||
|
||||
self.FileCache = {}
|
||||
self.FileDependency = []
|
||||
self.LibraryBuildCommandList = []
|
||||
self.LibraryFileList = []
|
||||
|
@ -722,24 +725,26 @@ cleanlib:
|
|||
EdkLogger.debug(EdkLogger.DEBUG_1, "Try to get dependency files for %s" % File)
|
||||
FileStack = [File] + ForceList
|
||||
DependencySet = set()
|
||||
MacroUsedByIncludedFile = False
|
||||
|
||||
if self._AutoGenObject.Arch not in gDependencyDatabase:
|
||||
gDependencyDatabase[self._AutoGenObject.Arch] = {}
|
||||
DepDb = gDependencyDatabase[self._AutoGenObject.Arch]
|
||||
|
||||
# add path of given source file into search path list.
|
||||
if File.Dir not in SearchPathList:
|
||||
SearchPathList.append(File.Dir)
|
||||
while len(FileStack) > 0:
|
||||
F = FileStack.pop()
|
||||
|
||||
FullPathDependList = []
|
||||
if F in self.FileCache:
|
||||
for CacheFile in self.FileCache[F]:
|
||||
FullPathDependList.append(CacheFile)
|
||||
if CacheFile not in DependencySet:
|
||||
FileStack.append(CacheFile)
|
||||
DependencySet.update(FullPathDependList)
|
||||
continue
|
||||
|
||||
CurrentFileDependencyList = []
|
||||
if F in DepDb:
|
||||
CurrentFileDependencyList = DepDb[F]
|
||||
for Dep in CurrentFileDependencyList:
|
||||
if Dep not in FileStack and Dep not in DependencySet:
|
||||
FileStack.append(Dep)
|
||||
else:
|
||||
try:
|
||||
Fd = open(F.Path, 'r')
|
||||
|
@ -755,7 +760,6 @@ cleanlib:
|
|||
FileContent = unicode(FileContent, "utf-16")
|
||||
IncludedFileList = gIncludePattern.findall(FileContent)
|
||||
|
||||
CurrentFilePath = F.Dir
|
||||
for Inc in IncludedFileList:
|
||||
Inc = Inc.strip()
|
||||
# if there's macro used to reference header file, expand it
|
||||
|
@ -766,41 +770,44 @@ cleanlib:
|
|||
if HeaderType in gIncludeMacroConversion:
|
||||
Inc = gIncludeMacroConversion[HeaderType] % {"HeaderKey" : HeaderKey}
|
||||
else:
|
||||
# not known macro used in #include
|
||||
MacroUsedByIncludedFile = True
|
||||
continue
|
||||
# not known macro used in #include, always build the file by
|
||||
# returning a empty dependency
|
||||
self.FileCache[File] = []
|
||||
return []
|
||||
Inc = os.path.normpath(Inc)
|
||||
for SearchPath in [CurrentFilePath] + SearchPathList:
|
||||
FilePath = os.path.join(SearchPath, Inc)
|
||||
if not os.path.isfile(FilePath) or FilePath in CurrentFileDependencyList:
|
||||
CurrentFileDependencyList.append(Inc)
|
||||
DepDb[F] = CurrentFileDependencyList
|
||||
|
||||
CurrentFilePath = F.Dir
|
||||
PathList = [CurrentFilePath] + SearchPathList
|
||||
for Inc in CurrentFileDependencyList:
|
||||
for SearchPath in PathList:
|
||||
FilePath = os.path.join(SearchPath, Inc)
|
||||
if FilePath in gIsFileMap:
|
||||
if not gIsFileMap[FilePath]:
|
||||
continue
|
||||
FilePath = PathClass(FilePath)
|
||||
CurrentFileDependencyList.append(FilePath)
|
||||
if FilePath not in FileStack and FilePath not in DependencySet:
|
||||
FileStack.append(FilePath)
|
||||
break
|
||||
# If isfile is called too many times, the performance is slow down.
|
||||
elif not os.path.isfile(FilePath):
|
||||
gIsFileMap[FilePath] = False
|
||||
continue
|
||||
else:
|
||||
EdkLogger.debug(EdkLogger.DEBUG_9, "%s included by %s was not found "\
|
||||
"in any given path:\n\t%s" % (Inc, F, "\n\t".join(SearchPathList)))
|
||||
gIsFileMap[FilePath] = True
|
||||
FilePath = PathClass(FilePath)
|
||||
FullPathDependList.append(FilePath)
|
||||
if FilePath not in DependencySet:
|
||||
FileStack.append(FilePath)
|
||||
break
|
||||
else:
|
||||
EdkLogger.debug(EdkLogger.DEBUG_9, "%s included by %s was not found "\
|
||||
"in any given path:\n\t%s" % (Inc, F, "\n\t".join(SearchPathList)))
|
||||
|
||||
if not MacroUsedByIncludedFile:
|
||||
if F == File:
|
||||
CurrentFileDependencyList += ForceList
|
||||
#
|
||||
# Don't keep the file in cache if it uses macro in included file.
|
||||
# So it will be scanned again if another file includes this file.
|
||||
#
|
||||
DepDb[F] = CurrentFileDependencyList
|
||||
DependencySet.update(CurrentFileDependencyList)
|
||||
self.FileCache[F] = FullPathDependList
|
||||
DependencySet.update(FullPathDependList)
|
||||
|
||||
#
|
||||
# If there's macro used in included file, always build the file by
|
||||
# returning a empty dependency
|
||||
#
|
||||
if MacroUsedByIncludedFile:
|
||||
DependencyList = []
|
||||
else:
|
||||
DependencyList = list(DependencySet) # remove duplicate ones
|
||||
DependencySet.update(ForceList)
|
||||
if File in DependencySet:
|
||||
DependencySet.remove(File)
|
||||
DependencyList = list(DependencySet) # remove duplicate ones
|
||||
|
||||
return DependencyList
|
||||
|
||||
|
@ -1314,16 +1321,16 @@ ${END}\t@cd $(BUILD_DIR)\n
|
|||
# macros passed to GenFds
|
||||
MacroList.append('"%s=%s"' % ("EFI_SOURCE", GlobalData.gEfiSource.replace('\\', '\\\\')))
|
||||
MacroList.append('"%s=%s"' % ("EDK_SOURCE", GlobalData.gEdkSource.replace('\\', '\\\\')))
|
||||
for MacroName in GlobalData.gGlobalDefines:
|
||||
if GlobalData.gGlobalDefines[MacroName] != "":
|
||||
MacroList.append('"%s=%s"' % (MacroName, GlobalData.gGlobalDefines[MacroName].replace('\\', '\\\\')))
|
||||
MacroDict = {}
|
||||
MacroDict.update(GlobalData.gGlobalDefines)
|
||||
MacroDict.update(GlobalData.gCommandLineDefines)
|
||||
MacroDict.pop("EFI_SOURCE", "dummy")
|
||||
MacroDict.pop("EDK_SOURCE", "dummy")
|
||||
for MacroName in MacroDict:
|
||||
if MacroDict[MacroName] != "":
|
||||
MacroList.append('"%s=%s"' % (MacroName, MacroDict[MacroName].replace('\\', '\\\\')))
|
||||
else:
|
||||
MacroList.append('"%s"' % MacroName)
|
||||
for MacroName in GlobalData.gCommandLineDefines:
|
||||
if GlobalData.gCommandLineDefines[MacroName] != "":
|
||||
MacroList.append('"%s=%s"' % (MacroName, GlobalData.gCommandLineDefines[MacroName].replace('\\', '\\\\')))
|
||||
else:
|
||||
MacroList.append('"%s"' % MacroName)
|
||||
else:
|
||||
FdfFileList = []
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ OFFSET = 'offset'
|
|||
STRING = 'string'
|
||||
TO = 'to'
|
||||
STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)
|
||||
COMPATIBLE_STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Za-z0-9_]+) *\)', re.MULTILINE | re.UNICODE)
|
||||
COMPATIBLE_STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)
|
||||
|
||||
EFI_HII_ARRAY_SIZE_LENGTH = 4
|
||||
EFI_HII_PACKAGE_HEADER_LENGTH = 4
|
||||
|
|
|
@ -260,7 +260,7 @@ class UniFileClassObject(object):
|
|||
|
||||
Name = Item.split()[1]
|
||||
# Check the string name is the upper character
|
||||
if not self.IsCompatibleMode and Name != '':
|
||||
if Name != '':
|
||||
MatchString = re.match('[A-Z0-9_]+', Name, re.UNICODE)
|
||||
if MatchString == None or MatchString.end(0) != len(Name):
|
||||
EdkLogger.error('Unicode File Parser', FORMAT_INVALID, 'The string token name %s defined in UNI file %s contains the invalid lower case character.' %(Name, self.File))
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#This file is for build version number auto generation
|
||||
#
|
||||
gBUILD_VERSION = "Build 2396"
|
||||
gBUILD_VERSION = "Build 2423"
|
||||
|
|
|
@ -1,580 +0,0 @@
|
|||
## @file
|
||||
# This file is used to define each component of DEC file in light mode
|
||||
#
|
||||
# Copyright (c) 2008, 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.
|
||||
#
|
||||
|
||||
##
|
||||
# Import Modules
|
||||
#
|
||||
import os
|
||||
from Misc import GetFiles
|
||||
from String import *
|
||||
from DataType import *
|
||||
from CommonDataClass.PackageClass import *
|
||||
from CommonDataClass import CommonClass
|
||||
from BuildToolError import *
|
||||
from Parsing import *
|
||||
|
||||
# Global variable
|
||||
Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN,
|
||||
TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER,
|
||||
TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE,
|
||||
TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,
|
||||
TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT,
|
||||
TAB_GUIDS.upper() : MODEL_EFI_GUID,
|
||||
TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL,
|
||||
TAB_PPIS.upper() : MODEL_EFI_PPI,
|
||||
TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD,
|
||||
TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE,
|
||||
TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG,
|
||||
TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX,
|
||||
TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC,
|
||||
TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION
|
||||
}
|
||||
|
||||
## DecObject
|
||||
#
|
||||
# This class defined basic Dec object which is used by inheriting
|
||||
#
|
||||
# @param object: Inherited from object class
|
||||
#
|
||||
class DecObject(object):
|
||||
def __init__(self):
|
||||
object.__init__()
|
||||
|
||||
## Dec
|
||||
#
|
||||
# This class defined the structure used in Dec object
|
||||
#
|
||||
# @param DecObject: Inherited from DecObject class
|
||||
# @param Filename: Input value for Filename of Dec file, default is None
|
||||
# @param IsMergeAllArches: Input value for IsMergeAllArches
|
||||
# True is to merge all arches
|
||||
# Fales is not to merge all arches
|
||||
# default is False
|
||||
# @param IsToPackage: Input value for IsToPackage
|
||||
# True is to transfer to PackageObject automatically
|
||||
# False is not to transfer to PackageObject automatically
|
||||
# default is False
|
||||
# @param WorkspaceDir: Input value for current workspace directory, default is None
|
||||
#
|
||||
# @var Identification: To store value for Identification, it is a structure as Identification
|
||||
# @var Defines: To store value for Defines, it is a structure as DecDefines
|
||||
# @var UserExtensions: To store value for UserExtensions
|
||||
# @var Package: To store value for Package, it is a structure as PackageClass
|
||||
# @var WorkspaceDir: To store value for WorkspaceDir
|
||||
# @var Contents: To store value for Contents, it is a structure as DecContents
|
||||
# @var KeyList: To store value for KeyList, a list for all Keys used in Dec
|
||||
#
|
||||
class Dec(DecObject):
|
||||
def __init__(self, Filename=None, IsToPackage=False, WorkspaceDir=None, AllGuidVersionDict=None, SupArchList=DataType.ARCH_LIST):
|
||||
self.Identification = IdentificationClass()
|
||||
self.Package = PackageClass()
|
||||
self.UserExtensions = ''
|
||||
self.WorkspaceDir = WorkspaceDir
|
||||
self.SupArchList = SupArchList
|
||||
self.AllGuidVersionDict = {}
|
||||
if AllGuidVersionDict:
|
||||
self.AllGuidVersionDict = AllGuidVersionDict
|
||||
|
||||
self.KeyList = [
|
||||
TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \
|
||||
TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \
|
||||
TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEC_DEFINES
|
||||
]
|
||||
# Upper all KEYs to ignore case sensitive when parsing
|
||||
self.KeyList = map(lambda c: c.upper(), self.KeyList)
|
||||
|
||||
# Init RecordSet
|
||||
self.RecordSet = {}
|
||||
for Key in self.KeyList:
|
||||
self.RecordSet[Section[Key]] = []
|
||||
|
||||
# Init Comment
|
||||
self.SectionHeaderCommentDict = {}
|
||||
|
||||
# Load Dec file if filename is not None
|
||||
if Filename != None:
|
||||
self.LoadDecFile(Filename)
|
||||
|
||||
# Transfer to Package Object if IsToPackage is True
|
||||
if IsToPackage:
|
||||
self.DecToPackage()
|
||||
|
||||
## Load Dec file
|
||||
#
|
||||
# Load the file if it exists
|
||||
#
|
||||
# @param Filename: Input value for filename of Dec file
|
||||
#
|
||||
def LoadDecFile(self, Filename):
|
||||
# Insert a record for file
|
||||
Filename = NormPath(Filename)
|
||||
self.Identification.FullPath = Filename
|
||||
(self.Identification.RelaPath, self.Identification.FileName) = os.path.split(Filename)
|
||||
if self.Identification.FullPath.find(self.WorkspaceDir) > -1:
|
||||
self.Identification.PackagePath = os.path.dirname(self.Identification.FullPath[len(self.WorkspaceDir) + 1:])
|
||||
|
||||
# Init common datas
|
||||
IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \
|
||||
[], [], TAB_UNKNOWN, [], [], []
|
||||
LineNo = 0
|
||||
|
||||
# Parse file content
|
||||
IsFindBlockComment = False
|
||||
ReservedLine = ''
|
||||
Comment = ''
|
||||
for Line in open(Filename, 'r'):
|
||||
LineNo = LineNo + 1
|
||||
# Remove comment block
|
||||
if Line.find(TAB_COMMENT_EDK_START) > -1:
|
||||
ReservedLine = GetSplitList(Line, TAB_COMMENT_EDK_START, 1)[0]
|
||||
if ReservedLine.strip().startswith(TAB_COMMENT_SPLIT):
|
||||
Comment = Comment + Line.strip() + '\n'
|
||||
ReservedLine = ''
|
||||
else:
|
||||
Comment = Comment + Line[len(ReservedLine):] + '\n'
|
||||
IsFindBlockComment = True
|
||||
if not ReservedLine:
|
||||
continue
|
||||
if Line.find(TAB_COMMENT_EDK_END) > -1:
|
||||
Comment = Comment + Line[:Line.find(TAB_COMMENT_EDK_END) + len(TAB_COMMENT_EDK_END)] + '\n'
|
||||
Line = ReservedLine + GetSplitList(Line, TAB_COMMENT_EDK_END, 1)[1]
|
||||
ReservedLine = ''
|
||||
IsFindBlockComment = False
|
||||
if IsFindBlockComment:
|
||||
Comment = Comment + Line.strip() + '\n'
|
||||
continue
|
||||
|
||||
# Remove comments at tail and remove spaces again
|
||||
if Line.strip().startswith(TAB_COMMENT_SPLIT) or Line.strip().startswith('--/'):
|
||||
Comment = Comment + Line.strip() + '\n'
|
||||
Line = CleanString(Line)
|
||||
if Line == '':
|
||||
continue
|
||||
|
||||
## Find a new section tab
|
||||
# First insert previous section items
|
||||
# And then parse the content of the new section
|
||||
#
|
||||
if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):
|
||||
# Insert items data of previous section
|
||||
Model = Section[CurrentSection.upper()]
|
||||
InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)
|
||||
# Parse the new section
|
||||
SectionItemList = []
|
||||
ArchList = []
|
||||
ThirdList = []
|
||||
|
||||
CurrentSection = ''
|
||||
LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)
|
||||
for Item in LineList:
|
||||
ItemList = GetSplitValueList(Item, TAB_SPLIT)
|
||||
if CurrentSection == '':
|
||||
CurrentSection = ItemList[0]
|
||||
else:
|
||||
if CurrentSection != ItemList[0]:
|
||||
EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)
|
||||
if CurrentSection.upper() not in self.KeyList:
|
||||
RaiseParserError(Line, CurrentSection, Filename, '', LineNo)
|
||||
ItemList.append('')
|
||||
ItemList.append('')
|
||||
if len(ItemList) > 5:
|
||||
RaiseParserError(Line, CurrentSection, Filename, '', LineNo)
|
||||
else:
|
||||
if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:
|
||||
EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)
|
||||
ArchList.append(ItemList[1].upper())
|
||||
ThirdList.append(ItemList[2])
|
||||
|
||||
if Comment:
|
||||
if Comment.endswith('\n'):
|
||||
Comment = Comment[:len(Comment) - len('\n')]
|
||||
self.SectionHeaderCommentDict[Section[CurrentSection.upper()]] = Comment
|
||||
Comment = ''
|
||||
continue
|
||||
|
||||
# Not in any defined section
|
||||
if CurrentSection == TAB_UNKNOWN:
|
||||
ErrorMsg = "%s is not in any defined section" % Line
|
||||
EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)
|
||||
|
||||
# Add a section item
|
||||
SectionItemList.append([Line, LineNo, Comment])
|
||||
Comment = ''
|
||||
# End of parse
|
||||
#End of For
|
||||
|
||||
#
|
||||
# Insert items data of last section
|
||||
#
|
||||
Model = Section[CurrentSection.upper()]
|
||||
InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)
|
||||
if Comment != '':
|
||||
self.SectionHeaderCommentDict[Model] = Comment
|
||||
Comment = ''
|
||||
|
||||
## Package Object to DEC file
|
||||
def PackageToDec(self, Package):
|
||||
Dec = ''
|
||||
DecList = sdict()
|
||||
SectionHeaderCommentDict = {}
|
||||
if Package == None:
|
||||
return Dec
|
||||
|
||||
PackageHeader = Package.PackageHeader
|
||||
TmpList = []
|
||||
if PackageHeader.Name:
|
||||
TmpList.append(TAB_DEC_DEFINES_PACKAGE_NAME + ' = ' + PackageHeader.Name)
|
||||
if PackageHeader.Guid:
|
||||
TmpList.append(TAB_DEC_DEFINES_PACKAGE_GUID + ' = ' + PackageHeader.Guid)
|
||||
if PackageHeader.Version:
|
||||
TmpList.append(TAB_DEC_DEFINES_PACKAGE_VERSION + ' = ' + PackageHeader.Version)
|
||||
if PackageHeader.DecSpecification:
|
||||
TmpList.append(TAB_DEC_DEFINES_DEC_SPECIFICATION + ' = ' + PackageHeader.DecSpecification)
|
||||
if Package.UserExtensions != None:
|
||||
for Item in Package.UserExtensions.Defines:
|
||||
TmpList.append(Item)
|
||||
DecList['Defines'] = TmpList
|
||||
if PackageHeader.Description != '':
|
||||
SectionHeaderCommentDict['Defines'] = PackageHeader.Description
|
||||
|
||||
for Item in Package.Includes:
|
||||
Key = 'Includes.' + Item.SupArchList
|
||||
Value = Item.FilePath
|
||||
GenMetaDatSectionItem(Key, Value, DecList)
|
||||
|
||||
for Item in Package.GuidDeclarations:
|
||||
Key = 'Guids.' + Item.SupArchList
|
||||
Value = Item.CName + '=' + Item.Guid
|
||||
GenMetaDatSectionItem(Key, Value, DecList)
|
||||
|
||||
for Item in Package.ProtocolDeclarations:
|
||||
Key = 'Protocols.' + Item.SupArchList
|
||||
Value = Item.CName + '=' + Item.Guid
|
||||
GenMetaDatSectionItem(Key, Value, DecList)
|
||||
|
||||
for Item in Package.PpiDeclarations:
|
||||
Key = 'Ppis.' + Item.SupArchList
|
||||
Value = Item.CName + '=' + Item.Guid
|
||||
GenMetaDatSectionItem(Key, Value, DecList)
|
||||
|
||||
for Item in Package.LibraryClassDeclarations:
|
||||
Key = 'LibraryClasses.' + Item.SupArchList
|
||||
Value = Item.LibraryClass + '|' + Item.RecommendedInstance
|
||||
GenMetaDatSectionItem(Key, Value, DecList)
|
||||
|
||||
for Item in Package.PcdDeclarations:
|
||||
Key = 'Pcds' + Item.ItemType + '.' + Item.SupArchList
|
||||
Value = Item.TokenSpaceGuidCName + '.' + Item.CName
|
||||
if Item.DefaultValue != '':
|
||||
Value = Value + '|' + Item.DefaultValue
|
||||
if Item.DatumType != '':
|
||||
Value = Value + '|' + Item.DatumType
|
||||
if Item.Token != '':
|
||||
Value = Value + '|' + Item.Token
|
||||
GenMetaDatSectionItem(Key, Value, DecList)
|
||||
|
||||
# Transfer Package to Inf
|
||||
for Key in DecList:
|
||||
if Key in SectionHeaderCommentDict:
|
||||
List = SectionHeaderCommentDict[Key].split('\r')
|
||||
for Item in List:
|
||||
Dec = Dec + Item + '\n'
|
||||
Dec = Dec + '[' + Key + ']' + '\n'
|
||||
for Value in DecList[Key]:
|
||||
if type(Value) == type([]):
|
||||
for SubValue in Value:
|
||||
Dec = Dec + ' ' + SubValue + '\n'
|
||||
else:
|
||||
Dec = Dec + ' ' + Value + '\n'
|
||||
Dec = Dec + '\n'
|
||||
|
||||
return Dec
|
||||
|
||||
## Transfer to Package Object
|
||||
#
|
||||
# Transfer all contents of a Dec file to a standard Package Object
|
||||
#
|
||||
def DecToPackage(self):
|
||||
# Init global information for the file
|
||||
ContainerFile = self.Identification.FullPath
|
||||
|
||||
# Generate Package Header
|
||||
self.GenPackageHeader(ContainerFile)
|
||||
|
||||
# Generate Includes
|
||||
# Only for Edk
|
||||
self.GenIncludes(ContainerFile)
|
||||
|
||||
# Generate Guids
|
||||
self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)
|
||||
|
||||
# Generate Protocols
|
||||
self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)
|
||||
|
||||
# Generate Ppis
|
||||
self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)
|
||||
|
||||
# Generate LibraryClasses
|
||||
self.GenLibraryClasses(ContainerFile)
|
||||
|
||||
# Generate Pcds
|
||||
self.GenPcds(ContainerFile)
|
||||
|
||||
# Init MiscFiles
|
||||
self.GenMiscFiles(ContainerFile)
|
||||
|
||||
## GenMiscFiles
|
||||
#
|
||||
def GenMiscFiles(self, ContainerFile):
|
||||
MiscFiles = MiscFileClass()
|
||||
MiscFiles.Name = 'ModuleFiles'
|
||||
for Item in GetFiles(os.path.dirname(ContainerFile), ['CVS', '.svn'], False):
|
||||
File = CommonClass.FileClass()
|
||||
File.Filename = Item
|
||||
MiscFiles.Files.append(File)
|
||||
self.Package.MiscFiles = MiscFiles
|
||||
|
||||
## Get Package Header
|
||||
#
|
||||
# Gen Package Header of Dec as <Key> = <Value>
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenPackageHeader(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate PackageHeader ...")
|
||||
#
|
||||
# Update all defines item in database
|
||||
#
|
||||
RecordSet = self.RecordSet[MODEL_META_DATA_HEADER]
|
||||
PackageHeader = PackageHeaderClass()
|
||||
OtherDefines = []
|
||||
for Record in RecordSet:
|
||||
ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT)
|
||||
if len(ValueList) != 2:
|
||||
OtherDefines.append(Record[0])
|
||||
else:
|
||||
Name = ValueList[0]
|
||||
Value = ValueList[1]
|
||||
if Name == TAB_DEC_DEFINES_PACKAGE_NAME:
|
||||
PackageHeader.Name = Value
|
||||
elif Name == TAB_DEC_DEFINES_PACKAGE_GUID:
|
||||
PackageHeader.Guid = Value
|
||||
elif Name == TAB_DEC_DEFINES_PACKAGE_VERSION:
|
||||
PackageHeader.Version = Value
|
||||
elif Name == TAB_DEC_DEFINES_DEC_SPECIFICATION:
|
||||
PackageHeader.DecSpecification = Value
|
||||
else:
|
||||
OtherDefines.append(Record[0])
|
||||
|
||||
PackageHeader.FileName = self.Identification.FileName
|
||||
PackageHeader.FullPath = self.Identification.FullPath
|
||||
PackageHeader.RelaPath = self.Identification.RelaPath
|
||||
PackageHeader.PackagePath = self.Identification.PackagePath
|
||||
PackageHeader.ModulePath = self.Identification.ModulePath
|
||||
PackageHeader.CombinePath = os.path.normpath(os.path.join(PackageHeader.PackagePath, PackageHeader.ModulePath, PackageHeader.FileName))
|
||||
|
||||
if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict:
|
||||
PackageHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER]
|
||||
|
||||
self.Package.PackageHeader = PackageHeader
|
||||
UE = UserExtensionsClass()
|
||||
UE.Defines = OtherDefines
|
||||
self.Package.UserExtensions = UE
|
||||
|
||||
|
||||
## GenIncludes
|
||||
#
|
||||
# Gen Includes of Dec
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenIncludes(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES)
|
||||
Includes = {}
|
||||
# Get all Includes
|
||||
RecordSet = self.RecordSet[MODEL_EFI_INCLUDE]
|
||||
|
||||
# Go through each arch
|
||||
for Record in RecordSet:
|
||||
Arch = Record[1]
|
||||
Key = Record[0]
|
||||
Include = IncludeClass()
|
||||
Include.FilePath = NormPath(Key)
|
||||
Include.SupArchList = Arch
|
||||
self.Package.Includes.append(Include)
|
||||
|
||||
## GenPpis
|
||||
#
|
||||
# Gen Ppis of Dec
|
||||
# <CName>=<GuidValue>
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenGuidProtocolPpis(self, Type, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % Type)
|
||||
Lists = {}
|
||||
# Get all Items
|
||||
RecordSet = self.RecordSet[Section[Type.upper()]]
|
||||
|
||||
# Go through each arch
|
||||
for Record in RecordSet:
|
||||
Arch = Record[1]
|
||||
(Name, Value) = GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2])
|
||||
|
||||
ListMember = None
|
||||
if Type == TAB_GUIDS:
|
||||
ListMember = self.Package.GuidDeclarations
|
||||
elif Type == TAB_PROTOCOLS:
|
||||
ListMember = self.Package.ProtocolDeclarations
|
||||
elif Type == TAB_PPIS:
|
||||
ListMember = self.Package.PpiDeclarations
|
||||
|
||||
ListClass = GuidProtocolPpiCommonClass()
|
||||
ListClass.CName = Name
|
||||
ListClass.Guid = Value
|
||||
ListClass.SupArchList = Arch
|
||||
ListMember.append(ListClass)
|
||||
|
||||
## GenLibraryClasses
|
||||
#
|
||||
# Gen LibraryClasses of Dec
|
||||
# <CName>=<GuidValue>
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenLibraryClasses(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)
|
||||
LibraryClasses = {}
|
||||
# Get all Guids
|
||||
RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS]
|
||||
|
||||
# Go through each arch
|
||||
for Record in RecordSet:
|
||||
Arch = Record[1]
|
||||
List = GetSplitValueList(Record[0], DataType.TAB_VALUE_SPLIT)
|
||||
if len(List) != 2:
|
||||
continue
|
||||
LibraryClass = LibraryClassClass()
|
||||
LibraryClass.LibraryClass = List[0]
|
||||
LibraryClass.RecommendedInstance = NormPath(List[1])
|
||||
LibraryClass.SupArchList = Arch
|
||||
self.Package.LibraryClassDeclarations.append(LibraryClass)
|
||||
|
||||
def AddPcd(self, CName, Token, TokenSpaceGuidCName, DatumType, DefaultValue, ItemType, Arch):
|
||||
Pcd = CommonClass.PcdClass()
|
||||
Pcd.CName = CName
|
||||
Pcd.Token = Token
|
||||
Pcd.TokenSpaceGuidCName = TokenSpaceGuidCName
|
||||
Pcd.DatumType = DatumType
|
||||
Pcd.DefaultValue = DefaultValue
|
||||
Pcd.ItemType = ItemType
|
||||
Pcd.SupArchList = Arch
|
||||
self.Package.PcdDeclarations.append(Pcd)
|
||||
|
||||
## GenPcds
|
||||
#
|
||||
# Gen Pcds of Dec
|
||||
# <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenPcds(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)
|
||||
Pcds = {}
|
||||
PcdToken = {}
|
||||
# Get all Pcds
|
||||
RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD]
|
||||
RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE]
|
||||
RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG]
|
||||
RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX]
|
||||
RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC]
|
||||
|
||||
# Go through each pcd
|
||||
for Record in RecordSet1:
|
||||
Arch = Record[1]
|
||||
(TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)
|
||||
for Record in RecordSet2:
|
||||
Arch = Record[1]
|
||||
(TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)
|
||||
for Record in RecordSet3:
|
||||
Arch = Record[1]
|
||||
(TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)
|
||||
for Record in RecordSet4:
|
||||
Arch = Record[1]
|
||||
(TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)
|
||||
for Record in RecordSet5:
|
||||
Arch = Record[1]
|
||||
(TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch)
|
||||
|
||||
## Show detailed information of Package
|
||||
#
|
||||
# Print all members and their values of Package class
|
||||
#
|
||||
def ShowPackage(self):
|
||||
M = self.Package
|
||||
print 'Filename =', M.PackageHeader.FileName
|
||||
print 'FullPath =', M.PackageHeader.FullPath
|
||||
print 'RelaPath =', M.PackageHeader.RelaPath
|
||||
print 'PackagePath =', M.PackageHeader.PackagePath
|
||||
print 'ModulePath =', M.PackageHeader.ModulePath
|
||||
print 'CombinePath =', M.PackageHeader.CombinePath
|
||||
|
||||
print 'BaseName =', M.PackageHeader.Name
|
||||
print 'Guid =', M.PackageHeader.Guid
|
||||
print 'Version =', M.PackageHeader.Version
|
||||
print 'DecSpecification =', M.PackageHeader.DecSpecification
|
||||
|
||||
print '\nIncludes ='#, M.Includes
|
||||
for Item in M.Includes:
|
||||
print Item.FilePath, Item.SupArchList
|
||||
print '\nGuids ='#, M.GuidDeclarations
|
||||
for Item in M.GuidDeclarations:
|
||||
print Item.CName, Item.Guid, Item.SupArchList
|
||||
print '\nProtocols ='#, M.ProtocolDeclarations
|
||||
for Item in M.ProtocolDeclarations:
|
||||
print Item.CName, Item.Guid, Item.SupArchList
|
||||
print '\nPpis ='#, M.PpiDeclarations
|
||||
for Item in M.PpiDeclarations:
|
||||
print Item.CName, Item.Guid, Item.SupArchList
|
||||
print '\nLibraryClasses ='#, M.LibraryClassDeclarations
|
||||
for Item in M.LibraryClassDeclarations:
|
||||
print Item.LibraryClass, Item.RecommendedInstance, Item.SupModuleList, Item.SupArchList
|
||||
print '\nPcds ='#, M.PcdDeclarations
|
||||
for Item in M.PcdDeclarations:
|
||||
print 'CName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, 'Token=', Item.Token, 'DatumType=', Item.DatumType, Item.SupArchList
|
||||
print '\nUserExtensions =', M.UserExtensions.Defines
|
||||
print '\n*** FileList ***'
|
||||
for Item in M.MiscFiles.Files:
|
||||
print Item.Filename
|
||||
print '****************\n'
|
||||
|
||||
##
|
||||
#
|
||||
# This acts like the main() function for the script, unless it is 'import'ed into another
|
||||
# script.
|
||||
#
|
||||
if __name__ == '__main__':
|
||||
EdkLogger.Initialize()
|
||||
EdkLogger.SetLevel(EdkLogger.QUIET)
|
||||
|
||||
W = os.getenv('WORKSPACE')
|
||||
F = os.path.join(W, 'MdeModulePkg/MdeModulePkg.dec')
|
||||
|
||||
P = Dec(os.path.normpath(F), True, W)
|
||||
P.ShowPackage()
|
||||
print P.PackageToDec(P.Package)
|
|
@ -1,877 +0,0 @@
|
|||
## @file
|
||||
# This file is used to define each component of INF file
|
||||
#
|
||||
# Copyright (c) 2007 - 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.
|
||||
#
|
||||
|
||||
##
|
||||
# Import Modules
|
||||
#
|
||||
import os
|
||||
import re
|
||||
import EdkLogger
|
||||
|
||||
from CommonDataClass.ModuleClass import *
|
||||
from CommonDataClass import CommonClass
|
||||
from String import *
|
||||
from DataType import *
|
||||
from BuildToolError import *
|
||||
from Misc import sdict
|
||||
from Misc import GetFiles
|
||||
from Parsing import *
|
||||
|
||||
# Global variable
|
||||
Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN,
|
||||
TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER,
|
||||
TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION,
|
||||
TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE,
|
||||
TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE,
|
||||
TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,
|
||||
TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE,
|
||||
TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE,
|
||||
TAB_INF_FIXED_PCD.upper() : MODEL_PCD_FIXED_AT_BUILD,
|
||||
TAB_INF_PATCH_PCD.upper() : MODEL_PCD_PATCHABLE_IN_MODULE,
|
||||
TAB_INF_FEATURE_PCD.upper() : MODEL_PCD_FEATURE_FLAG,
|
||||
TAB_INF_PCD_EX.upper() : MODEL_PCD_DYNAMIC_EX,
|
||||
TAB_INF_PCD.upper() : MODEL_PCD_DYNAMIC,
|
||||
TAB_SOURCES.upper() : MODEL_EFI_SOURCE_FILE,
|
||||
TAB_GUIDS.upper() : MODEL_EFI_GUID,
|
||||
TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL,
|
||||
TAB_PPIS.upper() : MODEL_EFI_PPI,
|
||||
TAB_DEPEX.upper() : MODEL_EFI_DEPEX,
|
||||
TAB_BINARIES.upper() : MODEL_EFI_BINARY_FILE,
|
||||
TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION
|
||||
}
|
||||
|
||||
gComponentType2ModuleType = {
|
||||
"LIBRARY" : "BASE",
|
||||
"SECURITY_CORE" : "SEC",
|
||||
"PEI_CORE" : "PEI_CORE",
|
||||
"COMBINED_PEIM_DRIVER" : "PEIM",
|
||||
"PIC_PEIM" : "PEIM",
|
||||
"RELOCATABLE_PEIM" : "PEIM",
|
||||
"PE32_PEIM" : "PEIM",
|
||||
"BS_DRIVER" : "DXE_DRIVER",
|
||||
"RT_DRIVER" : "DXE_RUNTIME_DRIVER",
|
||||
"SAL_RT_DRIVER" : "DXE_SAL_DRIVER",
|
||||
"APPLICATION" : "UEFI_APPLICATION",
|
||||
"LOGO" : "BASE",
|
||||
}
|
||||
|
||||
class InfHeader(ModuleHeaderClass):
|
||||
_Mapping_ = {
|
||||
# Required Fields
|
||||
TAB_INF_DEFINES_BASE_NAME : "Name",
|
||||
TAB_INF_DEFINES_FILE_GUID : "Guid",
|
||||
TAB_INF_DEFINES_MODULE_TYPE : "ModuleType",
|
||||
TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION : "UefiSpecificationVersion",
|
||||
TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION : "UefiSpecificationVersion",
|
||||
TAB_INF_DEFINES_EDK_RELEASE_VERSION : "EdkReleaseVersion",
|
||||
|
||||
# Optional Fields
|
||||
TAB_INF_DEFINES_INF_VERSION : "InfVersion",
|
||||
TAB_INF_DEFINES_BINARY_MODULE : "BinaryModule",
|
||||
TAB_INF_DEFINES_COMPONENT_TYPE : "ComponentType",
|
||||
TAB_INF_DEFINES_MAKEFILE_NAME : "MakefileName",
|
||||
TAB_INF_DEFINES_BUILD_NUMBER : "BuildNumber",
|
||||
TAB_INF_DEFINES_BUILD_TYPE : "BuildType",
|
||||
TAB_INF_DEFINES_FFS_EXT : "FfsExt",
|
||||
TAB_INF_DEFINES_FV_EXT : "FvExt",
|
||||
TAB_INF_DEFINES_SOURCE_FV : "SourceFv",
|
||||
TAB_INF_DEFINES_VERSION_NUMBER : "VersionNumber",
|
||||
TAB_INF_DEFINES_VERSION_STRING : "VersionString",
|
||||
TAB_INF_DEFINES_VERSION : "Version",
|
||||
TAB_INF_DEFINES_PCD_IS_DRIVER : "PcdIsDriver",
|
||||
TAB_INF_DEFINES_TIANO_EDK_FLASHMAP_H : "TianoEdkFlashMap_h",
|
||||
TAB_INF_DEFINES_SHADOW : "Shadow",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
ModuleHeaderClass.__init__(self)
|
||||
self.VersionNumber = ''
|
||||
self.VersionString = ''
|
||||
#print self.__dict__
|
||||
def __setitem__(self, key, value):
|
||||
self.__dict__[self._Mapping_[key]] = value
|
||||
def __getitem__(self, key):
|
||||
return self.__dict__[self._Mapping_[key]]
|
||||
## "in" test support
|
||||
def __contains__(self, key):
|
||||
return key in self._Mapping_
|
||||
|
||||
## InfObject
|
||||
#
|
||||
# This class defined basic Inf object which is used by inheriting
|
||||
#
|
||||
# @param object: Inherited from object class
|
||||
#
|
||||
class InfObject(object):
|
||||
def __init__(self):
|
||||
object.__init__()
|
||||
|
||||
## Inf
|
||||
#
|
||||
# This class defined the structure used in Inf object
|
||||
#
|
||||
# @param InfObject: Inherited from InfObject class
|
||||
# @param Ffilename: Input value for Ffilename of Inf file, default is None
|
||||
# @param IsMergeAllArches: Input value for IsMergeAllArches
|
||||
# True is to merge all arches
|
||||
# Fales is not to merge all arches
|
||||
# default is False
|
||||
# @param IsToModule: Input value for IsToModule
|
||||
# True is to transfer to ModuleObject automatically
|
||||
# False is not to transfer to ModuleObject automatically
|
||||
# default is False
|
||||
# @param WorkspaceDir: Input value for current workspace directory, default is None
|
||||
#
|
||||
# @var Identification: To store value for Identification, it is a structure as Identification
|
||||
# @var UserExtensions: To store value for UserExtensions
|
||||
# @var Module: To store value for Module, it is a structure as ModuleClass
|
||||
# @var WorkspaceDir: To store value for WorkspaceDir
|
||||
# @var KeyList: To store value for KeyList, a list for all Keys used in Inf
|
||||
#
|
||||
class Inf(InfObject):
|
||||
def __init__(self, Filename=None, IsToModule=False, WorkspaceDir=None, PackageDir=None, SupArchList=DataType.ARCH_LIST):
|
||||
self.Identification = IdentificationClass()
|
||||
self.Module = ModuleClass()
|
||||
self.WorkspaceDir = WorkspaceDir
|
||||
self.PackageDir = PackageDir
|
||||
self.SupArchList = SupArchList
|
||||
|
||||
self.KeyList = [
|
||||
TAB_SOURCES, TAB_BUILD_OPTIONS, TAB_BINARIES, TAB_INCLUDES, TAB_GUIDS,
|
||||
TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, TAB_PACKAGES, TAB_INF_FIXED_PCD,
|
||||
TAB_INF_PATCH_PCD, TAB_INF_FEATURE_PCD, TAB_INF_PCD, TAB_INF_PCD_EX,
|
||||
TAB_DEPEX, TAB_INF_DEFINES
|
||||
]
|
||||
# Upper all KEYs to ignore case sensitive when parsing
|
||||
self.KeyList = map(lambda c: c.upper(), self.KeyList)
|
||||
|
||||
# Init RecordSet
|
||||
self.RecordSet = {}
|
||||
for Key in self.KeyList:
|
||||
self.RecordSet[Section[Key]] = []
|
||||
|
||||
# Init Comment
|
||||
self.SectionHeaderCommentDict = {}
|
||||
|
||||
# Load Inf file if filename is not None
|
||||
if Filename != None:
|
||||
self.LoadInfFile(Filename)
|
||||
|
||||
# Transfer to Module Object if IsToModule is True
|
||||
if IsToModule:
|
||||
self.InfToModule()
|
||||
|
||||
## Module Object to INF file
|
||||
def ModuleToInf(self, Module):
|
||||
Inf = ''
|
||||
InfList = sdict()
|
||||
SectionHeaderCommentDict = {}
|
||||
if Module == None:
|
||||
return Inf
|
||||
|
||||
ModuleHeader = Module.ModuleHeader
|
||||
TmpList = []
|
||||
# Common define items
|
||||
if ModuleHeader.Name:
|
||||
TmpList.append(TAB_INF_DEFINES_BASE_NAME + ' = ' + ModuleHeader.Name)
|
||||
if ModuleHeader.Guid:
|
||||
TmpList.append(TAB_INF_DEFINES_FILE_GUID + ' = ' + ModuleHeader.Guid)
|
||||
if ModuleHeader.Version:
|
||||
TmpList.append(TAB_INF_DEFINES_VERSION_STRING + ' = ' + ModuleHeader.Version)
|
||||
if ModuleHeader.ModuleType:
|
||||
TmpList.append(TAB_INF_DEFINES_MODULE_TYPE + ' = ' + ModuleHeader.ModuleType)
|
||||
if ModuleHeader.PcdIsDriver:
|
||||
TmpList.append(TAB_INF_DEFINES_PCD_IS_DRIVER + ' = ' + ModuleHeader.PcdIsDriver)
|
||||
# Externs
|
||||
for Item in Module.Externs:
|
||||
if Item.EntryPoint:
|
||||
TmpList.append(TAB_INF_DEFINES_ENTRY_POINT + ' = ' + Item.EntryPoint)
|
||||
if Item.UnloadImage:
|
||||
TmpList.append(TAB_INF_DEFINES_UNLOAD_IMAGE + ' = ' + Item.UnloadImage)
|
||||
if Item.Constructor:
|
||||
TmpList.append(TAB_INF_DEFINES_CONSTRUCTOR + ' = ' + Item.Constructor)
|
||||
if Item.Destructor:
|
||||
TmpList.append(TAB_INF_DEFINES_DESTRUCTOR + ' = ' + Item.Destructor)
|
||||
# Other define items
|
||||
if Module.UserExtensions != None:
|
||||
for Item in Module.UserExtensions.Defines:
|
||||
TmpList.append(Item)
|
||||
InfList['Defines'] = TmpList
|
||||
if ModuleHeader.Description != '':
|
||||
SectionHeaderCommentDict['Defines'] = ModuleHeader.Description
|
||||
|
||||
if Module.UserExtensions != None:
|
||||
InfList['BuildOptions'] = Module.UserExtensions.BuildOptions
|
||||
|
||||
for Item in Module.Includes:
|
||||
Key = 'Includes.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
Value.append(Item.FilePath)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.LibraryClasses:
|
||||
Key = 'LibraryClasses.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
NewValue = Item.LibraryClass
|
||||
if Item.RecommendedInstance:
|
||||
NewValue = NewValue + '|' + Item.RecommendedInstance
|
||||
if Item.FeatureFlag:
|
||||
NewValue = NewValue + '|' + Item.FeatureFlag
|
||||
Value.append(NewValue)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.PackageDependencies:
|
||||
Key = 'Packages.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
Value.append(Item.FilePath)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.PcdCodes:
|
||||
Key = 'Pcds' + Item.ItemType + '.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
NewValue = Item.TokenSpaceGuidCName + '.' + Item.CName
|
||||
if Item.DefaultValue != '':
|
||||
NewValue = NewValue + '|' + Item.DefaultValue
|
||||
Value.append(NewValue)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.Sources:
|
||||
Key = 'Sources.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
NewValue = Item.SourceFile
|
||||
if Item.ToolChainFamily != '':
|
||||
NewValue = NewValue + '|' + Item.ToolChainFamily
|
||||
if Item.TagName != '':
|
||||
NewValue = NewValue + '|' + Item.TagName
|
||||
if Item.ToolCode != '':
|
||||
NewValue = NewValue + '|' + Item.ToolCode
|
||||
if Item.FeatureFlag != '':
|
||||
NewValue = NewValue + '|' + Item.FeatureFlag
|
||||
Value.append(NewValue)
|
||||
if Item.HelpText != '':
|
||||
SectionHeaderCommentDict[Key] = Item.HelpText
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.Guids:
|
||||
Key = 'Guids.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
Value.append(Item.CName)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.Protocols:
|
||||
Key = 'Protocols.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
Value.append(Item.CName)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.Ppis:
|
||||
Key = 'Ppis.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
Value.append(Item.CName)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
if Module.PeiDepex:
|
||||
Key = 'Depex'
|
||||
Value = Module.PeiDepex.Depex
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
if Module.DxeDepex:
|
||||
Key = 'Depex'
|
||||
Value = Module.DxeDepex.Depex
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
if Module.SmmDepex:
|
||||
Key = 'Depex'
|
||||
Value = Module.SmmDepex.Depex
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
for Item in Module.Binaries:
|
||||
Key = 'Binaries.' + GetStringOfList(Item.SupArchList)
|
||||
Value = GetHelpTextList(Item.HelpTextList)
|
||||
NewValue = Item.FileType + '|' + Item.BinaryFile + '|' + Item.Target
|
||||
if Item.FeatureFlag != '':
|
||||
NewValue = NewValue + '|' + Item.FeatureFlag
|
||||
Value.append(NewValue)
|
||||
GenMetaDatSectionItem(Key, Value, InfList)
|
||||
|
||||
# Transfer Module to Inf
|
||||
for Key in InfList:
|
||||
if Key in SectionHeaderCommentDict:
|
||||
List = SectionHeaderCommentDict[Key].split('\r')
|
||||
for Item in List:
|
||||
Inf = Inf + Item + '\n'
|
||||
Inf = Inf + '[' + Key + ']' + '\n'
|
||||
for Value in InfList[Key]:
|
||||
if type(Value) == type([]):
|
||||
for SubValue in Value:
|
||||
Inf = Inf + ' ' + SubValue + '\n'
|
||||
else:
|
||||
Inf = Inf + ' ' + Value + '\n'
|
||||
Inf = Inf + '\n'
|
||||
|
||||
return Inf
|
||||
|
||||
|
||||
## Transfer to Module Object
|
||||
#
|
||||
# Transfer all contents of an Inf file to a standard Module Object
|
||||
#
|
||||
def InfToModule(self):
|
||||
# Init global information for the file
|
||||
ContainerFile = self.Identification.FullPath
|
||||
|
||||
# Generate Module Header
|
||||
self.GenModuleHeader(ContainerFile)
|
||||
|
||||
# Generate BuildOptions
|
||||
self.GenBuildOptions(ContainerFile)
|
||||
|
||||
# Generate Includes
|
||||
self.GenIncludes(ContainerFile)
|
||||
|
||||
# Generate LibraryClasses
|
||||
self.GenLibraryClasses(ContainerFile)
|
||||
|
||||
# Generate Packages
|
||||
self.GenPackages(ContainerFile)
|
||||
|
||||
# Generate Pcds
|
||||
self.GenPcds(ContainerFile)
|
||||
|
||||
# Generate Sources
|
||||
self.GenSources(ContainerFile)
|
||||
|
||||
# Generate Guids
|
||||
self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)
|
||||
|
||||
# Generate Protocols
|
||||
self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)
|
||||
|
||||
# Generate Ppis
|
||||
self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)
|
||||
|
||||
# Generate Depexes
|
||||
self.GenDepexes(ContainerFile)
|
||||
|
||||
# Generate Binaries
|
||||
self.GenBinaries(ContainerFile)
|
||||
|
||||
# Init MiscFiles
|
||||
self.GenMiscFiles(ContainerFile)
|
||||
|
||||
## GenMiscFiles
|
||||
#
|
||||
def GenMiscFiles(self, ContainerFile):
|
||||
MiscFiles = MiscFileClass()
|
||||
MiscFiles.Name = 'ModuleFiles'
|
||||
for Item in GetFiles(os.path.dirname(ContainerFile), ['CVS', '.svn'], False):
|
||||
File = CommonClass.FileClass()
|
||||
File.Filename = Item
|
||||
MiscFiles.Files.append(File)
|
||||
self.Module.MiscFiles = MiscFiles
|
||||
|
||||
## Load Inf file
|
||||
#
|
||||
# Load the file if it exists
|
||||
#
|
||||
# @param Filename: Input value for filename of Inf file
|
||||
#
|
||||
def LoadInfFile(self, Filename):
|
||||
# Insert a record for file
|
||||
Filename = NormPath(Filename)
|
||||
|
||||
self.Identification.FullPath = Filename
|
||||
(self.Identification.RelaPath, self.Identification.FileName) = os.path.split(Filename)
|
||||
if self.Identification.FullPath.find(self.WorkspaceDir) > -1:
|
||||
self.Identification.ModulePath = os.path.dirname(self.Identification.FullPath[len(self.WorkspaceDir) + 1:])
|
||||
if self.PackageDir:
|
||||
self.Identification.PackagePath = self.PackageDir
|
||||
if self.Identification.ModulePath.find(self.PackageDir) == 0:
|
||||
self.Identification.ModulePath = self.Identification.ModulePath[len(self.PackageDir) + 1:]
|
||||
|
||||
# Init common datas
|
||||
IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \
|
||||
[], [], TAB_UNKNOWN, [], [], []
|
||||
LineNo = 0
|
||||
|
||||
# Parse file content
|
||||
IsFindBlockComment = False
|
||||
ReservedLine = ''
|
||||
Comment = ''
|
||||
for Line in open(Filename, 'r'):
|
||||
LineNo = LineNo + 1
|
||||
# Remove comment block
|
||||
if Line.find(TAB_COMMENT_EDK_START) > -1:
|
||||
ReservedLine = GetSplitList(Line, TAB_COMMENT_EDK_START, 1)[0]
|
||||
if ReservedLine.strip().startswith(TAB_COMMENT_SPLIT):
|
||||
Comment = Comment + Line.strip() + '\n'
|
||||
ReservedLine = ''
|
||||
else:
|
||||
Comment = Comment + Line[len(ReservedLine):] + '\n'
|
||||
IsFindBlockComment = True
|
||||
if not ReservedLine:
|
||||
continue
|
||||
if Line.find(TAB_COMMENT_EDK_END) > -1:
|
||||
Comment = Comment + Line[:Line.find(TAB_COMMENT_EDK_END) + len(TAB_COMMENT_EDK_END)] + '\n'
|
||||
Line = ReservedLine + GetSplitList(Line, TAB_COMMENT_EDK_END, 1)[1]
|
||||
ReservedLine = ''
|
||||
IsFindBlockComment = False
|
||||
if IsFindBlockComment:
|
||||
Comment = Comment + Line.strip() + '\n'
|
||||
continue
|
||||
|
||||
# Remove comments at tail and remove spaces again
|
||||
if Line.strip().startswith(TAB_COMMENT_SPLIT) or Line.strip().startswith('--/'):
|
||||
Comment = Comment + Line.strip() + '\n'
|
||||
Line = CleanString(Line)
|
||||
if Line == '':
|
||||
continue
|
||||
|
||||
## Find a new section tab
|
||||
# First insert previous section items
|
||||
# And then parse the content of the new section
|
||||
if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):
|
||||
if Line[1:3] == "--":
|
||||
continue
|
||||
Model = Section[CurrentSection.upper()]
|
||||
# Insert items data of previous section
|
||||
InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)
|
||||
|
||||
# Parse the new section
|
||||
SectionItemList = []
|
||||
ArchList = []
|
||||
ThirdList = []
|
||||
|
||||
CurrentSection = ''
|
||||
LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)
|
||||
for Item in LineList:
|
||||
ItemList = GetSplitValueList(Item, TAB_SPLIT)
|
||||
if CurrentSection == '':
|
||||
CurrentSection = ItemList[0]
|
||||
else:
|
||||
if CurrentSection != ItemList[0]:
|
||||
EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)
|
||||
if CurrentSection.upper() not in self.KeyList:
|
||||
RaiseParserError(Line, CurrentSection, Filename, '', LineNo)
|
||||
ItemList.append('')
|
||||
ItemList.append('')
|
||||
if len(ItemList) > 5:
|
||||
RaiseParserError(Line, CurrentSection, Filename, '', LineNo)
|
||||
else:
|
||||
if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:
|
||||
EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)
|
||||
ArchList.append(ItemList[1].upper())
|
||||
ThirdList.append(ItemList[2])
|
||||
|
||||
if Comment:
|
||||
if Comment.endswith('\n'):
|
||||
Comment = Comment[:len(Comment) - len('\n')]
|
||||
self.SectionHeaderCommentDict[Section[CurrentSection.upper()]] = Comment
|
||||
Comment = ''
|
||||
continue
|
||||
|
||||
# Not in any defined section
|
||||
if CurrentSection == TAB_UNKNOWN:
|
||||
ErrorMsg = "%s is not in any defined section" % Line
|
||||
EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError)
|
||||
|
||||
# Add a section item
|
||||
SectionItemList.append([Line, LineNo, Comment])
|
||||
Comment = ''
|
||||
# End of parse
|
||||
#End of For
|
||||
|
||||
# Insert items data of last section
|
||||
Model = Section[CurrentSection.upper()]
|
||||
InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet)
|
||||
if Comment != '':
|
||||
self.SectionHeaderCommentDict[Model] = Comment
|
||||
Comment = ''
|
||||
|
||||
## Show detailed information of Module
|
||||
#
|
||||
# Print all members and their values of Module class
|
||||
#
|
||||
def ShowModule(self):
|
||||
M = self.Module
|
||||
print 'Filename =', M.ModuleHeader.FileName
|
||||
print 'FullPath =', M.ModuleHeader.FullPath
|
||||
print 'RelaPath =', M.ModuleHeader.RelaPath
|
||||
print 'PackagePath =', M.ModuleHeader.PackagePath
|
||||
print 'ModulePath =', M.ModuleHeader.ModulePath
|
||||
print 'CombinePath =', M.ModuleHeader.CombinePath
|
||||
|
||||
print 'BaseName =', M.ModuleHeader.Name
|
||||
print 'Guid =', M.ModuleHeader.Guid
|
||||
print 'Version =', M.ModuleHeader.Version
|
||||
|
||||
print '\nIncludes ='
|
||||
for Item in M.Includes:
|
||||
print Item.FilePath, Item.SupArchList
|
||||
print '\nLibraryClasses ='
|
||||
for Item in M.LibraryClasses:
|
||||
print Item.LibraryClass, Item.RecommendedInstance, Item.RecommendedInstanceGuid, Item.RecommendedInstanceVersion, Item.FeatureFlag, Item.SupModuleList, Item.SupArchList, Item.Define
|
||||
print '\nPackageDependencies ='
|
||||
for Item in M.PackageDependencies:
|
||||
print Item.FilePath, Item.SupArchList, Item.FeatureFlag
|
||||
print '\nPcds ='
|
||||
for Item in M.PcdCodes:
|
||||
print '\tCName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, Item.SupArchList
|
||||
print '\nSources ='
|
||||
for Source in M.Sources:
|
||||
print Source.SourceFile, 'Fam=', Source.ToolChainFamily, 'Pcd=', Source.FeatureFlag, 'Tag=', Source.TagName, 'ToolCode=', Source.ToolCode, Source.SupArchList
|
||||
print '\nGuids ='
|
||||
for Item in M.Guids:
|
||||
print Item.CName, Item.SupArchList, Item.FeatureFlag
|
||||
print '\nProtocols ='
|
||||
for Item in M.Protocols:
|
||||
print Item.CName, Item.SupArchList, Item.FeatureFlag
|
||||
print '\nPpis ='
|
||||
for Item in M.Ppis:
|
||||
print Item.CName, Item.SupArchList, Item.FeatureFlag
|
||||
print '\nDepex ='
|
||||
for Item in M.Depex:
|
||||
print Item.Depex, Item.SupArchList, Item.Define
|
||||
print '\nBinaries ='
|
||||
for Binary in M.Binaries:
|
||||
print 'Type=', Binary.FileType, 'Target=', Binary.Target, 'Name=', Binary.BinaryFile, 'FeatureFlag=', Binary.FeatureFlag, 'SupArchList=', Binary.SupArchList
|
||||
print '\n*** FileList ***'
|
||||
for Item in M.MiscFiles.Files:
|
||||
print Item.Filename
|
||||
print '****************\n'
|
||||
|
||||
## Convert [Defines] section content to ModuleHeaderClass
|
||||
#
|
||||
# Convert [Defines] section content to ModuleHeaderClass
|
||||
#
|
||||
# @param Defines The content under [Defines] section
|
||||
# @param ModuleHeader An object of ModuleHeaderClass
|
||||
# @param Arch The supported ARCH
|
||||
#
|
||||
def GenModuleHeader(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate ModuleHeader ...")
|
||||
# Update all defines item in database
|
||||
RecordSet = self.RecordSet[MODEL_META_DATA_HEADER]
|
||||
|
||||
ModuleHeader = ModuleHeaderClass()
|
||||
ModuleExtern = ModuleExternClass()
|
||||
OtherDefines = []
|
||||
for Record in RecordSet:
|
||||
ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT)
|
||||
if len(ValueList) != 2:
|
||||
OtherDefines.append(Record[0])
|
||||
else:
|
||||
Name = ValueList[0]
|
||||
Value = ValueList[1]
|
||||
if Name == TAB_INF_DEFINES_BASE_NAME:
|
||||
ModuleHeader.Name = Value
|
||||
ModuleHeader.BaseName = Value
|
||||
elif Name == TAB_INF_DEFINES_FILE_GUID:
|
||||
ModuleHeader.Guid = Value
|
||||
elif Name == TAB_INF_DEFINES_VERSION_STRING:
|
||||
ModuleHeader.Version = Value
|
||||
elif Name == TAB_INF_DEFINES_PCD_IS_DRIVER:
|
||||
ModuleHeader.PcdIsDriver = Value
|
||||
elif Name == TAB_INF_DEFINES_MODULE_TYPE:
|
||||
ModuleHeader.ModuleType = Value
|
||||
elif Name in (TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION, TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION):
|
||||
ModuleHeader.UefiSpecificationVersion = Value
|
||||
elif Name == TAB_INF_DEFINES_PI_SPECIFICATION_VERSION:
|
||||
ModuleHeader.PiSpecificationVersion = Value
|
||||
elif Name == TAB_INF_DEFINES_ENTRY_POINT:
|
||||
ModuleExtern.EntryPoint = Value
|
||||
elif Name == TAB_INF_DEFINES_UNLOAD_IMAGE:
|
||||
ModuleExtern.UnloadImage = Value
|
||||
elif Name == TAB_INF_DEFINES_CONSTRUCTOR:
|
||||
ModuleExtern.Constructor = Value
|
||||
elif Name == TAB_INF_DEFINES_DESTRUCTOR:
|
||||
ModuleExtern.Destructor = Value
|
||||
else:
|
||||
OtherDefines.append(Record[0])
|
||||
ModuleHeader.FileName = self.Identification.FileName
|
||||
ModuleHeader.FullPath = self.Identification.FullPath
|
||||
ModuleHeader.RelaPath = self.Identification.RelaPath
|
||||
ModuleHeader.PackagePath = self.Identification.PackagePath
|
||||
ModuleHeader.ModulePath = self.Identification.ModulePath
|
||||
ModuleHeader.CombinePath = os.path.normpath(os.path.join(ModuleHeader.PackagePath, ModuleHeader.ModulePath, ModuleHeader.FileName))
|
||||
|
||||
if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict:
|
||||
ModuleHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER]
|
||||
self.Module.ModuleHeader = ModuleHeader
|
||||
self.Module.Externs.append(ModuleExtern)
|
||||
UE = self.Module.UserExtensions
|
||||
if UE == None:
|
||||
UE = UserExtensionsClass()
|
||||
UE.Defines = OtherDefines
|
||||
self.Module.UserExtensions = UE
|
||||
|
||||
## GenBuildOptions
|
||||
#
|
||||
# Gen BuildOptions of Inf
|
||||
# [<Family>:]<ToolFlag>=Flag
|
||||
#
|
||||
# @param ContainerFile: The Inf file full path
|
||||
#
|
||||
def GenBuildOptions(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_BUILD_OPTIONS)
|
||||
BuildOptions = {}
|
||||
# Get all BuildOptions
|
||||
RecordSet = self.RecordSet[MODEL_META_DATA_BUILD_OPTION]
|
||||
UE = self.Module.UserExtensions
|
||||
if UE == None:
|
||||
UE = UserExtensionsClass()
|
||||
for Record in RecordSet:
|
||||
UE.BuildOptions.append(Record[0])
|
||||
self.Module.UserExtensions = UE
|
||||
|
||||
## GenIncludes
|
||||
#
|
||||
# Gen Includes of Inf
|
||||
#
|
||||
# @param ContainerFile: The Inf file full path
|
||||
#
|
||||
def GenIncludes(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES)
|
||||
Includes = sdict()
|
||||
# Get all Includes
|
||||
RecordSet = self.RecordSet[MODEL_EFI_INCLUDE]
|
||||
for Record in RecordSet:
|
||||
Include = IncludeClass()
|
||||
Include.FilePath = Record[0]
|
||||
Include.SupArchList = Record[1]
|
||||
if GenerateHelpText(Record[5], ''):
|
||||
Include.HelpTextList.append(GenerateHelpText(Record[5], ''))
|
||||
self.Module.Includes.append(Include)
|
||||
#self.Module.FileList.extend(GetFiles(os.path.normpath(os.path.join(self.Identification.FileRelativePath, Include.FilePath)), ['CVS', '.svn']))
|
||||
|
||||
## GenLibraryClasses
|
||||
#
|
||||
# Get LibraryClass of Inf
|
||||
# <LibraryClassKeyWord>|<LibraryInstance>
|
||||
#
|
||||
# @param ContainerFile: The Inf file full path
|
||||
#
|
||||
def GenLibraryClasses(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)
|
||||
LibraryClasses = {}
|
||||
# Get all LibraryClasses
|
||||
RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS]
|
||||
for Record in RecordSet:
|
||||
(LibClassName, LibClassIns, Pcd, SupModelList) = GetLibraryClassOfInf([Record[0], Record[4]], ContainerFile, self.WorkspaceDir, Record[2])
|
||||
LibraryClass = CommonClass.LibraryClassClass()
|
||||
LibraryClass.LibraryClass = LibClassName
|
||||
LibraryClass.RecommendedInstance = LibClassIns
|
||||
LibraryClass.FeatureFlag = Pcd
|
||||
LibraryClass.SupArchList = Record[1]
|
||||
LibraryClass.SupModuleList = Record[4]
|
||||
if GenerateHelpText(Record[5], ''):
|
||||
LibraryClass.HelpTextList.append(GenerateHelpText(Record[5], ''))
|
||||
self.Module.LibraryClasses.append(LibraryClass)
|
||||
|
||||
## GenPackages
|
||||
#
|
||||
# Gen Packages of Inf
|
||||
#
|
||||
# @param ContainerFile: The Inf file full path
|
||||
#
|
||||
def GenPackages(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_PACKAGES)
|
||||
Packages = {}
|
||||
# Get all Packages
|
||||
RecordSet = self.RecordSet[MODEL_META_DATA_PACKAGE]
|
||||
for Record in RecordSet:
|
||||
(PackagePath, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2])
|
||||
Package = ModulePackageDependencyClass()
|
||||
Package.FilePath = NormPath(PackagePath)
|
||||
Package.SupArchList = Record[1]
|
||||
Package.FeatureFlag = Pcd
|
||||
if GenerateHelpText(Record[5], ''):
|
||||
Package.HelpTextList.append(GenerateHelpText(Record[5], ''))
|
||||
self.Module.PackageDependencies.append(Package)
|
||||
|
||||
def AddPcd(self, CName, TokenSpaceGuidCName, DefaultValue, ItemType, Arch, HelpTextList):
|
||||
Pcd = PcdClass()
|
||||
Pcd.CName = CName
|
||||
Pcd.TokenSpaceGuidCName = TokenSpaceGuidCName
|
||||
Pcd.DefaultValue = DefaultValue
|
||||
Pcd.ItemType = ItemType
|
||||
Pcd.SupArchList = Arch
|
||||
if GenerateHelpText(HelpTextList, ''):
|
||||
Pcd.HelpTextList.append(GenerateHelpText(HelpTextList, ''))
|
||||
self.Module.PcdCodes.append(Pcd)
|
||||
|
||||
## GenPcds
|
||||
#
|
||||
# Gen Pcds of Inf
|
||||
# <TokenSpaceGuidCName>.<PcdCName>[|<Value>]
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenPcds(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)
|
||||
Pcds = {}
|
||||
PcdToken = {}
|
||||
|
||||
# Get all Pcds
|
||||
RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD]
|
||||
RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE]
|
||||
RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG]
|
||||
RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX]
|
||||
RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC]
|
||||
|
||||
# Go through each arch
|
||||
for Record in RecordSet1:
|
||||
(TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])
|
||||
for Record in RecordSet2:
|
||||
(TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])
|
||||
for Record in RecordSet3:
|
||||
(TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])
|
||||
for Record in RecordSet4:
|
||||
(TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])
|
||||
for Record in RecordSet5:
|
||||
(TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], '', ContainerFile, Record[2])
|
||||
self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5])
|
||||
|
||||
## GenSources
|
||||
#
|
||||
# Gen Sources of Inf
|
||||
# <Filename>[|<Family>[|<TagName>[|<ToolCode>[|<PcdFeatureFlag>]]]]
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenSources(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_SOURCES)
|
||||
Sources = {}
|
||||
|
||||
# Get all Sources
|
||||
RecordSet = self.RecordSet[MODEL_EFI_SOURCE_FILE]
|
||||
for Record in RecordSet:
|
||||
(Filename, Family, TagName, ToolCode, Pcd) = GetSource(Record[0], ContainerFile, self.Identification.RelaPath, Record[2])
|
||||
Source = ModuleSourceFileClass(Filename, TagName, ToolCode, Family, Pcd, Record[1])
|
||||
if GenerateHelpText(Record[5], ''):
|
||||
Source.HelpTextList.append(GenerateHelpText(Record[5], ''))
|
||||
if MODEL_EFI_SOURCE_FILE in self.SectionHeaderCommentDict:
|
||||
Source.HelpText = self.SectionHeaderCommentDict[MODEL_EFI_SOURCE_FILE]
|
||||
self.Module.Sources.append(Source)
|
||||
#self.Module.FileList.append(os.path.normpath(os.path.join(self.Identification.RelaPath, Filename)))
|
||||
|
||||
## GenDepexes
|
||||
#
|
||||
# Gen Depex of Inf
|
||||
#
|
||||
# @param ContainerFile: The Inf file full path
|
||||
#
|
||||
def GenDepexes(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_DEPEX)
|
||||
Depex = {}
|
||||
# Get all Depexes
|
||||
RecordSet = self.RecordSet[MODEL_EFI_DEPEX]
|
||||
DepexString = ''
|
||||
for Record in RecordSet:
|
||||
DepexString = DepexString + Record[0] + '\n'
|
||||
Dep = ModuleDepexClass()
|
||||
if DepexString.endswith('\n'):
|
||||
DepexString = DepexString[:len(DepexString) - len('\n')]
|
||||
Dep.Depex = DepexString
|
||||
if self.Module.ModuleHeader.ModuleType in ['DXE_SMM_DRIVER']:
|
||||
self.Module.SmmDepex = Dep
|
||||
elif self.Module.ModuleHeader.ModuleType in ['PEI_CORE', 'PEIM']:
|
||||
self.Module.PeiDepex = Dep
|
||||
else:
|
||||
self.Module.DxeDepex = Dep
|
||||
# for Record in RecordSet:
|
||||
#
|
||||
# Dep = ModuleDepexClass()
|
||||
# Dep.Depex = Record[0]
|
||||
# Dep.SupArchList = Record[1]
|
||||
# if GenerateHelpText(Record[5], ''):
|
||||
# Dep.HelpTextList.append(GenerateHelpText(Record[5], ''))
|
||||
# DepexString = DepexString + Dep
|
||||
# List.append(Dep)
|
||||
# self.Module.Depex = List
|
||||
# if self.Module.ModuleHeader.ModuleType in ['DXE_SMM_DRIVER']:
|
||||
# self.Module.SmmDepex = List
|
||||
# elif self.Module.ModuleHeader.ModuleType in ['PEI_CORE', 'PEIM']:
|
||||
# self.Module.PeiDepex = List
|
||||
# else:
|
||||
# self.Module.DxeDepex = List
|
||||
|
||||
## GenBinaries
|
||||
#
|
||||
# Gen Binary of Inf
|
||||
# <FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>]
|
||||
#
|
||||
# @param ContainerFile: The Dec file full path
|
||||
#
|
||||
def GenBinaries(self, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % TAB_BINARIES)
|
||||
Binaries = {}
|
||||
|
||||
# Get all Guids
|
||||
RecordSet = self.RecordSet[MODEL_EFI_BINARY_FILE]
|
||||
for Record in RecordSet:
|
||||
(FileType, Filename, Target, Pcd) = GetBinary(Record[0], ContainerFile, self.Identification.RelaPath, Record[2])
|
||||
Binary = ModuleBinaryFileClass(Filename, FileType, Target, Pcd, Record[1])
|
||||
if GenerateHelpText(Record[5], ''):
|
||||
Binary.HelpTextList.append(GenerateHelpText(Record[5], ''))
|
||||
self.Module.Binaries.append(Binary)
|
||||
#self.Module.FileList.append(os.path.normpath(os.path.join(self.Identification.RelaPath, Filename)))
|
||||
|
||||
## GenGuids
|
||||
#
|
||||
# Gen Guids of Inf
|
||||
# <CName>=<GuidValue>
|
||||
#
|
||||
# @param ContainerFile: The Inf file full path
|
||||
#
|
||||
def GenGuidProtocolPpis(self, Type, ContainerFile):
|
||||
EdkLogger.debug(2, "Generate %s ..." % Type)
|
||||
Lists = {}
|
||||
# Get all Items
|
||||
if Type == TAB_GUIDS:
|
||||
ListMember = self.Module.Guids
|
||||
elif Type == TAB_PROTOCOLS:
|
||||
ListMember = self.Module.Protocols
|
||||
elif Type == TAB_PPIS:
|
||||
ListMember = self.Module.Ppis
|
||||
|
||||
RecordSet = self.RecordSet[Section[Type.upper()]]
|
||||
for Record in RecordSet:
|
||||
(Name, Value) = GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2])
|
||||
ListClass = GuidProtocolPpiCommonClass()
|
||||
ListClass.CName = Name
|
||||
ListClass.SupArchList = Record[1]
|
||||
ListClass.FeatureFlag = Value
|
||||
if GenerateHelpText(Record[5], ''):
|
||||
ListClass.HelpTextList.append(GenerateHelpText(Record[5], ''))
|
||||
ListMember.append(ListClass)
|
||||
|
||||
##
|
||||
#
|
||||
# This acts like the main() function for the script, unless it is 'import'ed into another
|
||||
# script.
|
||||
#
|
||||
if __name__ == '__main__':
|
||||
EdkLogger.Initialize()
|
||||
EdkLogger.SetLevel(EdkLogger.QUIET)
|
||||
|
||||
W = os.getenv('WORKSPACE')
|
||||
F = os.path.join(W, 'MdeModulePkg/Application/HelloWorld/HelloWorld.inf')
|
||||
|
||||
P = Inf(os.path.normpath(F), True, W, 'MdeModulePkg')
|
||||
P.ShowModule()
|
||||
print P.ModuleToInf(P.Module)
|
File diff suppressed because it is too large
Load Diff
|
@ -1,158 +0,0 @@
|
|||
## @file
|
||||
# This file is used to define a class object to describe a distribution package
|
||||
#
|
||||
# Copyright (c) 2008, 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.
|
||||
|
||||
##
|
||||
# Import Modules
|
||||
#
|
||||
import os.path
|
||||
from CommonClass import *
|
||||
from Common.Misc import sdict
|
||||
from Common.Misc import GetFiles
|
||||
from Common.DecClassObjectLight import Dec
|
||||
from Common.InfClassObjectLight import Inf
|
||||
from Common.XmlParser import *
|
||||
|
||||
## DistributionPackageHeaderClass
|
||||
#
|
||||
class DistributionPackageHeaderClass(IdentificationClass, CommonHeaderClass):
|
||||
def __init__(self):
|
||||
IdentificationClass.__init__(self)
|
||||
CommonHeaderClass.__init__(self)
|
||||
self.ReadOnly = 'False'
|
||||
self.RePackage = 'True'
|
||||
self.Vendor = ''
|
||||
self.Date = ''
|
||||
self.Signature = 'Md5Sum'
|
||||
self.XmlSpecification = ''
|
||||
|
||||
## DistributionPackageClass
|
||||
#
|
||||
#
|
||||
class DistributionPackageClass(object):
|
||||
def __init__(self):
|
||||
self.Header = DistributionPackageHeaderClass()
|
||||
self.PackageSurfaceArea = sdict() # {(Guid, Version, Path) : PackageObj}
|
||||
self.ModuleSurfaceArea = sdict() # {(Guid, Version, Path) : ModuleObj}
|
||||
self.Tools = MiscFileClass()
|
||||
self.MiscellaneousFiles = MiscFileClass()
|
||||
self.UserExtensions = []
|
||||
|
||||
## Get all included packages and modules for a distribution package
|
||||
#
|
||||
# @param WorkspaceDir: WorkspaceDir
|
||||
# @param PackageList: A list of all packages
|
||||
# @param ModuleList: A list of all modules
|
||||
#
|
||||
def GetDistributionPackage(self, WorkspaceDir, PackageList, ModuleList):
|
||||
AllGuidVersionDict = {}
|
||||
# Get Packages
|
||||
if PackageList:
|
||||
for PackageFile in PackageList:
|
||||
PackageFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, PackageFile))
|
||||
DecObj = Dec(PackageFileFullPath, True, WorkspaceDir)
|
||||
PackageObj = DecObj.Package
|
||||
AllGuidVersionDict[PackageFileFullPath] = [PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version]
|
||||
|
||||
# Parser inf file one bye one
|
||||
for File in PackageObj.MiscFiles.Files:
|
||||
Filename = os.path.normpath(os.path.join(PackageObj.PackageHeader.RelaPath, File.Filename))
|
||||
(Name, ExtName) = os.path.splitext(Filename)
|
||||
if ExtName.upper() == '.INF':
|
||||
InfObj = Inf(Filename, True, WorkspaceDir, DecObj.Identification.PackagePath)
|
||||
ModuleObj = InfObj.Module
|
||||
AllGuidVersionDict[File] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version]
|
||||
# Find and update Guid/Version of LibraryClass
|
||||
for Item in ModuleObj.LibraryClasses:
|
||||
if Item.RecommendedInstance:
|
||||
LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance))
|
||||
Guid, Version = '', ''
|
||||
if LibClassIns in AllGuidVersionDict:
|
||||
Guid = AllGuidVersionDict[LibClassIns][0]
|
||||
Version = AllGuidVersionDict[LibClassIns][1]
|
||||
else:
|
||||
Lib = Inf(LibClassIns, True, WorkspaceDir)
|
||||
Guid = Lib.Module.ModuleHeader.Guid
|
||||
Version = Lib.Module.ModuleHeader.Version
|
||||
AllGuidVersionDict[LibClassIns] = [Guid, Version]
|
||||
Item.RecommendedInstanceGuid = Guid
|
||||
Item.RecommendedInstanceVersion = Version
|
||||
# Find and update Guid/Version of
|
||||
for Item in ModuleObj.PackageDependencies:
|
||||
if Item.FilePath:
|
||||
PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath))
|
||||
Guid, Version = '', ''
|
||||
if PackageFilePath in AllGuidVersionDict:
|
||||
Guid = AllGuidVersionDict[PackageFilePath][0]
|
||||
Version = AllGuidVersionDict[PackageFilePath][1]
|
||||
else:
|
||||
PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir)
|
||||
Guid = PackageDependencies.Package.PackageHeader.Guid
|
||||
Version = PackageDependencies.Package.PackageHeader.Version
|
||||
AllGuidVersionDict[PackageFilePath] = [Guid, Version]
|
||||
Item.PackageGuid = Guid
|
||||
Item.PackageVersion = Version
|
||||
|
||||
# Add module to package
|
||||
PackageObj.Modules[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj
|
||||
self.PackageSurfaceArea[(PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version, PackageObj.PackageHeader.CombinePath)] = PackageObj
|
||||
|
||||
# Get Modules
|
||||
if ModuleList:
|
||||
for ModuleFile in ModuleList:
|
||||
ModuleFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, ModuleFile))
|
||||
InfObj = Inf(ModuleFileFullPath, True, WorkspaceDir)
|
||||
ModuleObj = InfObj.Module
|
||||
AllGuidVersionDict[ModuleFileFullPath] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version]
|
||||
# Find and update Guid/Version of LibraryClass
|
||||
for Item in ModuleObj.LibraryClasses:
|
||||
if Item.RecommendedInstance:
|
||||
LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance))
|
||||
Guid, Version = '', ''
|
||||
if LibClassIns in AllGuidVersionDict:
|
||||
Guid = AllGuidVersionDict[LibClassIns][0]
|
||||
Version = AllGuidVersionDict[LibClassIns][1]
|
||||
else:
|
||||
Lib = Inf(LibClassIns, True, WorkspaceDir)
|
||||
Guid = Lib.Module.ModuleHeader.Guid
|
||||
Version = Lib.Module.ModuleHeader.Version
|
||||
AllGuidVersionDict[LibClassIns] = [Guid, Version]
|
||||
Item.RecommendedInstanceGuid = Guid
|
||||
Item.RecommendedInstanceVersion = Version
|
||||
# Find and update Guid/Version of
|
||||
for Item in ModuleObj.PackageDependencies:
|
||||
if Item.FilePath:
|
||||
PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath))
|
||||
Guid, Version = '', ''
|
||||
if PackageFilePath in AllGuidVersionDict:
|
||||
Guid = AllGuidVersionDict[PackageFilePath][0]
|
||||
Version = AllGuidVersionDict[PackageFilePath][1]
|
||||
else:
|
||||
PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir)
|
||||
Guid = PackageDependencies.Package.PackageHeader.Guid
|
||||
Version = PackageDependencies.Package.PackageHeader.Version
|
||||
AllGuidVersionDict[PackageFilePath] = [Guid, Version]
|
||||
Item.PackageGuid = Guid
|
||||
Item.PackageVersion = Version
|
||||
self.ModuleSurfaceArea[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj
|
||||
|
||||
##
|
||||
#
|
||||
# This acts like the main() function for the script, unless it is 'import'ed into another
|
||||
# script.
|
||||
#
|
||||
if __name__ == '__main__':
|
||||
D = DistributionPackageClass()
|
||||
D.GetDistributionPackage(os.getenv('WORKSPACE'), ['MdePkg/MdePkg.dec', 'TianoModulePkg/TianoModulePkg.dec'], ['MdeModulePkg/Application/HelloWorld/HelloWorld.inf'])
|
||||
Xml = DistributionPackageXml()
|
||||
print Xml.ToXml(D)
|
||||
E = Xml.FromXml('C:\\2.xml')
|
||||
#print Xml.ToXml(E)
|
|
@ -580,6 +580,7 @@ class Check(object):
|
|||
pass
|
||||
|
||||
# Check whether the unnecessary inclusion of library classes in the Inf file
|
||||
# Check whether the unnecessary duplication of library classe names in the DSC file
|
||||
def MetaDataFileCheckLibraryNoUse(self):
|
||||
if EccGlobalData.gConfig.MetaDataFileCheckLibraryNoUse == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':
|
||||
EdkLogger.quiet("Checking for library instance not used ...")
|
||||
|
@ -588,7 +589,20 @@ class Check(object):
|
|||
for Record in RecordSet:
|
||||
if not EccGlobalData.gException.IsException(ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE, Record[1]):
|
||||
EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE, OtherMsg="The Library Class [%s] is not used in any platform" % (Record[1]), BelongsToTable='Inf', BelongsToItem=Record[0])
|
||||
|
||||
SqlCommand = """
|
||||
select A.ID, A.Value1, A.BelongsToFile, A.StartLine, B.StartLine from Dsc as A left join Dsc as B
|
||||
where A.Model = %s and B.Model = %s and A.Value3 = B.Value3 and A.Arch = B.Arch and A.ID <> B.ID
|
||||
and A.Value1 = B.Value1 and A.StartLine <> B.StartLine and B.BelongsToFile = A.BelongsToFile""" \
|
||||
% (MODEL_EFI_LIBRARY_CLASS, MODEL_EFI_LIBRARY_CLASS)
|
||||
RecordSet = EccGlobalData.gDb.TblDsc.Exec(SqlCommand)
|
||||
for Record in RecordSet:
|
||||
if Record[3] and Record[4] and Record[3] != Record[4]:
|
||||
SqlCommand = """select FullPath from File where ID = %s""" % (Record[2])
|
||||
FilePathList = EccGlobalData.gDb.TblFile.Exec(SqlCommand)
|
||||
for FilePath in FilePathList:
|
||||
if not EccGlobalData.gException.IsException(ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE, Record[1]):
|
||||
EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE, OtherMsg="The Library Class [%s] is duplicated in '%s' line %s and line %s." % (Record[1], FilePath, Record[3], Record[4]), BelongsToTable='Dsc', BelongsToItem=Record[0])
|
||||
|
||||
# Check whether an Inf file is specified in the FDF file, but not in the Dsc file, then the Inf file must be for a Binary module only
|
||||
def MetaDataFileCheckBinaryInfInFdf(self):
|
||||
if EccGlobalData.gConfig.MetaDataFileCheckBinaryInfInFdf == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':
|
||||
|
|
|
@ -94,6 +94,7 @@ ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI = 10013
|
|||
ERROR_META_DATA_FILE_CHECK_MODULE_FILE_NO_USE = 10014
|
||||
ERROR_META_DATA_FILE_CHECK_PCD_TYPE = 10015
|
||||
ERROR_META_DATA_FILE_CHECK_MODULE_FILE_GUID_DUPLICATION = 10016
|
||||
ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE = 10017
|
||||
|
||||
ERROR_SPELLING_CHECK_ALL = 11000
|
||||
|
||||
|
@ -171,6 +172,7 @@ gEccErrorMessage = {
|
|||
ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_DEPENDENT : "A library instance must be defined for all dependent library classes",
|
||||
ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_ORDER : "The library Instances specified by the LibraryClasses sections should be listed in order of dependencies",
|
||||
ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE : "There should be no unnecessary inclusion of library classes in the INF file",
|
||||
ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE : "Duplicate Library Class Name found",
|
||||
ERROR_META_DATA_FILE_CHECK_BINARY_INF_IN_FDF : "An INF file is specified in the FDF file, but not in the DSC file, therefore the INF file must be for a Binary module only",
|
||||
ERROR_META_DATA_FILE_CHECK_PCD_DUPLICATE : "Duplicate PCDs found",
|
||||
ERROR_META_DATA_FILE_CHECK_PCD_FLASH : "PCD settings in the FDF file should only be related to flash",
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
##
|
||||
# Import Modules
|
||||
#
|
||||
from Common.XmlRoutines import *
|
||||
from Xml.XmlRoutines import *
|
||||
import os.path
|
||||
|
||||
# ExceptionXml to parse Exception Node of XML file
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
## @file
|
||||
# Python 'Library' package initialization file.
|
||||
#
|
||||
# This file is required to make Python interpreter treat the directory
|
||||
# as containing package.
|
||||
#
|
||||
# Copyright (c) 2011, 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.
|
||||
#
|
||||
|
||||
'''
|
||||
Xml
|
||||
'''
|
|
@ -50,6 +50,7 @@ from Common.String import NormPath
|
|||
import Common.GlobalData as GlobalData
|
||||
from Common.Expression import *
|
||||
from Common import GlobalData
|
||||
from Common.String import ReplaceMacro
|
||||
|
||||
import re
|
||||
import os
|
||||
|
@ -528,25 +529,35 @@ class FdfParser:
|
|||
if not self.__GetNextToken():
|
||||
raise Warning("expected include file name", self.FileName, self.CurrentLineNumber)
|
||||
IncFileName = self.__Token
|
||||
if not os.path.isabs(IncFileName):
|
||||
if IncFileName.startswith('$(WORKSPACE)'):
|
||||
Str = IncFileName.replace('$(WORKSPACE)', os.environ.get('WORKSPACE'))
|
||||
if os.path.exists(Str):
|
||||
if not os.path.isabs(Str):
|
||||
Str = os.path.abspath(Str)
|
||||
IncFileName = Str
|
||||
else:
|
||||
# file is in the same dir with FDF file
|
||||
FullFdf = self.FileName
|
||||
if not os.path.isabs(self.FileName):
|
||||
FullFdf = os.path.join(os.environ.get('WORKSPACE'), self.FileName)
|
||||
__IncludeMacros = {}
|
||||
__IncludeMacros['WORKSPACE'] = InputMacroDict['WORKSPACE']
|
||||
__IncludeMacros['ECP_SOURCE'] = InputMacroDict['ECP_SOURCE']
|
||||
__IncludeMacros['EFI_SOURCE'] = InputMacroDict['EFI_SOURCE']
|
||||
__IncludeMacros['EDK_SOURCE'] = InputMacroDict['EDK_SOURCE']
|
||||
|
||||
IncludedFile = NormPath(ReplaceMacro(IncFileName, __IncludeMacros, RaiseError=True))
|
||||
#
|
||||
# First search the include file under the same directory as FDF file
|
||||
#
|
||||
IncludedFile1 = PathClass(IncludedFile, os.path.dirname(self.FileName))
|
||||
ErrorCode = IncludedFile1.Validate()[0]
|
||||
if ErrorCode != 0:
|
||||
#
|
||||
# Then search the include file under the same directory as DSC file
|
||||
#
|
||||
IncludedFile1 = PathClass(IncludedFile, GenFdsGlobalVariable.ActivePlatform.Dir)
|
||||
ErrorCode = IncludedFile1.Validate()[0]
|
||||
if ErrorCode != 0:
|
||||
#
|
||||
# Also search file under the WORKSPACE directory
|
||||
#
|
||||
IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)
|
||||
ErrorCode = IncludedFile1.Validate()[0]
|
||||
if ErrorCode != 0:
|
||||
raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), GenFdsGlobalVariable.ActivePlatform.Dir, GlobalData.gWorkspace),
|
||||
self.FileName, self.CurrentLineNumber)
|
||||
|
||||
IncFileName = os.path.join(os.path.dirname(FullFdf), IncFileName)
|
||||
|
||||
if not os.path.exists(os.path.normpath(IncFileName)):
|
||||
raise Warning("Include file not exists", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
IncFileProfile = IncludeFileProfile(os.path.normpath(IncFileName))
|
||||
IncFileProfile = IncludeFileProfile(IncludedFile1.Path)
|
||||
|
||||
CurrentLine = self.CurrentLineNumber
|
||||
CurrentOffset = self.CurrentOffsetWithinLine
|
||||
|
@ -2942,6 +2953,9 @@ class FdfParser:
|
|||
if not self.__GetNextToken():
|
||||
raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
if self.__Token.upper() not in self.Profile.FvDict.keys():
|
||||
raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
CapsuleFv = CapsuleData.CapsuleFv()
|
||||
CapsuleFv.FvName = self.__Token
|
||||
CapsuleObj.CapsuleDataList.append(CapsuleFv)
|
||||
|
@ -2967,6 +2981,9 @@ class FdfParser:
|
|||
if not self.__GetNextToken():
|
||||
raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
if self.__Token.upper() not in self.Profile.FdDict.keys():
|
||||
raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)
|
||||
|
||||
CapsuleFd = CapsuleData.CapsuleFd()
|
||||
CapsuleFd.FdName = self.__Token
|
||||
CapsuleObj.CapsuleDataList.append(CapsuleFd)
|
||||
|
|
|
@ -27,7 +27,6 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \
|
|||
$(BASE_TOOLS_PATH)\Source\Python\Common\Database.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\DataType.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\DecClassObject.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\DecClassObjectLight.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\Dictionary.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\DscClassObject.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\EdkIIWorkspace.py \
|
||||
|
@ -38,7 +37,6 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \
|
|||
$(BASE_TOOLS_PATH)\Source\Python\Common\GlobalData.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\Identification.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\InfClassObject.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\InfClassObjectLight.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\MigrationUtilities.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\Misc.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\Parsing.py \
|
||||
|
@ -46,8 +44,6 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \
|
|||
$(BASE_TOOLS_PATH)\Source\Python\Common\TargetTxtClassObject.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\ToolDefClassObject.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\VpdInfoFile.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\XmlParser.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\XmlRoutines.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\__init__.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Common\BuildVersion.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Workspace\BuildClassObject.py \
|
||||
|
@ -65,6 +61,7 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \
|
|||
$(BASE_TOOLS_PATH)\Source\Python\Autogen\UniClassObject.py \
|
||||
$(BASE_TOOLS_PATH)\Source\Python\Autogen\__init__.py
|
||||
|
||||
UPT_BUILDVERSION_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\UPT\BuildVersion.py
|
||||
|
||||
all: SetPythonPath $(APPLICATIONS)
|
||||
|
||||
|
@ -104,7 +101,7 @@ $(BIN_DIR)\PatchPcdValue.exe: $(BASE_TOOLS_PATH)\Source\Python\PatchPcdValue\Pat
|
|||
$(BIN_DIR)\BPDG.exe: $(BASE_TOOLS_PATH)\Source\Python\BPDG\BPDG.py $(COMMON_PYTHON)
|
||||
@pushd . & @cd BPDG & @$(FREEZE) --include-modules=$(MODULES) --install-dir=$(BIN_DIR) BPDG.py & @popd
|
||||
|
||||
$(BIN_DIR)\UPT.exe: $(BASE_TOOLS_PATH)\Source\Python\UPT\UPT.py $(BASE_TOOLS_PATH)\Source\Python\UPT\UPT.py $(COMMON_PYTHON)
|
||||
$(BIN_DIR)\UPT.exe: $(BASE_TOOLS_PATH)\Source\Python\UPT\UPT.py $(UPT_BUILDVERSION_PYTHON)
|
||||
@pushd . & @cd UPT & @$(FREEZE) --include-modules=$(MODULES) --install-dir=$(BIN_DIR) UPT.py & @popd
|
||||
|
||||
clean:
|
||||
|
|
|
@ -37,7 +37,9 @@ gTypedefPattern = re.compile("^\s*typedef\s+struct(\s+\w+)?\s*[{]*$", re.MULTILI
|
|||
## Regular expression for matching "#pragma pack"
|
||||
gPragmaPattern = re.compile("^\s*#pragma\s+pack", re.MULTILINE)
|
||||
## Regular expression for matching HEX number
|
||||
gHexNumberPattern = re.compile("0[xX]([0-9a-fA-F]+)")
|
||||
gHexNumberPattern = re.compile("(0[xX])([0-9a-fA-F]+)U?")
|
||||
## Regular expression for matching decimal number with 'U' postfix
|
||||
gDecNumberPattern = re.compile("([0-9]+)U")
|
||||
## Regular expression for matching "Include ()" in asl file
|
||||
gAslIncludePattern = re.compile("^(\s*)[iI]nclude\s*\(\"?([^\"\(\)]+)\"\)", re.MULTILINE)
|
||||
## Regular expression for matching C style #include "XXX.asl" in asl file
|
||||
|
@ -169,10 +171,15 @@ def TrimPreprocessedFile(Source, Target, ConvertHex, TrimLong):
|
|||
|
||||
# convert HEX number format if indicated
|
||||
if ConvertHex:
|
||||
Line = gHexNumberPattern.sub(r"0\1h", Line)
|
||||
Line = gHexNumberPattern.sub(r"0\2h", Line)
|
||||
else:
|
||||
Line = gHexNumberPattern.sub(r"\1\2", Line)
|
||||
if TrimLong:
|
||||
Line = gLongNumberPattern.sub(r"\1", Line)
|
||||
|
||||
# convert Decimal number format
|
||||
Line = gDecNumberPattern.sub(r"\1", Line)
|
||||
|
||||
if LineNumber != None:
|
||||
EdkLogger.verbose("Got line directive: line=%d" % LineNumber)
|
||||
# in case preprocessor removed some lines, like blank or comment lines
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
#This file is for build version number auto generation
|
||||
#
|
||||
gBUILD_VERSION = "Build 2423"
|
|
@ -834,6 +834,59 @@ def ProcessLineExtender(LineList):
|
|||
|
||||
return NewList
|
||||
|
||||
## ProcessEdkComment
|
||||
#
|
||||
# Process EDK style comment in LineList: c style /* */ comment or cpp style // comment
|
||||
#
|
||||
#
|
||||
# @param LineList The LineList need to be processed.
|
||||
#
|
||||
# @return LineList The LineList been processed.
|
||||
# @return FirstPos Where Edk comment is first found, -1 if not found
|
||||
#
|
||||
def ProcessEdkComment(LineList):
|
||||
FindEdkBlockComment = False
|
||||
Count = 0
|
||||
StartPos = -1
|
||||
EndPos = -1
|
||||
FirstPos = -1
|
||||
|
||||
while(Count < len(LineList)):
|
||||
Line = LineList[Count].strip()
|
||||
if Line.startswith("/*"):
|
||||
#
|
||||
# handling c style comment
|
||||
#
|
||||
StartPos = Count
|
||||
while Count < len(LineList):
|
||||
Line = LineList[Count].strip()
|
||||
if Line.endswith("*/"):
|
||||
if (Count == StartPos) and Line.strip() == '/*/':
|
||||
Count = Count + 1
|
||||
continue
|
||||
EndPos = Count
|
||||
FindEdkBlockComment = True
|
||||
break
|
||||
Count = Count + 1
|
||||
|
||||
if FindEdkBlockComment:
|
||||
if FirstPos == -1:
|
||||
FirstPos = StartPos
|
||||
for Index in xrange(StartPos, EndPos+1):
|
||||
LineList[Index] = ''
|
||||
FindEdkBlockComment = False
|
||||
elif Line.find("//") != -1:
|
||||
#
|
||||
# handling cpp style comment
|
||||
#
|
||||
LineList[Count] = Line.replace("//", '#')
|
||||
if FirstPos == -1:
|
||||
FirstPos = Count
|
||||
|
||||
Count = Count + 1
|
||||
|
||||
return LineList, FirstPos
|
||||
|
||||
## GetLibInstanceInfo
|
||||
#
|
||||
# Get the information from Library Instance INF file.
|
||||
|
|
|
@ -196,6 +196,7 @@ ERR_INF_PARSER_VER_EXIST_BOTH_NUM_STR = \
|
|||
_("The INF file %s defines both VERSION_NUMBER and VERSION_STRING, "
|
||||
"using VERSION_STRING")
|
||||
ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF = _("EDKI INF is not supported")
|
||||
ERR_INF_PARSER_EDKI_COMMENT_IN_EDKII = _("The EDKI style comment is not supported in EDKII modules")
|
||||
|
||||
ERR_INF_PARSER_FEATUREPCD_USAGE_INVALID = _("The usage for FeaturePcd can only"
|
||||
" be type of \"CONSUMES\".")
|
||||
|
|
|
@ -24,14 +24,14 @@ SOURCES_PATH = .
|
|||
|
||||
APPLICATIONS=$(BIN_DIR)\UPT.exe
|
||||
|
||||
COMMON_PYTHON=$(SOURCES_PATH)\UPT.py
|
||||
UPT_BUILDVERSION_PYTHON=$(SOURCES_PATH)\BuildVersion.py
|
||||
|
||||
all: SetPythonPath $(APPLICATIONS)
|
||||
|
||||
SetPythonPath:
|
||||
set PYTHONPATH= $(SOURCES_PATH)
|
||||
|
||||
$(BIN_DIR)\UPT.exe: $(SOURCES_PATH)\UPT.py $(COMMON_PYTHON)
|
||||
$(BIN_DIR)\UPT.exe: $(SOURCES_PATH)\UPT.py $(UPT_BUILDVERSION_PYTHON)
|
||||
@pushd . & @cd build & @$(FREEZE) --include-modules=$(MODULES) --install-dir=$(BIN_DIR) UPT.py & @popd
|
||||
@pushd . & @copy .\Dll\sqlite3.dll .\Bin\Sqlite3.dll & @popd
|
||||
clean:
|
||||
|
|
|
@ -26,6 +26,7 @@ from copy import deepcopy
|
|||
from Library.String import GetSplitValueList
|
||||
from Library.String import ConvertSpecialChar
|
||||
from Library.Misc import ProcessLineExtender
|
||||
from Library.Misc import ProcessEdkComment
|
||||
from Library.Parsing import NormPath
|
||||
from Library.ParserValidate import IsValidInfMoudleTypeList
|
||||
from Library.ParserValidate import IsValidArch
|
||||
|
@ -164,6 +165,12 @@ class InfParser(InfSectionParser):
|
|||
#
|
||||
FileLinesList = ProcessLineExtender(FileLinesList)
|
||||
|
||||
#
|
||||
# Process EdkI INF style comment if found
|
||||
#
|
||||
OrigLines = [Line for Line in FileLinesList]
|
||||
FileLinesList, EdkCommentStartPos = ProcessEdkComment(FileLinesList)
|
||||
|
||||
#
|
||||
# Judge whether the INF file is Binary INF or not
|
||||
#
|
||||
|
@ -338,6 +345,17 @@ class InfParser(InfSectionParser):
|
|||
ST.ERR_INF_PARSER_HEADER_MISSGING,
|
||||
File=self.FullPath)
|
||||
|
||||
#
|
||||
# EDKII INF should not have EDKI style comment
|
||||
#
|
||||
if EdkCommentStartPos != -1:
|
||||
Logger.Error("InfParser",
|
||||
FORMAT_INVALID,
|
||||
ST.ERR_INF_PARSER_EDKI_COMMENT_IN_EDKII,
|
||||
File=self.FullPath,
|
||||
Line=EdkCommentStartPos + 1,
|
||||
ExtraData=OrigLines[EdkCommentStartPos])
|
||||
|
||||
#
|
||||
# extract [Event] [Hob] [BootMode] sections
|
||||
#
|
||||
|
|
|
@ -43,7 +43,7 @@ import RmPkg
|
|||
from Library.Misc import CheckEnvVariable
|
||||
from Library import GlobalData
|
||||
from Core.IpiDb import IpiDatabase
|
||||
from Common.BuildVersion import gBUILD_VERSION
|
||||
from BuildVersion import gBUILD_VERSION
|
||||
|
||||
##
|
||||
# Version and Copyright
|
||||
|
|
|
@ -769,7 +769,7 @@ class DscParser(MetaFileParser):
|
|||
self._InSubsection = False
|
||||
self._SubsectionType = MODEL_UNKNOWN
|
||||
self._SubsectionName = ''
|
||||
self._Owner.pop()
|
||||
self._Owner[-1] = -1
|
||||
continue
|
||||
# subsection header
|
||||
elif Line[0] == TAB_OPTION_START and Line[-1] == TAB_OPTION_END:
|
||||
|
@ -1247,19 +1247,48 @@ class DscParser(MetaFileParser):
|
|||
MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]:
|
||||
break
|
||||
elif self._ItemType == MODEL_META_DATA_INCLUDE:
|
||||
# The included file must be relative to workspace
|
||||
IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], self._Macros, RaiseError=True))
|
||||
IncludedFile = PathClass(IncludedFile, GlobalData.gWorkspace)
|
||||
ErrorCode, ErrorInfo = IncludedFile.Validate()
|
||||
# The included file must be relative to workspace or same directory as DSC file
|
||||
__IncludeMacros = {}
|
||||
#
|
||||
# Allow using system environment variables in path after !include
|
||||
#
|
||||
__IncludeMacros['WORKSPACE'] = GlobalData.gGlobalDefines['WORKSPACE']
|
||||
if "ECP_SOURCE" in GlobalData.gGlobalDefines.keys():
|
||||
__IncludeMacros['ECP_SOURCE'] = GlobalData.gGlobalDefines['ECP_SOURCE']
|
||||
#
|
||||
# During GenFds phase call DSC parser, will go into this branch.
|
||||
#
|
||||
elif "ECP_SOURCE" in GlobalData.gCommandLineDefines.keys():
|
||||
__IncludeMacros['ECP_SOURCE'] = GlobalData.gCommandLineDefines['ECP_SOURCE']
|
||||
|
||||
__IncludeMacros['EFI_SOURCE'] = GlobalData.gGlobalDefines['EFI_SOURCE']
|
||||
__IncludeMacros['EDK_SOURCE'] = GlobalData.gGlobalDefines['EDK_SOURCE']
|
||||
#
|
||||
# Allow using MACROs comes from [Defines] section to keep compatible.
|
||||
#
|
||||
__IncludeMacros.update(self._Macros)
|
||||
|
||||
IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], __IncludeMacros, RaiseError=True))
|
||||
#
|
||||
# First search the include file under the same directory as DSC file
|
||||
#
|
||||
IncludedFile1 = PathClass(IncludedFile, self.MetaFile.Dir)
|
||||
ErrorCode, ErrorInfo1 = IncludedFile1.Validate()
|
||||
if ErrorCode != 0:
|
||||
EdkLogger.error('parser', ErrorCode, File=self._FileWithError,
|
||||
Line=self._LineIndex+1, ExtraData=ErrorInfo)
|
||||
#
|
||||
# Also search file under the WORKSPACE directory
|
||||
#
|
||||
IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)
|
||||
ErrorCode, ErrorInfo2 = IncludedFile1.Validate()
|
||||
if ErrorCode != 0:
|
||||
EdkLogger.error('parser', ErrorCode, File=self._FileWithError,
|
||||
Line=self._LineIndex+1, ExtraData=ErrorInfo1 + "\n"+ ErrorInfo2)
|
||||
|
||||
self._FileWithError = IncludedFile
|
||||
self._FileWithError = IncludedFile1
|
||||
|
||||
IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile, MODEL_FILE_DSC, False)
|
||||
IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False)
|
||||
Owner = self._Content[self._ContentIndex-1][0]
|
||||
Parser = DscParser(IncludedFile, self._FileType, IncludedFileTable,
|
||||
Parser = DscParser(IncludedFile1, self._FileType, IncludedFileTable,
|
||||
Owner=Owner, From=Owner)
|
||||
|
||||
# set the parser status with current status
|
||||
|
@ -1280,7 +1309,10 @@ class DscParser(MetaFileParser):
|
|||
Records = IncludedFileTable.GetAll()
|
||||
if Records:
|
||||
self._Content[self._ContentIndex:self._ContentIndex] = Records
|
||||
|
||||
self._Content.pop(self._ContentIndex-1)
|
||||
self._ValueList = None
|
||||
self._ContentIndex -= 1
|
||||
|
||||
def __ProcessSkuId(self):
|
||||
self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True)
|
||||
for Value in self._ValueList]
|
||||
|
|
Loading…
Reference in New Issue