X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=7b0f0187f762cf03defc63645cc285f9db647934;hb=f515e91176cb4fcb1df379cdf664c90b3a565c95;hp=c86c5dadaf9ffa2671abf97d73b557b7587fd12d;hpb=bd61d7fbd0ba77356b6def1dd20f8cebe31de182;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index c86c5da..7b0f018 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -91,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])+" [ ...]"; helpmsg = getopt.generate_help(); getopt(argc, argv); @@ -188,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; @@ -201,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 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)); @@ -230,25 +217,6 @@ Builder::~Builder() int Builder::main() { - if(prefix.str()!="/usr") - { - FS::Path pcdir = prefix/"lib"/"pkgconfig"; - if(const char *pcp = getenv("PKG_CONFIG_PATH")) - { - vector path = split(pcp, ':'); - bool found = false; - for(vector::const_iterator i=path.begin(); (!found && i!=path.end()); ++i) - found = (*i==pcdir.str()); - if(!found) - { - path.push_back(pcdir.str()); - setenv("PKG_CONFIG_PATH", join(path.begin(), path.end(), ":").c_str(), true); - } - } - else - setenv("PKG_CONFIG_PATH", pcdir.str().c_str(), true); - } - if(load_build_file(cwd/build_file)) { if(help) @@ -271,12 +239,12 @@ int Builder::main() return 0; } + if(!prepare_build()) + return 1; + if(conf_only) return 0; - if(create_targets()) - return 1; - 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)); @@ -363,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) @@ -389,24 +365,24 @@ 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; } -int Builder::create_targets() +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(); @@ -422,10 +398,10 @@ int Builder::create_targets() if(!tgt) { IO::print("I don't know anything about %s\n", *i); - return -1; + return false; } - cmdline->add_depend(*tgt); + cmdline->add_dependency(*tgt); } cmdline->prepare(); @@ -437,7 +413,7 @@ int Builder::create_targets() if(!tgt) { IO::print(IO::cerr, "Unknown what-if target %s\n", *i); - return -1; + return false; } tgt->touch(); } @@ -456,7 +432,7 @@ int Builder::create_targets() i->second->save_caches(); } - return 0; + return true; } int Builder::do_build() @@ -481,10 +457,11 @@ int Builder::do_build() bool fail = false; bool finish = false; + bool starved = false; while(!finish) { - if(tasks.size()get_buildable_target(); if(tgt) @@ -512,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; icheck(); + Task::Status status; + if(jobs==1 || (tasks.size()==1 && starved)) + status = tasks[i]->wait(); + else + status = tasks[i]->check(); + if(status!=Task::RUNNING) { ++count; @@ -529,6 +513,7 @@ int Builder::do_build() fail = true; if(tasks.empty() && fail) finish = true; + starved = false; } else ++i; @@ -542,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; } @@ -561,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::const_iterator i=deps.begin(); i!=deps.end(); ++i) if(!clean_tgts.count(*i)) queue.push_back(*i); @@ -581,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()) @@ -592,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"); } } @@ -603,9 +595,8 @@ string Builder::usagemsg; string Builder::helpmsg; -Builder::Loader::Loader(Builder &b, const FS::Path &s): - DataFile::ObjectLoader(b), - src(s) +Builder::Loader::Loader(Builder &b): + DataFile::ObjectLoader(b) { add("architecture", &Loader::architecture); add("binary_package", &Loader::binpkg); @@ -642,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;