X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fanalyzer.cpp;h=0db55c76b637942ba997bff9b2ee90d05237e58b;hb=0ac8d6708b8c758fb89d97a0049d4a329990b83b;hp=a4780fd697dd451fae6afa5ddc6efce020f9be9a;hpb=0d80cabf649b931b26e7055385156c75a7385d35;p=builder.git diff --git a/source/analyzer.cpp b/source/analyzer.cpp index a4780fd..0db55c7 100644 --- a/source/analyzer.cpp +++ b/source/analyzer.cpp @@ -1,3 +1,10 @@ +/* $Id$ + +This file is part of builder +Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions +Distributed under the LGPL +*/ + #include #include #include @@ -14,10 +21,14 @@ using namespace Msp; Analyzer::Analyzer(Builder &b): builder(b), + mode(DEPS), max_depth(0), full_paths(false) { } +/** +Performs the analysis and prints out the resulting dependency tree. +*/ void Analyzer::analyze() { TableRow row; @@ -32,16 +43,25 @@ void Analyzer::analyze() print_table(); } +/** +Adds rows to the table for the given target and it' dependencies. + +@param tgt Target to be processed +@param depth Recursion level of the target (top level is 0) +*/ void Analyzer::build_depend_table(Target &tgt, unsigned depth) { - if(mode!=REBUILD) + if(mode!=REBUILD && mode!=ALLDEPS) { + // Skip trivial targets if(dynamic_cast(&tgt)) return build_depend_table(*tgt.get_depends().front(), depth); else if(dynamic_cast(&tgt)) return build_depend_table(*tgt.get_depends().front(), depth); } - else if(!tgt.get_rebuild()) + else if(mode==REBUILD && !tgt.get_rebuild()) + /* All targets that depend on to-be-built targets will be rebuilt + themselves, so we cn stop here. */ return; TableRow row; @@ -73,17 +93,22 @@ void Analyzer::build_depend_table(Target &tgt, unsigned depth) if(!max_depth || depth &depends=tgt.get_depends(); + const TargetList &depends=tgt.get_depends(); + //XXX If we want to sort the targets, we need to take the value of full_paths into account //depends.sort(target_order); - for(list::const_iterator i=depends.begin(); i!=depends.end(); ++i) + for(TargetList::const_iterator i=depends.begin(); i!=depends.end(); ++i) build_depend_table(**i, depth+1); } } +/** +Prints out the table that resulted from the analysis. +*/ void Analyzer::print_table() const { vector col_width; + // Determine column widths for(Table::const_iterator i=table.begin(); i!=table.end(); ++i) { if(col_width.size()size())