]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
Revamp problem reporting system to be more useful
[builder.git] / source / builder.cpp
index 6ee210177f32a077935223d17203d924da9d45dd..d4669520abd93fd7aabaf4b9b1ba7cf2bfc690ac 100644 (file)
@@ -12,6 +12,7 @@ Distributed under the LGPL
 #include <msp/core/getopt.h>
 #include <msp/datafile/parser.h>
 #include <msp/path/utils.h>
+#include <msp/strings/formatter.h>
 #include <msp/strings/utils.h>
 #include <msp/time/units.h>
 #include <msp/time/utils.h>
@@ -35,7 +36,7 @@ using namespace std;
 using namespace Msp;
 
 Builder::Builder(int argc, char **argv):
-       default_pkg(0),
+       main_pkg(0),
        analyzer(0),
        build(false),
        clean(0),
@@ -174,6 +175,9 @@ Package *Builder::get_package(const string &n)
 
        packages.insert(PackageMap::value_type(n, pkg));
 
+       if(!pkg)
+               problem(n, "not found");
+
        return pkg;
 }
 
@@ -311,6 +315,11 @@ void Builder::apply_profile_template(Config &config, const string &pt) const
        }
 }
 
+void Builder::problem(const string &p, const string &d)
+{
+       problems.push_back(Problem(p, d));
+}
+
 /**
 Adds a target to both the target map and the new target queue.  Called from
 Target constructor.
@@ -329,7 +338,7 @@ int Builder::main()
                return 1;
        }
 
-       default_pkg->configure(cmdline_options, conf_all?2:1);
+       main_pkg->configure(cmdline_options, conf_all?2:1);
 
        if(help)
        {
@@ -339,24 +348,24 @@ int Builder::main()
                return 0;
        }
 
-       StringMap problems;
-       for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i)
+       if(!conf_only && create_targets())
+               return 1;
+
+       PackageList all_reqs=main_pkg->collect_requires();
+
+       for(PackageList::const_iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i)
        {
-               SourcePackage *spkg=dynamic_cast<SourcePackage *>(i->second);
+               SourcePackage *spkg=dynamic_cast<SourcePackage *>(*i);
                string prob;
-               if(!i->second)
-                       prob="missing";
-               else if(spkg && spkg->get_arch()!=default_pkg->get_arch())
-                       prob="wrong architecture ("+spkg->get_arch()+")";
-               if(!prob.empty())
-                       problems.insert(StringMap::value_type(i->first, prob));
+               if(spkg && spkg->get_arch()!=main_pkg->get_arch())
+                       problem(spkg->get_name(), format("wrong architecture (%s)", spkg->get_arch()));
        }
 
        if(!problems.empty())
        {
                cerr<<"The following problems were detected:\n";
-               for(StringMap::iterator i=problems.begin(); i!=problems.end(); ++i)
-                       cerr<<"  "<<i->first<<": "<<i->second<<'\n';
+               for(ProblemList::iterator i=problems.begin(); i!=problems.end(); ++i)
+                       cerr<<"  "<<i->package<<": "<<i->descr<<'\n';
                cerr<<"Please fix them and try again.\n";
                return 1;
        }
@@ -364,21 +373,18 @@ int Builder::main()
        if(conf_only)
                return 0;
 
-       if(create_targets())
-               return 1;
-
-       cout<<packages.size()<<" packages, "<<targets.size()<<" targets\n";
+       cout<<all_reqs.size()<<" active packages, "<<targets.size()<<" targets\n";
        if(verbose>=2)
        {
-               for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i)
+               for(PackageList::const_iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i)
                {
-                       cout<<' '<<i->second->get_name();
-                       if(dynamic_cast<SourcePackage *>(i->second))
+                       cout<<' '<<(*i)->get_name();
+                       if(dynamic_cast<SourcePackage *>(*i))
                                cout<<'*';
                        unsigned count=0;
                        unsigned ood_count=0;
                        for(TargetMap::iterator j=targets.begin(); j!=targets.end(); ++j)
-                               if(j->second->get_package()==i->second)
+                               if(j->second->get_package()==*i)
                                {
                                        ++count;
                                        if(j->second->get_rebuild())
@@ -492,9 +498,10 @@ int Builder::create_targets()
        Target *tarballs=new VirtualTarget(*this, "tarballs");
        world->add_depend(tarballs);
 
-       for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i)
+       PackageList all_reqs=main_pkg->collect_requires();
+       for(PackageList::iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i)
        {
-               SourcePackage *spkg=dynamic_cast<SourcePackage *>(i->second);
+               SourcePackage *spkg=dynamic_cast<SourcePackage *>(*i);
                if(!spkg)
                        continue;
 
@@ -736,7 +743,7 @@ int Builder::do_clean()
                Target *tgt=queue.front();
                queue.erase(queue.begin());
 
-               if(tgt->get_buildable() && (tgt->get_package()==default_pkg || clean>=2))
+               if(tgt->get_buildable() && (tgt->get_package()==main_pkg || clean>=2))
                        clean_tgts.insert(tgt);
 
                const TargetList &deps=tgt->get_depends();
@@ -760,11 +767,11 @@ Prints out information about the default package.
 */
 void Builder::package_help()
 {
-       const Config &config=default_pkg->get_config();
+       const Config &config=main_pkg->get_config();
        const Config::OptionMap &options=config.get_options();
 
        cout<<"Required packages:\n  ";
-       const PackageList &requires=default_pkg->get_requires();
+       const PackageList &requires=main_pkg->get_requires();
        for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i)
        {
                if(i!=requires.begin())
@@ -815,8 +822,8 @@ void Builder::Loader::profile(const string &n)
 void Builder::Loader::package(const string &n)
 {
        SourcePackage *pkg=new SourcePackage(bld, n, src);
-       if(!bld.default_pkg)
-               bld.default_pkg=pkg;
+       if(!bld.main_pkg)
+               bld.main_pkg=pkg;
 
        load_sub(*pkg);
        bld.packages.insert(PackageMap::value_type(n, pkg));