|
@@ -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>
|
|
@@ -226,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;
|
|
@@ -258,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}/");
|
|
@@ -274,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;
|