- 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))
- {
- 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);
- }
-
- 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;