summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitar Yordanov <dimitar.yordanov@sap.com>2016-02-12 13:21:12 +0100
committerBrad King <brad.king@kitware.com>2016-02-12 11:19:40 -0500
commitc8c45a2c4e10715e5cf05acaa0ac2c80f28b9a6a (patch)
tree7e9300e1c0698c5783d6b8931a69c208ffd927a4
parenta5a5a6857241c21d306661d723b749839f4c6e1a (diff)
downloadcmake-c8c45a2c4e10715e5cf05acaa0ac2c80f28b9a6a.tar.gz
cmake_parse_arguments: Restore ;-list argument flattening
The re-implementation in commit v3.5.0-rc1~116^2~1 (CMakeParseArguments: replace by native cmake_parse_arguments command, 2015-12-05) introduced a regression when parsing the ARGN arguments with cmake_parse_arguments. The original implementation used foreach(currentArg ${ARGN}) to iterate over input arguments. This flattened ;-lists within the arguments whether they were quoted or not. Fix our new implementation to preserve this behavior and add a test case to cover it. Signed-off-by: Dimitar Yordanov <dimitar.yordanov@sap.com> Signed-off-by: Matthias Maennich <matthias.maennich@sap.com>
-rw-r--r--Source/cmParseArgumentsCommand.cxx12
-rw-r--r--Tests/RunCMake/cmake_parse_arguments/CornerCases.cmake19
2 files changed, 29 insertions, 2 deletions
diff --git a/Source/cmParseArgumentsCommand.cxx b/Source/cmParseArgumentsCommand.cxx
index a861965155..ca76c889dd 100644
--- a/Source/cmParseArgumentsCommand.cxx
+++ b/Source/cmParseArgumentsCommand.cxx
@@ -97,10 +97,18 @@ bool cmParseArgumentsCommand
} insideValues = NONE;
std::string currentArgName;
- // now iterate over the remaining arguments
- // and fill in the values where applicable
+ // Flatten ;-lists in the arguments into a single list as was done
+ // by the original function(CMAKE_PARSE_ARGUMENTS).
+ list.clear();
for(; argIter != argEnd; ++argIter)
{
+ cmSystemTools::ExpandListArgument(*argIter, list);
+ }
+
+ // iterate over the arguments list and fill in the values where applicable
+ for (argIter = list.begin(), argEnd = list.end();
+ argIter != argEnd; ++argIter)
+ {
const options_map::iterator optIter = options.find(*argIter);
if (optIter != options.end())
{
diff --git a/Tests/RunCMake/cmake_parse_arguments/CornerCases.cmake b/Tests/RunCMake/cmake_parse_arguments/CornerCases.cmake
index 9a727dd006..72c82abcee 100644
--- a/Tests/RunCMake/cmake_parse_arguments/CornerCases.cmake
+++ b/Tests/RunCMake/cmake_parse_arguments/CornerCases.cmake
@@ -13,3 +13,22 @@ cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}"
TEST(MY_INSTALL_DESTINATION UNDEFINED)
TEST(MY_INSTALL_OPTIONAL TRUE)
+
+macro(foo)
+ set(_options )
+ set(_oneValueArgs FOO)
+ set(_multiValueArgs )
+ cmake_parse_arguments(_FOO2 "${_options}"
+ "${_oneValueArgs}"
+ "${_multiValueArgs}"
+ "${ARGN}")
+ cmake_parse_arguments(_FOO1 "${_options}"
+ "${_oneValueArgs}"
+ "${_multiValueArgs}"
+ ${ARGN})
+endmacro()
+
+foo(FOO foo)
+
+TEST(_FOO1_FOO foo)
+TEST(_FOO2_FOO foo)