Преглед на файлове

string: Add CONCAT sub-command

Add a string(CONCAT) command to simply concatenate input arguments
together.  This will be useful for combining strings from different
quoting syntaxes.  Add a RunCMake.string test covering these cases.
Brad King преди 12 години
родител
ревизия
4e184a21be

+ 4 - 0
Help/command/string.rst

@@ -15,6 +15,7 @@ String operations.
   string(REPLACE <match_string>
          <replace_string> <output variable>
          <input> [<input>...])
+  string(CONCAT <output variable> [<input>...])
   string(<MD5|SHA1|SHA224|SHA256|SHA384|SHA512>
          <output variable> <input>)
   string(COMPARE EQUAL <string1> <string2> <output variable>)
@@ -51,6 +52,9 @@ through argument parsing.
 REPLACE will replace all occurrences of match_string in the input with
 replace_string and store the result in the output.
 
+CONCAT will concatenate all the input arguments together and store
+the result in the named output variable.
+
 MD5, SHA1, SHA224, SHA256, SHA384, and SHA512 will compute a
 cryptographic hash of the input string.
 

+ 25 - 0
Source/cmStringCommand.cxx

@@ -73,6 +73,10 @@ bool cmStringCommand
     {
     return this->HandleLengthCommand(args);
     }
+  else if(subCommand == "CONCAT")
+    {
+    return this->HandleConcatCommand(args);
+    }
   else if(subCommand == "SUBSTRING")
     {
     return this->HandleSubstringCommand(args);
@@ -766,6 +770,27 @@ bool cmStringCommand
   return true;
 }
 
+//----------------------------------------------------------------------------
+bool cmStringCommand
+::HandleConcatCommand(std::vector<std::string> const& args)
+{
+  if(args.size() < 2)
+    {
+    this->SetError("sub-command CONCAT requires at least one argument.");
+    return false;
+    }
+
+  std::string const& variableName = args[1];
+  std::string value;
+  for(unsigned int i = 2; i < args.size(); ++i)
+    {
+    value += args[i];
+    }
+
+  this->Makefile->AddDefinition(variableName.c_str(), value.c_str());
+  return true;
+}
+
 //----------------------------------------------------------------------------
 bool cmStringCommand
 ::HandleMakeCIdentifierCommand(std::vector<std::string> const& args)

+ 1 - 0
Source/cmStringCommand.h

@@ -69,6 +69,7 @@ protected:
   bool HandleReplaceCommand(std::vector<std::string> const& args);
   bool HandleLengthCommand(std::vector<std::string> const& args);
   bool HandleSubstringCommand(std::vector<std::string> const& args);
+  bool HandleConcatCommand(std::vector<std::string> const& args);
   bool HandleStripCommand(std::vector<std::string> const& args);
   bool HandleRandomCommand(std::vector<std::string> const& args);
   bool HandleFindCommand(std::vector<std::string> const& args);

+ 1 - 0
Tests/RunCMake/CMakeLists.txt

@@ -98,6 +98,7 @@ add_RunCMake_test(include)
 add_RunCMake_test(include_directories)
 add_RunCMake_test(list)
 add_RunCMake_test(message)
+add_RunCMake_test(string)
 add_RunCMake_test(try_compile)
 add_RunCMake_test(variable_watch)
 add_RunCMake_test(CMP0004)

+ 3 - 0
Tests/RunCMake/string/CMakeLists.txt

@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8.4)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)

+ 19 - 0
Tests/RunCMake/string/Concat.cmake

@@ -0,0 +1,19 @@
+set(b b)
+set(out x)
+string(CONCAT out)
+if(NOT out STREQUAL "")
+  message(FATAL_ERROR "\"string(CONCAT out)\" set out to \"${out}\"")
+endif()
+string(CONCAT out a)
+if(NOT out STREQUAL "a")
+  message(FATAL_ERROR "\"string(CONCAT out a)\" set out to \"${out}\"")
+endif()
+string(CONCAT out a "b")
+if(NOT out STREQUAL "ab")
+  message(FATAL_ERROR "\"string(CONCAT out a \"b\")\" set out to \"${out}\"")
+endif()
+string(CONCAT out a "${b}" [[
+${c}]])
+if(NOT out STREQUAL "ab\${c}")
+  message(FATAL_ERROR "\"string(CONCAT out a \"\${b}\" [[\${c}]])\" set out to \"${out}\"")
+endif()

+ 1 - 0
Tests/RunCMake/string/ConcatNoArgs-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/string/ConcatNoArgs-stderr.txt

@@ -0,0 +1,4 @@
+CMake Error at ConcatNoArgs.cmake:1 \(string\):
+  string sub-command CONCAT requires at least one argument.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/RunCMake/string/ConcatNoArgs.cmake

@@ -0,0 +1 @@
+string(CONCAT)

+ 4 - 0
Tests/RunCMake/string/RunCMakeTest.cmake

@@ -0,0 +1,4 @@
+include(RunCMake)
+
+run_cmake(Concat)
+run_cmake(ConcatNoArgs)