diff options
Diffstat (limited to 'Source/cmGeneratorExpression.cxx')
| -rw-r--r-- | Source/cmGeneratorExpression.cxx | 80 |
1 files changed, 58 insertions, 22 deletions
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx index f988e54..c5ae31b 100644 --- a/Source/cmGeneratorExpression.cxx +++ b/Source/cmGeneratorExpression.cxx @@ -2,6 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmGeneratorExpression.h" +#include <algorithm> #include <cassert> #include <memory> #include <utility> @@ -13,11 +14,15 @@ #include "cmGeneratorExpressionEvaluator.h" #include "cmGeneratorExpressionLexer.h" #include "cmGeneratorExpressionParser.h" +#include "cmLocalGenerator.h" #include "cmStringAlgorithms.h" #include "cmSystemTools.h" +#include "cmake.h" -cmGeneratorExpression::cmGeneratorExpression(cmListFileBacktrace backtrace) - : Backtrace(std::move(backtrace)) +cmGeneratorExpression::cmGeneratorExpression(cmake& cmakeInstance, + cmListFileBacktrace backtrace) + : CMakeInstance(cmakeInstance) + , Backtrace(std::move(backtrace)) { } @@ -29,7 +34,8 @@ std::unique_ptr<cmCompiledGeneratorExpression> cmGeneratorExpression::Parse( std::string input) const { return std::unique_ptr<cmCompiledGeneratorExpression>( - new cmCompiledGeneratorExpression(this->Backtrace, std::move(input))); + new cmCompiledGeneratorExpression(this->CMakeInstance, this->Backtrace, + std::move(input))); } std::string cmGeneratorExpression::Evaluate( @@ -39,7 +45,13 @@ std::string cmGeneratorExpression::Evaluate( cmGeneratorTarget const* currentTarget, std::string const& language) { if (Find(input) != std::string::npos) { - cmCompiledGeneratorExpression cge(cmListFileBacktrace(), std::move(input)); +#ifndef CMAKE_BOOTSTRAP + auto profilingRAII = lg->GetCMakeInstance()->CreateProfilingEntry( + "genex_compile_eval", input); +#endif + + cmCompiledGeneratorExpression cge(*lg->GetCMakeInstance(), + cmListFileBacktrace(), std::move(input)); return cge.Evaluate(lg, config, headTarget, dagChecker, currentTarget, language); } @@ -97,10 +109,15 @@ const std::string& cmCompiledGeneratorExpression::EvaluateWithContext( } cmCompiledGeneratorExpression::cmCompiledGeneratorExpression( - cmListFileBacktrace backtrace, std::string input) + cmake& cmakeInstance, cmListFileBacktrace backtrace, std::string input) : Backtrace(std::move(backtrace)) , Input(std::move(input)) { +#ifndef CMAKE_BOOTSTRAP + auto profilingRAII = + cmakeInstance.CreateProfilingEntry("genex_compile", this->Input); +#endif + cmGeneratorExpressionLexer l; std::vector<cmGeneratorExpressionToken> tokens = l.Tokenize(this->Input); this->NeedsEvaluation = l.GetSawGeneratorExpression(); @@ -210,23 +227,33 @@ static std::string stripExportInterface( while (true) { std::string::size_type bPos = input.find("$<BUILD_INTERFACE:", lastPos); std::string::size_type iPos = input.find("$<INSTALL_INTERFACE:", lastPos); + std::string::size_type lPos = + input.find("$<BUILD_LOCAL_INTERFACE:", lastPos); - if (bPos == std::string::npos && iPos == std::string::npos) { + pos = std::min({ bPos, iPos, lPos }); + if (pos == std::string::npos) { break; } - if (bPos == std::string::npos) { - pos = iPos; - } else if (iPos == std::string::npos) { - pos = bPos; + result += input.substr(lastPos, pos - lastPos); + enum class FoundGenex + { + BuildInterface, + InstallInterface, + BuildLocalInterface, + } foundGenex = FoundGenex::BuildInterface; + if (pos == bPos) { + foundGenex = FoundGenex::BuildInterface; + pos += cmStrLen("$<BUILD_INTERFACE:"); + } else if (pos == iPos) { + foundGenex = FoundGenex::InstallInterface; + pos += cmStrLen("$<INSTALL_INTERFACE:"); + } else if (pos == lPos) { + foundGenex = FoundGenex::BuildLocalInterface; + pos += cmStrLen("$<BUILD_LOCAL_INTERFACE:"); } else { - pos = (bPos < iPos) ? bPos : iPos; + assert(false && "Invalid position found"); } - - result += input.substr(lastPos, pos - lastPos); - const bool gotInstallInterface = input[pos + 2] == 'I'; - pos += gotInstallInterface ? sizeof("$<INSTALL_INTERFACE:") - 1 - : sizeof("$<BUILD_INTERFACE:") - 1; nestingLevel = 1; const char* c = input.c_str() + pos; const char* const cStart = c; @@ -242,10 +269,10 @@ static std::string stripExportInterface( continue; } if (context == cmGeneratorExpression::BuildInterface && - !gotInstallInterface) { + foundGenex == FoundGenex::BuildInterface) { result += input.substr(pos, c - cStart); } else if (context == cmGeneratorExpression::InstallInterface && - gotInstallInterface) { + foundGenex == FoundGenex::InstallInterface) { const std::string content = input.substr(pos, c - cStart); if (resolveRelative) { prefixItems(content, result, "${_IMPORT_PREFIX}/"); @@ -258,9 +285,18 @@ static std::string stripExportInterface( } const std::string::size_type traversed = (c - cStart) + 1; if (!*c) { - result += std::string(gotInstallInterface ? "$<INSTALL_INTERFACE:" - : "$<BUILD_INTERFACE:") + - input.substr(pos, traversed); + auto remaining = input.substr(pos, traversed); + switch (foundGenex) { + case FoundGenex::BuildInterface: + result = cmStrCat(result, "$<BUILD_INTERFACE:", remaining); + break; + case FoundGenex::InstallInterface: + result = cmStrCat(result, "$<INSTALL_INTERFACE:", remaining); + break; + case FoundGenex::BuildLocalInterface: + result = cmStrCat(result, "$<BUILD_LOCAL_INTERFACE:", remaining); + break; + } } pos += traversed; lastPos = pos; @@ -370,7 +406,7 @@ void cmGeneratorExpression::ReplaceInstallPrefix( while ((pos = input.find("$<INSTALL_PREFIX>", lastPos)) != std::string::npos) { - std::string::size_type endPos = pos + sizeof("$<INSTALL_PREFIX>") - 1; + std::string::size_type endPos = pos + cmStrLen("$<INSTALL_PREFIX>"); input.replace(pos, endPos - pos, replacement); lastPos = endPos; } |
