From: Mikko Rasa Date: Tue, 11 Sep 2007 05:38:44 +0000 (+0000) Subject: Revamp problem reporting system to be more useful X-Git-Tag: 0.9~23 X-Git-Url: http://git.tdb.fi/?p=builder.git;a=commitdiff_plain;h=1968c546cfb30214e8dc5afc722bec14aa8373f5 Revamp problem reporting system to be more useful Rename default_pkg to main_pkg in Builder --- diff --git a/source/builder.cpp b/source/builder.cpp index 6ee2101..d466952 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -12,6 +12,7 @@ Distributed under the LGPL #include #include #include +#include #include #include #include @@ -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(i->second); + SourcePackage *spkg=dynamic_cast(*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<<" "<first<<": "<second<<'\n'; + for(ProblemList::iterator i=problems.begin(); i!=problems.end(); ++i) + cerr<<" "<package<<": "<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<=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<<' '<second->get_name(); - if(dynamic_cast(i->second)) + cout<<' '<<(*i)->get_name(); + if(dynamic_cast(*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(i->second); + SourcePackage *spkg=dynamic_cast(*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)); diff --git a/source/builder.h b/source/builder.h index 6da42a1..4811493 100644 --- a/source/builder.h +++ b/source/builder.h @@ -16,6 +16,7 @@ Distributed under the LGPL #include #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; diff --git a/source/component.cpp b/source/component.cpp index e338676..07cd6ea 100644 --- a/source/component.cpp +++ b/source/component.cpp @@ -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); diff --git a/source/executable.cpp b/source/executable.cpp index d1cc59a..0cae259 100644 --- a/source/executable.cpp +++ b/source/executable.cpp @@ -5,7 +5,8 @@ Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ -#include +#include +#include #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 "<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. diff --git a/source/package.h b/source/package.h index a2563bf..4620cf4 100644 --- a/source/package.h +++ b/source/package.h @@ -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