diff --git a/Help/command/string.rst b/Help/command/string.rst index 34c1b6179..bc4399c05 100644 --- a/Help/command/string.rst +++ b/Help/command/string.rst @@ -15,6 +15,7 @@ String operations. string(REPLACE [...]) + string(APPEND [...]) string(CONCAT [...]) string( ) @@ -55,6 +56,8 @@ through argument parsing. ``REPLACE`` will replace all occurrences of ``match_string`` in the input with ``replace_string`` and store the result in the output. +``APPEND`` will append all the input arguments to the string. + ``CONCAT`` will concatenate all the input arguments together and store the result in the named output variable. diff --git a/Help/release/dev/string-append.rst b/Help/release/dev/string-append.rst new file mode 100644 index 000000000..190b51ee7 --- /dev/null +++ b/Help/release/dev/string-append.rst @@ -0,0 +1,4 @@ +string-append +------------- + +* The :command:`string` command learned a new ``APPEND`` subcommand. diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index edc6afc19..efc1f1627 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -74,6 +74,10 @@ bool cmStringCommand { return this->HandleLengthCommand(args); } + else if(subCommand == "APPEND") + { + return this->HandleAppendCommand(args); + } else if(subCommand == "CONCAT") { return this->HandleConcatCommand(args); @@ -729,6 +733,34 @@ bool cmStringCommand return true; } +//---------------------------------------------------------------------------- +bool cmStringCommand::HandleAppendCommand(std::vector const& args) +{ + if(args.size() < 2) + { + this->SetError("sub-command APPEND requires at least one argument."); + return false; + } + + // Skip if nothing to append. + if(args.size() < 3) + { + return true; + } + + const std::string& variable = args[1]; + + std::string value; + const char* oldValue = this->Makefile->GetDefinition(variable); + if(oldValue) + { + value = oldValue; + } + value += cmJoin(cmRange(args).advance(2), std::string()); + this->Makefile->AddDefinition(variable, value.c_str()); + return true; +} + //---------------------------------------------------------------------------- bool cmStringCommand ::HandleConcatCommand(std::vector const& args) diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index 9c75095c1..3ed17ebd3 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -67,6 +67,7 @@ protected: bool HandleReplaceCommand(std::vector const& args); bool HandleLengthCommand(std::vector const& args); bool HandleSubstringCommand(std::vector const& args); + bool HandleAppendCommand(std::vector const& args); bool HandleConcatCommand(std::vector const& args); bool HandleStripCommand(std::vector const& args); bool HandleRandomCommand(std::vector const& args); diff --git a/Tests/RunCMake/string/Append.cmake b/Tests/RunCMake/string/Append.cmake new file mode 100644 index 000000000..2634274bf --- /dev/null +++ b/Tests/RunCMake/string/Append.cmake @@ -0,0 +1,58 @@ +set(out) +string(APPEND out) +if(DEFINED out) + message(FATAL_ERROR "\"string(APPEND out)\" set out to \"${out}\"") +endif() + +set(out "") +string(APPEND out) +if(NOT out STREQUAL "") + message(FATAL_ERROR "\"string(APPEND out)\" set out to \"${out}\"") +endif() + +set(out x) +string(APPEND out) +if(NOT out STREQUAL "x") + message(FATAL_ERROR "\"string(APPEND out)\" set out to \"${out}\"") +endif() + + +set(out) +string(APPEND out a) +if(NOT out STREQUAL "a") + message(FATAL_ERROR "\"string(APPEND out a)\" set out to \"${out}\"") +endif() + +set(out "") +string(APPEND out a) +if(NOT out STREQUAL "a") + message(FATAL_ERROR "\"string(APPEND out a)\" set out to \"${out}\"") +endif() + +set(out x) +string(APPEND out a) +if(NOT out STREQUAL "xa") + message(FATAL_ERROR "\"string(APPEND out a)\" set out to \"${out}\"") +endif() + + +set(out x) +string(APPEND out a "b") +if(NOT out STREQUAL "xab") + message(FATAL_ERROR "\"string(APPEND out a \"b\")\" set out to \"${out}\"") +endif() + +set(b) +set(out x) +string(APPEND out ${b}) +if(NOT out STREQUAL "x") + message(FATAL_ERROR "\"string(APPEND out \${b})\" set out to \"${out}\"") +endif() + +set(b b) +set(out x) +string(APPEND out a "${b}" [[ +${c}]]) +if(NOT out STREQUAL "xab\${c}") + message(FATAL_ERROR "\"string(APPEND out a \"\${b}\" [[\${c}]])\" set out to \"${out}\"") +endif() diff --git a/Tests/RunCMake/string/AppendNoArgs-result.txt b/Tests/RunCMake/string/AppendNoArgs-result.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/Tests/RunCMake/string/AppendNoArgs-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/string/AppendNoArgs-stderr.txt b/Tests/RunCMake/string/AppendNoArgs-stderr.txt new file mode 100644 index 000000000..75ad427fd --- /dev/null +++ b/Tests/RunCMake/string/AppendNoArgs-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at AppendNoArgs.cmake:1 \(string\): + string sub-command APPEND requires at least one argument. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/string/AppendNoArgs.cmake b/Tests/RunCMake/string/AppendNoArgs.cmake new file mode 100644 index 000000000..f54fb7719 --- /dev/null +++ b/Tests/RunCMake/string/AppendNoArgs.cmake @@ -0,0 +1 @@ +string(APPEND) diff --git a/Tests/RunCMake/string/RunCMakeTest.cmake b/Tests/RunCMake/string/RunCMakeTest.cmake index 89f7ea517..8067d9dbf 100644 --- a/Tests/RunCMake/string/RunCMakeTest.cmake +++ b/Tests/RunCMake/string/RunCMakeTest.cmake @@ -1,5 +1,8 @@ include(RunCMake) +run_cmake(Append) +run_cmake(AppendNoArgs) + run_cmake(Concat) run_cmake(ConcatNoArgs)