- Add to your bazel
WORKSPACE
:
http_archive(
name = "com_github_cdump_scfg",
strip_prefix = "scfg-<githash>",
urls = [
"https://github.com/cdump/scfg/archive/<githash>.tar.gz",
],
)
load("@com_github_cdump_scfg//:scfg_deps.bzl", "scfg_deps")
scfg_deps()
- add the following code in your file with main function:
#include "scfg/scfg_types.hpp"
// clang-format off
#define SCFG_APP_CONFIG(XX) \
XX((input), std::string, 'i', SCFG_NO_DEFAULT, "required string arg") \
XX((num), unsigned, 0, 8, "num with default val") \
/**/ \
XX((enabled, filter), bool, 0, false, "filter on/off") \
XX((threshold, filter), double, 0, 1.4, "filter threhsold") \
/**/ \
// clang-format on
#include "scfg/scfg.hpp"
scfg::config cfg;
...
int
main(int argc, char **argv)
{
try {
cfg = scfg::init(argc, argv);
} catch(std::exception &ex) {
printf("Err: %s\n", ex.what());
return 1;
}
...
}
Now you can use parsed params as cfg.input
(std::string), cfg.num
(unsigned), cfg.filter_enabled
(bool), cfg.filter_threshold
(double)
- Default values
- Values from config file
- Values from ENV
- Values from command line
For example, command line option overwrites the config value, ENV var overwrites config value and so on
See full example in example.cc
- Compile:
$ bazel build '@//:example'
- Show help:
$ ./bazel-bin/example --help
Usage: ./bazel-bin/example [options]
-h, --help {bool} - display this help and exit
-c, --config {string} - path to config file
-C, --config-template {bool} - echo default config to stdout
-i, --input {string} - required string arg
--file {string} - string arg default
--num {number} - num with default val
--filter-enabled {bool} - filter on/off
--filter-threshold {double} - filter threhsold
--filter-subgroup-val {double} - filter subgroup
- Run without args:
$ ./bazel-bin/example
Option -i (--input) must be set
Err: not all required options provided
- Run with required arg:
$ ./bazel-bin/example --input xxx
Config values, config-file: (not specified)
.input = xxx
.file = /etc/passwd
.num = 8
filter.enabled = false
filter.threshold = 1.500000
filter.subgroup_val = 1.200000
input='xxx', filter: [0 ; 1.500000; 1.200000]
- Generate default config:
$ ./bazel-bin/example -i defaultinput --config-template > config.yaml && cat config.yaml
---
input: defaultinput
file: /etc/passwd
num: 8
filter:
enabled: false
threshold: 1.5
subgroup:
val: 1.2
...
- Run with config & override config params:
$ CFG_NUM=41 ./bazel-bin/example --config config.yaml --input aaa
Config values, config-file: config.yaml
.input = aaa
.file = /etc/passwd
.num = 41
filter.enabled = false
filter.threshold = 1.500000
filter.subgroup_val = 1.200000
input='aaa', filter: [0 ; 1.500000; 1.200000]