+BuildInfo Component::get_build_info_for_path(const FS::Path &path) const
+{
+ // XXX Cache these and check that the directories actually exist before adding them
+ BuildInfo binfo = build_info;
+ if(!overlays.empty())
+ {
+ FS::Path dir = FS::dirname(path);
+ string last = FS::basename(dir);
+ for(OverlayList::const_iterator i=overlays.begin(); i!=overlays.end(); ++i)
+ if(last==*i)
+ {
+ dir = FS::dirname(dir);
+ break;
+ }
+
+ for(SourceList::const_iterator i=sources.begin(); i!=sources.end(); ++i)
+ if(dir==*i)
+ {
+ binfo.local_incpath.push_back(dir);
+ for(OverlayList::const_iterator j=overlays.begin(); j!=overlays.end(); ++j)
+ binfo.local_incpath.push_back(*i/ *j);
+ }
+ }
+ return binfo;
+}
+
+Component::SourceList Component::collect_source_files() const
+{
+ SourceList files;
+ for(SourceList::const_iterator i=sources.begin(); i!=sources.end(); ++i)
+ {
+ FS::Path path(*i);
+ if(FS::is_dir(path))
+ {
+ SourceList dirs;
+ dirs.push_back(path);
+ for(OverlayList::const_iterator j=overlays.begin(); j!=overlays.end(); ++j)
+ {
+ FS::Path opath = path / *j;
+ if(FS::is_dir(opath))
+ dirs.push_back(opath);
+ }
+ set<string> overlay_files;
+ for(SourceList::const_iterator j=dirs.begin(); j!=dirs.end(); ++j)
+ {
+ package.get_builder().get_logger().log("files", format("Traversing %s", *j));
+ list<string> sfiles = list_files(*j);
+ for(list<string>::iterator k=sfiles.begin(); k!=sfiles.end(); ++k)
+ {
+ if(j!=dirs.begin())
+ {
+ if(overlay_files.count(*k))
+ continue;
+ overlay_files.insert(*k);
+ }
+ FS::Path fn = *j / *k;
+ if(!FS::is_dir(fn))
+ files.push_back(fn);
+ }
+ }
+ }
+ else
+ {
+ files.push_back(path);
+ for(OverlayList::const_iterator j=overlays.begin(); j!=overlays.end(); ++j)
+ {
+ FS::Path opath = FS::dirname(path)/ *j/FS::basename(path);
+ if(FS::is_reg(opath))
+ files.push_back(opath);
+ }
+ }
+ }
+
+ return files;
+}
+
+