mirror of
https://github.com/CLIUtils/CLI11.git
synced 2025-04-30 20:53:52 +00:00
docs: move and update installation (#901)
This PR includes updates from #774 and #613. It updates the readme and docbook with some additional installation instructions. --------- Co-authored-by: Owen Parkins <oparkins@users.noreply.github.com> Co-authored-by: Mengna Li <Adela0814@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
bf4bdcaf39
commit
ccf141c49d
100
README.md
100
README.md
@ -172,7 +172,8 @@ this library:
|
|||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
To use, there are several methods:
|
To use, the most common methods are described here additional methods and
|
||||||
|
details are available at [installation][]:
|
||||||
|
|
||||||
- All-in-one local header: Copy `CLI11.hpp` from the [most recent
|
- All-in-one local header: Copy `CLI11.hpp` from the [most recent
|
||||||
release][github releases] into your include directory, and you are set. This
|
release][github releases] into your include directory, and you are set. This
|
||||||
@ -183,98 +184,8 @@ To use, there are several methods:
|
|||||||
- All-in-one global header: Like above, but copying the file to a shared folder
|
- All-in-one global header: Like above, but copying the file to a shared folder
|
||||||
location like `/opt/CLI11`. Then, the C++ include path has to be extended to
|
location like `/opt/CLI11`. Then, the C++ include path has to be extended to
|
||||||
point at this folder. With CMake 3.5+, use `include_directories(/opt/CLI11)`
|
point at this folder. With CMake 3.5+, use `include_directories(/opt/CLI11)`
|
||||||
- Local headers and target: Use `CLI/*.hpp` files. You could check out the
|
- For other methods including using CMake or vcpkg and some specific
|
||||||
repository as a git submodule, for example. With CMake, you can use
|
instructions for GCC 8 or WASI see [installation][].
|
||||||
`add_subdirectory` and the `CLI11::CLI11` interface target when linking. If
|
|
||||||
not using a submodule, you must ensure that the copied files are located
|
|
||||||
inside the same tree directory than your current project, to prevent an error
|
|
||||||
with CMake and `add_subdirectory`.
|
|
||||||
- Global headers: Use `CLI/*.hpp` files stored in a shared folder. You could
|
|
||||||
check out the git repository to a system-wide folder, for example `/opt/`.
|
|
||||||
With CMake, you could add to the include path via:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
if(NOT DEFINED CLI11_DIR)
|
|
||||||
set (CLI11_DIR "/opt/CLI11" CACHE STRING "CLI11 git repository")
|
|
||||||
endif()
|
|
||||||
include_directories(${CLI11_DIR}/include)
|
|
||||||
```
|
|
||||||
|
|
||||||
And then in the source code (adding several headers might be needed to prevent
|
|
||||||
linker errors):
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "CLI/App.hpp"
|
|
||||||
#include "CLI/Formatter.hpp"
|
|
||||||
#include "CLI/Config.hpp"
|
|
||||||
```
|
|
||||||
|
|
||||||
- Global headers and target: configuring and installing the project is required
|
|
||||||
for linking CLI11 to your project in the same way as you would do with any
|
|
||||||
other external library. With CMake, this step allows using
|
|
||||||
`find_package(CLI11 CONFIG REQUIRED)` and then using the `CLI11::CLI11` target
|
|
||||||
when linking. If `CMAKE_INSTALL_PREFIX` was changed during install to a
|
|
||||||
specific folder like `/opt/CLI11`, then you have to pass
|
|
||||||
`-DCLI11_DIR=/opt/CLI11` when building your current project. You can also use
|
|
||||||
[Conan.io][conan-link] or [Hunter][]. (These are just conveniences to allow
|
|
||||||
you to use your favorite method of managing packages; it's just header only so
|
|
||||||
including the correct path and using C++11 is all you really need.)
|
|
||||||
- Via FetchContent in CMake 3.14+ (or 3.11+ with more work): you can add this
|
|
||||||
with fetch-content, then use the `CLI11::CLI11` target as above, and CMake
|
|
||||||
will download the project in the configure stage:
|
|
||||||
|
|
||||||
```cmake
|
|
||||||
include(FetchContent)
|
|
||||||
FetchContent_Declare(
|
|
||||||
cli11
|
|
||||||
GIT_REPOSITORY https://github.com/CLIUtils/CLI11
|
|
||||||
GIT_TAG v2.3.2
|
|
||||||
)
|
|
||||||
|
|
||||||
FetchContent_MakeAvailable(cli11)
|
|
||||||
```
|
|
||||||
|
|
||||||
It is highly recommended that you use the git hash for `GIT_TAG` instead of a
|
|
||||||
tag or branch, as that will both be more secure, as well as faster to
|
|
||||||
reconfigure - CMake will not have to reach out to the internet to see if the tag
|
|
||||||
moved. You can also download just the single header file from the releases using
|
|
||||||
`file(DOWNLOAD`.
|
|
||||||
|
|
||||||
To build the tests, checkout the repository and use CMake:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cmake -S . -B build
|
|
||||||
cmake --build build
|
|
||||||
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build -t test
|
|
||||||
```
|
|
||||||
|
|
||||||
<details><summary>Note: Special instructions for GCC 8</summary><p>
|
|
||||||
|
|
||||||
If you are using GCC 8 and using it in C++17 mode with CLI11. CLI11 makes use of
|
|
||||||
the `<filesystem>` header if available, but specifically for this compiler, the
|
|
||||||
`filesystem` library is separate from the standard library and needs to be
|
|
||||||
linked separately. So it is available but CLI11 doesn't use it by default.
|
|
||||||
|
|
||||||
Specifically `libstdc++fs` needs to be added to the linking list and
|
|
||||||
`CLI11_HAS_FILESYSTEM=1` has to be defined. Then the filesystem variant of the
|
|
||||||
Validators could be used on GCC 8. GCC 9+ does not have this issue so the
|
|
||||||
`<filesystem>` is used by default.
|
|
||||||
|
|
||||||
There may also be other cases where a specific library needs to be linked.
|
|
||||||
|
|
||||||
Defining `CLI11_HAS_FILESYSTEM=0` which will remove the usage and hence any
|
|
||||||
linking issue.
|
|
||||||
|
|
||||||
In some cases certain clang compilations may require linking against `libc++fs`.
|
|
||||||
These situations have not been encountered so the specific situations requiring
|
|
||||||
them are unknown yet.
|
|
||||||
|
|
||||||
If building with WASI it is necessary to add the flag
|
|
||||||
`-lc-printscan-long-double` to the build to allow long double support. See #841
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
</p></details>
|
|
||||||
</br>
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@ -1491,8 +1402,6 @@ need to convert to. Some examples of some new parsers for `complex<double>` that
|
|||||||
support all of the features of a standard `add_options` call are in
|
support all of the features of a standard `add_options` call are in
|
||||||
[one of the tests](./tests/NewParseTest.cpp). A simpler example is shown below:
|
[one of the tests](./tests/NewParseTest.cpp). A simpler example is shown below:
|
||||||
|
|
||||||
#### Example
|
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
app.add_option("--fancy-count", [](std::vector<std::string> val){
|
app.add_option("--fancy-count", [](std::vector<std::string> val){
|
||||||
std::cout << "This option was given " << val.size() << " times." << std::endl;
|
std::cout << "This option was given " << val.size() << " times." << std::endl;
|
||||||
@ -1908,3 +1817,4 @@ try! Feedback is always welcome.
|
|||||||
[argparse]: https://github.com/p-ranav/argparse
|
[argparse]: https://github.com/p-ranav/argparse
|
||||||
[toml]: https://toml.io
|
[toml]: https://toml.io
|
||||||
[lyra]: https://github.com/bfgroup/Lyra
|
[lyra]: https://github.com/bfgroup/Lyra
|
||||||
|
[installation]: https://cliutils.github.io/CLI11/book/chapters/installation.html
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
This example uses the single file edition of CLI11. You can download `CLI11.hpp`
|
This example uses the single file edition of CLI11. You can download `CLI11.hpp`
|
||||||
from the latest release and put it into the same folder as your source code,
|
from the latest release and put it into the same folder as your source code,
|
||||||
then compile this with C++ enabled. For a larger project, you can just put this
|
then compile this with C++ enabled. For a larger project, you can just put this
|
||||||
in an include folder and you are set.
|
in an include folder and you are set. This is the simplest and most
|
||||||
|
straightforward means of including CLI11 with a project.
|
||||||
|
|
||||||
## Full edition
|
## Full edition
|
||||||
|
|
||||||
@ -46,6 +47,83 @@ necessary `lib/cmake/CLI11/CLI11Config.cmake` files, so
|
|||||||
If you use conan.io, CLI11 supports that too. CLI11 also supports Meson and
|
If you use conan.io, CLI11 supports that too. CLI11 also supports Meson and
|
||||||
pkg-config if you are not using CMake.
|
pkg-config if you are not using CMake.
|
||||||
|
|
||||||
|
If the CMake option `CLI11_PRECOMPILED` is set then the library is compiled into
|
||||||
|
a static library. This can be used to improve compile times if CLI11 is included
|
||||||
|
in many different parts of a project.
|
||||||
|
|
||||||
|
### Global Headers
|
||||||
|
|
||||||
|
Use `CLI/*.hpp` files stored in a shared folder. You could check out the git
|
||||||
|
repository to a system-wide folder, for example `/opt/`. With CMake, you could
|
||||||
|
add to the include path via:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
if(NOT DEFINED CLI11_DIR)
|
||||||
|
set (CLI11_DIR "/opt/CLI11" CACHE STRING "CLI11 git repository")
|
||||||
|
endif()
|
||||||
|
include_directories(${CLI11_DIR}/include)
|
||||||
|
```
|
||||||
|
|
||||||
|
And then in the source code (adding several headers might be needed to prevent
|
||||||
|
linker errors):
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "CLI/App.hpp"
|
||||||
|
#include "CLI/Formatter.hpp"
|
||||||
|
#include "CLI/Config.hpp"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Global Headers with Target
|
||||||
|
|
||||||
|
configuring and installing the project is required for linking CLI11 to your
|
||||||
|
project in the same way as you would do with any other external library. With
|
||||||
|
CMake, this step allows using `find_package(CLI11 CONFIG REQUIRED)` and then
|
||||||
|
using the `CLI11::CLI11` target when linking. If `CMAKE_INSTALL_PREFIX` was
|
||||||
|
changed during install to a specific folder like `/opt/CLI11`, then you have to
|
||||||
|
pass `-DCLI11_DIR=/opt/CLI11` when building your current project. You can also
|
||||||
|
use [Conan.io](https://conan.io/center/cli11) or
|
||||||
|
[Hunter](https://docs.hunter.sh/en/latest/packages/pkg/CLI11.html). (These are
|
||||||
|
just conveniences to allow you to use your favorite method of managing packages;
|
||||||
|
it's just header only so including the correct path and using C++11 is all you
|
||||||
|
really need.)
|
||||||
|
|
||||||
|
#### Using Fetchcontent
|
||||||
|
|
||||||
|
If you do not want to add cmake as a submodule or include it with your code the
|
||||||
|
project can be added using `FetchContent`. This capability requires CMake 3.14+
|
||||||
|
(or 3.11+ with more work).
|
||||||
|
|
||||||
|
An example CMake file would include:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
include(FetchContent)
|
||||||
|
FetchContent_Populate(
|
||||||
|
cli11_proj
|
||||||
|
QUIET
|
||||||
|
GIT_REPOSITORY https://github.com/CLIUtils/CLI11.git
|
||||||
|
GIT_TAG v2.3.2
|
||||||
|
SOURCE_DIR cli11_proj
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(cli11)
|
||||||
|
|
||||||
|
# And now you can use it
|
||||||
|
add_subdirectory(${cli11_proj_SOURCE_DIR} ${cli11_proj_SOURCE_DIR}/build)
|
||||||
|
target_link_libraries(<your project> CLI11::CLI11)
|
||||||
|
```
|
||||||
|
|
||||||
|
And use
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#include <CLI/CLI.hpp>
|
||||||
|
```
|
||||||
|
|
||||||
|
in your project. It is highly recommended that you use the git hash for
|
||||||
|
`GIT_TAG` instead of a tag or branch, as that will both be more secure, as well
|
||||||
|
as faster to reconfigure - CMake will not have to reach out to the internet to
|
||||||
|
see if the tag moved. You can also download just the single header file from the
|
||||||
|
releases using `file(DOWNLOAD)`.
|
||||||
|
|
||||||
### Running tests on the full edition
|
### Running tests on the full edition
|
||||||
|
|
||||||
CLI11 has examples and tests that can be accessed using a CMake build on any
|
CLI11 has examples and tests that can be accessed using a CMake build on any
|
||||||
@ -101,15 +179,62 @@ For the curious, the CMake options and defaults are listed below. Most options
|
|||||||
default to off if CLI11 is used as a subdirectory in another project.
|
default to off if CLI11 is used as a subdirectory in another project.
|
||||||
|
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
| ----------------------------- | ----------------------------------------------------------------------------------------------- |
|
| ------------------------------ | -------------------------------------------------------------------------------- |
|
||||||
| `CLI11_SINGLE_FILE=ON` | Build the `CLI11.hpp` file from the sources. Requires Python (version 3 or 2.7). |
|
| `CLI11_SINGLE_FILE=ON` | Build the `CLI11.hpp` file from the sources. Requires Python (version 3 or 2.7). |
|
||||||
|
| `CLI11_PRECOMPILED=OFF` | generate a precompiled static library instead of header-only |
|
||||||
| `CLI11_SINGLE_FILE_TESTS=OFF` | Run the tests on the generated single file version as well |
|
| `CLI11_SINGLE_FILE_TESTS=OFF` | Run the tests on the generated single file version as well |
|
||||||
| `CLI11_EXAMPLES=ON` | Build the example programs. |
|
| `CLI11_BUILD_DOCS=ON` | build CLI11 documentation and book |
|
||||||
| `CLI11_TESTING=ON` | Build the tests. |
|
| `CLI11_BUILD_EXAMPLES=ON` | Build the example programs. |
|
||||||
| `CLI11_CLANG_TIDY=OFF` | Run `clang-tidy` on the examples and headers. Requires CMake 3.6+. |
|
| `CLI11_BUILD_EXAMPLES_JSON=ON` | Build some additional example using json libraries |
|
||||||
| `CLI11_CLANG_TIDY_OPTIONS=""` | Options to pass to `clang-tidy`, such as `-fix` (single threaded build only if applying fixes!) |
|
| `CLI11_INSTALL=ON` | install CLI11 to the install folder during the install process |
|
||||||
|
| `CLI11_FORCE_LIBCXX=OFF` | use libc++ instead of libstdc++ if building with clang on linux |
|
||||||
|
| `CLI11_CUDA_TESTS=OFF` | build the tests with NVCC |
|
||||||
|
| `CLI11_BUILD_TESTS=ON` | Build the tests. |
|
||||||
|
|
||||||
[^1]:
|
[^1]:
|
||||||
Docker is being used to create a pristine disposable environment; there is
|
Docker is being used to create a pristine disposable environment; there is
|
||||||
nothing special about this container. Alpine is being used because it is
|
nothing special about this container. Alpine is being used because it is
|
||||||
small, modern, and fast. Commands are similar on any other platform.
|
small, modern, and fast. Commands are similar on any other platform.
|
||||||
|
|
||||||
|
## Installing cli11 using vcpkg
|
||||||
|
|
||||||
|
You can download and install cli11 using the
|
||||||
|
[vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/Microsoft/vcpkg.git
|
||||||
|
cd vcpkg
|
||||||
|
./bootstrap-vcpkg.sh
|
||||||
|
./vcpkg integrate install
|
||||||
|
./vcpkg install cli11
|
||||||
|
```
|
||||||
|
|
||||||
|
The cli11 port in vcpkg is kept up to date by Microsoft team members and
|
||||||
|
community contributors. If the version is out of date, please
|
||||||
|
[create an issue or pull request](https://github.com/Microsoft/vcpkg) on the
|
||||||
|
vcpkg repository.
|
||||||
|
|
||||||
|
## Special instructions for GCC 8, Some clang, and WASI
|
||||||
|
|
||||||
|
If you are using GCC 8 and using it in C++17 mode with CLI11. CLI11 makes use of
|
||||||
|
the `<filesystem>` header if available, but specifically for this compiler, the
|
||||||
|
`filesystem` library is separate from the standard library and needs to be
|
||||||
|
linked separately. So it is available but CLI11 doesn't use it by default.
|
||||||
|
|
||||||
|
Specifically `libstdc++fs` needs to be added to the linking list and
|
||||||
|
`CLI11_HAS_FILESYSTEM=1` has to be defined. Then the filesystem variant of the
|
||||||
|
Validators could be used on GCC 8. GCC 9+ does not have this issue so the
|
||||||
|
`<filesystem>` is used by default.
|
||||||
|
|
||||||
|
There may also be other cases where a specific library needs to be linked.
|
||||||
|
|
||||||
|
Defining `CLI11_HAS_FILESYSTEM=0` which will remove the usage and hence any
|
||||||
|
linking issue.
|
||||||
|
|
||||||
|
In some cases certain clang compilations may require linking against `libc++fs`.
|
||||||
|
These situations have not been encountered so the specific situations requiring
|
||||||
|
them are unknown yet.
|
||||||
|
|
||||||
|
If building with WASI it is necessary to add the flag
|
||||||
|
`-lc-printscan-long-double` to the build to allow long double support. See #841
|
||||||
|
for more details.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user