From 4e184a21beda9de3703ecda94085c234f5bbd7da Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 21 Oct 2013 12:49:15 -0400 Subject: [PATCH] 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. --- Help/command/string.rst | 4 +++ Source/cmStringCommand.cxx | 25 +++++++++++++++++++ Source/cmStringCommand.h | 1 + Tests/RunCMake/CMakeLists.txt | 1 + Tests/RunCMake/string/CMakeLists.txt | 3 +++ Tests/RunCMake/string/Concat.cmake | 19 ++++++++++++++ Tests/RunCMake/string/ConcatNoArgs-result.txt | 1 + Tests/RunCMake/string/ConcatNoArgs-stderr.txt | 4 +++ Tests/RunCMake/string/ConcatNoArgs.cmake | 1 + Tests/RunCMake/string/RunCMakeTest.cmake | 4 +++ 10 files changed, 63 insertions(+) create mode 100644 Tests/RunCMake/string/CMakeLists.txt create mode 100644 Tests/RunCMake/string/Concat.cmake create mode 100644 Tests/RunCMake/string/ConcatNoArgs-result.txt create mode 100644 Tests/RunCMake/string/ConcatNoArgs-stderr.txt create mode 100644 Tests/RunCMake/string/ConcatNoArgs.cmake create mode 100644 Tests/RunCMake/string/RunCMakeTest.cmake diff --git a/Help/command/string.rst b/Help/command/string.rst index 1e18ca619..af1882527 100644 --- a/Help/command/string.rst +++ b/Help/command/string.rst @@ -15,6 +15,7 @@ String operations. string(REPLACE [...]) + string(CONCAT [...]) string( ) string(COMPARE EQUAL ) @@ -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. diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index 68ba13f62..f9b69e329 100644 --- a/Source/cmStringCommand.cxx +++ b/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 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 const& args) diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index 0e833c45a..66b48e69f 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -69,6 +69,7 @@ protected: bool HandleReplaceCommand(std::vector const& args); bool HandleLengthCommand(std::vector const& args); bool HandleSubstringCommand(std::vector const& args); + bool HandleConcatCommand(std::vector const& args); bool HandleStripCommand(std::vector const& args); bool HandleRandomCommand(std::vector const& args); bool HandleFindCommand(std::vector const& args); diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 52c86677d..44da6f2a6 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/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) diff --git a/Tests/RunCMake/string/CMakeLists.txt b/Tests/RunCMake/string/CMakeLists.txt new file mode 100644 index 000000000..12cd3c775 --- /dev/null +++ b/Tests/RunCMake/string/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8.4) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/string/Concat.cmake b/Tests/RunCMake/string/Concat.cmake new file mode 100644 index 000000000..7260c95dd --- /dev/null +++ b/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() diff --git a/Tests/RunCMake/string/ConcatNoArgs-result.txt b/Tests/RunCMake/string/ConcatNoArgs-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/string/ConcatNoArgs-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/string/ConcatNoArgs-stderr.txt b/Tests/RunCMake/string/ConcatNoArgs-stderr.txt new file mode 100644 index 000000000..efea5f1d8 --- /dev/null +++ b/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\) diff --git a/Tests/RunCMake/string/ConcatNoArgs.cmake b/Tests/RunCMake/string/ConcatNoArgs.cmake new file mode 100644 index 000000000..ba2113662 --- /dev/null +++ b/Tests/RunCMake/string/ConcatNoArgs.cmake @@ -0,0 +1 @@ +string(CONCAT) diff --git a/Tests/RunCMake/string/RunCMakeTest.cmake b/Tests/RunCMake/string/RunCMakeTest.cmake new file mode 100644 index 000000000..501acd2bd --- /dev/null +++ b/Tests/RunCMake/string/RunCMakeTest.cmake @@ -0,0 +1,4 @@ +include(RunCMake) + +run_cmake(Concat) +run_cmake(ConcatNoArgs)