-/**
-Returns the target with the given name, or 0 if no such target exists.
-*/
-Target *Builder::get_target(const string &n) const
-{
- TargetMap::const_iterator i=targets.find(n);
- if(i!=targets.end())
- return i->second;
- return 0;
-}
-
-/**
-Tries to locate a header included from a given location and with a given include
-path. Considers known targets as well as existing files. If a matching target
-is not found but a file exists, a new SystemHeader target will be created and
-returned.
-*/
-Target *Builder::get_header(const string &include, const string &from, const list<string> &path)
-{
- string hash(8, 0);
- update_hash(hash, from);
- for(list<string>::const_iterator i=path.begin(); i!=path.end(); ++i)
- update_hash(hash, *i);
-
- string id=hash+include;
- TargetMap::iterator i=includes.find(id);
- if(i!=includes.end())
- return i->second;
-
- static string cxx_ver;
- if(cxx_ver.empty())
- {
- StringList argv;
- argv.push_back(get_current_arch().get_tool("CXX"));
- argv.push_back("--version");
- cxx_ver=Regex("[0-9]\\.[0-9.]+").match(run_command(argv))[0].str;
- while(!cxx_ver.empty() && !FS::is_dir(FS::Path("/usr/include/c++")/cxx_ver))
- {
- unsigned dot=cxx_ver.rfind('.');
- if(dot==string::npos)
- break;
- cxx_ver.erase(dot);
- }
- if(verbose>=5)
- cout<<"C++ version is "<<cxx_ver<<'\n';
- }
-
- string fn=include.substr(1);
- if(verbose>=5)
- cout<<"Looking for include "<<fn<<" with path "<<join(path.begin(), path.end())<<'\n';
-
- StringList syspath;
- if(current_arch->is_native())
- syspath.push_back("/usr/include");
- else
- syspath.push_back("/usr/"+current_arch->get_prefix()+"/include");
- syspath.push_back((FS::Path("/usr/include/c++/")/cxx_ver/fn).str());
-
- Target *tgt=0;
- if(include[0]=='\"')
- tgt=get_header(FS::Path(from)/fn);
- for(list<string>::const_iterator j=path.begin(); (!tgt && j!=path.end()); ++j)
- tgt=get_header(cwd/ *j/fn);
- for(list<string>::const_iterator j=syspath.begin(); (!tgt && j!=syspath.end()); ++j)
- tgt=get_header(FS::Path(*j)/fn);
-
- includes.insert(TargetMap::value_type(id, tgt));
-
- return tgt;
-}
-
-/**
-Tries to locate a library with the given library path. Considers known targets
-as well as existing files. If a matching target is not found but a file exists,
-a new SystemLibrary target will be created and returned.
-
-@param lib Name of the library to get (without "lib" prefix or extension)
-@param path List of paths to search for the library
-@param mode Shared / static mode
-
-@return Some kind of library target, if a match was found
-*/
-Target *Builder::get_library(const string &lib, const list<string> &path, LibMode mode)
-{
- string hash(8, 0);
- for(list<string>::const_iterator i=path.begin(); i!=path.end(); ++i)
- update_hash(hash, *i);
-
- string id=hash+string(1, mode)+lib;
- TargetMap::iterator i=libraries.find(id);
- if(i!=libraries.end())
- return i->second;
-
- StringList syspath;
- if(current_arch->is_native())
- {
- syspath.push_back("/lib");
- syspath.push_back("/usr/lib");
- }
- else
- syspath.push_back("/usr/"+get_current_arch().get_prefix()+"/lib");
-
- if(verbose>=5)
- cout<<"Looking for library "<<lib<<" with path "<<join(path.begin(), path.end())<<'\n';
-
- Target *tgt=0;
- for(StringList::const_iterator j=path.begin(); (!tgt && j!=path.end()); ++j)
- tgt=get_library(lib, cwd/ *j, mode);
- for(StringList::iterator j=syspath.begin(); (!tgt && j!=syspath.end()); ++j)
- tgt=get_library(lib, *j, mode);
-
- libraries.insert(TargetMap::value_type(id, tgt));
-
- return tgt;
-}
-
-const Architecture &Builder::get_architecture(const string &arch) const
-{
- ArchMap::const_iterator i=archs.find(arch);
- if(i==archs.end())
- throw KeyError("Unknown architecture", arch);
-
- return i->second;
-}
-
-void Builder::apply_profile_template(Config &config, const string &pt) const
-{
- vector<string> parts=split(pt, '-');
-
- for(vector<string>::iterator i=parts.begin(); i!=parts.end(); ++i)
- {
- ProfileTemplateMap::const_iterator j=profile_tmpl.find(*i);
- if(j==profile_tmpl.end())
- continue;
-
- config.update(j->second);
- }
-}
-
-void Builder::problem(const string &p, const string &d)
-{
- problems.push_back(Problem(p, d));
-}
-
-/**
-Adds a target to both the target map and the new target queue. Called from
-Target constructor.
-*/
-void Builder::add_target(Target *t)