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