cmake_parse_arguments: consider duplicate keyword as warning

The behaviour of double specified keywords is rather undefined or at
least not clearly documented. This change introduces a strict check and
emits a warning in case a keyword has been specified more than once.
This commit is contained in:
Matthias Maennich 2015-12-05 19:02:19 +01:00 committed by Brad King
parent e8b148318f
commit ab8a280857
4 changed files with 68 additions and 5 deletions

View File

@ -25,6 +25,13 @@ The ``<multi_value_keywords>`` argument contains all keywords for this
macro which can be followed by more than one value, like e.g. the
``TARGETS`` or ``FILES`` keywords of the :command:`install` command.
.. note::
All keywords shall be unique. I.e. every keyword shall only be specified
once in either ``<options>``, ``<one_value_keywords>`` or
``<multi_value_keywords>``. A warning will be emitted if uniqueness is
violated.
When done, ``cmake_parse_arguments`` will have defined for each of the
keywords listed in ``<options>``, ``<one_value_keywords>`` and
``<multi_value_keywords>`` a variable composed of the given ``<prefix>``

View File

@ -43,6 +43,10 @@ bool cmParseArgumentsCommand
// anything else is put into a vector of unparsed strings
std::vector<std::string> unparsed;
// remember already defined keywords
std::set<std::string> used_keywords;
const std::string dup_warning = "keyword defined more than once: ";
// the second argument is a (cmake) list of options without argument
std::vector<std::string> list;
cmSystemTools::ExpandListArgument(*argIter++, list);
@ -50,6 +54,10 @@ bool cmParseArgumentsCommand
end = list.end();
iter != end; ++iter)
{
if (!used_keywords.insert(*iter).second)
{
this->GetMakefile()->IssueMessage(cmake::WARNING, dup_warning + *iter);
}
options[*iter]; // default initialize
}
@ -60,6 +68,10 @@ bool cmParseArgumentsCommand
end = list.end();
iter != end; ++iter)
{
if (!used_keywords.insert(*iter).second)
{
this->GetMakefile()->IssueMessage(cmake::WARNING, dup_warning + *iter);
}
single[*iter]; // default initialize
}
@ -70,6 +82,10 @@ bool cmParseArgumentsCommand
end = list.end();
iter != end; ++iter)
{
if (!used_keywords.insert(*iter).second)
{
this->GetMakefile()->IssueMessage(cmake::WARNING, dup_warning + *iter);
}
multi[*iter]; // default initialize
}

View File

@ -1,8 +1,3 @@
CMake Error at Errors\.cmake:1 \(cmake_parse_arguments\):
cmake_parse_arguments must be called with at least 4 arguments\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Error at Errors\.cmake:2 \(cmake_parse_arguments\):
cmake_parse_arguments must be called with at least 4 arguments\.
Call Stack \(most recent call first\):
@ -12,3 +7,38 @@ CMake Error at Errors\.cmake:3 \(cmake_parse_arguments\):
cmake_parse_arguments must be called with at least 4 arguments\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Error at Errors\.cmake:4 \(cmake_parse_arguments\):
cmake_parse_arguments must be called with at least 4 arguments\.
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Warning at Errors\.cmake:8 \(cmake_parse_arguments\):
keyword defined more than once: OPT
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Warning at Errors\.cmake:9 \(cmake_parse_arguments\):
keyword defined more than once: OPT
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Warning at Errors\.cmake:10 \(cmake_parse_arguments\):
keyword defined more than once: OPT
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Warning at Errors\.cmake:12 \(cmake_parse_arguments\):
keyword defined more than once: OPT
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Warning at Errors\.cmake:13 \(cmake_parse_arguments\):
keyword defined more than once: OPT
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)
+
CMake Warning at Errors\.cmake:14 \(cmake_parse_arguments\):
keyword defined more than once: OPT
Call Stack \(most recent call first\):
CMakeLists\.txt:3 \(include\)

View File

@ -1,4 +1,14 @@
# wrong argument count
cmake_parse_arguments()
cmake_parse_arguments(prefix OPT)
cmake_parse_arguments(prefix OPT SINGLE)
cmake_parse_arguments(prefix OPT SINGLE MULTI) # not an error
# duplicate keywords
cmake_parse_arguments(prefix "OPT;OPT" "" "")
cmake_parse_arguments(prefix "" "OPT;OPT" "")
cmake_parse_arguments(prefix "" "" "OPT;OPT")
cmake_parse_arguments(prefix "OPT" "OPT" "")
cmake_parse_arguments(prefix "" "OPT" "OPT")
cmake_parse_arguments(prefix "OPT" "" "OPT")