]> git.tdb.fi Git - builder.git/commitdiff
Revamp problem reporting system to be more useful
authorMikko Rasa <tdb@tdb.fi>
Tue, 11 Sep 2007 05:38:44 +0000 (05:38 +0000)
committerMikko Rasa <tdb@tdb.fi>
Tue, 11 Sep 2007 05:38:44 +0000 (05:38 +0000)
Rename default_pkg to main_pkg in Builder

source/builder.cpp
source/builder.h
source/component.cpp
source/executable.cpp
source/package.cpp
source/package.h

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));
index 6da42a1a90e94c55ca080157c3ae6fcdba1a31d2..4811493e005e649dcaeba5f24c89f976a880454d 100644 (file)
@@ -16,6 +16,7 @@ Distributed under the LGPL
 #include <msp/path/path.h>
 #include "config.h"
 #include "misc.h"
+#include "problem.h"
 #include "target.h"
 
 class Analyzer;
@@ -34,7 +35,7 @@ public:
        bool     get_dry_run() const   { return dry_run; }
        bool     get_build_all() const { return build_all; }
        Package  *get_package(const std::string &);
-       SourcePackage *get_default_package() const { return default_pkg; }
+       SourcePackage *get_main_package() const { return main_pkg; }
        Target   *get_target(const std::string &) const;
        const TargetMap &get_targets() const { return targets; }
        Target   *get_header(const std::string &, const std::string &, const std::string &, const StringList &);
@@ -44,6 +45,7 @@ public:
        std::string get_tool(const std::string &, const std::string &);
        void     apply_profile_template(Config &, const std::string &) const;
        void     add_target(Target *);
+       void     problem(const std::string &, const std::string &);
        int      main();
        ~Builder();
 
@@ -83,7 +85,7 @@ private:
        Msp::Path::Path cwd;
 
        PackageMap   packages;
-       SourcePackage *default_pkg;
+       SourcePackage *main_pkg;
 
        TargetMap    targets;
        TargetList   new_tgts;
@@ -94,6 +96,7 @@ private:
        StringMap    archs;    //< arch -> prefix
        ProfileTemplateMap profile_tmpl;
 
+       ProblemList     problems;
        Analyzer        *analyzer;
        bool            build;
        unsigned        clean;
index e33867680fb420e927d7abe20f5b524fe737defd..07cd6ea5aee874df889e4c34c49c77ae12ae5356 100644 (file)
@@ -114,7 +114,7 @@ void Component::create_targets() const
                else
                        exe=new Executable(builder, *this, objs);
 
-               if(&pkg==builder.get_default_package() && deflt)
+               if(&pkg==builder.get_main_package() && deflt)
                {
                        def_tgt->add_depend(exe);
                        if(slib) def_tgt->add_depend(slib);
index d1cc59aa174c278dac0c533e12254cbbbf71c5b7..0cae259f8b7b755bf74da0913a516ecafbd7d09a 100644 (file)
@@ -5,7 +5,8 @@ Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
-#include <iostream>
+#include <msp/path/utils.h>
+#include <msp/strings/formatter.h>
 #include "builder.h"
 #include "component.h"
 #include "executable.h"
@@ -59,8 +60,7 @@ void Executable::find_depends()
                                        queue.push_back(&stlib->get_component());
                        }
                        else
-                               cout<<"Couldn't find library "<<*i<<" for "<<name<<'\n';
-                               //XXX Throw an exception here or something
+                               builder.problem(comp.get_package().get_name(), format("Couldn't find library %s for %s", *i, Path::basename(name)));
                }
        }
 
@@ -89,7 +89,7 @@ we need to pass the value to the Target c'tor.
 */
 string Executable::generate_target_name(const Component &c)
 {
-       string prefix,suffix;
+       string prefix, suffix;
        const string &arch=c.get_package().get_arch();
 
        if(c.get_type()==Component::LIBRARY)
index 20fec32acfb84d64665ff2c05372482761de3eb2..c905ee464e7041de6372cbcca0f7e7142e20ef35 100644 (file)
@@ -26,6 +26,26 @@ Package::Package(Builder &b, const string &n):
        use_pkgconfig(true)
 { }
 
+/**
+Collects all directly and indirectly required packages, including the package
+itself.
+*/
+PackageList Package::collect_requires()
+{
+       PackageList result;
+       result.push_back(this);
+       for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i)
+       {
+               PackageList r=(*i)->collect_requires();
+               result.splice(result.end(), r);
+       }
+
+       result.sort();
+       result.unique();
+
+       return result;
+}
+
 /**
 Processes configuration options that were most likely obtained from the command
 line.
index a2563bf3004d36027a6e5c37611a75dad545bb13..4620cf475f51d3d99b5d251b274a760a92a4fb97 100644 (file)
@@ -40,6 +40,7 @@ public:
        const std::string   &get_name() const           { return name; }
        Builder             &get_builder() const        { return builder; }
        const PackageList   &get_requires() const       { return requires; }
+       PackageList         collect_requires();
        const BuildInfo     &get_exported_binfo() const { return export_binfo; }
 
        /// Indicates whether or not this package supports pkg-config