#include "gnucxxcompiler.h"
#include "gnulinker.h"
#include "installedfile.h"
+#include "mingwdlltool.h"
#include "package.h"
#include "pkgconfiggenerator.h"
#include "sharedlibrary.h"
Builder::Builder(int argc, char **argv):
package_manager(*this),
- main_pkg(0),
native_arch(*this, string()),
build_type(0),
vfs(*this),
+ build_graph(*this),
analyzer(0),
build(false),
clean(0),
cmdline_targets.push_back(*i);
}
- if(cmdline_targets.empty())
- cmdline_targets.push_back("default");
-
if(!work_dir.empty())
FS::chdir(work_dir);
toolchain.add_tool(new Copy(*this));
toolchain.add_tool(new Tar(*this));
toolchain.add_tool(new PkgConfigGenerator(*this));
+ if(current_arch->get_system()=="windows")
+ toolchain.add_tool(new MingwDllTool(*this, *current_arch));
}
Builder::~Builder()
{
- for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i)
- delete i->second;
delete analyzer;
}
unsigned count = 0;
unsigned to_be_built = 0;
- for(TargetMap::iterator j=targets.begin(); j!=targets.end(); ++j)
+ const BuildGraph::TargetMap &targets = build_graph.get_targets();
+ for(BuildGraph::TargetMap::const_iterator j=targets.begin(); j!=targets.end(); ++j)
if(j->second->get_package()==i->second)
{
++count;
package_details.push_back(line);
}
- logger.log("summary", format("%d active packages, %d targets", package_details.size(), targets.size()));
+ logger.log("summary", format("%d active packages, %d targets", package_details.size(), build_graph.get_targets().size()));
for(list<string>::const_iterator i=package_details.begin(); i!=package_details.end(); ++i)
logger.log("packages", *i);
return exit_code;
}
-Target *Builder::get_target(const string &n) const
-{
- TargetMap::const_iterator i = targets.find(n);
- if(i!=targets.end())
- return i->second;
- return 0;
-}
-
void Builder::problem(const string &p, const string &d)
{
problems.push_back(Problem(p, d));
}
-void Builder::add_target(Target *t)
-{
- targets.insert(TargetMap::value_type(t->get_name(), t));
-}
-
-void Builder::add_primary_target(Target &t)
-{
- get_target("world")->add_dependency(t);
-
- if(t.get_package()==main_pkg && t.get_component() && t.get_component()->is_default())
- get_target("default")->add_dependency(t);
-}
-
void Builder::usage(const char *reason, const char *argv0, bool brief)
{
if(reason)
bool Builder::prepare_build()
{
- Target *world = new VirtualTarget(*this, "world");
-
- Target *def_tgt = new VirtualTarget(*this, "default");
- world->add_dependency(*def_tgt);
-
- Target *install = new VirtualTarget(*this, "install");
- world->add_dependency(*install);
-
- Target *tarballs = new VirtualTarget(*this, "tarballs");
- world->add_dependency(*tarballs);
+ package_manager.get_main_package().prepare();
- main_pkg->prepare();
-
- // Make the cmdline target depend on all targets mentioned on the command line
- Target *cmdline = new VirtualTarget(*this, "cmdline");
+ // Add targets from command line as goals
for(NameList::iterator i=cmdline_targets.begin(); i!=cmdline_targets.end(); ++i)
{
- Target *tgt = get_target(*i);
+ Target *tgt = build_graph.get_target(*i);
if(!tgt)
tgt = vfs.get_target(*i);
if(!tgt)
return false;
}
- cmdline->add_dependency(*tgt);
+ build_graph.add_goal(*tgt);
}
- cmdline->prepare();
+ build_graph.prepare();
// Apply what-ifs
for(NameList::iterator i=what_if.begin(); i!=what_if.end(); ++i)
}
if(build_all)
- {
- for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i)
- if(i->second->is_buildable() && !i->second->needs_rebuild())
- i->second->force_rebuild();
- }
+ build_graph.force_full_rebuild();
if(!dry_run)
{
int Builder::do_build()
{
- Target *cmdline = get_target("cmdline");
-
- unsigned total = 0;
- for(map<string, Target *>::const_iterator i=targets.begin(); i!=targets.end(); ++i)
- if(i->second->is_buildable() && i->second->needs_rebuild())
- ++total;
+ unsigned total = build_graph.count_rebuild_targets();
if(!total)
{
{
if(tasks.size()<jobs && !fail && !starved)
{
- Target *tgt = cmdline->get_buildable_target();
+ Target *tgt = build_graph.get_buildable_target();
if(tgt)
{
if(tgt->get_tool())
set<Target *> clean_tgts;
list<Target *> queue;
- queue.push_back(get_target("cmdline"));
+ queue.push_back(build_graph.get_target("cmdline"));
while(!queue.empty())
{
Target *tgt = queue.front();
queue.erase(queue.begin());
- if(tgt->is_buildable() && (tgt->get_package()==main_pkg || clean>=2))
+ if(tgt->is_buildable() && (tgt->get_package()==&package_manager.get_main_package() || clean>=2))
clean_tgts.insert(tgt);
const Target::Dependencies &deps = tgt->get_dependencies();
void Builder::package_help()
{
- const Config &config = main_pkg->get_config();
+ SourcePackage &main_pkg = dynamic_cast<SourcePackage &>(package_manager.get_main_package());
+ const Config &config = main_pkg.get_config();
const Config::OptionMap &options = config.get_options();
IO::print("Required packages:\n ");
- const Package::Requirements &requires = main_pkg->get_required_packages();
+ const Package::Requirements &requires = main_pkg.get_required_packages();
for(Package::Requirements::const_iterator i=requires.begin(); i!=requires.end(); ++i)
{
if(i!=requires.begin())
void Builder::Loader::package(const string &n)
{
SourcePackage *pkg = new SourcePackage(obj, n, get_source());
- if(!obj.main_pkg)
- obj.main_pkg = pkg;
- if(obj.conf_all || pkg==obj.main_pkg)
+ if(obj.conf_all || pkg==&obj.package_manager.get_main_package())
load_sub(*pkg, obj.cmdline_options);
else
load_sub(*pkg);