Commit Graph

31 Commits

Author SHA1 Message Date
Ben Boeckel 93993c7ad4 cmArgumentParser: support storing a context value with parsing
This allows for parsing of contextual keywords. For example:

```
some_command(
  ARG_WITH_CONTEXT foo
  CONTEXT bar
  ARG_WITH_CONTEXT quux)
```

will be able to store that `foo` happened without context (or, rather,
its default value) and `quux` was provided in a `bar` context.
2023-07-31 11:37:47 -04:00
Matthew Woehlke f2ef60ca54 cmArgumentParser: Ignore positional after keyword
Tweak cmArgumentParser to ignore positional arguments once a keyword
argument has been seen. This prevents mingling of keyword arguments
being able to effectively skip positional arguments, with later
arguments being picked up again; this seems highly likely to lead to
user confusion. This is also consistent with how other languages (e.g.
Python) handle a mix of "named" and positional arguments.
2022-08-17 11:03:51 -04:00
Brad King 7ca8d9f0f8 cmArgumentParser: Model non-empty strings with wrapper type
Some clients have been explicitly checking whether the string specified
after a keyword is empty.  Offer them a way to specify that the string
must be non-empty as part of the binding type.
2022-07-28 08:24:47 -04:00
Brad King 236bacc244 cmArgumentParser: Offer bindings for positional arguments 2022-07-27 07:03:32 -04:00
Brad King 1f2eb63d1c cmArgumentParser: Add callback bindings 2022-07-27 07:03:32 -04:00
Brad King f5d2f6076a cmArgumentParser: Generalize expected argument count
Replace the boolean expectation with an integer count.
2022-07-27 07:03:32 -04:00
Brad King 078e2aec8f cmArgumentParser: Generalize internal state tracking
Use a `std::function` to support general actions on value arguments.
2022-07-27 07:03:32 -04:00
Brad King 2eba10c5ee cmArgumentParser: Drop unused parsedKeywords argument to Parse()
All clients have been ported to use a binding instead.
2022-07-25 13:52:11 -04:00
Brad King f7e81802f2 cmArgumentParser: Offer binding for list of parsed keywords
Some clients ask for this list in their `Parse()` call.
Offer them a way to express this request as a binding.
2022-07-25 13:52:01 -04:00
Brad King f95a5832c7 cmArgumentParser: Drop unused keywordsMissingValue argument to Parse()
All clients have been converted to encoding this requirement in their
bindings.
2022-07-25 13:51:43 -04:00
Brad King 9a7efb6813 cmArgumentParser: Offer private binding to cmParseArgumentsCommand
The `keywordsMissingValue` argument to `Parse()` is now needed only for
the `cmake_parse_arguments` result `_KEYWORDS_MISSING_VALUES`.  Offer
its implementation a private binding for this.  Our internal clients can
use `ArgumentParser::NonEmpty<>` and friends to enforce the presence of
values.
2022-07-25 13:48:26 -04:00
Brad King b7c82b26b0 cmArgumentParser: Capture keyword errors in parse results
Since commit f46b2e9142 (cmArgumentParser: Model maybe-missing string
with wrapper type, 2022-07-06) we know during parsing whether or not it
is an error for a keyword to be missing a value.  Record such errors in
the parse results structure.  Offer clients a helper method to report
them.  This provides clients with an alternative to manually checking
`keywordsMissingValue` and generating their own error message.
2022-07-22 10:32:24 -04:00
Brad King 50876f6b9a cmArgumentParser: Add structure to capture operational results
Create a way for the parser to record errors or incidental information
about the argument parsing operation that clients can inspect afterward.
Offer clients a way to hold the structure as part of their arguments
structure.
2022-07-22 10:32:18 -04:00
Brad King 5955ec1992 cmArgumentParser: Store keyword action map with explicit name 2022-07-22 10:32:17 -04:00
Brad King 119e1f7fbc cmArgumentParser: Factor out common static/dynamic implementation 2022-07-22 10:32:08 -04:00
Brad King 84b335c286 cmArgumentParser: Track pending keyword explicitly
Avoid allocating missing keyword vector unnecessarily.
2022-07-20 16:03:13 -04:00
Brad King a77b9c0ece cmArgumentParser: De-duplicate parse loop 2022-07-20 16:03:13 -04:00
Brad King 197ef69aa1 cmArgumentParser: Simplify internal method signatures
Record `Parse` parameters during construction of the internal instance
instead of passing them to every method.
2022-07-20 16:03:12 -04:00
Brad King f46b2e9142 cmArgumentParser: Model maybe-missing string with wrapper type
Bindings to `std::string` require one value.  Some clients have been
filtering `keywordsMissingValue` to support keywords that tolerate a
missing value.  Offer them a type-safe way to achieve this instead.
2022-07-07 09:49:04 -04:00
Brad King e6d1e29ffa cmArgumentParser: Model maybe-empty and non-empty lists with wrapper types
Previously bindings to `std::vector<std::string>` required at least one
value.  Some clients have been filtering `keywordsMissingValue` to
support keywords followed by empty lists.  Instead, require clients to
specify whether a keyword's list can be empty as part of the binding
type.
2022-07-07 09:48:58 -04:00
Brad King 0a4c5164c9 cmArgumentParser: Offer cm::optional bindings to capture keyword presence
Several clients have been using `keywordsMissingValue` or
`parsedKeywords` to check for the presence of keywords.  Offer them a
type-encoded way to explicitly check whether a keyword is present.
2022-07-05 16:35:01 -04:00
Brad King f3dbf4b89d cmArgumentParser: Remove unnecessary local names for common types 2022-07-05 16:35:01 -04:00
Brad King 2873f41bd9 cmArgumentParser: Require callers to consider unparsed arguments 2022-07-05 16:35:01 -04:00
Brad King 1ee5a4a548 cmArgumentParser: Avoid allocating copies of keyword strings 2022-07-05 16:34:57 -04:00
Kitware Robot bdca8b01d2 Modernize: Use #pragma once in all header files
#pragma once is a widely supported compiler pragma, even though it is
not part of the C++ standard. Many of the issues keeping #pragma once
from being standardized (distributed filesystems, build farms, hard
links, etc.) do not apply to CMake - it is easy to build CMake on a
single machine. CMake also does not install any header files which can
be consumed by other projects (though cmCPluginAPI.h has been
deliberately omitted from this conversion in case anyone is still using
it.) Finally, #pragma once has been required to build CMake since at
least August 2017 (7f29bbe6 enabled server mode unconditionally, which
had been using #pragma once since September 2016 (b13d3e0d)). The fact
that we now require C++11 filters out old compilers, and it is unlikely
that there is a compiler which supports C++11 but does not support
#pragma once.
2020-09-03 09:30:21 -04:00
Marc Chevrier 8d4a9ee398 Refactoring: rename "cm_static_string_view.hxx" as <cmext/string_view> 2020-04-30 09:53:27 +02:00
Kitware Robot ed98209ddc Revise include order using clang-format-6.0
Run the `clang-format.bash` script to update our C and C++ code to a new
include order `.clang-format`.  Use `clang-format` version 6.0.
2019-10-01 12:26:36 -04:00
Kyle Edwards 67e6b55c58 Merge topic 'ctest-argument-parser'
0aa8a2ab8b cmCTest*Command: Port to cmArgumentParser
d5a6a13368 cmArgumentParser: Record parsed keywords

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !3835
2019-09-26 09:22:13 -04:00
Marc Chevrier c688b401d3 cmstd: Modernize CMake system headers
Provide a standardized way to handle the C++ "standard" headers
customized to be used with current CMake C++ standard constraints.
Offer under directory `cm` headers which can be used as direct
replacements of the standard ones.  For example:

    #include <cm/string_view>

can be used safely for CMake development in place of the `<string_view>`
standard header.

Fixes: #19491
2019-09-20 10:01:37 -04:00
Regina Pfeifer d5a6a13368 cmArgumentParser: Record parsed keywords 2019-09-20 13:27:30 +02:00
Regina Pfeifer 4359fe133b Introduce cmArgumentParser 2019-04-04 13:24:39 -04:00