X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fanalyzer.cpp;h=2c9cf058d7a565d3849acca028e150d878f4e85c;hb=HEAD;hp=f91c298825cc8a8039a0c1d1bc63a7036ec75120;hpb=451ef4f33b5a57dcb56bd7cb671bed359ac86247;p=builder.git diff --git a/source/analyzer.cpp b/source/analyzer.cpp deleted file mode 100644 index f91c298..0000000 --- a/source/analyzer.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include "analyzer.h" -#include "builder.h" -#include "buildgraph.h" -#include "objectfile.h" -#include "sourcefile.h" -#include "sourcepackage.h" -#include "target.h" -#include "tool.h" - -using namespace std; -using namespace Msp; - -void Analyzer::analyze() -{ - if(mode==RDEPS) - { - rdepends.clear(); - for(const auto &kvp: builder.get_build_graph().get_targets()) - { - for(Target *d: kvp.second->get_dependencies()) - rdepends[d].insert(kvp.second); - for(Target *d: kvp.second->get_transitive_dependencies()) - rdepends[d].insert(kvp.second); - } - } - - table.clear(); - - TableRow row; - row.push_back("Name"); - row.push_back("Package"); - row.push_back("Type"); - row.push_back("Tool"); - row.push_back("Rebuild"); - table.push_back(row); - - Target &goals = builder.get_build_graph().get_goals(); - if(mode==RDEPS) - { - for(Target *d: goals.get_dependencies()) - build_depend_table(*d, 0); - } - else - build_depend_table(goals, 0); - - print_table(); -} - -void Analyzer::build_depend_table(Target &tgt, unsigned depth) -{ - Target *real = tgt.get_real_target(); - if(mode==DEPS) - { - // Skip trivial targets - if(real!=&tgt) - return build_depend_table(*real, depth); - if(const ObjectFile *obj = dynamic_cast(&tgt)) - return build_depend_table(obj->get_source(), depth); - } - else if(mode==REBUILD && !tgt.needs_rebuild()) - /* All targets that depend on to-be-built targets will be rebuilt - themselves, so we can stop here. */ - return; - - TableRow row; - - string name; - const FileTarget *ft = dynamic_cast(&tgt); - if(full_paths && ft) - name = ft->get_path().str(); - else - name = tgt.get_name(); - row.push_back(string(depth*2, ' ')+name); - - const Package *pkg = tgt.get_package(); - if(pkg) - row.push_back(pkg->get_name()); - else - row.push_back(""); - - row.push_back(tgt.get_type()); - const Tool *tool = tgt.get_tool(); - if(tool) - row.push_back(tool->get_tag()); - else - row.push_back(""); - - if(tgt.needs_rebuild()) - row.push_back(tgt.get_rebuild_reason()); - - table.push_back(row); - - if(!max_depth || depth &rdeps = rdepends[&tgt]; - depends.assign(rdeps.begin(), rdeps.end()); - } - else - { - depends = tgt.get_dependencies(); - const Target::Dependencies &tdeps = tgt.get_transitive_dependencies(); - depends.insert(depends.end(), tdeps.begin(), tdeps.end()); - } - - sort(depends, (full_paths ? target_order_full : target_order)); - - for(Target *d: depends) - build_depend_table(*d, depth+1); - } -} - -void Analyzer::print_table() const -{ - vector col_width; - - // Determine column widths - for(const vector &r: table) - { - if(col_width.size() &r: table) - { - string line; - for(unsigned j=0; j0) - line += " "; - line += lexical_cast(r[j], Fmt("%-s").width(col_width[j])); - } - IO::print("%s\n", line); - } -} - -bool Analyzer::target_order(const Target *t1, const Target *t2) -{ - return t1->get_name()get_name(); -} - -bool Analyzer::target_order_full(const Target *t1, const Target *t2) -{ - const FileTarget *ft1 = dynamic_cast(t1); - const FileTarget *ft2 = dynamic_cast(t2); - if(!ft1) - { - if(ft2) - return true; - return target_order(t1, t2); - } - else if(!ft2) - return false; - return ft1->get_path().str()get_path().str(); -}