From: jwang36 Date: Fri, 13 Oct 2006 09:21:14 +0000 (+0000) Subject: a) Cleaned tools_def.template X-Git-Tag: edk2-stable201903~24130 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=8c84e1b1aca1f2eac14ba331f3fec892210a70c4 a) Cleaned tools_def.template b) Changed overriding priority of tool chain definition. Now right non-* has higher priority. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1744 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/Tools/Conf/tools_def.template b/Tools/Conf/tools_def.template index 6cb197fb7d..f36bcf21fa 100644 --- a/Tools/Conf/tools_def.template +++ b/Tools/Conf/tools_def.template @@ -15,6 +15,23 @@ IDENTIFIER = Default TOOL_CHAIN_CONF #################################################################################### # # format: TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE = +# priorty: +# TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE (Highest) +# ******_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE +# TARGET_*********_ARCH_COMMANDTYPE_ATTRIBUTE +# ******_*********_ARCH_COMMANDTYPE_ATTRIBUTE +# TARGET_TOOLCHAIN_****_COMMANDTYPE_ATTRIBUTE +# ******_TOOLCHAIN_****_COMMANDTYPE_ATTRIBUTE +# TARGET_*********_****_COMMANDTYPE_ATTRIBUTE +# ******_*********_****_COMMANDTYPE_ATTRIBUTE +# TARGET_TOOLCHAIN_ARCH_***********_ATTRIBUTE +# ******_TOOLCHAIN_ARCH_***********_ATTRIBUTE +# TARGET_*********_ARCH_***********_ATTRIBUTE +# ******_*********_ARCH_***********_ATTRIBUTE +# TARGET_TOOLCHAIN_****_***********_ATTRIBUTE +# ******_TOOLCHAIN_****_***********_ATTRIBUTE +# TARGET_*********_****_***********_ATTRIBUTE +# ******_*********_****_***********_ATTRIBUTE (Lowest) # #################################################################################### #################################################################################### @@ -124,10 +141,12 @@ RELEASE_WINDDK3790x1830_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OP ################## # IPF definitions ################## +*_WINDDK3790x1830_IPF_APP_NAME = cl.exe *_WINDDK3790x1830_IPF_ASM_NAME = ias.exe *_WINDDK3790x1830_IPF_ASM_EXT = .s *_WINDDK3790x1830_IPF_*_PATH = C:\WINDDK\3790.1830\bin\win64\x86 +*_WINDDK3790x1830_IPF_APP_FLAGS = /nologo /P /TC *_WINDDK3790x1830_IPF_PP_FLAGS = /nologo /P /TC /FI${DEST_DIR_DEBUG}/AutoGen.h *_WINDDK3790x1830_IPF_CC_FLAGS = /GS- /nologo /W4 /WX /EHs-c- /Gy /c /D EFI64 /O1i /DEFI_FIRMWARE_VENDOR=L\"INTEL\" /DSTRING_ARRAY_NAME=${BASE_NAME}Strings /FI${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch /Yu${DEST_DIR_DEBUG}/AutoGen.h *_WINDDK3790x1830_IPF_PCH_FLAGS = /GS- /nologo /W4 /WX /EHs-c- /Gy /c /D EFI64 /O1i /DEFI_FIRMWARE_VENDOR=L\"INTEL\" /DSTRING_ARRAY_NAME=${BASE_NAME}Strings /FI${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch /Yc /TC @@ -155,10 +174,7 @@ RELEASE_WINDDK3790x1830_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OP ################## *_WINDDK3790x1830_*_ASL_FAMILY = INTEL *_WINDDK3790x1830_*_ASL_NAME = iasl.exe -*_WINDDK3790x1830_IA32_ASL_PATH = C:\ASL -*_WINDDK3790x1830_X64_ASL_PATH = C:\ASL -*_WINDDK3790x1830_IPF_ASL_PATH = C:\ASL -*_WINDDK3790x1830_EBC_ASL_PATH = C:\ASL +*_WINDDK3790x1830_*_ASL_PATH = C:\ASL #################################################################################### # @@ -248,10 +264,7 @@ RELEASE_VS2005PRO_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF ################## *_VS2005PRO_*_ASL_FAMILY = INTEL *_VS2005PRO_*_ASL_NAME = iasl.exe -*_VS2005PRO_IA32_ASL_PATH = C:\ASL -*_VS2005PRO_X64_ASL_PATH = C:\ASL -*_VS2005PRO_IPF_ASL_PATH = C:\ASL -*_VS2005PRO_EBC_ASL_PATH = C:\ASL +*_VS2005PRO_*_ASL_PATH = C:\ASL #################################################################################### # @@ -330,10 +343,7 @@ RELEASE_VS2005PRO_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF # # *_*_*_ASL_FAMILY = INTEL # *_*_*_ASL_NAME = iasl.exe -# *_*_IA32_ASL_PATH = C:\ASL -# *_*_X64_ASL_PATH = C:\ASL -# *_*_IPF_ASL_PATH = C:\ASL -# *_*_EBC_ASL_PATH = C:\ASL +# *_*_*_ASL_PATH = C:\ASL # #################################################################################### # @@ -343,10 +353,7 @@ RELEASE_VS2005PRO_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF # # *_*_*_ASL_FAMILY = MSFT # *_*_*_ASL_NAME = asl.exe -# *_*_IA32_ASL_PATH = C:\ASL -# *_*_X64_ASL_PATH = C:\ASL -# *_*_IPF_ASL_PATH = C:\ASL -# *_*_EBC_ASL_PATH = C:\ASL +# *_*_*_ASL_PATH = C:\ASL # #################################################################################### @@ -359,20 +366,20 @@ RELEASE_VS2005PRO_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF # ASL - Intel ACPI Source Language COmpiler # #################################################################################### +*_MYTOOLS_*_*_FAMILY = MSFT + +*_MYTOOLS_*_CC_NAME = cl.exe +*_MYTOOLS_*_SLINK_NAME = lib.exe +*_MYTOOLS_*_DLINK_NAME = link.exe +*_MYTOOLS_*_ASMLINK_NAME = link.exe +*_MYTOOLS_*_PP_NAME = cl.exe +*_MYTOOLS_*_ASM_NAME = ml.exe ################## # IA32 definitions ################## -*_MYTOOLS_IA32_*_FAMILY = MSFT - -*_MYTOOLS_IA32_CC_NAME = cl.exe -*_MYTOOLS_IA32_SLINK_NAME = lib.exe -*_MYTOOLS_IA32_DLINK_NAME = link.exe -*_MYTOOLS_IA32_ASMLINK_NAME = link.exe -*_MYTOOLS_IA32_PP_NAME = cl.exe -*_MYTOOLS_IA32_ASM_NAME = ml.exe -*_MYTOOLS_IA32_ASM_EXT = .asm *_MYTOOLS_IA32_PCH_NAME = cl.exe +*_MYTOOLS_IA32_ASM_EXT = .asm *_MYTOOLS_IA32_*_PATH = C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin *_MYTOOLS_IA32_*_DPATH = C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE @@ -392,22 +399,14 @@ RELEASE_MYTOOLS_IA32_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF / ################## # x64 definitions ################## -*_MYTOOLS_X64_*_FAMILY = MSFT - -*_MYTOOLS_X64_CC_NAME = cl.exe -*_MYTOOLS_X64_SLINK_NAME = lib.exe -*_MYTOOLS_X64_DLINK_NAME = link.exe -*_MYTOOLS_X64_ASMLINK_NAME = link.exe -*_MYTOOLS_X64_PP_NAME = cl.exe *_MYTOOLS_X64_PCH_NAME = cl.exe - -*_MYTOOLS_X64_SLINK_FLAGS = /nologo /LTCG - *_MYTOOLS_X64_ASM_NAME = ml64.exe *_MYTOOLS_X64_ASM_EXT = .asm + *_MYTOOLS_X64_*_PATH = C:\WINDDK\3790.1830\bin\win64\x86\amd64 *_MYTOOLS_X64_ASMLINK_PATH = C:\WINDDK\3790.1830\bin\bin16\ +*_MYTOOLS_X64_SLINK_FLAGS = /nologo /LTCG *_MYTOOLS_X64_PP_FLAGS = /nologo /P /TC /FI${DEST_DIR_DEBUG}/AutoGen.h DEBUG_MYTOOLS_X64_CC_FLAGS = /nologo /X /W4 /WX /c /Gs8192 /GS- /D UNICODE /O1ib2s /GL /Gy /D EFIX64 /DOLDSMM=1 /D EFI_FIRMWARE_VENDOR=L\"INTEL\" /DSTRING_ARRAY_NAME=${BASE_NAME}Strings /FI${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch /Yu${DEST_DIR_DEBUG}/AutoGen.h /Zi /Gm /EHs-c- /GF RELEASE_MYTOOLS_X64_CC_FLAGS = /nologo /X /W4 /WX /c /Gs8192 /GS- /D UNICODE /O1ib2s /GL /Gy /D EFIX64 /DOLDSMM=1 /D EFI_FIRMWARE_VENDOR=L\"INTEL\" /DSTRING_ARRAY_NAME=${BASE_NAME}Strings /FI${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch /Yu${DEST_DIR_DEBUG}/AutoGen.h /EHs-c- /GF @@ -421,19 +420,11 @@ RELEASE_MYTOOLS_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /O ################## # IPF definitions ################## -*_MYTOOLS_IPF_*_FAMILY = MSFT - -*_MYTOOLS_IPF_APP_NAME = cl.exe -*_MYTOOLS_IPF_PP_NAME = cl.exe -*_MYTOOLS_IPF_CC_NAME = cl.exe -*_MYTOOLS_IPF_SLINK_NAME = lib.exe -*_MYTOOLS_IPF_DLINK_NAME = link.exe *_MYTOOLS_IPF_PCH_NAME = cl.exe - -*_MYTOOLS_IPF_SLINK_FLAGS = /nologo /LTCG - +*_MYTOOLS_IPF_APP_NAME = cl.exe *_MYTOOLS_IPF_ASM_NAME = ias.exe *_MYTOOLS_IPF_ASM_EXT = .s + *_MYTOOLS_IPF_*_PATH = C:\WINDDK\3790.1830\bin\win64\x86 *_MYTOOLS_IPF_APP_FLAGS = /nologo /P /TC @@ -442,6 +433,7 @@ RELEASE_MYTOOLS_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /O *_MYTOOLS_IPF_PCH_FLAGS = /GS- /nologo /W4 /WX /EHs-c- /Gy /c /D EFI64 /O1i /DEFI_FIRMWARE_VENDOR=L\"INTEL\" /DSTRING_ARRAY_NAME=${BASE_NAME}Strings /FI${DEST_DIR_DEBUG}/AutoGen.h /Fp${DEST_DIR_OUTPUT}/AutoGen.h.gch /Yc /TC *_MYTOOLS_IPF_ASM_FLAGS = -N us -X explicit -M ilp64 -N so -W4 *_MYTOOLS_IPF_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /LTCG /OPT:REF /IGNORE:4086 /MAP /MACHINE:IA64 /ENTRY:${ENTRYPOINT} /SUBSYSTEM:CONSOLE /MAP:${DEST_DIR_DEBUG}/${BASE_NAME}.map /PDB:${DEST_DIR_DEBUG}/${BASE_NAME}.pdb +*_MYTOOLS_IPF_SLINK_FLAGS = /nologo /LTCG ################## # EBC definitions @@ -451,6 +443,7 @@ RELEASE_MYTOOLS_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /O *_MYTOOLS_EBC_CC_NAME = iec.exe *_MYTOOLS_EBC_DLINK_NAME = link.exe *_MYTOOLS_EBC_SLINK_NAME = link.exe + *_MYTOOLS_EBC_*_PATH = C:\Program Files\Intel\EBC\Bin *_MYTOOLS_EBC_*_SPATH = "C:\Program Files\Intel\EBC\Lib\EbcLib.lib" @@ -464,7 +457,4 @@ RELEASE_MYTOOLS_X64_DLINK_FLAGS = /NOLOGO /NODEFAULTLIB /IGNORE:4086 /OPT:REF /O ################## *_MYTOOLS_*_ASL_FAMILY = INTEL *_MYTOOLS_*_ASL_NAME = iasl.exe -*_MYTOOLS_IA32_ASL_PATH = C:\ASL -*_MYTOOLS_X64_ASL_PATH = C:\ASL -*_MYTOOLS_IPF_ASL_PATH = C:\ASL -*_MYTOOLS_EBC_ASL_PATH = C:\ASL +*_MYTOOLS_*_ASL_PATH = C:\ASL diff --git a/Tools/Java/Source/GenBuild/org/tianocore/build/global/GlobalData.java b/Tools/Java/Source/GenBuild/org/tianocore/build/global/GlobalData.java index ceb19d91db..9138036c78 100644 --- a/Tools/Java/Source/GenBuild/org/tianocore/build/global/GlobalData.java +++ b/Tools/Java/Source/GenBuild/org/tianocore/build/global/GlobalData.java @@ -132,6 +132,7 @@ public class GlobalData { private static Map moduleToolChainOption = new HashMap(); private static Map moduleToolChainFamilyOption = new HashMap(); + private static Pattern flagPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+"); /** Parse framework database (DB) and all SPD files listed in DB to initialize the environment for next build. This method will only be executed only once @@ -733,153 +734,71 @@ public class GlobalData { ToolChainMap toolChainConfig = toolsDef.getConfig(); String setting = null; + // + // Default in tools_def.txt + // setting = toolChainConfig.get(toolChainKey); if (setting == null) { - setting = ""; + setting = ""; } if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolChainAttribute.FLAGS.toString())) { return setting; } // - // get module specific options, if any - // - // tool tag first - ToolChainMap option = moduleToolChainOption.get(fpdModuleId); - ToolChainKey toolChainFamilyKey = null; - - if (option != null && option.get(toolChainKey) != null) - { - String str = option.get(toolChainKey); - - Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+"); - Matcher matcher = myPattern.matcher(str + " "); - while (matcher.find()) - { - setting = setting + " " + str.substring(matcher.start(1), matcher.end(1)); - } - } -// else -// { - if (toolChainFamilyKey == null) - { - toolChainFamilyKey = new ToolChainKey(commandDescription); - toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value); - String family = toolChainConfig.get(toolChainFamilyKey); - toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value); - toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value); - } - - option = moduleToolChainFamilyOption.get(fpdModuleId); - if (option != null && option.get(toolChainFamilyKey) != null) - { - String str = option.get(toolChainFamilyKey); - - Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+"); - Matcher matcher = myPattern.matcher(str + " "); - while (matcher.find()) - { - setting = setting + " " + str.substring(matcher.start(1), matcher.end(1)); - } - } -// } - - // - // get platform options, if any - // - // tool tag first -// if (platformToolChainOption != null && platformToolChainOption.get(toolChainKey) != null) - if (platformToolChainOption.get(toolChainKey) != null) - { - String str = platformToolChainOption.get(toolChainKey); - - Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+"); - Matcher matcher = myPattern.matcher(str + " "); - while (matcher.find()) - { - setting = setting + " " + str.substring(matcher.start(1), matcher.end(1)); - } - } -// else -// { - // then tool chain family - if (toolChainFamilyKey == null) - { - toolChainFamilyKey = new ToolChainKey(commandDescription); - toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value); - String family = toolChainConfig.get(toolChainFamilyKey); - toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value); - toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value); - } - -// if (platformToolChainFamilyOption != null && platformToolChainFamilyOption.get(toolChainFamilyKey) != null) - if (platformToolChainFamilyOption.get(toolChainFamilyKey) != null) - { - String str = platformToolChainFamilyOption.get(toolChainFamilyKey); - - setting = setting + " " + str; - -// Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+"); -// Matcher matcher = myPattern.matcher(str + " "); -// while (matcher.find()) -// { -// setting = setting + " " + str.substring(matcher.start(1), matcher.end(1)); -// } - } -// } + // tool's option can be in .fpd and/or .msa file + // + String optionString; + ToolChainMap option = null; + ToolChainKey toolChainFamilyKey = new ToolChainKey(commandDescription); - return setting; + toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value); + String family = toolChainConfig.get(toolChainFamilyKey); + toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value); + toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value); -/* // - // get module specific options, if any + // Platform's tool chain family option // - // tool tag first - ToolChainMap option = moduleToolChainOption.get(fpdModuleId); - ToolChainKey toolChainFamilyKey = null; - - if ((option == null) || (option != null && (setting = option.get(toolChainKey)) == null)) - { - // - // then tool chain family - // - toolChainFamilyKey = new ToolChainKey(commandDescription); - toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value); - String family = toolChainConfig.get(toolChainFamilyKey); - toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value); - toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value); - - option = moduleToolChainFamilyOption.get(fpdModuleId); - if (option != null) { - setting = option.get(toolChainFamilyKey); - } + optionString = platformToolChainFamilyOption.get(toolChainFamilyKey); + if (optionString != null) { + setting += (" " + optionString); } // - // get platform options, if any + // Platform's tool chain tag option // - if (setting == null) { - // tool tag first - if (platformToolChainOption == null || (setting = platformToolChainOption.get(toolChainKey)) == null) { - // then tool chain family - if (toolChainFamilyKey == null) { - toolChainFamilyKey = new ToolChainKey(commandDescription); - toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value); - String family = toolChainConfig.get(toolChainFamilyKey); - toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value); - toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value); - } + optionString = platformToolChainOption.get(toolChainKey); + if (optionString != null) { + Matcher matcher = flagPattern.matcher(optionString + " "); + while (matcher.find()) { + setting += (" " + optionString.substring(matcher.start(1), matcher.end(1))); + } + } - setting = platformToolChainFamilyOption.get(toolChainFamilyKey); + // + // Module's tool chain family option + // + option = moduleToolChainFamilyOption.get(fpdModuleId); + if (option != null && (optionString = option.get(toolChainFamilyKey)) != null) { + Matcher matcher = flagPattern.matcher(optionString + " "); + while (matcher.find()) { + setting += (" " + optionString.substring(matcher.start(1), matcher.end(1))); } } - if (setting == null) { - setting = ""; + // + // Module's tool chain tag option + // + option = moduleToolChainOption.get(fpdModuleId); + if (option != null && (optionString = option.get(toolChainKey)) != null) { + Matcher matcher = flagPattern.matcher(optionString + " "); + while (matcher.find()) { + setting += (" " + optionString.substring(matcher.start(1), matcher.end(1))); + } } return setting; -*/ } public static void setToolChainEnvInfo(ToolChainInfo envInfo) { diff --git a/Tools/Java/Source/GenBuild/org/tianocore/build/toolchain/ToolChainMap.java b/Tools/Java/Source/GenBuild/org/tianocore/build/toolchain/ToolChainMap.java index b9d24eb0b9..f3f07797bc 100644 --- a/Tools/Java/Source/GenBuild/org/tianocore/build/toolchain/ToolChainMap.java +++ b/Tools/Java/Source/GenBuild/org/tianocore/build/toolchain/ToolChainMap.java @@ -29,7 +29,7 @@ public class ToolChainMap { // // From which part of key can be used to match "*" // - private int matchLevel = ToolChainKey.keyLength - 2; + private int matchLevel = ToolChainKey.keyLength - 1; // // A Map object in which tool chain configuration information will be stored @@ -211,98 +211,96 @@ public class ToolChainMap { /// /// In the current tool chain definition format (in name/value pair), /// there're five parts in the "name". The last part of the "name" must - /// not be "wildcard". So we should start combining "*" from the fourth part. + /// not be "wildcard". We should start combining "*" from left to right. /// We'll try all the possible combinations until the value can be fetched. /// /// The following code implements the logic which will try to use, for example, /// following key parts combinations sequentially to get the value. /// /// TARGET_TOOLCHAIN_ARCH_TOOLCODE_ATTRIBUTE - /// TARGET_TOOLCHAIN_ARCH_*_ATTRIBUTE - /// TARGET_TOOLCHAIN_*_TOOLCODE_ATTRIBUTE - /// TARGET_TOOLCHAIN_*_*_ATTRIBUTE - /// TARGET_*_ARCH_TOOLCODE_ATTRIBUTE - /// TARGET_*_ARCH_*_ATTRIBUTE - /// TARGET_*_*_TOOLCODE_ATTRIBUTE - /// TARGET_*_*_*_ATTRIBUTE - /// *_TOOLCHAIN_ARCH_TOOLCODE_ATTRIBUTE - /// *_TOOLCHAIN_ARCH_*_ATTRIBUTE - /// *_TOOLCHAIN_*_TOOLCODE_ATTRIBUTE - /// *_TOOLCHAIN_*_*_ATTRIBUTE - /// *_*_ARCH_TOOLCODE_ATTRIBUTE - /// *_*_ARCH_*_ATTRIBUTE - /// *_*_*_TOOLCODE_ATTRIBUTE - /// *_*_*_*_ATTRIBUTE + /// ******_TOOLCHAIN_ARCH_TOOLCODE_ATTRIBUTE + /// TARGET_*********_ARCH_TOOLCODE_ATTRIBUTE + /// ******_*********_ARCH_TOOLCODE_ATTRIBUTE + /// TARGET_TOOLCHAIN_****_TOOLCODE_ATTRIBUTE + /// ******_TOOLCHAIN_****_TOOLCODE_ATTRIBUTE + /// TARGET_*********_****_TOOLCODE_ATTRIBUTE + /// ******_*********_****_TOOLCODE_ATTRIBUTE + /// TARGET_TOOLCHAIN_ARCH_********_ATTRIBUTE + /// ******_TOOLCHAIN_ARCH_********_ATTRIBUTE + /// TARGET_*********_ARCH_********_ATTRIBUTE + /// ******_*********_ARCH_********_ATTRIBUTE + /// TARGET_TOOLCHAIN_****_********_ATTRIBUTE + /// ******_TOOLCHAIN_****_********_ATTRIBUTE + /// TARGET_*********_****_********_ATTRIBUTE + /// ******_*********_****_********_ATTRIBUTE /// // - // level is used to control if all parts of "name" have been "wildcarded" + // The wildcard "*" appears regularly (2^n). "*" in TARGET appears 2^0 + // times at every 2^0 TARGET, "*" in TOOLCHAIN appears 2^1 times at + // every 2^1 TOOLCHAIN, and "*" in TOOLCODE appears 2^3 times at every + // 2^3 TOOLCODE. We're going to use this to form all the combinations of key. // - int level = matchLevel; - while (level >= 0) { + int[] combinations = new int[matchLevel]; + for (int i = 0; i < matchLevel; ++i) { // - // tmplevel is used to control if all parts of "name" between first - // "*" and fourth name part have been "wildcarded". + // initialize the array with 2^n // - int tmpLevel = level; - while (tmpLevel >= level) { - String[] tmpKeySet = tmpKey.getKeySet(); + combinations[i] = 1 << (i + 1); + } + + // + // when last part goes down to zero, we tried all combinations of key + // + int lastIndex = matchLevel - 1; + while (combinations[lastIndex] > 0) { + // + // form the key which has "*" in it + // + for (int i = 0; i < matchLevel; ++i) { + // + // start again if not finished + // + if (combinations[i] == 0) { + combinations[i] = 1 << (i + 1); + } + + // + // half of 2^n is "*", the rest is non-* + // try { - if (!tmpKeySet[tmpLevel].equals("*")) { - // - // If "tmplevel" part is not "*", set it to "*". - // For example, at first loop, the key will become - // TARGET_TOOLCHAIN_ARCH_*_ATTRIBUTE, and at next loop, - // become TARGET_TOOLCHAIN_*_ARCH_ATTRIBUTE - // - tmpKey.setKey("*", tmpLevel); - // - // We'll try all possible combinations between current - // part and the fourth part. - // - tmpLevel = matchLevel; + if (combinations[i] > (1 << i)) { + tmpKey.setKey(keySet[i], i); } else { - // - // Restore original value of key if "*" at "tmplevel" - // part of "name" has been checked - // - tmpKey.setKey(keySet[tmpLevel], tmpLevel); - // - // Try "*" at part left to "tmplevel" part of "name" - // - --tmpLevel; - continue; + tmpKey.setKey("*", i); } } catch (Exception e) { return null; } + combinations[i] -= 1; + } + + // + // Try get the value from the map + // + result = map.get(tmpKey); + if (result != null) { // - // Try get the value from the map + // The map actually has no exact key as the given "key", + // putting it back into map can speed up the get() next time // - result = map.get(tmpKey); - if (result != null) { - // - // The map actually has no exact key as the given "key", - // putting it back into map can speed up the get() next time - // - map.put(key, result); - return result; - } + map.put(key, result); + return result; } - /// - /// If all possible combinations of "wildcard" between "level" and - /// the fourth part of "name" have been tried, try the left part - /// - --level; } // // The map actually has no exact key as the given "key", putting it back // into map can speed up the get() next time even we got nothing. // - map.put(key, result); - return result; + map.put(key, null); + return null; } /**