|
|
@@ -123,15 +123,9 @@ cmCompiledGeneratorExpression::~cmCompiledGeneratorExpression()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-std::string cmGeneratorExpression::Preprocess(const std::string &input,
|
|
|
- PreprocessContext context)
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+static std::string stripAllGeneratorExpressions(const std::string &input)
|
|
|
{
|
|
|
- if (context != StripAllGeneratorExpressions)
|
|
|
- {
|
|
|
- assert(!"cmGeneratorExpression::Preprocess called with invalid args");
|
|
|
- return std::string();
|
|
|
- }
|
|
|
-
|
|
|
std::string result;
|
|
|
std::string::size_type pos = 0;
|
|
|
std::string::size_type lastPos = pos;
|
|
|
@@ -170,3 +164,81 @@ std::string cmGeneratorExpression::Preprocess(const std::string &input,
|
|
|
result += input.substr(lastPos);
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+static std::string stripExportInterface(const std::string &input,
|
|
|
+ cmGeneratorExpression::PreprocessContext context)
|
|
|
+{
|
|
|
+ std::string result;
|
|
|
+
|
|
|
+ std::string::size_type pos = 0;
|
|
|
+ std::string::size_type lastPos = pos;
|
|
|
+ while((pos = input.find("$<BUILD_INTERFACE:", lastPos)) != input.npos
|
|
|
+ || (pos = input.find("$<INSTALL_INTERFACE:", lastPos)) != input.npos)
|
|
|
+ {
|
|
|
+ result += input.substr(lastPos, pos - lastPos);
|
|
|
+ const bool gotInstallInterface = input[pos + 2] == 'I';
|
|
|
+ pos += gotInstallInterface ? sizeof("$<INSTALL_INTERFACE:") - 1
|
|
|
+ : sizeof("$<BUILD_INTERFACE:") - 1;
|
|
|
+ int nestingLevel = 1;
|
|
|
+ const char *c = input.c_str() + pos;
|
|
|
+ const char * const cStart = c;
|
|
|
+ for ( ; *c; ++c)
|
|
|
+ {
|
|
|
+ if(c[0] == '$' && c[1] == '<')
|
|
|
+ {
|
|
|
+ ++nestingLevel;
|
|
|
+ ++c;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(c[0] == '>')
|
|
|
+ {
|
|
|
+ --nestingLevel;
|
|
|
+ if (nestingLevel != 0)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(context == cmGeneratorExpression::BuildInterface
|
|
|
+ && !gotInstallInterface)
|
|
|
+ {
|
|
|
+ result += input.substr(pos, c - cStart);
|
|
|
+ }
|
|
|
+ else if(context == cmGeneratorExpression::InstallInterface
|
|
|
+ && gotInstallInterface)
|
|
|
+ {
|
|
|
+ result += input.substr(pos, c - cStart);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const std::string::size_type traversed = (c - cStart) + 1;
|
|
|
+ if (!*c)
|
|
|
+ {
|
|
|
+ result += std::string(gotInstallInterface ? "$<INSTALL_INTERFACE:"
|
|
|
+ : "$<BUILD_INTERFACE:")
|
|
|
+ + input.substr(pos, traversed);
|
|
|
+ }
|
|
|
+ pos += traversed;
|
|
|
+ lastPos = pos;
|
|
|
+ }
|
|
|
+ result += input.substr(lastPos);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+std::string cmGeneratorExpression::Preprocess(const std::string &input,
|
|
|
+ PreprocessContext context)
|
|
|
+{
|
|
|
+ if (context == StripAllGeneratorExpressions)
|
|
|
+ {
|
|
|
+ return stripAllGeneratorExpressions(input);
|
|
|
+ }
|
|
|
+ else if (context == BuildInterface || context == InstallInterface)
|
|
|
+ {
|
|
|
+ return stripExportInterface(input, context);
|
|
|
+ }
|
|
|
+
|
|
|
+ assert(!"cmGeneratorExpression::Preprocess called with invalid args");
|
|
|
+ return std::string();
|
|
|
+}
|