Browse Source

ENH: Added STRING(CONFIGURE ...) command.

Brad King 21 years ago
parent
commit
4990e1481d

+ 51 - 0
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());
@@ -114,6 +118,53 @@ bool cmStringCommand::HandleAsciiCommand(std::vector<std::string> const& args)
   return true;
 }
 
+//----------------------------------------------------------------------------
+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)
 {

+ 5 - 0
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);

+ 5 - 0
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}")

+ 13 - 0
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  
 }