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
This commit is contained in:
jwang36
2006-10-13 09:21:14 +00:00
parent 713ace4c96
commit 8c84e1b1ac
3 changed files with 143 additions and 236 deletions

View File

@ -132,6 +132,7 @@ public class GlobalData {
private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainOption = new HashMap<FpdModuleIdentification, ToolChainMap>();
private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainFamilyOption = new HashMap<FpdModuleIdentification, ToolChainMap>();
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's option can be in .fpd and/or .msa file
//
// tool tag first
ToolChainMap option = moduleToolChainOption.get(fpdModuleId);
ToolChainKey toolChainFamilyKey = null;
String optionString;
ToolChainMap option = null;
ToolChainKey toolChainFamilyKey = new ToolChainKey(commandDescription);
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));
}
}
// }
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 platform options, if any
// Platform's tool chain family option
//
// tool tag first
// if (platformToolChainOption != null && platformToolChainOption.get(toolChainKey) != null)
if (platformToolChainOption.get(toolChainKey) != null)
{
String str = platformToolChainOption.get(toolChainKey);
optionString = platformToolChainFamilyOption.get(toolChainFamilyKey);
if (optionString != null) {
setting += (" " + optionString);
}
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));
// }
}
// }
return setting;
/*
//
// get module specific options, if any
// Platform's tool chain tag 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 = platformToolChainOption.get(toolChainKey);
if (optionString != null) {
Matcher matcher = flagPattern.matcher(optionString + " ");
while (matcher.find()) {
setting += (" " + optionString.substring(matcher.start(1), matcher.end(1)));
}
}
//
// get platform options, if any
// Module's tool chain family 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);
}
setting = platformToolChainFamilyOption.get(toolChainFamilyKey);
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) {

View File

@ -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;
}
//
// Try get the value from the map
//
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;
}
combinations[i] -= 1;
}
//
// Try get the value from the map
//
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;
}
///
/// 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;
}
/**