-Package *Builder::get_package(const string &name)
-{
- PackageMap::iterator i=packages.find(format("%s/%s", name, current_arch->get_name()));
- if(i==packages.end())
- i=packages.find(name);
- if(i!=packages.end())
- return i->second;
-
- FS::Path path=get_package_location(name);
- if(!path.empty() && !load_build_file(path/"Build"))
- {
- i=packages.find(name);
- if(i!=packages.end())
- return i->second;
- }
-
- // Package source not found - create a binary package
- Package *pkg=BinaryPackage::from_pkgconfig(*this, name);
-
- packages.insert(PackageMap::value_type(name, pkg));
-
- if(!pkg)
- problem(name, "not found");
-
- return pkg;
-}
-
-Target *Builder::get_target(const string &n) const
-{
- // XXX Used for getting targets by path. get_target(const FS::Path &)?
- TargetMap::const_iterator i=targets.find(n);
- if(i!=targets.end())
- return i->second;
- return 0;
-}
-
-Target *Builder::get_header(const string &include, const FS::Path &from, const list<string> &path)
-{
- string hash(8, 0);
- if(include[0]=='\"')
- update_hash(hash, from.str());
- 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(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)
- IO::print("C++ version is %s\n", cxx_ver);
- }
-
- string fn=include.substr(1);
- if(verbose>=5)
- IO::print("Looking for include %s from %s with path %s\n", fn, from, join(path.begin(), path.end()));
-
- 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).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;
-}
-
-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/"+current_arch->get_prefix()+"/lib");
-
- if(verbose>=5)
- IO::print("Looking for library %s with path %s\n", lib, join(path.begin(), path.end()));
-
- 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);
- }
-}
-