-string Builder::run_pkgconfig(const string &pkg, const string &what)
-{
- list<string> argv;
- argv.push_back("pkg-config");
- if(what=="cflags" || what=="libs")
- argv.push_back("--"+what);
- else if(what=="flags")
- {
- argv.push_back("--cflags");
- argv.push_back("--libs");
- }
- else
- argv.push_back("--variable="+what);
- argv.push_back(pkg);
-
- if(verbose>=4)
- IO::print("Running %s\n", join(argv.begin(), argv.end()));
-
- int status;
- string res = run_command(argv, &status);
- if(status)
- throw Exception(format("pkg-config for package %s failed", pkg));
-
- return res;
-}
-
-Package *Builder::get_package(const string &name)
-{
- PackageMap::iterator i = packages.find(format("%s/%s", name, current_arch->get_system()));
- if(i==packages.end())
- i = packages.find(name);
- if(i!=packages.end())
- return i->second;
-
- if(!no_externals)
- {
- 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 *pkg = 0;
- try
- {
- // Package source not found - create a binary package
- pkg = BinaryPackage::from_pkgconfig(*this, name);
- }
- catch(...)
- {
- problem(name, "not found");
- }
-
- packages.insert(PackageMap::value_type(name, pkg));
-
- 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");
- if(RegMatch m = Regex("[0-9]\\.[0-9.]+").match(run_command(argv)))
- {
- cxx_ver = m[0].str;
- while(!cxx_ver.empty() && !FS::is_dir(FS::Path("/usr/include/c++")/cxx_ver))
- {
- string::size_type 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);
- }
- else
- 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_cross_prefix()+"/include");
- if(cxx_ver!="-")
- 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_cross_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;
-}
-
-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);
- }
-}
-