aboutsummaryrefslogtreecommitdiff
path: root/libbutl
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2020-12-07 22:13:06 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2020-12-08 18:00:41 +0300
commit871273b374f75306a6c79c4ec067f2e4ce338172 (patch)
treed16336ce5aa46a5ee6ab0b51323d625bcbd13caa /libbutl
parent819741778f6ad75b5b104d2107a8fd9e30d4d4e5 (diff)
Add proper support for option files option to load_default_options()
Diffstat (limited to 'libbutl')
-rw-r--r--libbutl/default-options.mxx11
-rw-r--r--libbutl/default-options.txx18
2 files changed, 20 insertions, 9 deletions
diff --git a/libbutl/default-options.mxx b/libbutl/default-options.mxx
index aeb246d..11f7bb2 100644
--- a/libbutl/default-options.mxx
+++ b/libbutl/default-options.mxx
@@ -61,10 +61,12 @@ LIBBUTL_MODEXPORT namespace butl
using default_options = small_vector<default_options_entry<O>, 4>;
// Search for and load the specified list of options files in the specified
- // directories returning a vector of option class instances (O). If args is
- // false, only options are allowed and are parsed using scanner S in the
- // U::fail mode. If args is true, then both options and arguments are
- // allowed in any order with options parsed in the U::stop mode.
+ // directories returning a vector of option class instances (O). Read
+ // additional options from files referenced by the specified option
+ // (normally --options-file). If args is false, only options are allowed and
+ // are parsed using scanner S in the U::fail mode. If args is true, then
+ // both options and arguments are allowed in any order with options parsed
+ // in the U::stop mode.
//
// Pass each default options file path to the specified function prior to
// load (can be used for tracing, etc). The function signature is:
@@ -112,6 +114,7 @@ LIBBUTL_MODEXPORT namespace butl
const optional<dir_path>& extra_dir,
const default_options_files&,
F&&,
+ const std::string& option,
bool args = false);
// Merge the default options/arguments and the command line
diff --git a/libbutl/default-options.txx b/libbutl/default-options.txx
index 5245bd6..eaf4235 100644
--- a/libbutl/default-options.txx
+++ b/libbutl/default-options.txx
@@ -31,6 +31,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
template <typename O, typename S, typename U, typename F>
bool
load_default_options_files (const dir_path& d,
+ const std::string& opt,
bool args,
bool remote,
const small_vector<path, 2>& fs,
@@ -43,7 +44,8 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
bool r (true);
- auto load = [args, &fs, &fn, &def_ops, &r] (const dir_path& d, bool rem)
+ auto load = [&opt, args, &fs, &fn, &def_ops, &r]
+ (const dir_path& d, bool rem)
{
using namespace std;
@@ -57,7 +59,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
{
fn (p, rem, false /* overwrite */);
- S s (p.string ());
+ S s (p.string (), opt);
// @@ Note that the potentially thrown exceptions (unknown option,
// unexpected argument, etc) will not contain any location
@@ -66,7 +68,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
// this in CLI.
//
O o;
- small_vector<std::string, 1> as;
+ small_vector<string, 1> as;
if (args)
{
@@ -88,9 +90,9 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
rem});
}
}
- catch (std::system_error& e)
+ catch (system_error& e)
{
- throw std::make_pair (move (p), std::move (e));
+ throw make_pair (move (p), move (e));
}
}
};
@@ -116,6 +118,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
const optional<dir_path>& extra_dir,
const default_options_files& ofs,
F&& fn,
+ const std::string& opt,
bool args)
{
if (sys_dir)
@@ -206,6 +209,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
if (load_extra && extra_dir->sub (d))
{
load = load_default_options_files<O, S, U> (*extra_dir,
+ opt,
args,
false /* remote */,
ofs.files,
@@ -219,6 +223,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
if (load && options_dir_exists (od))
load = load_default_options_files<O, S, U> (od,
+ opt,
args,
remote,
ofs.files,
@@ -235,6 +240,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
if (load && load_extra)
load = load_default_options_files<O, S, U> (*extra_dir,
+ opt,
args,
false /* remote */,
ofs.files,
@@ -247,6 +253,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
if (options_dir_exists (d))
load = load_default_options_files<O, S, U> (d,
+ opt,
args,
false /* remote */,
ofs.files,
@@ -256,6 +263,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason.
if (load && sys_dir && options_dir_exists (*sys_dir))
load_default_options_files<O, S, U> (*sys_dir,
+ opt,
args,
false /* remote */,
ofs.files,