#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>
using namespace Msp;
Builder::Builder(int argc, char **argv):
- default_pkg(0),
+ main_pkg(0),
analyzer(0),
build(false),
clean(0),
packages.insert(PackageMap::value_type(n, pkg));
+ if(!pkg)
+ problem(n, "not found");
+
return pkg;
}
}
}
+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.
return 1;
}
- default_pkg->configure(cmdline_options, conf_all?2:1);
+ main_pkg->configure(cmdline_options, conf_all?2:1);
if(help)
{
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;
}
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())
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;
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();
*/
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())
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));
#include <msp/path/path.h>
#include "config.h"
#include "misc.h"
+#include "problem.h"
#include "target.h"
class Analyzer;
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 &);
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();
Msp::Path::Path cwd;
PackageMap packages;
- SourcePackage *default_pkg;
+ SourcePackage *main_pkg;
TargetMap targets;
TargetList new_tgts;
StringMap archs; //< arch -> prefix
ProfileTemplateMap profile_tmpl;
+ ProblemList problems;
Analyzer *analyzer;
bool build;
unsigned clean;