diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2005-06-13 15:00:29 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2005-06-13 15:00:29 (GMT) |
commit | 29f7e505a50f502ab54c97f86d8b714184aed8ad (patch) | |
tree | f37987e1022912c6d194d6c04d628ac7e41a4b14 /Source | |
parent | 385cced66c27658e93c5b63ddc3424da0feb8a61 (diff) | |
download | CMake-29f7e505a50f502ab54c97f86d8b714184aed8ad.zip CMake-29f7e505a50f502ab54c97f86d8b714184aed8ad.tar.gz CMake-29f7e505a50f502ab54c97f86d8b714184aed8ad.tar.bz2 |
ENH: Use the new parser that supports nested variables
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMakeLists.txt | 52 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 50 |
2 files changed, 102 insertions, 0 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index ac822bb..b5d41d2 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -17,6 +17,55 @@ INCLUDE_DIRECTORIES( # let cmake know it is supposed to use it ADD_DEFINITIONS(-DCMAKE_BUILD_WITH_CMAKE) +OPTION(CMAKE_REGENERATE_YACCLEX + "Regenerate YACC and LEXX files" OFF) +MARK_AS_ADVANCED(CMAKE_REGENERATE_YACCLEX) +IF(CMAKE_REGENERATE_YACCLEX) + FIND_PROGRAM(YACC_EXECUTABLE + NAMES yacc bison + PATHS /usr/bin + DOC "Yacc or Bison executable") + FIND_PROGRAM(FLEX_EXECUTABLE + NAMES flex + PATHS /usr/bin + DOC "Flex executable") + MARK_AS_ADVANCED(YACC_EXECUTABLE FLEX_EXECUTABLE) + IF(YACC_EXECUTABLE) + SET(BISON_FLAGS) + IF(YACC_EXECUTABLE MATCHES "bison") + SET(BISON_FLAGS "--yacc") + ENDIF(YACC_EXECUTABLE MATCHES "bison") + SET(yacc_files) + FOREACH(name cmCommandArgument) + SET(src "${CMAKE_CURRENT_SOURCE_DIR}/${name}Parser.y") + SET(dst "${CMAKE_CURRENT_BINARY_DIR}/${name}Parser.cxx") + SET(hdr "${CMAKE_CURRENT_BINARY_DIR}/${name}ParserTokens.h") + ADD_CUSTOM_COMMAND( + OUTPUT "${dst}" + DEPENDS "${src}" + COMMAND ${YACC_EXECUTABLE} + ARGS --name-prefix=${name}_yy --defines="${hdr}" -o"${dst}" "${src}") + SET(yacc_files ${yacc_files} "${dst}") + ENDFOREACH(name) + ADD_CUSTOM_TARGET(RerunYacc DEPENDS ${yacc_files}) + ENDIF(YACC_EXECUTABLE) + IF(FLEX_EXECUTABLE) + SET(lex_files) + FOREACH(name cmCommandArgument) + SET(src "${CMAKE_CURRENT_SOURCE_DIR}/${name}Lexer.in.l") + SET(dst "${CMAKE_CURRENT_BINARY_DIR}/${name}Lexer.cxx") + SET(hdr "${CMAKE_CURRENT_BINARY_DIR}/${name}Lexer.h") + ADD_CUSTOM_COMMAND( + OUTPUT "${dst}" + DEPENDS "${src}" + COMMAND ${FLEX_EXECUTABLE} + ARGS --prefix=${name}_yy --header-file="${hdr}" -o"${dst}" "${src}") + SET(lex_files ${lex_files} "${dst}") + ENDFOREACH(name) + ADD_CUSTOM_TARGET(RerunLex DEPENDS ${lex_files}) + ENDIF(FLEX_EXECUTABLE) + +ENDIF(CMAKE_REGENERATE_YACCLEX) # # Sources for CMakeLib # @@ -26,6 +75,9 @@ SET(SRCS cmCacheManager.h cmCommands.cxx cmCommands.h + cmCommandArgumentLexer.cxx + cmCommandArgumentParser.cxx + cmCommandArgumentParserHelper.cxx cmCustomCommand.cxx cmCustomCommand.h cmDepends.cxx diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index a89fcd1..37238bf 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -24,6 +24,7 @@ #include "cmCacheManager.h" #include "cmFunctionBlocker.h" #include "cmListFileCache.h" +#include "cmCommandArgumentParserHelper.h" #include "cmTest.h" #ifdef CMAKE_BUILD_WITH_CMAKE # include "cmVariableWatch.h" @@ -1365,10 +1366,58 @@ const char *cmMakefile::ExpandVariablesInString(std::string& source, long line, bool removeEmpty) const { + if ( source.empty() || source.find_first_of("$@") == source.npos) + { + return source.c_str(); + } // This method replaces ${VAR} and @VAR@ where VAR is looked up // with GetDefinition(), if not found in the map, nothing is expanded. // It also supports the $ENV{VAR} syntax where VAR is looked up in // the current environment variables. + + bool notParsed = true; + if ( !atOnly ) + { + cmCommandArgumentParserHelper parser; + parser.SetMakefile(this); + parser.SetLineFile(line, filename); + parser.SetEscapeQuotes(escapeQuotes); + int res = parser.ParseString(source.c_str(), 0); + if ( res ) + { + source = parser.GetResult(); + notParsed = false; + } + else + { + cmOStringStream error; + error << "Syntax error in cmake code at\n" + << filename << ":" << line << ":\n" + << parser.GetError() << ", when parsing string \"" << source.c_str() << "\""; + const char* versionValue + = this->GetDefinition("CMAKE_BACKWARDS_COMPATIBILITY"); + int major = 0; + int minor = 0; + if ( versionValue ) + { + sscanf(versionValue, "%d.%d", &major, &minor); + } + if ( major < 2 || major == 2 && minor < 1 ) + { + cmSystemTools::Error(error.str().c_str()); + cmSystemTools::SetFatalErrorOccured(); + return source.c_str(); + } + else + { + cmSystemTools::Message(error.str().c_str()); + } + //std::cerr << "[" << source.c_str() << "] results in: [" << parser.GetResult() << "]" << std::endl; + } + } + + if ( notParsed ) + { // start by look for $ or @ in the string std::string::size_type markerPos; @@ -1521,6 +1570,7 @@ const char *cmMakefile::ExpandVariablesInString(std::string& source, } result += source.substr(currentPos); // pick up the rest of the string source = result; + } return source.c_str(); } |