xref: /netbsd-src/external/bsd/atf/dist/tools/config.cpp (revision d780102efefa02003390cc43ea410dbd0ebb4a85)
1*d780102eSjmmv //
2*d780102eSjmmv // Automated Testing Framework (atf)
3*d780102eSjmmv //
4*d780102eSjmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*d780102eSjmmv // All rights reserved.
6*d780102eSjmmv //
7*d780102eSjmmv // Redistribution and use in source and binary forms, with or without
8*d780102eSjmmv // modification, are permitted provided that the following conditions
9*d780102eSjmmv // are met:
10*d780102eSjmmv // 1. Redistributions of source code must retain the above copyright
11*d780102eSjmmv //    notice, this list of conditions and the following disclaimer.
12*d780102eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13*d780102eSjmmv //    notice, this list of conditions and the following disclaimer in the
14*d780102eSjmmv //    documentation and/or other materials provided with the distribution.
15*d780102eSjmmv //
16*d780102eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*d780102eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*d780102eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*d780102eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*d780102eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*d780102eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*d780102eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*d780102eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*d780102eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*d780102eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*d780102eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*d780102eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*d780102eSjmmv //
29*d780102eSjmmv 
30*d780102eSjmmv #include <cassert>
31*d780102eSjmmv #include <map>
32*d780102eSjmmv 
33*d780102eSjmmv #include "config.hpp"
34*d780102eSjmmv #include "env.hpp"
35*d780102eSjmmv #include "text.hpp"
36*d780102eSjmmv 
37*d780102eSjmmv static std::map< std::string, std::string > m_variables;
38*d780102eSjmmv 
39*d780102eSjmmv static struct var {
40*d780102eSjmmv     const char *name;
41*d780102eSjmmv     const char *default_value;
42*d780102eSjmmv     bool can_be_empty;
43*d780102eSjmmv } vars[] = {
44*d780102eSjmmv     { "ATF_ARCH",           ATF_ARCH,           false, },
45*d780102eSjmmv     { "ATF_BUILD_CC",       ATF_BUILD_CC,       false, },
46*d780102eSjmmv     { "ATF_BUILD_CFLAGS",   ATF_BUILD_CFLAGS,   true,  },
47*d780102eSjmmv     { "ATF_BUILD_CPP",      ATF_BUILD_CPP,      false, },
48*d780102eSjmmv     { "ATF_BUILD_CPPFLAGS", ATF_BUILD_CPPFLAGS, true,  },
49*d780102eSjmmv     { "ATF_BUILD_CXX",      ATF_BUILD_CXX,      false, },
50*d780102eSjmmv     { "ATF_BUILD_CXXFLAGS", ATF_BUILD_CXXFLAGS, true,  },
51*d780102eSjmmv     { "ATF_CONFDIR",        ATF_CONFDIR,        false, },
52*d780102eSjmmv     { "ATF_INCLUDEDIR",     ATF_INCLUDEDIR,     false, },
53*d780102eSjmmv     { "ATF_LIBDIR",         ATF_LIBDIR,         false, },
54*d780102eSjmmv     { "ATF_LIBEXECDIR",     ATF_LIBEXECDIR,     false, },
55*d780102eSjmmv     { "ATF_MACHINE",        ATF_MACHINE,        false, },
56*d780102eSjmmv     { "ATF_PKGDATADIR",     ATF_PKGDATADIR,     false, },
57*d780102eSjmmv     { "ATF_SHELL",          ATF_SHELL,          false, },
58*d780102eSjmmv     { "ATF_WORKDIR",        ATF_WORKDIR,        false, },
59*d780102eSjmmv     { NULL,                 NULL,               false, },
60*d780102eSjmmv };
61*d780102eSjmmv 
62*d780102eSjmmv //
63*d780102eSjmmv // Adds all predefined standard build-time variables to the m_variables
64*d780102eSjmmv // map, considering the values a user may have provided in the environment.
65*d780102eSjmmv //
66*d780102eSjmmv // Can only be called once during the program's lifetime.
67*d780102eSjmmv //
68*d780102eSjmmv static
69*d780102eSjmmv void
init_variables(void)70*d780102eSjmmv init_variables(void)
71*d780102eSjmmv {
72*d780102eSjmmv     assert(m_variables.empty());
73*d780102eSjmmv 
74*d780102eSjmmv     for (struct var* v = vars; v->name != NULL; v++) {
75*d780102eSjmmv         const std::string varname = tools::text::to_lower(v->name);
76*d780102eSjmmv 
77*d780102eSjmmv         if (tools::env::has(v->name)) {
78*d780102eSjmmv             const std::string envval = tools::env::get(v->name);
79*d780102eSjmmv             if (envval.empty() && !v->can_be_empty)
80*d780102eSjmmv                 m_variables[varname] = v->default_value;
81*d780102eSjmmv             else
82*d780102eSjmmv                 m_variables[varname] = envval;
83*d780102eSjmmv         } else {
84*d780102eSjmmv             m_variables[varname] = v->default_value;
85*d780102eSjmmv         }
86*d780102eSjmmv     }
87*d780102eSjmmv 
88*d780102eSjmmv     assert(!m_variables.empty());
89*d780102eSjmmv }
90*d780102eSjmmv 
91*d780102eSjmmv const std::string&
get(const std::string & varname)92*d780102eSjmmv tools::config::get(const std::string& varname)
93*d780102eSjmmv {
94*d780102eSjmmv     if (m_variables.empty())
95*d780102eSjmmv         init_variables();
96*d780102eSjmmv 
97*d780102eSjmmv     assert(has(varname));
98*d780102eSjmmv     return m_variables[varname];
99*d780102eSjmmv }
100*d780102eSjmmv 
101*d780102eSjmmv const std::map< std::string, std::string >&
get_all(void)102*d780102eSjmmv tools::config::get_all(void)
103*d780102eSjmmv {
104*d780102eSjmmv     if (m_variables.empty())
105*d780102eSjmmv         init_variables();
106*d780102eSjmmv 
107*d780102eSjmmv     return m_variables;
108*d780102eSjmmv }
109*d780102eSjmmv 
110*d780102eSjmmv bool
has(const std::string & varname)111*d780102eSjmmv tools::config::has(const std::string& varname)
112*d780102eSjmmv {
113*d780102eSjmmv     if (m_variables.empty())
114*d780102eSjmmv         init_variables();
115*d780102eSjmmv 
116*d780102eSjmmv     return m_variables.find(varname) != m_variables.end();
117*d780102eSjmmv }
118*d780102eSjmmv 
119*d780102eSjmmv namespace tools {
120*d780102eSjmmv namespace config {
121*d780102eSjmmv //
122*d780102eSjmmv // Auxiliary function for the t_config test program so that it can
123*d780102eSjmmv // revert the configuration's global status to an empty state and
124*d780102eSjmmv // do new tests from there on.
125*d780102eSjmmv //
126*d780102eSjmmv // Ideally this shouldn't be part of the production library... but
127*d780102eSjmmv // this is so small that it does not matter.
128*d780102eSjmmv //
129*d780102eSjmmv void
__reinit(void)130*d780102eSjmmv __reinit(void)
131*d780102eSjmmv {
132*d780102eSjmmv     m_variables.clear();
133*d780102eSjmmv }
134*d780102eSjmmv } // namespace config
135*d780102eSjmmv } // namespace tools
136