From c8c45a2c4e10715e5cf05acaa0ac2c80f28b9a6a Mon Sep 17 00:00:00 2001 From: Dimitar Yordanov Date: Fri, 12 Feb 2016 13:21:12 +0100 Subject: [PATCH] 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 Signed-off-by: Matthias Maennich --- Source/cmParseArgumentsCommand.cxx | 12 ++++++++++-- .../cmake_parse_arguments/CornerCases.cmake | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Source/cmParseArgumentsCommand.cxx b/Source/cmParseArgumentsCommand.cxx index a86196515..ca76c889d 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 9a727dd00..72c82abce 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)