Commit 4e184a21 authored by Brad King's avatar Brad King

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.
parent 9fb65d70
......@@ -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.
......
......@@ -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)
......
......@@ -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);
......
......@@ -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)
......
cmake_minimum_required(VERSION 2.8.4)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)
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()
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\)
include(RunCMake)
run_cmake(Concat)
run_cmake(ConcatNoArgs)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment