diff options
author | Brad King <brad.king@kitware.com> | 2013-11-01 13:39:56 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2013-11-01 13:39:56 (GMT) |
commit | a549b68d37bc3d1b87cfd407d4edb45fa02079dd (patch) | |
tree | 76fe2f76039946dfc17d948dba9916c1670abcb1 | |
parent | 80c3420f30909ab7402145ee98fcb7d67c4fc7fc (diff) | |
parent | b54dbebf6259eb9fb688b1857e84cfcc2ffdbbe1 (diff) | |
download | CMake-a549b68d37bc3d1b87cfd407d4edb45fa02079dd.zip CMake-a549b68d37bc3d1b87cfd407d4edb45fa02079dd.tar.gz CMake-a549b68d37bc3d1b87cfd407d4edb45fa02079dd.tar.bz2 |
Merge topic 'cmake-syntax-recorded-brackets'
b54dbeb Test foreach/function/macro handling of bracket arguments
ccdf7e0 macro: Do not substitute for placeholders in bracket arguments
999abb9 macro: Add extra indentation to placeholder substitution code
-rw-r--r-- | Source/cmMacroCommand.cxx | 105 | ||||
-rw-r--r-- | Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt | 2 | ||||
-rw-r--r-- | Tests/RunCMake/Syntax/ForEachBracket1.cmake | 3 | ||||
-rw-r--r-- | Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt | 2 | ||||
-rw-r--r-- | Tests/RunCMake/Syntax/FunctionBracket1.cmake | 6 | ||||
-rw-r--r-- | Tests/RunCMake/Syntax/MacroBracket1-stderr.txt | 2 | ||||
-rw-r--r-- | Tests/RunCMake/Syntax/MacroBracket1.cmake | 6 | ||||
-rw-r--r-- | Tests/RunCMake/Syntax/RunCMakeTest.cmake | 3 |
8 files changed, 80 insertions, 49 deletions
diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx index fd6537f..499d3c6 100644 --- a/Source/cmMacroCommand.cxx +++ b/Source/cmMacroCommand.cxx @@ -140,75 +140,82 @@ bool cmMacroHelperCommand::InvokeInitialPass // Set the FilePath on the arguments to match the function since it is // not stored and the original values may be freed k->FilePath = this->FilePath.c_str(); - tmps = k->Value; - // replace formal arguments - for (unsigned int j = 1; j < this->Args.size(); ++j) + if(k->Delim == cmListFileArgument::Bracket) { - variable = "${"; - variable += this->Args[j]; - variable += "}"; - cmSystemTools::ReplaceString(tmps, variable.c_str(), - expandedArgs[j-1].c_str()); + arg.Value = k->Value; } - // replace argc - cmSystemTools::ReplaceString(tmps, "${ARGC}",argcDef.c_str()); - - // repleace ARGN - if (tmps.find("${ARGN}") != std::string::npos) + else { - if (!argnDefInitialized) + tmps = k->Value; + // replace formal arguments + for (unsigned int j = 1; j < this->Args.size(); ++j) + { + variable = "${"; + variable += this->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) { - std::vector<std::string>::const_iterator eit; - std::vector<std::string>::size_type cnt = 0; - for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit ) + if (!argnDefInitialized) { - if ( cnt >= this->Args.size()-1 ) + std::vector<std::string>::const_iterator eit; + std::vector<std::string>::size_type cnt = 0; + for(eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit) { - if ( argnDef.size() > 0 ) + if ( cnt >= this->Args.size()-1 ) { - argnDef += ";"; + if ( argnDef.size() > 0 ) + { + argnDef += ";"; + } + argnDef += *eit; } - argnDef += *eit; + cnt ++; } - cnt ++; + argnDefInitialized = true; } - argnDefInitialized = true; + cmSystemTools::ReplaceString(tmps, "${ARGN}", argnDef.c_str()); } - 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) - { - char argvName[60]; - // repleace ARGV, compute it only once - if (!argvDefInitialized) + // if the current argument of the current function has ${ARGV in it + // then try replacing ARGV values + if (tmps.find("${ARGV") != std::string::npos) { - std::vector<std::string>::const_iterator eit; - for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit ) + char argvName[60]; + + // repleace ARGV, compute it only once + if (!argvDefInitialized) { - if ( argvDef.size() > 0 ) + std::vector<std::string>::const_iterator eit; + for(eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit) { - argvDef += ";"; + if ( argvDef.size() > 0 ) + { + argvDef += ";"; + } + argvDef += *eit; } - argvDef += *eit; + argvDefInitialized = true; } - argvDefInitialized = true; - } - cmSystemTools::ReplaceString(tmps, "${ARGV}", argvDef.c_str()); + 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()); + // 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()); + } } - } - arg.Value = tmps; + arg.Value = tmps; + } arg.Delim = k->Delim; arg.FilePath = k->FilePath; arg.Line = k->Line; diff --git a/Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt b/Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt new file mode 100644 index 0000000..93c31cf --- /dev/null +++ b/Tests/RunCMake/Syntax/ForEachBracket1-stderr.txt @@ -0,0 +1,2 @@ +^\${x}:a +\${x}:b$ diff --git a/Tests/RunCMake/Syntax/ForEachBracket1.cmake b/Tests/RunCMake/Syntax/ForEachBracket1.cmake new file mode 100644 index 0000000..a55e21f --- /dev/null +++ b/Tests/RunCMake/Syntax/ForEachBracket1.cmake @@ -0,0 +1,3 @@ +foreach(x a b) + message([[${x}:]] "${x}") +endforeach() diff --git a/Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt b/Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt new file mode 100644 index 0000000..9ba6179 --- /dev/null +++ b/Tests/RunCMake/Syntax/FunctionBracket1-stderr.txt @@ -0,0 +1,2 @@ +^\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:a,n,2,a;n,a,n, +\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:b,n,2,b;n,b,n,$ diff --git a/Tests/RunCMake/Syntax/FunctionBracket1.cmake b/Tests/RunCMake/Syntax/FunctionBracket1.cmake new file mode 100644 index 0000000..8ed4f65 --- /dev/null +++ b/Tests/RunCMake/Syntax/FunctionBracket1.cmake @@ -0,0 +1,6 @@ +function(fun x) + message([[${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}:]] + "${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}") +endfunction(fun) +fun(a n) +fun(b n) diff --git a/Tests/RunCMake/Syntax/MacroBracket1-stderr.txt b/Tests/RunCMake/Syntax/MacroBracket1-stderr.txt new file mode 100644 index 0000000..9ba6179 --- /dev/null +++ b/Tests/RunCMake/Syntax/MacroBracket1-stderr.txt @@ -0,0 +1,2 @@ +^\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:a,n,2,a;n,a,n, +\${x},\${ARGN},\${ARGC},\${ARGV},\${ARGV0},\${ARGV1},\${ARGV2}:b,n,2,b;n,b,n,$ diff --git a/Tests/RunCMake/Syntax/MacroBracket1.cmake b/Tests/RunCMake/Syntax/MacroBracket1.cmake new file mode 100644 index 0000000..ef6de20 --- /dev/null +++ b/Tests/RunCMake/Syntax/MacroBracket1.cmake @@ -0,0 +1,6 @@ +macro(mac x) + message([[${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}:]] + "${x},${ARGN},${ARGC},${ARGV},${ARGV0},${ARGV1},${ARGV2}") +endmacro(mac) +mac(a n) +mac(b n) diff --git a/Tests/RunCMake/Syntax/RunCMakeTest.cmake b/Tests/RunCMake/Syntax/RunCMakeTest.cmake index 4f42a07..5f05cfc 100644 --- a/Tests/RunCMake/Syntax/RunCMakeTest.cmake +++ b/Tests/RunCMake/Syntax/RunCMakeTest.cmake @@ -12,6 +12,9 @@ run_cmake(CommandComments) run_cmake(CommandError0) run_cmake(CommandError1) run_cmake(CommandError2) +run_cmake(ForEachBracket1) +run_cmake(FunctionBracket1) +run_cmake(MacroBracket1) run_cmake(String0) run_cmake(String1) run_cmake(StringBackslash) |