void Component::configure(const StringMap &opts, unsigned flag)
{
- for(StringList::iterator i=sources.begin(); i!=sources.end(); ++i)
- *i = (pkg.get_source()/pkg.expand_string(*i)).str();
-
for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i)
(*i)->configure(opts, flag&2);
}
void Component::Loader::source(const string &s)
{
- obj.sources.push_back(s);
+ obj.sources.push_back((obj.pkg.get_source()/s).str());
}
void Component::Loader::require(const string &n)
return source/arch.get_name()/detail;
}
-string SourcePackage::expand_string(const string &str) const
-{
- string result = str;
- string::size_type dollar = 0;
- unsigned n = 0;
- while((dollar = result.find('$'))!=string::npos)
- {
- if(n>1000)
- throw bad_expansion("nested too deep");
-
- string::size_type end;
- string var;
- if(dollar+1<result.size() && result[dollar+1]=='{')
- {
- end = result.find('}', dollar+2);
- if(end==string::npos)
- throw bad_expansion("unterminated variable reference");
- var = result.substr(dollar+2, end-dollar-2);
- ++end;
- }
- else
- {
- for(end=dollar+1; (isalnum(result[end]) || result[end]=='_'); ++end) ;
- var = result.substr(dollar+1, end-dollar-1);
- }
-
- string value;
- if(config.is_option(var))
- value = config.get_option(var).value;
- else if(var=="arch")
- value = builder.get_current_arch().get_name();
- else if(var=="system")
- value = builder.get_current_arch().get_system();
- else if(const char *ptr = getenv(var.c_str()))
- value = ptr;
-
- result.replace(dollar, end-dollar, value);
-
- ++n;
- }
-
- return result;
-}
-
void SourcePackage::do_configure(const StringMap &opts, unsigned flag)
{
init_config();
if(flag && config.update(opts))
builder.get_logger().log("configure", format("Configuration of %s changed", name));
- config.finish();
-
deps_cache.load();
for(ComponentList::iterator i=components.begin(); i!=components.end(); ++i)
Builder &get_builder() const { return builder; }
DependencyCache &get_deps_cache() const { return deps_cache; }
- std::string expand_string(const std::string &) const;
private:
virtual void do_configure(const StringMap &, unsigned);