diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmConditionEvaluator.cxx | 5 | ||||
-rw-r--r-- | Source/cmGeneratorExpressionEvaluator.cxx | 74 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 47 | ||||
-rw-r--r-- | Source/cmMakefile.h | 5 | ||||
-rw-r--r-- | Source/cmSourceFileLocation.cxx | 3 | ||||
-rw-r--r-- | Source/cmStringCommand.cxx | 44 | ||||
-rw-r--r-- | Source/cmStringCommand.h | 2 |
7 files changed, 85 insertions, 95 deletions
diff --git a/Source/cmConditionEvaluator.cxx b/Source/cmConditionEvaluator.cxx index aba26de..6065b8a 100644 --- a/Source/cmConditionEvaluator.cxx +++ b/Source/cmConditionEvaluator.cxx @@ -11,6 +11,7 @@ ============================================================================*/ #include "cmConditionEvaluator.h" +#include "cmStringCommand.h" cmConditionEvaluator::cmConditionEvaluator(cmMakefile& makefile): Makefile(makefile), @@ -555,7 +556,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs, { def = this->GetVariableOrString(*arg); const char* rex = argP2->c_str(); - this->Makefile.ClearMatches(); + cmStringCommand::ClearMatches(&this->Makefile); cmsys::RegularExpression regEntry; if ( !regEntry.compile(rex) ) { @@ -567,7 +568,7 @@ bool cmConditionEvaluator::HandleLevel2(cmArgumentList &newArgs, } if (regEntry.find(def)) { - this->Makefile.StoreMatches(regEntry); + cmStringCommand::StoreMatches(&this->Makefile, regEntry); *arg = cmExpandedCommandArgument("1", true); } else diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 67a1a6d..84a4daa 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -69,9 +69,42 @@ struct cmGeneratorExpressionNode const GeneratorExpressionContent *content, cmGeneratorExpressionDAGChecker *dagChecker ) const = 0; + + static std::string EvaluateDependentExpression( + std::string const& prop, cmMakefile *makefile, + cmGeneratorExpressionContext *context, + cmTarget const* headTarget, cmTarget const* currentTarget, + cmGeneratorExpressionDAGChecker *dagChecker); }; //---------------------------------------------------------------------------- +std::string cmGeneratorExpressionNode::EvaluateDependentExpression( + std::string const& prop, cmMakefile *makefile, + cmGeneratorExpressionContext *context, + cmTarget const* headTarget, cmTarget const* currentTarget, + cmGeneratorExpressionDAGChecker *dagChecker) +{ + cmGeneratorExpression ge(&context->Backtrace); + cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop); + cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem); + std::string result = cge->Evaluate(makefile, + context->Config, + context->Quiet, + headTarget, + currentTarget, + dagChecker); + if (cge->GetHadContextSensitiveCondition()) + { + context->HadContextSensitiveCondition = true; + } + if (cge->GetHadHeadSensitiveCondition()) + { + context->HadHeadSensitiveCondition = true; + } + return result; +} + +//---------------------------------------------------------------------------- static const struct ZeroNode : public cmGeneratorExpressionNode { ZeroNode() {} @@ -825,22 +858,10 @@ getLinkedTargetsContent( } if(!depString.empty()) { - cmGeneratorExpression ge(&context->Backtrace); - cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(depString); - linkedTargetsContent = cge->Evaluate(target->GetMakefile(), - context->Config, - context->Quiet, - headTarget, - target, - dagChecker); - if (cge->GetHadContextSensitiveCondition()) - { - context->HadContextSensitiveCondition = true; - } - if (cge->GetHadHeadSensitiveCondition()) - { - context->HadHeadSensitiveCondition = true; - } + linkedTargetsContent = + cmGeneratorExpressionNode::EvaluateDependentExpression(depString, + target->GetMakefile(), context, + headTarget, target, dagChecker); } linkedTargetsContent = cmGeneratorExpression::StripEmptyListElements(linkedTargetsContent); @@ -1181,24 +1202,9 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode } if(!interfacePropertyName.empty()) { - cmGeneratorExpression ge(&context->Backtrace); - cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(prop); - cge->SetEvaluateForBuildsystem(context->EvaluateForBuildsystem); - std::string result = cge->Evaluate(context->Makefile, - context->Config, - context->Quiet, - headTarget, - target, - &dagChecker); - - if (cge->GetHadContextSensitiveCondition()) - { - context->HadContextSensitiveCondition = true; - } - if (cge->GetHadHeadSensitiveCondition()) - { - context->HadHeadSensitiveCondition = true; - } + std::string result = this->EvaluateDependentExpression(prop, + context->Makefile, context, + headTarget, target, &dagChecker); if (!linkedTargetsContent.empty()) { result += (result.empty() ? "" : ";") + linkedTargetsContent; diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 0bd1624..b7e89b8 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -102,7 +102,6 @@ cmMakefile::cmMakefile(): Internal(new Internals) this->PreOrder = false; this->GeneratingBuildSystem = false; - this->NumLastMatches = 0; this->SuppressWatches = false; } @@ -153,7 +152,6 @@ cmMakefile::cmMakefile(const cmMakefile& mf): Internal(new Internals) this->ListFileStack = mf.ListFileStack; this->OutputToSource = mf.OutputToSource; - this->NumLastMatches = mf.NumLastMatches; this->SuppressWatches = mf.SuppressWatches; } @@ -4743,51 +4741,6 @@ std::vector<cmSourceFile*> cmMakefile::GetQtUiFilesWithOptions() const return this->QtUiFilesWithOptions; } -static std::string matchVariables[] = { - "CMAKE_MATCH_0", - "CMAKE_MATCH_1", - "CMAKE_MATCH_2", - "CMAKE_MATCH_3", - "CMAKE_MATCH_4", - "CMAKE_MATCH_5", - "CMAKE_MATCH_6", - "CMAKE_MATCH_7", - "CMAKE_MATCH_8", - "CMAKE_MATCH_9" -}; - -//---------------------------------------------------------------------------- -void cmMakefile::ClearMatches() -{ - for (unsigned int i=0; i<this->NumLastMatches; i++) - { - std::string const& var = matchVariables[i]; - std::string const& s = this->GetSafeDefinition(var); - if(!s.empty()) - { - this->AddDefinition(var, ""); - this->MarkVariableAsUsed(var); - } - } - this->NumLastMatches = 0; -} - -//---------------------------------------------------------------------------- -void cmMakefile::StoreMatches(cmsys::RegularExpression& re) -{ - for (unsigned int i=0; i<10; i++) - { - std::string const& m = re.match(i); - if(!m.empty()) - { - std::string const& var = matchVariables[i]; - this->AddDefinition(var, m.c_str()); - this->MarkVariableAsUsed(var); - this->NumLastMatches = i + 1; - } - } -} - //---------------------------------------------------------------------------- cmPolicies::PolicyStatus cmMakefile::GetPolicyStatus(cmPolicies::PolicyID id) const diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 164290a..28f8686 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -942,9 +942,6 @@ public: std::string const& lhs, std::string const& rhs); - void ClearMatches(); - void StoreMatches(cmsys::RegularExpression& re); - protected: // add link libraries and directories to the target void AddGlobalLinkInformation(const std::string& name, cmTarget& target); @@ -1150,8 +1147,6 @@ private: std::vector<cmSourceFile*> QtUiFilesWithOptions; - unsigned int NumLastMatches; - bool AddRequiredTargetCFeature(cmTarget *target, const std::string& feature) const; diff --git a/Source/cmSourceFileLocation.cxx b/Source/cmSourceFileLocation.cxx index 1c2454e..004fd1f 100644 --- a/Source/cmSourceFileLocation.cxx +++ b/Source/cmSourceFileLocation.cxx @@ -216,7 +216,8 @@ bool cmSourceFileLocation::Matches(cmSourceFileLocation const& loc) // Both extensions are similarly ambiguous. Since only the old fixed set // of extensions will be tried, the names must match at this point to be // the same file. - if(this->Name.size() != loc.Name.size() || this->Name != loc.Name) + if(this->Name.size() != loc.Name.size() || + !cmSystemTools::ComparePath(this->Name, loc.Name)) { return false; } diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index 90a8f85..93aa083 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -310,7 +310,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args) input += args[i]; } - this->Makefile->ClearMatches(); + this->ClearMatches(this->Makefile); // Compile the regular expression. cmsys::RegularExpression re; if(!re.compile(regex.c_str())) @@ -325,7 +325,7 @@ bool cmStringCommand::RegexMatch(std::vector<std::string> const& args) std::string output; if(re.find(input.c_str())) { - this->Makefile->StoreMatches(re); + this->StoreMatches(this->Makefile, re); std::string::size_type l = re.start(); std::string::size_type r = re.end(); if(r-l == 0) @@ -359,7 +359,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args) input += args[i]; } - this->Makefile->ClearMatches(); + this->ClearMatches(this->Makefile); // Compile the regular expression. cmsys::RegularExpression re; if(!re.compile(regex.c_str())) @@ -376,7 +376,7 @@ bool cmStringCommand::RegexMatchAll(std::vector<std::string> const& args) const char* p = input.c_str(); while(re.find(p)) { - this->Makefile->StoreMatches(re); + this->StoreMatches(this->Makefile, re); std::string::size_type l = re.start(); std::string::size_type r = re.end(); if(r-l == 0) @@ -463,7 +463,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args) input += args[i]; } - this->Makefile->ClearMatches(); + this->ClearMatches(this->Makefile); // Compile the regular expression. cmsys::RegularExpression re; if(!re.compile(regex.c_str())) @@ -480,7 +480,7 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args) std::string::size_type base = 0; while(re.find(input.c_str()+base)) { - this->Makefile->StoreMatches(re); + this->StoreMatches(this->Makefile, re); std::string::size_type l2 = re.start(); std::string::size_type r = re.end(); @@ -541,6 +541,38 @@ bool cmStringCommand::RegexReplace(std::vector<std::string> const& args) } //---------------------------------------------------------------------------- +void cmStringCommand::ClearMatches(cmMakefile* mf) +{ + for (unsigned int i=0; i<10; i++) + { + char name[128]; + sprintf(name, "CMAKE_MATCH_%d", i); + const char* s = mf->GetDefinition(name); + if(s && *s != 0) + { + mf->AddDefinition(name, ""); + mf->MarkVariableAsUsed(name); + } + } +} + +//---------------------------------------------------------------------------- +void cmStringCommand::StoreMatches(cmMakefile* mf,cmsys::RegularExpression& re) +{ + for (unsigned int i=0; i<10; i++) + { + std::string m = re.match(i); + if(m.size() > 0) + { + char name[128]; + sprintf(name, "CMAKE_MATCH_%d", i); + mf->AddDefinition(name, re.match(i).c_str()); + mf->MarkVariableAsUsed(name); + } + } +} + +//---------------------------------------------------------------------------- bool cmStringCommand::HandleFindCommand(std::vector<std::string> const& args) { diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index 9c75095..a5fe893 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -53,6 +53,8 @@ public: virtual std::string GetName() const { return "string";} cmTypeMacro(cmStringCommand, cmCommand); + static void ClearMatches(cmMakefile* mf); + static void StoreMatches(cmMakefile* mf, cmsys::RegularExpression& re); protected: bool HandleConfigureCommand(std::vector<std::string> const& args); bool HandleAsciiCommand(std::vector<std::string> const& args); |