X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fobjectfile.cpp;h=00fa6792859962e9a1a0b984bdde70b8c86bf3e4;hb=d1f9551e05c9d341149eb490e05b1465d3d6b711;hp=256807c1d7930d7db3e1c6e6360d5d6ceb1f26f7;hpb=b45cfe5e437ca79bb3176618769628c58c0734d1;p=builder.git diff --git a/source/objectfile.cpp b/source/objectfile.cpp index 256807c..00fa679 100644 --- a/source/objectfile.cpp +++ b/source/objectfile.cpp @@ -11,8 +11,7 @@ using namespace Msp; ObjectFile::ObjectFile(Builder &b, const Component &c, SourceFile &s): FileTarget(b, c.get_package(), generate_target_path(c, s.get_path())), - source(s), - used_in_shlib(false) + source(s) { component = &c; add_dependency(source); @@ -52,61 +51,60 @@ void ObjectFile::collect_build_info(BuildInfo &binfo) const void ObjectFile::find_dependencies() { - for(Target *d: depends) + vector headers; + find_dependencies(source, headers); + for(FileTarget *h: headers) { - d->prepare(); - find_dependencies(dynamic_cast(d)); + add_dependency(*h); + if(h->get_real_target()->is_buildable()) + h->signal_modified.connect(sigc::mem_fun(this, static_cast(&ObjectFile::find_dependencies))); } } -void ObjectFile::find_dependencies(FileTarget *tgt) +void ObjectFile::find_dependencies(FileTarget &tgt, vector &headers) { - FileTarget *rtgt = dynamic_cast(tgt->get_real_target()); - const Dependencies &tdeps = rtgt->get_transitive_dependencies(); - Dependencies deps_to_add; - if(rtgt==tgt) - { - /* We are using the target from its original location, so dependencies - apply directly */ - deps_to_add = tdeps; - } - else + tgt.prepare(); + + FileTarget *rtgt = dynamic_cast(tgt.get_real_target()); + Dependencies deps_to_add = rtgt->get_transitive_dependencies(); + if(rtgt!=&tgt) { FS::Path inst_dir = rtgt->get_component()->get_install_map().get_install_location(*rtgt); /* The target has been displaced by installing it. Displace any dependencies that come from the same package as well. */ const SourcePackage *tpkg = rtgt->get_package(); - for(Target *d: tdeps) + for(Target *&d: deps_to_add) { FileTarget *file = dynamic_cast(d); if(file && file->get_package()==tpkg && FS::descendant_depth(file->get_path(), tpkg->get_source_directory())>=0) { const Component *tcomp = file->get_component(); FS::Path dep_inst = tcomp->get_install_map().get_install_location(*file); - FS::Path displaced = FS::dirname(tgt->get_path())/FS::relative(dep_inst, inst_dir)/FS::basename(file->get_path()); - if(Target *ddep = builder.get_vfs().get_target(displaced)) - deps_to_add.push_back(ddep); - else + FS::Path displaced = FS::dirname(tgt.get_path())/FS::relative(dep_inst, inst_dir)/FS::basename(file->get_path()); + d = builder.get_vfs().get_target(displaced); + if(!d) { + /* If the target was in an overlay directory and the displaced + dependency is not found, try removing the overlay from the path. */ string last_dir = FS::basename(FS::dirname(displaced)); if(any_equals(tcomp->get_overlays(), last_dir)) { displaced = displaced.subpath(0, displaced.size()-2)/FS::basename(file->get_path()); - if((ddep = builder.get_vfs().get_target(displaced))) - deps_to_add.push_back(ddep); + d = builder.get_vfs().get_target(displaced); } } } - else - deps_to_add.push_back(d); } } for(Target *d: deps_to_add) - if(!any_equals(depends, d)) + if(FileTarget *file = dynamic_cast(d)) { - add_dependency(*d); - if(d->get_real_target()->is_buildable()) - d->signal_modified.connect(sigc::mem_fun(this, static_cast(&ObjectFile::find_dependencies))); + auto i = lower_bound(headers, file); + if(i==headers.end() || *i!=file) + { + headers.insert(i, file); + find_dependencies(*file, headers); + } } }