2016-06-11 18:53:26 +02:00
|
|
|
|
# C++ utilities
|
2017-11-04 15:48:47 +01:00
|
|
|
|
Useful C++ classes and routines such as argument parser, IO and conversion utilities.
|
2015-05-19 22:33:12 +02:00
|
|
|
|
|
2016-02-17 20:20:37 +01:00
|
|
|
|
## Features
|
2020-04-13 01:12:29 +02:00
|
|
|
|
The library contains helpers for:
|
2017-06-24 23:53:51 +02:00
|
|
|
|
|
2016-07-04 23:53:56 +02:00
|
|
|
|
* parsing command-line arguments and providing Bash completion
|
2018-05-05 23:28:21 +02:00
|
|
|
|
- supports nested arguments
|
|
|
|
|
- supports operations (no `--` or `-` prefix, eg. `git status`)
|
|
|
|
|
- can check for invalid or uncombinable arguments
|
|
|
|
|
- can print help automatically
|
|
|
|
|
- provides automatic Bash completion for argument names
|
|
|
|
|
- allows customizing Bash completion for argument values
|
2016-06-11 18:53:26 +02:00
|
|
|
|
* dealing with dates and times
|
|
|
|
|
* conversion of primitive data types to byte-buffers and vice versa (litte-endian and big-endian)
|
2016-02-17 20:20:37 +01:00
|
|
|
|
* common string conversions/operations, eg.
|
2017-11-04 15:48:47 +01:00
|
|
|
|
- character set conversions via iconv
|
2017-06-24 23:53:51 +02:00
|
|
|
|
- split, join, find and replace
|
|
|
|
|
- conversion from number to string and vice verca
|
|
|
|
|
- encoding/decoding base-64
|
2017-08-17 19:12:25 +02:00
|
|
|
|
- building string without multiple heap allocations ("string builder")
|
2020-06-04 20:49:02 +02:00
|
|
|
|
* using standard IO streams
|
2017-06-24 23:53:51 +02:00
|
|
|
|
- reading/writing primitive data types of various sizes (little-endian and big-endian)
|
|
|
|
|
- reading/writing terminated strings and size-prefixed strings
|
|
|
|
|
- reading/writing INI files
|
2020-06-04 20:49:02 +02:00
|
|
|
|
- reading bitwise (from a buffer; not using standard IO streams)
|
2017-11-04 15:48:47 +01:00
|
|
|
|
- writing formatted output using ANSI escape sequences
|
2019-05-30 14:05:03 +02:00
|
|
|
|
- instantiating a standard IO stream from a native file descriptor to support UTF-8 encoded
|
|
|
|
|
file paths under Windows and Android's `content://` URLs
|
2017-11-04 15:48:47 +01:00
|
|
|
|
* using SFINAE by providing additional traits, eg. for checking whether a type is iteratable
|
|
|
|
|
* testing with *CppUnit*
|
|
|
|
|
- finding testfiles and make working copies of testfiles
|
|
|
|
|
- assert standard output
|
|
|
|
|
- various helper
|
2016-04-16 19:17:29 +02:00
|
|
|
|
* building with CMake by providing some modules and templates
|
2016-02-17 20:20:37 +01:00
|
|
|
|
|
2018-05-05 23:28:21 +02:00
|
|
|
|
Besides, the library provides a few useful algorithms and data structures:
|
|
|
|
|
|
|
|
|
|
* min(), max() for any number of arguments
|
|
|
|
|
* digitsum(), factorial(), powerModulo(), inverseModulo(), orderModulo()
|
|
|
|
|
* Damerau–Levenshtein distance
|
|
|
|
|
* *N*-dimensional array
|
|
|
|
|
|
2020-11-25 17:53:14 +01:00
|
|
|
|
## API/ABI stability
|
|
|
|
|
The following counts for `c++utilities` and my other libraries unless stated otherwise:
|
|
|
|
|
|
|
|
|
|
* Different major versions are incompatible (API- and ABI-wise). Different major versions can be
|
|
|
|
|
installed within the same prefix using the CMake variable `CONFIGURATION_NAME` (see documentation
|
|
|
|
|
about build variables mentioned below).
|
|
|
|
|
* Minor versions are backwards compatible (API- and ABI-wise) to previous ones within the same major
|
|
|
|
|
version.
|
|
|
|
|
* Patch versions are interchangeable (API- and ABI-wise) within the same major/minor version.
|
|
|
|
|
* Some functions or classes are experimental. They might be modified in an incompatible way or even
|
|
|
|
|
removed in the next minor or patch release.
|
|
|
|
|
|
2015-05-19 22:33:12 +02:00
|
|
|
|
## Build instructions
|
2016-01-29 00:47:05 +01:00
|
|
|
|
### Requirements
|
2016-04-16 19:17:29 +02:00
|
|
|
|
#### Build-only dependencies
|
2019-05-28 17:55:18 +02:00
|
|
|
|
* C++ compiler supporting C++17, tested with
|
|
|
|
|
- clang++ to compile for GNU/Linux and Android
|
2017-08-11 21:05:04 +02:00
|
|
|
|
- g++ to compile for GNU/Linux and Windows
|
2016-11-21 20:39:01 +01:00
|
|
|
|
* CMake (at least 3.3.0)
|
2016-04-16 19:17:29 +02:00
|
|
|
|
* cppunit for unit tests (optional)
|
2016-06-11 18:53:26 +02:00
|
|
|
|
* Doxygen for API documentation (optional)
|
2016-07-04 23:53:56 +02:00
|
|
|
|
* Graphviz for diagrams in the API documentation (optional)
|
2017-04-04 00:53:00 +02:00
|
|
|
|
* clang-format for tidying (optional)
|
2017-06-24 23:52:38 +02:00
|
|
|
|
* llvm-profdata, llvm-cov and cppunit for source-based code coverage analysis (optional)
|
2016-04-16 19:17:29 +02:00
|
|
|
|
|
|
|
|
|
#### Runtime dependencies
|
2016-07-27 18:24:37 +02:00
|
|
|
|
* The c++utilities library itself only needs
|
2019-05-28 17:55:18 +02:00
|
|
|
|
* C++ standard library supporting C++17, tested with
|
|
|
|
|
- libstdc++ under GNU/Linux and Windows
|
|
|
|
|
- libc++ under GNU/Linux and Android
|
2019-05-30 14:05:03 +02:00
|
|
|
|
* glibc with iconv support or standalone iconv library
|
|
|
|
|
* libstdc++ or Boost.Iostreams for `NativeFileStream` (optional)
|
2016-04-16 19:17:29 +02:00
|
|
|
|
* For dependencies of my other projects check the README.md of these projects.
|
2016-01-29 00:47:05 +01:00
|
|
|
|
|
|
|
|
|
### How to build
|
2020-06-04 20:49:02 +02:00
|
|
|
|
Example using `make`:
|
2016-01-29 00:47:05 +01:00
|
|
|
|
```
|
2016-04-16 19:17:29 +02:00
|
|
|
|
cd "path/to/build/directory"
|
2017-08-11 21:05:04 +02:00
|
|
|
|
cmake -DCMAKE_BUILD_TYPE=Release \
|
|
|
|
|
-DCMAKE_INSTALL_PREFIX="/final/install/location" \
|
|
|
|
|
"path/to/projectdirectory"
|
|
|
|
|
make tidy # format source files (optional, must be enabled via CLANG_FORMAT_ENABLED)
|
2020-06-04 20:49:02 +02:00
|
|
|
|
make # build the binaries
|
2017-08-11 21:05:04 +02:00
|
|
|
|
make check # build and run tests (optional)
|
|
|
|
|
make coverage # build and run tests measuring test coverage (optional, must be enabled via CLANG_SOURCE_BASED_COVERAGE_ENABLED)
|
2017-04-04 01:00:17 +02:00
|
|
|
|
make apidoc # build API documentation (optional)
|
2020-06-04 20:49:02 +02:00
|
|
|
|
make DESTDIR="/temporary/install/location" install # install binaries, headers and additional files
|
2015-05-19 22:33:12 +02:00
|
|
|
|
```
|
2016-01-29 00:47:05 +01:00
|
|
|
|
|
2016-04-16 19:17:29 +02:00
|
|
|
|
#### General notes
|
2016-07-04 23:53:56 +02:00
|
|
|
|
* The make option ```-j``` can be used for concurrent compilation.
|
|
|
|
|
* ```LIB_SUFFIX```, ```LIB_SUFFIX_32``` and ```LIB_SUFFIX_64``` can be set to
|
|
|
|
|
specify a suffix for the library directory, eg. lib*64* or lib*32*. The 32/64 variants are only used when building for 32/64-bit architecture.
|
2019-05-28 17:55:18 +02:00
|
|
|
|
* By default the build system will *build* static libs. To *build* shared libraries *instead*, set `BUILD_SHARED_LIBS=ON`.
|
2016-11-23 00:39:43 +01:00
|
|
|
|
* By default the build system will prefer *linking against* shared libraries. To force *linking against* static libraries set `STATIC_LINKAGE=ON`.
|
|
|
|
|
However, this will only affect applications. To force linking statically when building shared libraries set `STATIC_LIBRARY_LINKAGE=ON`.
|
2019-02-07 17:46:28 +01:00
|
|
|
|
* If thread local storage is not supported by your compiler/platform (might be the case on MacOS), you can disable making use of it
|
|
|
|
|
via `ENABLE_THREAD_LOCAL=OFF`.
|
2019-07-13 14:11:45 +02:00
|
|
|
|
* To disable use of `std::filesystem`, set `USE_STANDARD_FILESYSTEM=OFF`. This is required when building for MacOS and Android at the time of
|
2020-06-04 20:49:02 +02:00
|
|
|
|
writing this documentation. Note that the Bash completion will not be able to suggest files and directories with `USE_STANDARD_FILESYSTEM=OFF`.
|
2017-08-25 15:00:40 +02:00
|
|
|
|
* For more detailed documentation, see the documentation about build variables (in
|
|
|
|
|
[directory doc](https://github.com/Martchus/cpp-utilities/blob/master/doc/buildvariables.md) and
|
|
|
|
|
in Doxygen version accessible via "Related Pages").
|
2019-08-24 13:06:43 +02:00
|
|
|
|
* The repository [PKGBUILDs](https://github.com/Martchus/PKGBUILDs) contains build scripts for GNU/Linux, Android, Windows and
|
2020-06-04 20:49:02 +02:00
|
|
|
|
MacOS X in form of Arch Linux packages. These scripts can be used as an example also when building under/for other platforms.
|
2016-04-16 19:17:29 +02:00
|
|
|
|
|
|
|
|
|
#### Building for Windows
|
2017-08-11 21:05:04 +02:00
|
|
|
|
* Building for Windows with GCC as cross compiler and mingw-w64 can be simplified by using a small
|
|
|
|
|
[Cmake wrapper and a custom toolchain file](https://aur.archlinux.org/cgit/aur.git/tree/mingw-cmake.sh?h=mingw-w64-cmake):
|
|
|
|
|
```
|
|
|
|
|
${_arch}-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="/final/install/location" "path/to/source/directory"
|
|
|
|
|
make DESTDIR="/temporary/install/location" install-mingw-w64-strip
|
|
|
|
|
```
|
2019-05-30 14:05:03 +02:00
|
|
|
|
|
2016-04-16 19:17:29 +02:00
|
|
|
|
* To create the \*.ico file for the application icon ffmpeg/avconv is required.
|
2020-06-04 20:49:02 +02:00
|
|
|
|
* The target `install-mingw-w64-strip` can be used as in the example above to only install files suitable for creating a cross-compiler package
|
|
|
|
|
and additionally strip the binaries.
|
2016-04-16 19:17:29 +02:00
|
|
|
|
|
2017-08-11 21:05:04 +02:00
|
|
|
|
#### Building for MacOS X
|
2019-08-24 13:06:43 +02:00
|
|
|
|
* Building for MacOS X under GNU/Linux is possible using [osxcross](https://github.com/tpoechtrager/osxcross).
|
|
|
|
|
* There is a [Homebrew formula](https://gist.github.com/rakkesh/0b13b8fca5dd1d57d98537ef1dd2e0dd) to build Tag Editor (without GUI)
|
|
|
|
|
* There are [MacPorts packages](https://www.macports.org/ports.php?by=name&substr=syncthingtray-devel) to build Syncthing Tray
|
2017-08-11 21:05:04 +02:00
|
|
|
|
|
2016-04-16 19:17:29 +02:00
|
|
|
|
#### Development builds
|
2020-06-04 20:49:02 +02:00
|
|
|
|
During development I find it useful to build all required projects (for instace c++utilities, qtutilities, tagparser and tageditor) as one big
|
|
|
|
|
project.
|
2016-04-16 19:17:29 +02:00
|
|
|
|
|
2020-06-04 20:49:02 +02:00
|
|
|
|
This can be easily achieved by using CMake's `add_subdirectory()` function. For project files see the repository
|
|
|
|
|
[subdirs](https://github.com/Martchus/subdirs). For an example, see
|
2016-11-21 20:39:01 +01:00
|
|
|
|
[build instructions for Syncthing Tray](https://github.com/Martchus/syncthingtray#building-this-straight).
|
2016-01-29 00:47:05 +01:00
|
|
|
|
|
2020-06-04 20:49:02 +02:00
|
|
|
|
For a debug build, use `-DCMAKE_BUILD_TYPE=Debug`.
|
2015-12-05 22:47:49 +01:00
|
|
|
|
|
2016-07-04 23:53:56 +02:00
|
|
|
|
#### Arch Linux package
|
2020-06-04 20:49:02 +02:00
|
|
|
|
The repository [PKGBUILDs](https://github.com/Martchus/PKGBUILDs) contains files for building Arch Linux packages of the latest release and
|
|
|
|
|
the Git master.
|
2016-11-18 18:31:48 +01:00
|
|
|
|
|
2019-09-25 18:19:18 +02:00
|
|
|
|
PKGBUILDs to cross compile for Android, Windows (using mingw-w64) and for MacOS X (using osxcross) are included as well.
|
2015-12-05 22:47:49 +01:00
|
|
|
|
|
2019-09-25 18:19:18 +02:00
|
|
|
|
#### RPM packages for openSUSE and Fedora
|
2020-06-04 20:49:02 +02:00
|
|
|
|
RPM \*.spec files can be found at [openSUSE Build Servide](https://build.opensuse.org/project/show/home:mkittler). Packages are available for
|
|
|
|
|
several architectures.
|
2019-09-25 18:19:18 +02:00
|
|
|
|
|
2020-06-04 20:49:02 +02:00
|
|
|
|
There is also a [sub project](https://build.opensuse.org/project/show/home:mkittler:vcs) containing the builds from the Git master branch.
|
2016-11-18 18:31:48 +01:00
|
|
|
|
|
|
|
|
|
#### Gentoo
|
|
|
|
|
Packages are provided by perfect7gentleman; checkout his [repository](https://github.com/perfect7gentleman/pg_overlay).
|