+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;
+
+ FS::Path gen_dir = package.get_temp_directory()/"generated";
+ if(FS::descendant_depth(path, gen_dir)>=0)
+ {
+ FS::Path subdir = FS::dirname(FS::relative(path, gen_dir));
+ binfo.local_incpath.push_back(package.get_source_directory()/subdir);
+ }
+ else
+ {
+ FS::Path subdir = FS::dirname(FS::relative(path, package.get_source_directory()));
+ binfo.local_incpath.push_back(gen_dir/subdir);
+ }
+
+ if(!overlays.empty())
+ {
+ FS::Path dir = FS::dirname(path);
+ string last = FS::basename(dir);
+ if(any_equals(overlays, last))
+ dir = FS::dirname(dir);
+
+ if(any_equals(sources, dir))
+ {
+ binfo.local_incpath.push_back(dir);
+ for(const string &o: overlays)
+ binfo.local_incpath.push_back(dir/o);
+ }
+ }
+ return binfo;
+}
+
+vector<FS::Path> Component::collect_source_files() const
+{
+ vector<FS::Path> files;
+ for(const FS::Path &p: sources)
+ {
+ if(FS::is_dir(p))
+ {
+ vector<FS::Path> dirs;
+ dirs.reserve(1+overlays.size());
+ dirs.push_back(p);
+ for(const string &o: overlays)
+ {
+ FS::Path opath = p/o;
+ if(FS::is_dir(opath))
+ dirs.push_back(opath);
+ }
+ set<string> overlay_files;
+ for(auto j=dirs.begin(); j!=dirs.end(); ++j)
+ {
+ package.get_builder().get_logger().log("files", "Traversing %s", *j);
+ for(const string &f: list_files(*j))
+ {
+ if(j!=dirs.begin())
+ {
+ if(overlay_files.count(f))
+ continue;
+ overlay_files.insert(f);
+ }
+ FS::Path fn = *j/f;
+ if(!FS::is_dir(fn))
+ files.push_back(fn);
+ }
+ }
+ }
+ else
+ {
+ files.push_back(p);
+ for(const string &o: overlays)
+ {
+ FS::Path opath = FS::dirname(p)/o/FS::basename(p);
+ if(FS::is_reg(opath))
+ files.push_back(opath);
+ }
+ }
+ }
+
+ return files;
+}
+
+