]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
Improve task management to use blocking wait if possible
[builder.git] / source / builder.cpp
index ff2f95257b22b98404b2061bb5aab01b7b6aadff..7b0f0187f762cf03defc63645cc285f9db647934 100644 (file)
@@ -90,7 +90,6 @@ Builder::Builder(int argc, char **argv):
        getopt.add_option(     "max-depth",  max_depth,     GetOpt::REQUIRED_ARG).set_help("Show up to NUM levels in analysis..", "NUM");
        getopt.add_option(     "prefix",     prfx,          GetOpt::REQUIRED_ARG).set_help("Install things to DIR.", "DIR");
        getopt.add_option(     "tempdir",    temp_str,      GetOpt::REQUIRED_ARG).set_help("Store temporary files in DIR.", "DIR");
-       getopt.add_option(     "warnings",   cmdline_warn,  GetOpt::REQUIRED_ARG).set_help("Compiler warnings to use.", "LIST");
        usagemsg = getopt.generate_usage(argv[0])+" [<target> ...]";
        helpmsg = getopt.generate_help();
        getopt(argc, argv);
@@ -187,7 +186,7 @@ Builder::Builder(int argc, char **argv):
                        prefix = (FS::get_home_dir()/"local"/current_arch->get_name()).str();
        }
        else
-               prefix = FS::getcwd()/prfx;
+               prefix = cwd/prfx;
 
        if(!temp_str.empty())
                tempdir = temp_str;
@@ -200,17 +199,6 @@ Builder::Builder(int argc, char **argv):
                build_type = &i->second;
        }
 
-       warnings.push_back("all");
-       warnings.push_back("extra");
-       warnings.push_back("shadow");
-       warnings.push_back("pointer-arith");
-       warnings.push_back("error");
-       for(StringList::iterator i=cmdline_warn.begin(); i!=cmdline_warn.end(); ++i)
-       {
-               vector<string> warns = split(*i, ',');
-               warnings.insert(warnings.end(), warns.begin(), warns.end());
-       }
-
        toolchain.add_tool(new GnuCCompiler(*this, *current_arch));
        toolchain.add_tool(new GnuCxxCompiler(*this, *current_arch));
        toolchain.add_tool(new GnuLinker(*this, *current_arch));
@@ -251,12 +239,12 @@ int Builder::main()
                return 0;
        }
 
-       if(conf_only)
-               return 0;
-
        if(!prepare_build())
                return 1;
 
+       if(conf_only)
+               return 0;
+
        logger.log("environment", format("Building on %s, for %s%s", native_arch.get_name(),
                current_arch->get_name(), (current_arch->is_native() ? " (native)" : "")));
        logger.log("environment", format("Prefix is %s", prefix));
@@ -343,6 +331,14 @@ 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)
@@ -369,7 +365,7 @@ int Builder::load_build_file(const FS::Path &fn)
        logger.log("files", format("Reading %s", fn));
 
        DataFile::Parser parser(in, fn.str());
-       Loader loader(*this, fn.subpath(0, fn.size()-1));
+       Loader loader(*this);
        loader.load(parser);
 
        return 0;
@@ -380,13 +376,13 @@ bool Builder::prepare_build()
        Target *world = new VirtualTarget(*this, "world");
 
        Target *def_tgt = new VirtualTarget(*this, "default");
-       world->add_depend(*def_tgt);
+       world->add_dependency(*def_tgt);
 
        Target *install = new VirtualTarget(*this, "install");
-       world->add_depend(*install);
+       world->add_dependency(*install);
 
        Target *tarballs = new VirtualTarget(*this, "tarballs");
-       world->add_depend(*tarballs);
+       world->add_dependency(*tarballs);
 
        main_pkg->prepare();
 
@@ -405,7 +401,7 @@ bool Builder::prepare_build()
                        return false;
                }
 
-               cmdline->add_depend(*tgt);
+               cmdline->add_dependency(*tgt);
        }
 
        cmdline->prepare();
@@ -461,10 +457,11 @@ int Builder::do_build()
 
        bool fail = false;
        bool finish = false;
+       bool starved = false;
 
        while(!finish)
        {
-               if(tasks.size()<jobs && !fail)
+               if(tasks.size()<jobs && !fail && !starved)
                {
                        Target *tgt = cmdline->get_buildable_target();
                        if(tgt)
@@ -492,13 +489,20 @@ int Builder::do_build()
                        }
                        else if(tasks.empty())
                                finish = true;
+                       else
+                               starved = true;
                }
                else
                        Time::sleep(10*Time::msec);
 
                for(unsigned i=0; i<tasks.size();)
                {
-                       Task::Status status = tasks[i]->check();
+                       Task::Status status;
+                       if(jobs==1 || (tasks.size()==1 && starved))
+                               status = tasks[i]->wait();
+                       else
+                               status = tasks[i]->check();
+
                        if(status!=Task::RUNNING)
                        {
                                ++count;
@@ -509,6 +513,7 @@ int Builder::do_build()
                                        fail = true;
                                if(tasks.empty() && fail)
                                        finish = true;
+                               starved = false;
                        }
                        else
                                ++i;
@@ -522,6 +527,13 @@ int Builder::do_build()
        else if(show_progress)
                logger.log("summary", "Build complete");
 
+       if(!dry_run)
+       {
+               const PackageManager::PackageMap &packages = package_manager.get_packages();
+               for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i)
+                       i->second->save_caches();
+       }
+
        return fail;
 }
 
@@ -541,7 +553,7 @@ int Builder::do_clean()
                if(tgt->is_buildable() && (tgt->get_package()==main_pkg || clean>=2))
                        clean_tgts.insert(tgt);
 
-               const Target::Dependencies &deps = tgt->get_depends();
+               const Target::Dependencies &deps = tgt->get_dependencies();
                for(list<Target *>::const_iterator i=deps.begin(); i!=deps.end(); ++i)
                        if(!clean_tgts.count(*i))
                                queue.push_back(*i);
@@ -561,7 +573,7 @@ void Builder::package_help()
        const Config::OptionMap &options = config.get_options();
 
        IO::print("Required packages:\n  ");
-       const PackageList &requires = main_pkg->get_requires();
+       const PackageList &requires = main_pkg->get_required_packages();
        for(PackageList::const_iterator i=requires.begin(); i!=requires.end(); ++i)
        {
                if(i!=requires.begin())
@@ -572,9 +584,9 @@ void Builder::package_help()
        for(Config::OptionMap::const_iterator i=options.begin(); i!=options.end(); ++i)
        {
                const Config::Option &opt = i->second;
-               IO::print("  %s: %s (%s)", opt.name, opt.descr, opt.value);
-               if(opt.value!=opt.defv)
-                       IO::print(" [%s]", opt.defv);
+               IO::print("  %s: %s (%s)", opt.name, opt.description, opt.value);
+               if(opt.value!=opt.default_value)
+                       IO::print(" [%s]", opt.default_value);
                IO::print("\n");
        }
 }
@@ -583,9 +595,8 @@ string Builder::usagemsg;
 string Builder::helpmsg;
 
 
-Builder::Loader::Loader(Builder &b, const FS::Path &s):
-       DataFile::ObjectLoader<Builder>(b),
-       src(s)
+Builder::Loader::Loader(Builder &b):
+       DataFile::ObjectLoader<Builder>(b)
 {
        add("architecture", &Loader::architecture);
        add("binary_package", &Loader::binpkg);
@@ -622,7 +633,7 @@ void Builder::Loader::profile(const string &)
 
 void Builder::Loader::package(const string &n)
 {
-       SourcePackage *pkg = new SourcePackage(obj, n, src);
+       SourcePackage *pkg = new SourcePackage(obj, n, get_source());
        if(!obj.main_pkg)
                obj.main_pkg = pkg;