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

This commit is contained in:
Brad King 2004-03-04 10:05:14 -05:00
parent 1dd718457f
commit 4990e1481d
4 changed files with 74 additions and 0 deletions

View File

@ -49,6 +49,10 @@ bool cmStringCommand::InitialPass(std::vector<std::string> const& args)
{ {
return this->HandleAsciiCommand(args); return this->HandleAsciiCommand(args);
} }
else if(subCommand == "CONFIGURE")
{
return this->HandleConfigureCommand(args);
}
std::string e = "does not recognize sub-command "+subCommand; std::string e = "does not recognize sub-command "+subCommand;
this->SetError(e.c_str()); this->SetError(e.c_str());
@ -114,6 +118,53 @@ bool cmStringCommand::HandleAsciiCommand(std::vector<std::string> const& args)
return true; 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) bool cmStringCommand::HandleRegexCommand(std::vector<std::string> const& args)
{ {

View File

@ -82,6 +82,8 @@ public:
" STRING(COMPARE LESS <string1> <string2> <output variable>)\n" " STRING(COMPARE LESS <string1> <string2> <output variable>)\n"
" STRING(COMPARE GREATER <string1> <string2> <output variable>)\n" " STRING(COMPARE GREATER <string1> <string2> <output variable>)\n"
" STRING(ASCII <number> [<number> ...] <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(TOUPPER <string1> <output variable>)\n"
" STRING(TOLOWER <string1> <output variable>)\n" " STRING(TOLOWER <string1> <output variable>)\n"
"REGEX MATCH will match the regular expression once and store the " "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 " "COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and "
"store true or false in the output variable.\n" "store true or false in the output variable.\n"
"ASCII will convert all numbers into corresponding ASCII characters.\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."; "TOUPPER/TOLOWER will convert string to upper/lower characters.";
} }
cmTypeMacro(cmStringCommand, cmCommand); cmTypeMacro(cmStringCommand, cmCommand);
protected: protected:
bool HandleConfigureCommand(std::vector<std::string> const& args);
bool HandleAsciiCommand(std::vector<std::string> const& args); bool HandleAsciiCommand(std::vector<std::string> const& args);
bool HandleRegexCommand(std::vector<std::string> const& args); bool HandleRegexCommand(std::vector<std::string> const& args);
bool RegexMatch(std::vector<std::string> const& args); bool RegexMatch(std::vector<std::string> const& args);

View File

@ -55,6 +55,11 @@ FOREACH(var
FILE(APPEND "${file}" "#define ${var} \"${${var}}\"\n") FILE(APPEND "${file}" "#define ${var} \"${${var}}\"\n")
ENDFOREACH(var) 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 # Write include file to a file
STRING(REGEX REPLACE "includefile" "${file}" outfile "${infile}") STRING(REGEX REPLACE "includefile" "${file}" outfile "${infile}")
FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/OutputFile.h" "${outfile}") FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/OutputFile.h" "${outfile}")

View File

@ -1,5 +1,10 @@
#include "includefile" #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 ) int CheckMethod(const char* var, const char* val )
{ {
if ( !var ) 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); printf("Var (%s) and Val (%s) are not the same...\n", var, val);
return 1; 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; return 0;
#endif
} }