blob: e2afc806b5daa8548eca7973c830e914645e7681 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
// file : build/config/utility.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
#include <build/config/utility>
using namespace std;
namespace build
{
namespace config
{
// The same as the template except it is a bit more efficient
// when it comes to not creating the default value string
// unnecessarily.
//
pair<const string&, bool>
required (scope& root, const char* name, const char* def_value)
{
string r;
const variable& var (variable_pool.find (name));
if (auto v = root[var])
{
const string& s (v.as<const string&> ());
if (!v.belongs (*global_scope)) // A value from (some) config.build.
return pair<const string&, bool> (s, false);
r = s;
}
else
r = def_value;
auto v (root.assign (var));
v = move (r);
return pair<const string&, bool> (v.as<const string&> (), true);
}
bool
specified (scope& r, const string& ns)
{
// Search all outer scopes for any value in this namespace.
//
for (scope* s (&r); s != nullptr; s = s->parent_scope ())
{
auto p (s->vars.find_namespace (ns));
if (p.first != p.second)
return true;
}
return false;
}
void
append_options (cstrings& args, const list_value& lv, const char* var)
{
for (const name& n: lv)
{
if (n.simple ())
args.push_back (n.value.c_str ());
else if (n.directory ())
args.push_back (n.dir.string ().c_str ());
else
fail << "expected option instead of " << n <<
info << "in variable " << var;
}
}
}
}
|