|  | @@ -40,6 +40,28 @@
 | 
	
		
			
				|  |  |  #include <StorageDefs.h>
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// List of variables that are replaced when
 | 
	
		
			
				|  |  | +// rules are expanced.  These variables are
 | 
	
		
			
				|  |  | +// replaced in the form <var> with GetSafeDefinition(var).
 | 
	
		
			
				|  |  | +// ${LANG} is replaced in the variable first with all enabled
 | 
	
		
			
				|  |  | +// languages.
 | 
	
		
			
				|  |  | +static const char* ruleReplaceVars[] = {
 | 
	
		
			
				|  |  | +  "CMAKE_${LANG}_COMPILER",
 | 
	
		
			
				|  |  | +  "CMAKE_SHARED_LIBRARY_CREATE_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | +  "CMAKE_SHARED_MODULE_CREATE_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | +  "CMAKE_SHARED_MODULE_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | +  "CMAKE_SHARED_LIBRARY_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | +  "CMAKE_${LANG}_LINK_FLAGS",
 | 
	
		
			
				|  |  | +  "CMAKE_SHARED_LIBRARY_SONAME_${LANG}_FLAG",
 | 
	
		
			
				|  |  | +  "CMAKE_${LANG}_ARCHIVE",
 | 
	
		
			
				|  |  | +  "CMAKE_AR",
 | 
	
		
			
				|  |  | +  "CMAKE_CURRENT_SOURCE_DIR",
 | 
	
		
			
				|  |  | +  "CMAKE_CURRENT_BINARY_DIR",
 | 
	
		
			
				|  |  | +  "CMAKE_RANLIB",
 | 
	
		
			
				|  |  | +  "CMAKE_LINKER",
 | 
	
		
			
				|  |  | +  "CMAKE_CL_SHOWINCLUDES_PREFIX"
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  cmLocalGenerator::cmLocalGenerator(cmGlobalGenerator* gg, cmMakefile* makefile)
 | 
	
		
			
				|  |  |    : cmOutputConverter(makefile->GetStateSnapshot())
 | 
	
		
			
				|  |  |    , StateSnapshot(makefile->GetStateSnapshot())
 | 
	
	
		
			
				|  | @@ -56,6 +78,58 @@ cmLocalGenerator::cmLocalGenerator(cmGlobalGenerator* gg, cmMakefile* makefile)
 | 
	
		
			
				|  |  |    this->BackwardsCompatibilityFinal = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    this->ComputeObjectMaxPath();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  std::vector<std::string> enabledLanguages =
 | 
	
		
			
				|  |  | +    this->GetState()->GetEnabledLanguages();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  this->CompilerSysroot = this->Makefile->GetSafeDefinition("CMAKE_SYSROOT");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  for (std::vector<std::string>::iterator i = enabledLanguages.begin();
 | 
	
		
			
				|  |  | +       i != enabledLanguages.end(); ++i) {
 | 
	
		
			
				|  |  | +    std::string const& lang = *i;
 | 
	
		
			
				|  |  | +    if (lang == "NONE") {
 | 
	
		
			
				|  |  | +      continue;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    this->Compilers["CMAKE_" + lang + "_COMPILER"] = lang;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    this->VariableMappings["CMAKE_" + lang + "_COMPILER"] =
 | 
	
		
			
				|  |  | +      this->Makefile->GetSafeDefinition("CMAKE_" + lang + "_COMPILER");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    std::string const& compilerArg1 = "CMAKE_" + lang + "_COMPILER_ARG1";
 | 
	
		
			
				|  |  | +    std::string const& compilerTarget = "CMAKE_" + lang + "_COMPILER_TARGET";
 | 
	
		
			
				|  |  | +    std::string const& compilerOptionTarget =
 | 
	
		
			
				|  |  | +      "CMAKE_" + lang + "_COMPILE_OPTIONS_TARGET";
 | 
	
		
			
				|  |  | +    std::string const& compilerExternalToolchain =
 | 
	
		
			
				|  |  | +      "CMAKE_" + lang + "_COMPILER_EXTERNAL_TOOLCHAIN";
 | 
	
		
			
				|  |  | +    std::string const& compilerOptionExternalToolchain =
 | 
	
		
			
				|  |  | +      "CMAKE_" + lang + "_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN";
 | 
	
		
			
				|  |  | +    std::string const& compilerOptionSysroot =
 | 
	
		
			
				|  |  | +      "CMAKE_" + lang + "_COMPILE_OPTIONS_SYSROOT";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    this->VariableMappings[compilerArg1] =
 | 
	
		
			
				|  |  | +      this->Makefile->GetSafeDefinition(compilerArg1);
 | 
	
		
			
				|  |  | +    this->VariableMappings[compilerTarget] =
 | 
	
		
			
				|  |  | +      this->Makefile->GetSafeDefinition(compilerTarget);
 | 
	
		
			
				|  |  | +    this->VariableMappings[compilerOptionTarget] =
 | 
	
		
			
				|  |  | +      this->Makefile->GetSafeDefinition(compilerOptionTarget);
 | 
	
		
			
				|  |  | +    this->VariableMappings[compilerExternalToolchain] =
 | 
	
		
			
				|  |  | +      this->Makefile->GetSafeDefinition(compilerExternalToolchain);
 | 
	
		
			
				|  |  | +    this->VariableMappings[compilerOptionExternalToolchain] =
 | 
	
		
			
				|  |  | +      this->Makefile->GetSafeDefinition(compilerOptionExternalToolchain);
 | 
	
		
			
				|  |  | +    this->VariableMappings[compilerOptionSysroot] =
 | 
	
		
			
				|  |  | +      this->Makefile->GetSafeDefinition(compilerOptionSysroot);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    for (const char* const* replaceIter = cmArrayBegin(ruleReplaceVars);
 | 
	
		
			
				|  |  | +         replaceIter != cmArrayEnd(ruleReplaceVars); ++replaceIter) {
 | 
	
		
			
				|  |  | +      std::string actualReplace = *replaceIter;
 | 
	
		
			
				|  |  | +      if (actualReplace.find("${LANG}") != actualReplace.npos) {
 | 
	
		
			
				|  |  | +        cmSystemTools::ReplaceString(actualReplace, "${LANG}", lang);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      this->VariableMappings[actualReplace] =
 | 
	
		
			
				|  |  | +        this->Makefile->GetSafeDefinition(actualReplace);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  cmLocalGenerator::~cmLocalGenerator()
 | 
	
	
		
			
				|  | @@ -486,28 +560,6 @@ cmState::Snapshot cmLocalGenerator::GetStateSnapshot() const
 | 
	
		
			
				|  |  |    return this->Makefile->GetStateSnapshot();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// List of variables that are replaced when
 | 
	
		
			
				|  |  | -// rules are expanced.  These variables are
 | 
	
		
			
				|  |  | -// replaced in the form <var> with GetSafeDefinition(var).
 | 
	
		
			
				|  |  | -// ${LANG} is replaced in the variable first with all enabled
 | 
	
		
			
				|  |  | -// languages.
 | 
	
		
			
				|  |  | -static const char* ruleReplaceVars[] = {
 | 
	
		
			
				|  |  | -  "CMAKE_${LANG}_COMPILER",
 | 
	
		
			
				|  |  | -  "CMAKE_SHARED_LIBRARY_CREATE_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | -  "CMAKE_SHARED_MODULE_CREATE_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | -  "CMAKE_SHARED_MODULE_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | -  "CMAKE_SHARED_LIBRARY_${LANG}_FLAGS",
 | 
	
		
			
				|  |  | -  "CMAKE_${LANG}_LINK_FLAGS",
 | 
	
		
			
				|  |  | -  "CMAKE_SHARED_LIBRARY_SONAME_${LANG}_FLAG",
 | 
	
		
			
				|  |  | -  "CMAKE_${LANG}_ARCHIVE",
 | 
	
		
			
				|  |  | -  "CMAKE_AR",
 | 
	
		
			
				|  |  | -  "CMAKE_CURRENT_SOURCE_DIR",
 | 
	
		
			
				|  |  | -  "CMAKE_CURRENT_BINARY_DIR",
 | 
	
		
			
				|  |  | -  "CMAKE_RANLIB",
 | 
	
		
			
				|  |  | -  "CMAKE_LINKER",
 | 
	
		
			
				|  |  | -  "CMAKE_CL_SHOWINCLUDES_PREFIX"
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  std::string cmLocalGenerator::ExpandRuleVariable(
 | 
	
		
			
				|  |  |    std::string const& variable, const RuleVariables& replaceValues)
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -689,84 +741,29 @@ std::string cmLocalGenerator::ExpandRuleVariable(
 | 
	
		
			
				|  |  |        cmSystemTools::CollapseFullPath(cmSystemTools::GetCMakeCommand()),
 | 
	
		
			
				|  |  |        SHELL);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  std::vector<std::string> enabledLanguages =
 | 
	
		
			
				|  |  | -    this->GetState()->GetEnabledLanguages();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  std::map<std::string, std::string> compilers;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  std::map<std::string, std::string> variableMappings;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  std::string compilerSysroot =
 | 
	
		
			
				|  |  | -    this->Makefile->GetSafeDefinition("CMAKE_SYSROOT");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  for (std::vector<std::string>::iterator i = enabledLanguages.begin();
 | 
	
		
			
				|  |  | -       i != enabledLanguages.end(); ++i) {
 | 
	
		
			
				|  |  | -    std::string const& lang = *i;
 | 
	
		
			
				|  |  | -    if (lang == "NONE") {
 | 
	
		
			
				|  |  | -      continue;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    compilers["CMAKE_" + lang + "_COMPILER"] = lang;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    variableMappings["CMAKE_" + lang + "_COMPILER"] =
 | 
	
		
			
				|  |  | -      this->Makefile->GetSafeDefinition("CMAKE_" + lang + "_COMPILER");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    std::string const& compilerArg1 = "CMAKE_" + lang + "_COMPILER_ARG1";
 | 
	
		
			
				|  |  | -    std::string const& compilerTarget = "CMAKE_" + lang + "_COMPILER_TARGET";
 | 
	
		
			
				|  |  | -    std::string const& compilerOptionTarget =
 | 
	
		
			
				|  |  | -      "CMAKE_" + lang + "_COMPILE_OPTIONS_TARGET";
 | 
	
		
			
				|  |  | -    std::string const& compilerExternalToolchain =
 | 
	
		
			
				|  |  | -      "CMAKE_" + lang + "_COMPILER_EXTERNAL_TOOLCHAIN";
 | 
	
		
			
				|  |  | -    std::string const& compilerOptionExternalToolchain =
 | 
	
		
			
				|  |  | -      "CMAKE_" + lang + "_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN";
 | 
	
		
			
				|  |  | -    std::string const& compilerOptionSysroot =
 | 
	
		
			
				|  |  | -      "CMAKE_" + lang + "_COMPILE_OPTIONS_SYSROOT";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    variableMappings[compilerArg1] =
 | 
	
		
			
				|  |  | -      this->Makefile->GetSafeDefinition(compilerArg1);
 | 
	
		
			
				|  |  | -    variableMappings[compilerTarget] =
 | 
	
		
			
				|  |  | -      this->Makefile->GetSafeDefinition(compilerTarget);
 | 
	
		
			
				|  |  | -    variableMappings[compilerOptionTarget] =
 | 
	
		
			
				|  |  | -      this->Makefile->GetSafeDefinition(compilerOptionTarget);
 | 
	
		
			
				|  |  | -    variableMappings[compilerExternalToolchain] =
 | 
	
		
			
				|  |  | -      this->Makefile->GetSafeDefinition(compilerExternalToolchain);
 | 
	
		
			
				|  |  | -    variableMappings[compilerOptionExternalToolchain] =
 | 
	
		
			
				|  |  | -      this->Makefile->GetSafeDefinition(compilerOptionExternalToolchain);
 | 
	
		
			
				|  |  | -    variableMappings[compilerOptionSysroot] =
 | 
	
		
			
				|  |  | -      this->Makefile->GetSafeDefinition(compilerOptionSysroot);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    for (const char* const* replaceIter = cmArrayBegin(ruleReplaceVars);
 | 
	
		
			
				|  |  | -         replaceIter != cmArrayEnd(ruleReplaceVars); ++replaceIter) {
 | 
	
		
			
				|  |  | -      std::string const& lang = *i;
 | 
	
		
			
				|  |  | -      std::string actualReplace = *replaceIter;
 | 
	
		
			
				|  |  | -      if (actualReplace.find("${LANG}") != actualReplace.npos) {
 | 
	
		
			
				|  |  | -        cmSystemTools::ReplaceString(actualReplace, "${LANG}", lang);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      variableMappings[actualReplace] =
 | 
	
		
			
				|  |  | -        this->Makefile->GetSafeDefinition(actualReplace);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    std::map<std::string, std::string>::iterator compIt =
 | 
	
		
			
				|  |  | -    compilers.find(variable);
 | 
	
		
			
				|  |  | +    this->Compilers.find(variable);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (compIt != compilers.end()) {
 | 
	
		
			
				|  |  | +  if (compIt != this->Compilers.end()) {
 | 
	
		
			
				|  |  |      std::string ret = this->ConvertToOutputForExisting(
 | 
	
		
			
				|  |  | -      variableMappings["CMAKE_" + compIt->second + "_COMPILER"]);
 | 
	
		
			
				|  |  | +      this->VariableMappings["CMAKE_" + compIt->second + "_COMPILER"]);
 | 
	
		
			
				|  |  |      std::string const& compilerArg1 =
 | 
	
		
			
				|  |  | -      variableMappings[compIt->first + "_COMPILER_ARG1"];
 | 
	
		
			
				|  |  | +      this->VariableMappings[compIt->first + "_COMPILER_ARG1"];
 | 
	
		
			
				|  |  |      std::string const& compilerTarget =
 | 
	
		
			
				|  |  | -      variableMappings["CMAKE_" + compIt->second + "_COMPILER_TARGET"];
 | 
	
		
			
				|  |  | +      this->VariableMappings["CMAKE_" + compIt->second + "_COMPILER_TARGET"];
 | 
	
		
			
				|  |  |      std::string const& compilerOptionTarget =
 | 
	
		
			
				|  |  | -      variableMappings["CMAKE_" + compIt->second + "_COMPILE_OPTIONS_TARGET"];
 | 
	
		
			
				|  |  | +      this->VariableMappings["CMAKE_" + compIt->second +
 | 
	
		
			
				|  |  | +                             "_COMPILE_OPTIONS_TARGET"];
 | 
	
		
			
				|  |  |      std::string const& compilerExternalToolchain =
 | 
	
		
			
				|  |  | -      variableMappings["CMAKE_" + compIt->second +
 | 
	
		
			
				|  |  | -                       "_COMPILER_EXTERNAL_TOOLCHAIN"];
 | 
	
		
			
				|  |  | +      this->VariableMappings["CMAKE_" + compIt->second +
 | 
	
		
			
				|  |  | +                             "_COMPILER_EXTERNAL_TOOLCHAIN"];
 | 
	
		
			
				|  |  |      std::string const& compilerOptionExternalToolchain =
 | 
	
		
			
				|  |  | -      variableMappings["CMAKE_" + compIt->second +
 | 
	
		
			
				|  |  | -                       "_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN"];
 | 
	
		
			
				|  |  | +      this->VariableMappings["CMAKE_" + compIt->second +
 | 
	
		
			
				|  |  | +                             "_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN"];
 | 
	
		
			
				|  |  |      std::string const& compilerOptionSysroot =
 | 
	
		
			
				|  |  | -      variableMappings["CMAKE_" + compIt->second + "_COMPILE_OPTIONS_SYSROOT"];
 | 
	
		
			
				|  |  | +      this->VariableMappings["CMAKE_" + compIt->second +
 | 
	
		
			
				|  |  | +                             "_COMPILE_OPTIONS_SYSROOT"];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // if there is a required first argument to the compiler add it
 | 
	
		
			
				|  |  |      // to the compiler string
 | 
	
	
		
			
				|  | @@ -785,17 +782,17 @@ std::string cmLocalGenerator::ExpandRuleVariable(
 | 
	
		
			
				|  |  |        ret += compilerOptionExternalToolchain;
 | 
	
		
			
				|  |  |        ret += this->EscapeForShell(compilerExternalToolchain, true);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (!compilerSysroot.empty() && !compilerOptionSysroot.empty()) {
 | 
	
		
			
				|  |  | +    if (!this->CompilerSysroot.empty() && !compilerOptionSysroot.empty()) {
 | 
	
		
			
				|  |  |        ret += " ";
 | 
	
		
			
				|  |  |        ret += compilerOptionSysroot;
 | 
	
		
			
				|  |  | -      ret += this->EscapeForShell(compilerSysroot, true);
 | 
	
		
			
				|  |  | +      ret += this->EscapeForShell(this->CompilerSysroot, true);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      return ret;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    std::map<std::string, std::string>::iterator mapIt =
 | 
	
		
			
				|  |  | -    variableMappings.find(variable);
 | 
	
		
			
				|  |  | -  if (mapIt != variableMappings.end()) {
 | 
	
		
			
				|  |  | +    this->VariableMappings.find(variable);
 | 
	
		
			
				|  |  | +  if (mapIt != this->VariableMappings.end()) {
 | 
	
		
			
				|  |  |      if (variable.find("_FLAG") == variable.npos) {
 | 
	
		
			
				|  |  |        return this->ConvertToOutputForExisting(mapIt->second);
 | 
	
		
			
				|  |  |      }
 |