genex: Fix preprocessing with incomplete content (#14410).
Similar incomplete generator expressions are already tested in the GeneratorExpression unit test, but those are executed with add_custom_target. The generator expressions in the include directories are run through the preprocessor, whereas the ones run through add_custom_target are not.
This commit is contained in:
parent
1fef29e4c6
commit
70089d0769
|
@ -192,11 +192,12 @@ static std::string stripAllGeneratorExpressions(const std::string &input)
|
||||||
std::string result;
|
std::string result;
|
||||||
std::string::size_type pos = 0;
|
std::string::size_type pos = 0;
|
||||||
std::string::size_type lastPos = pos;
|
std::string::size_type lastPos = pos;
|
||||||
|
int nestingLevel = 0;
|
||||||
while((pos = input.find("$<", lastPos)) != input.npos)
|
while((pos = input.find("$<", lastPos)) != input.npos)
|
||||||
{
|
{
|
||||||
result += input.substr(lastPos, pos - lastPos);
|
result += input.substr(lastPos, pos - lastPos);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
int nestingLevel = 1;
|
nestingLevel = 1;
|
||||||
const char *c = input.c_str() + pos;
|
const char *c = input.c_str() + pos;
|
||||||
const char * const cStart = c;
|
const char * const cStart = c;
|
||||||
for ( ; *c; ++c)
|
for ( ; *c; ++c)
|
||||||
|
@ -224,7 +225,10 @@ static std::string stripAllGeneratorExpressions(const std::string &input)
|
||||||
pos += traversed;
|
pos += traversed;
|
||||||
lastPos = pos;
|
lastPos = pos;
|
||||||
}
|
}
|
||||||
result += input.substr(lastPos);
|
if (nestingLevel == 0)
|
||||||
|
{
|
||||||
|
result += input.substr(lastPos);
|
||||||
|
}
|
||||||
return cmGeneratorExpression::StripEmptyListElements(result);
|
return cmGeneratorExpression::StripEmptyListElements(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,6 +257,7 @@ static std::string stripExportInterface(const std::string &input,
|
||||||
{
|
{
|
||||||
std::string result;
|
std::string result;
|
||||||
|
|
||||||
|
int nestingLevel = 0;
|
||||||
std::string::size_type pos = 0;
|
std::string::size_type pos = 0;
|
||||||
std::string::size_type lastPos = pos;
|
std::string::size_type lastPos = pos;
|
||||||
while (true)
|
while (true)
|
||||||
|
@ -282,7 +287,7 @@ static std::string stripExportInterface(const std::string &input,
|
||||||
const bool gotInstallInterface = input[pos + 2] == 'I';
|
const bool gotInstallInterface = input[pos + 2] == 'I';
|
||||||
pos += gotInstallInterface ? sizeof("$<INSTALL_INTERFACE:") - 1
|
pos += gotInstallInterface ? sizeof("$<INSTALL_INTERFACE:") - 1
|
||||||
: sizeof("$<BUILD_INTERFACE:") - 1;
|
: sizeof("$<BUILD_INTERFACE:") - 1;
|
||||||
int nestingLevel = 1;
|
nestingLevel = 1;
|
||||||
const char *c = input.c_str() + pos;
|
const char *c = input.c_str() + pos;
|
||||||
const char * const cStart = c;
|
const char * const cStart = c;
|
||||||
for ( ; *c; ++c)
|
for ( ; *c; ++c)
|
||||||
|
@ -331,7 +336,10 @@ static std::string stripExportInterface(const std::string &input,
|
||||||
pos += traversed;
|
pos += traversed;
|
||||||
lastPos = pos;
|
lastPos = pos;
|
||||||
}
|
}
|
||||||
result += input.substr(lastPos);
|
if (nestingLevel == 0)
|
||||||
|
{
|
||||||
|
result += input.substr(lastPos);
|
||||||
|
}
|
||||||
|
|
||||||
return cmGeneratorExpression::StripEmptyListElements(result);
|
return cmGeneratorExpression::StripEmptyListElements(result);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue