[cmake-developers] CMakeParseArguments: Do not skip empty arguments

Matthew Woehlke matthew.woehlke at kitware.com
Wed Nov 6 15:01:28 EST 2013


On 2013-11-06 13:57, Brad King wrote:
> On 11/06/2013 01:32 PM, Alexander Neundorf wrote:
>> Adding proper named argument handling to cmake_parse_arguments() itself is
>> somewhat complicated since it can't make use of cmake_parse_arguments() ;-)
>
> Since the need for this is so common, perhaps we should provide a
> C++-implemented command to do it, e.g. cmake_command_options().
> We would need to carefully design the interface here first of course.

FWIW, I prefer the name [cmake_]parse_arguments :-).

Is there not already a C++ implementation something like this? (Or else 
how do the existing C++ commands do argument parsing?) If it is C++, I 
guess it would be possible for it to not have the limitation of being 
unable to parse its own arguments? (Actually, in either case, it seems 
that the implementation should be able to have all the 'real work' in a 
helper that is called once to parse arguments to the command itself, 
then again to parse the arguments the user wants to parse.)

In any case, it would be nice if we could reimplement 
cmake_parse_arguments so that it has the same signature but the 
implementation would newly just wrap the new C++ version.

What if we had something like:

parse_arguments(
   PREFIX "_"
   FLAG_OPTIONS ...
   VALUE_OPTIONS ...
   LIST_OPTIONS ...
   ARGS ...)

...where everything after ARGS is no longer considered an argument to 
parse_arguments itself. Also, 'parse_arguments(... IN LISTS ...)' 
(instead of using 'ARGS'), taking names of list variables containing 
arguments to be parsed (similar to 'IN LISTS' of foreach).

{FLAG,VALUE,LIST}_OPTIONS would accept one or more strings containing 
names of argument keywords, subject to recursive list expansion (should 
be safe - keywords should not contain ';' - and avoids breakage if 
option name lists are given in quoted variable expansions, which could 
easily happen by forgetting to remove quotes when porting to the new 
signature).

...and then of course cmake_parse_arguments can readily accept other 
options to modify its behavior e.g. KEEP_EMPTY (and/or SKIP_EMPTY if 
keeping becomes - or may be, depending on policy - the default).

-- 
Matthew




More information about the cmake-developers mailing list