diff options
author | Ken Martin <ken.martin@kitware.com> | 2005-06-23 15:03:57 (GMT) |
---|---|---|
committer | Ken Martin <ken.martin@kitware.com> | 2005-06-23 15:03:57 (GMT) |
commit | dec5cc1082f92fd1ba56afe9efc596377afc4461 (patch) | |
tree | 53f355a7b81db7fb0a311267f7aaaf7b3d7dc359 /Source | |
parent | 553f7a04d07aed93ae72148a171ec11d7a1403dd (diff) | |
download | CMake-dec5cc1082f92fd1ba56afe9efc596377afc4461.zip CMake-dec5cc1082f92fd1ba56afe9efc596377afc4461.tar.gz CMake-dec5cc1082f92fd1ba56afe9efc596377afc4461.tar.bz2 |
ENH: converted macro to use variables and fixed some case issues with some function blockers
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmForEachCommand.cxx | 4 | ||||
-rw-r--r-- | Source/cmIfCommand.cxx | 9 | ||||
-rw-r--r-- | Source/cmMacroCommand.cxx | 206 | ||||
-rw-r--r-- | Source/cmWhileCommand.cxx | 4 |
4 files changed, 95 insertions, 128 deletions
diff --git a/Source/cmForEachCommand.cxx b/Source/cmForEachCommand.cxx index e4a12cb..4c05cf0 100644 --- a/Source/cmForEachCommand.cxx +++ b/Source/cmForEachCommand.cxx @@ -27,7 +27,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) } // at end of for each execute recorded commands - if (lff.m_Name == "ENDFOREACH") + if (cmSystemTools::LowerCase(lff.m_Name) == "endforeach") { std::vector<std::string> expandedArguments; mf.ExpandArguments(lff.m_Arguments, expandedArguments); @@ -72,7 +72,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) bool cmForEachFunctionBlocker:: ShouldRemove(const cmListFileFunction& lff, cmMakefile& mf) { - if(lff.m_Name == "ENDFOREACH") + if(cmSystemTools::LowerCase(lff.m_Name) == "endforeach") { std::vector<std::string> expandedArguments; mf.ExpandArguments(lff.m_Arguments, expandedArguments); diff --git a/Source/cmIfCommand.cxx b/Source/cmIfCommand.cxx index 36bc35f..cf5bc82 100644 --- a/Source/cmIfCommand.cxx +++ b/Source/cmIfCommand.cxx @@ -25,19 +25,20 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) const char* name = lff.m_Name.c_str(); const std::vector<cmListFileArgument>& args = lff.m_Arguments; // always let if statements through - if (!strcmp(name,"IF")) + if (cmSystemTools::LowerCase(lff.m_Name) == "if") { return false; } // watch for our ELSE or ENDIF - if (!strcmp(name,"ELSE") || !strcmp(name,"ENDIF")) + if (cmSystemTools::LowerCase(lff.m_Name) == "else" || + cmSystemTools::LowerCase(lff.m_Name) == "endif") { if (args == m_Args) { // if it was an else statement then we should change state // and block this Else Command - if (!strcmp(name,"ELSE")) + if (cmSystemTools::LowerCase(lff.m_Name) == "else") { m_IsBlocking = !m_IsBlocking; return true; @@ -72,7 +73,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) bool cmIfFunctionBlocker::ShouldRemove(const cmListFileFunction& lff, cmMakefile&) { - if (lff.m_Name == "ENDIF") + if (cmSystemTools::LowerCase(lff.m_Name) == "endif") { if (lff.m_Arguments == m_Args) { diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx index dea15bc..3545ded 100644 --- a/Source/cmMacroCommand.cxx +++ b/Source/cmMacroCommand.cxx @@ -112,138 +112,104 @@ bool cmMacroHelperCommand::InvokeInitialPass // declare varuiables for ARGV ARGN but do not compute until needed std::string argvDef; std::string argnDef; - bool argnDefInitialized = false; bool argvDefInitialized = false; - - // Invoke all the functions that were collected in the block. - cmListFileFunction newLFF; - // for each function - for(unsigned int c = 0; c < m_Functions.size(); ++c) + + // save the current definitions of all vars that we will be setting + std::string oldARGC; + if (m_Makefile->GetDefinition("ARGC")) { - // Replace the formal arguments and then invoke the command. - newLFF.m_Arguments.clear(); - newLFF.m_Arguments.reserve(m_Functions[c].m_Arguments.size()); - newLFF.m_Name = m_Functions[c].m_Name; - newLFF.m_FilePath = m_Functions[c].m_FilePath; - newLFF.m_Line = m_Functions[c].m_Line; - const char* def = - m_Makefile->GetDefinition("CMAKE_MACRO_REPORT_DEFINITION_LOCATION"); - bool macroReportLocation = false; - if(def && !cmSystemTools::IsOff(def)) - { - macroReportLocation = true; - } - - // for each argument of the current function - for (std::vector<cmListFileArgument>::const_iterator k = - m_Functions[c].m_Arguments.begin(); - k != m_Functions[c].m_Arguments.end(); ++k) + oldARGC = m_Makefile->GetDefinition("ARGC"); + } + m_Makefile->AddDefinition("ARGC",argcDef.c_str()); + + // store ARGN, ARGV + std::vector<std::string> oldARGVArgs; + std::vector<std::string>::const_iterator eit; + std::vector<std::string>::size_type cnt = 0; + char argvName[60]; + for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit ) + { + if ( cnt >= m_Args.size()-1 ) { - tmps = k->Value; - // replace formal arguments - for (unsigned int j = 1; j < m_Args.size(); ++j) - { - variable = "${"; - variable += m_Args[j]; - variable += "}"; - cmSystemTools::ReplaceString(tmps, variable.c_str(), - expandedArgs[j-1].c_str()); - } - // replace argc - cmSystemTools::ReplaceString(tmps, "${ARGC}",argcDef.c_str()); - - // repleace ARGN - if (tmps.find("${ARGN}") != std::string::npos) - { - if (!argnDefInitialized) - { - std::vector<std::string>::const_iterator eit; - std::vector<std::string>::size_type cnt = 0; - for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit ) - { - if ( cnt >= m_Args.size()-1 ) - { - if ( argnDef.size() > 0 ) - { - argnDef += ";"; - } - argnDef += *eit; - } - cnt ++; - } - argnDefInitialized = true; - } - cmSystemTools::ReplaceString(tmps, "${ARGN}", argnDef.c_str()); - } - - // if the current argument of the current function has ${ARGV in it - // then try replacing ARGV values - if (tmps.find("${ARGV") != std::string::npos) + if ( argnDef.size() > 0 ) { - char argvName[60]; - - // repleace ARGV, compute it only once - if (!argvDefInitialized) - { - std::vector<std::string>::const_iterator eit; - for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit ) - { - if ( argvDef.size() > 0 ) - { - argvDef += ";"; - } - argvDef += *eit; - } - argvDefInitialized = true; - } - cmSystemTools::ReplaceString(tmps, "${ARGV}", argvDef.c_str()); - - // also replace the ARGV1 ARGV2 ... etc - for (unsigned int t = 0; t < expandedArgs.size(); ++t) - { - sprintf(argvName,"${ARGV%i}",t); - cmSystemTools::ReplaceString(tmps, argvName, - expandedArgs[t].c_str()); - } + argnDef += ";"; } - - arg.Value = tmps; - arg.Quoted = k->Quoted; - if(macroReportLocation) - { - // Report the location of the argument where the macro was - // defined. - arg.FilePath = k->FilePath; - arg.Line = k->Line; - } - else - { - // Report the location of the argument where the macro was - // invoked. - if (args.size()) - { - arg.FilePath = args[0].FilePath; - arg.Line = args[0].Line; - } - else - { - arg.FilePath = "Unknown"; - arg.Line = 0; - } - } - newLFF.m_Arguments.push_back(arg); + argnDef += *eit; + } + if ( argvDef.size() > 0 ) + { + argvDef += ";"; } - if(!m_Makefile->ExecuteCommand(newLFF)) + argvDef += *eit; + oldARGVArgs.push_back(std::string()); + sprintf(argvName,"ARGV%i",cnt); + if (m_Makefile->GetDefinition(argvName)) + { + oldARGVArgs[cnt] = m_Makefile->GetDefinition(argvName); + } + m_Makefile->AddDefinition(argvName,eit->c_str()); + cnt++; + } + std::string oldARGN; + if (m_Makefile->GetDefinition("ARGN")) + { + oldARGN = m_Makefile->GetDefinition("ARGN"); + } + m_Makefile->AddDefinition("ARGN",argnDef.c_str()); + std::string oldARGV; + if (m_Makefile->GetDefinition("ARGV")) + { + oldARGV = m_Makefile->GetDefinition("ARGV"); + } + m_Makefile->AddDefinition("ARGV",argvDef.c_str()); + + // store old defs for formal args + std::vector<std::string> oldFormalArgs; + for (unsigned int j = 1; j < m_Args.size(); ++j) + { + oldFormalArgs.push_back(std::string()); + if (m_Makefile->GetDefinition(m_Args[j].c_str())) + { + oldFormalArgs[j-1] = m_Makefile->GetDefinition(m_Args[j].c_str()); + } + m_Makefile->AddDefinition(m_Args[j].c_str(),expandedArgs[j-1].c_str()); + } + + // Invoke all the functions that were collected in the block. + for(unsigned int c = 0; c < m_Functions.size(); ++c) + { + if(!m_Makefile->ExecuteCommand(m_Functions[c])) { cmOStringStream error; error << "Error in cmake code at\n" - << args[0].FilePath << ":" << args[0].Line << ":\n" + << args[0].FilePath << ":" << args[0].Line << "\n" << "A command failed during the invocation of macro \"" - << this->m_Args[0].c_str() << "\"."; + << this->m_Args[0].c_str() << "\".\nThe failing line " + << "in the macro definition was at\n" + << m_Functions[c].m_FilePath << ":" + << m_Functions[c].m_Line << "\n"; cmSystemTools::Error(error.str().c_str()); return false; } } + + // restore all args + m_Makefile->AddDefinition("ARGC",oldARGC.c_str()); + m_Makefile->AddDefinition("ARGN",oldARGN.c_str()); + m_Makefile->AddDefinition("ARGV",oldARGV.c_str()); + // restore old defs for formal args + for (unsigned int j = 1; j < m_Args.size(); ++j) + { + m_Makefile->AddDefinition(m_Args[j].c_str(),oldFormalArgs[j-1].c_str()); + } + // restore old defs for formal args + for (unsigned int j = 0; j < oldARGVArgs.size(); ++j) + { + sprintf(argvName,"ARGV%i",j); + m_Makefile->AddDefinition(argvName,oldARGVArgs[j].c_str()); + } + return true; } @@ -252,7 +218,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) { // record commands until we hit the ENDMACRO // at the ENDMACRO call we shift gears and start looking for invocations - if(lff.m_Name == "ENDMACRO") + if(cmSystemTools::LowerCase(lff.m_Name) == "endmacro") { std::vector<std::string> expandedArguments; mf.ExpandArguments(lff.m_Arguments, expandedArguments); @@ -292,7 +258,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) bool cmMacroFunctionBlocker:: ShouldRemove(const cmListFileFunction& lff, cmMakefile &mf) { - if(lff.m_Name == "ENDMACRO") + if(cmSystemTools::LowerCase(lff.m_Name) == "endmacro") { std::vector<std::string> expandedArguments; mf.ExpandArguments(lff.m_Arguments, expandedArguments); diff --git a/Source/cmWhileCommand.cxx b/Source/cmWhileCommand.cxx index 00445e5..38cb9ba 100644 --- a/Source/cmWhileCommand.cxx +++ b/Source/cmWhileCommand.cxx @@ -28,7 +28,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) } // at end of for each execute recorded commands - if (lff.m_Name == "ENDWHILE") + if (cmSystemTools::LowerCase(lff.m_Name) == "endwhile") { char* errorString = 0; @@ -64,7 +64,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf) bool cmWhileFunctionBlocker:: ShouldRemove(const cmListFileFunction& lff, cmMakefile& ) { - if(lff.m_Name == "ENDWHILE") + if(cmSystemTools::LowerCase(lff.m_Name) == "endwhile") { if (lff.m_Arguments == m_Args) { |