From 4990e1481d378e89a0d07d1a25d882a38530db31 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 4 Mar 2004 10:05:14 -0500 Subject: ENH: Added STRING(CONFIGURE ...) command. --- Source/cmStringCommand.cxx | 51 +++++++++++++++++++++++++++++++++++++ Source/cmStringCommand.h | 5 ++++ Tests/StringFileTest/CMakeLists.txt | 5 ++++ Tests/StringFileTest/InputFile.h.in | 13 ++++++++++ 4 files changed, 74 insertions(+) diff --git a/Source/cmStringCommand.cxx b/Source/cmStringCommand.cxx index 6acb72c..76d60e0 100644 --- a/Source/cmStringCommand.cxx +++ b/Source/cmStringCommand.cxx @@ -49,6 +49,10 @@ bool cmStringCommand::InitialPass(std::vector const& args) { return this->HandleAsciiCommand(args); } + else if(subCommand == "CONFIGURE") + { + return this->HandleConfigureCommand(args); + } std::string e = "does not recognize sub-command "+subCommand; this->SetError(e.c_str()); @@ -115,6 +119,53 @@ bool cmStringCommand::HandleAsciiCommand(std::vector const& args) } //---------------------------------------------------------------------------- +bool cmStringCommand::HandleConfigureCommand( + std::vector 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 const& args) { if(args.size() < 2) diff --git a/Source/cmStringCommand.h b/Source/cmStringCommand.h index 1fb5158..ed28b4b 100644 --- a/Source/cmStringCommand.h +++ b/Source/cmStringCommand.h @@ -82,6 +82,8 @@ public: " STRING(COMPARE LESS )\n" " STRING(COMPARE GREATER )\n" " STRING(ASCII [ ...] )\n" + " STRING(CONFIGURE \n" + " [@ONLY] [ESCAPE_QUOTES])\n" " STRING(TOUPPER )\n" " STRING(TOLOWER )\n" "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 " "store true or false in the output variable.\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."; } cmTypeMacro(cmStringCommand, cmCommand); protected: + bool HandleConfigureCommand(std::vector const& args); bool HandleAsciiCommand(std::vector const& args); bool HandleRegexCommand(std::vector const& args); bool RegexMatch(std::vector const& args); diff --git a/Tests/StringFileTest/CMakeLists.txt b/Tests/StringFileTest/CMakeLists.txt index b0030fe..74b99ec 100644 --- a/Tests/StringFileTest/CMakeLists.txt +++ b/Tests/StringFileTest/CMakeLists.txt @@ -55,6 +55,11 @@ FOREACH(var FILE(APPEND "${file}" "#define ${var} \"${${var}}\"\n") 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 STRING(REGEX REPLACE "includefile" "${file}" outfile "${infile}") FILE(WRITE "${CMAKE_CURRENT_BINARY_DIR}/OutputFile.h" "${outfile}") diff --git a/Tests/StringFileTest/InputFile.h.in b/Tests/StringFileTest/InputFile.h.in index 1bda5af..c7c1995 100644 --- a/Tests/StringFileTest/InputFile.h.in +++ b/Tests/StringFileTest/InputFile.h.in @@ -1,5 +1,10 @@ #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 ) { 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); 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; +#endif } -- cgit v0.12