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;
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)
}
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;
fail = true;
if(tasks.empty() && fail)
finish = true;
+ starved = false;
}
else
++i;
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;
}
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);
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;