- StringMap &native_tools=tools.insert(ToolMap::value_type("native", StringMap())).first->second;
- native_tools.insert(StringMap::value_type("CC", "gcc"));
- native_tools.insert(StringMap::value_type("CXX", "g++"));
- native_tools.insert(StringMap::value_type("LD", "gcc"));
- native_tools.insert(StringMap::value_type("LDXX", "g++"));
- native_tools.insert(StringMap::value_type("AR", "ar"));
-
- StringMap &release_profile=profile_tmpl.insert(ProfileTemplateMap::value_type("release", StringMap())).first->second;
- release_profile.insert(StringMap::value_type("optimize", "3"));
- release_profile.insert(StringMap::value_type("outdir", "$profile"));
-
- StringMap &debug_profile=profile_tmpl.insert(ProfileTemplateMap::value_type("debug", StringMap())).first->second;
- debug_profile.insert(StringMap::value_type("debug", "1"));
- debug_profile.insert(StringMap::value_type("outdir", "$profile"));
-
- for(StringMap::iterator i=archs.begin(); i!=archs.end(); ++i)
- {
- if(i->first=="native")
- continue;
-
- StringMap &arch_profile=profile_tmpl.insert(ProfileTemplateMap::value_type(i->first, StringMap())).first->second;
- arch_profile.insert(StringMap::value_type("arch", i->first));
- arch_profile.insert(StringMap::value_type("prefix", "$HOME/local/$arch"));
- arch_profile.insert(StringMap::value_type("outdir", "$profile"));
- }
-}
-
-/**
-Gets a package with the specified name, possibly creating it.
-
-@param n Package name
-
-@return Pointer to the package, or 0 if the package could not be located
-*/
-Package *Builder::get_package(const string &n)
-{
- PackageMap::iterator i=packages.find(n);
- if(i!=packages.end())
- return i->second;
-
- // Try to get source directory with pkgconfig
- list<string> argv;
- argv.push_back("pkg-config");
- argv.push_back("--variable=source");
- argv.push_back(n);
- string srcdir=strip(run_command(argv));
-
- PathList dirs;
- if(!srcdir.empty())
- dirs.push_back(srcdir);
-
- // Make some other guesses about the source directory
- string dirname=n;
- if(!dirname.compare(0, 3, "msp"))
- dirname.erase(0, 3);
- dirs.push_back(cwd/dirname);
- dirs.push_back(cwd/".."/dirname);
-
- // Go through the candidate directories and look for a Build file
- for(PathList::iterator j=dirs.begin(); j!=dirs.end(); ++j)
- if(!load_build_file(*j/"Build"))
- {
- i=packages.find(n);
- if(i!=packages.end())
- return i->second;
- break;
- }
-
- // Package source not found - create a binary package
- Package *pkg=Package::create(*this, n);
- packages.insert(PackageMap::value_type(n, pkg));
- if(pkg)
- new_pkgs.push_back(pkg);
-
- return pkg;
-}
-
-/**
-Returns the target with the given name, or 0 if no such target exists.
-*/
-Target *Builder::get_target(const string &n)
-{
- TargetMap::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 &, 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;
-
- string fn=include.substr(1);
- Target *tgt=0;
- if(include[0]=='"' && (tgt=get_header(Path::Path(from)/fn)))
- ;
- else if((tgt=get_header(Path::Path("/usr/include")/fn)))
- ;
- //XXX Determine the C++ header location dynamically
- else if((tgt=get_header(Path::Path("/usr/include/c++/4.1.2")/fn)))
- ;