summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmStringCommand.cxx51
-rw-r--r--Source/cmStringCommand.h5
-rw-r--r--Tests/StringFileTest/CMakeLists.txt5
-rw-r--r--Tests/StringFileTest/InputFile.h.in13
4 files changed, 74 insertions, 0 deletions
diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx
index 6acb72c..76d60e0 100644
--- a/Source/cmStringCommand.cxx
+++ b/Source/cmStringCommand.cxx
@@ -49,6 +49,10 @@ bool cmStringCommand::InitialPass(std::vector<std::string> const& args)
{
return this->HandleAsciiCommand(args);
}
+ else if(subCommand == "CONFIGURE")
+ {
+ return this->HandleConfigureCommand(args);
+ }
std::string e = "does not recognize sub-command "+subCommand;
this->SetError(e.c_str());
@@ -115,6 +119,53 @@ bool cmStringCommand::HandleAsciiCommand(std::vector<std::string> const& args)
}
//----------------------------------------------------------------------------
+bool cmStringCommand::HandleConfigureCommand(
+ std::vector<std::string> const& args)
+{
+ if ( args.size() < 2 )
+ {
+ this->SetError("No input string specified.");
+ return false;
+ }
+ else if ( args.size() < 3 )
+ {
+ this->SetError("No output variable specified.");
+ return false;
+ }
+
+ // Parse options.
+ bool escapeQuotes = false;
+ bool atOnly = false;
+ for(unsigned int i = 3; i < args.size(); ++i)
+ {
+ if(args[i] == "@ONLY")
+ {
+ atOnly = true;
+ }
+ else if(args[i] == "ESCAPE_QUOTES")
+ {
+ escapeQuotes = true;
+ }
+ else
+ {
+ cmOStringStream err;
+ err << "Unrecognized argument \"" << args[i] << "\"";
+ this->SetError(err.str().c_str());
+ return false;
+ }
+ }
+
+ // Configure the string.
+ std::string output;
+ m_Makefile->ConfigureString(args[1], output, atOnly, escapeQuotes);
+
+ // Store the output in the provided variable.
+ m_Makefile->AddDefinition(args[2].c_str(), output.c_str());
+
+ return true;
+}
+
+//----------------------------------------------------------------------------
bool cmStringCommand::HandleRegexCommand(std::vector<std::string> const& args)
{
if(args.size() < 2)
diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h
index 1fb5158..ed28b4b 100644
--- a/Source/cmStringCommand.h
+++ b/Source/cmStringCommand.h
@@ -82,6 +82,8 @@ public:
" STRING(COMPARE LESS <string1> <string2> <output variable>)\n"
" STRING(COMPARE GREATER <string1> <string2> <output variable>)\n"
" STRING(ASCII <number> [<number> ...] <output variable>)\n"
+ " STRING(CONFIGURE <string1> <output variable>\n"
+ " [@ONLY] [ESCAPE_QUOTES])\n"
" STRING(TOUPPER <string1> <output variable>)\n"
" STRING(TOLOWER <string1> <output variable>)\n"
"REGEX MATCH will match the regular expression once and store the "
@@ -94,11 +96,14 @@ public:
"COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and "
"store true or false in the output variable.\n"
"ASCII will convert all numbers into corresponding ASCII characters.\n"
+ "CONFIGURE will transform a string like CONFIGURE_FILE transforms "
+ "a file.\n"
"TOUPPER/TOLOWER will convert string to upper/lower characters.";
}
cmTypeMacro(cmStringCommand, cmCommand);
protected:
+ bool HandleConfigureCommand(std::vector<std::string> const& args);
bool HandleAsciiCommand(std::vector<std::string> const& args);
bool HandleRegexCommand(std::vector<std::string> const& args);
bool RegexMatch(std::vector<std::string> const& args);
diff --git a/Tests/StringFileTest/CMakeLists.txt b/Tests/StringFileTest/CMakeLists.txt
index b0030fe..74b99ec 100644
--- a/Tests/StringFileTest/CMakeLists.txt
+++ b/Tests/StringFileTest/CMakeLists.txt
@@ -55,6 +55,11 @@ FOREACH(var
FILE(APPEND "${file}" "#define ${var} \"${${var}}\"\n")
ENDFOREACH(var)
+# Test configuration of the string
+SET(TEST_DEFINED 123)
+SET(TEST_NOT_DEFINED)
+STRING(CONFIGURE "${infile}" infile @ONLY)
+
# Write include file to a file
STRING(REGEX REPLACE "includefile" "${file}" outfile "${infile}")
FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/OutputFile.h" "${outfile}")
diff --git a/Tests/StringFileTest/InputFile.h.in b/Tests/StringFileTest/InputFile.h.in
index 1bda5af..c7c1995 100644
--- a/Tests/StringFileTest/InputFile.h.in
+++ b/Tests/StringFileTest/InputFile.h.in
@@ -1,5 +1,10 @@
#include "includefile"
+/* This should be configured to a define. */
+#cmakedefine TEST_DEFINED @TEST_DEFINED@
+/* This should be configured to a commented undef with the curlies in place */
+#cmakedefine TEST_NOT_DEFINED ${TEST_NOT_DEFINED}
+
int CheckMethod(const char* var, const char* val )
{
if ( !var )
@@ -17,5 +22,13 @@ int CheckMethod(const char* var, const char* val )
printf("Var (%s) and Val (%s) are not the same...\n", var, val);
return 1;
}
+#if !defined(TEST_DEFINED) || TEST_DEFINED != 123
+ printf("TEST_DEFINED is not defined to 123\n");
+ return 1;
+#elif defined(TEST_NOT_DEFINED)
+ printf("TEST_NOT_DEFINED is defined\n");
+ return 1;
+#else
return 0;
+#endif
}