X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=92f639c9c594e184f617dce0b204677bb7225ea5;hb=402a19ee62dc2d3465b48fc518bdae265fc3e090;hp=6c508026c6e7a67e6b32198609e3a5c112d21d9b;hpb=d861af0938a9043270245f6973d4ddbdc94e75b4;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index 6c50802..92f639c 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -55,7 +55,7 @@ Builder::Builder(int argc, char **argv): string analyze_mode; string work_dir; bool full_paths = false; - unsigned max_depth = 5; + unsigned max_depth = 4; StringList cmdline_warn; string prfx; string temp_str; @@ -67,14 +67,14 @@ Builder::Builder(int argc, char **argv): string build_type_name; GetOpt getopt; - getopt.add_option('a', "analyze", analyze_mode, GetOpt::REQUIRED_ARG).set_help("Perform analysis. MODE can be deps, alldeps or rebuild.", "MODE"); - getopt.add_option('b', "build", build, GetOpt::NO_ARG).set_help("Perform build even if doing analysis."); + getopt.add_option('a', "analyze", analyze_mode, GetOpt::REQUIRED_ARG).set_help("Perform dependency analysis.", "MODE"); + getopt.add_option('b', "build", build, GetOpt::NO_ARG).set_help("Perform build even if also doing something else."); getopt.add_option('c', "clean", clean, GetOpt::NO_ARG).set_help("Clean buildable targets."); - getopt.add_option('f', "file", build_file, GetOpt::REQUIRED_ARG).set_help("Read info from FILE instead of Build.", "FILE"); + getopt.add_option('f', "file", build_file, GetOpt::REQUIRED_ARG).set_help("Read build instructions from FILE.", "FILE"); getopt.add_option('h', "help", help, GetOpt::NO_ARG).set_help("Print this message."); - getopt.add_option('j', "jobs", jobs, GetOpt::REQUIRED_ARG).set_help("Run NUM commands at once, whenever possible.", "NUM"); - getopt.add_option('l', "log", log_channels, GetOpt::REQUIRED_ARG).set_help("Set log channels to be displayed.", "LIST"); - getopt.add_option('n', "dry-run", dry_run, GetOpt::NO_ARG).set_help("Don't actually do anything, only show what would be done."); + getopt.add_option('j', "jobs", jobs, GetOpt::REQUIRED_ARG).set_help("Run up to NUM tasks in parallel.", "NUM"); + getopt.add_option('l', "log", log_channels, GetOpt::REQUIRED_ARG).set_help("Enable listed log channels.", "LIST"); + getopt.add_option('n', "dry-run", dry_run, GetOpt::NO_ARG).set_help("Show what would be done without actually doing it."); getopt.add_option('s', "silent", silent, GetOpt::NO_ARG).set_help("Don't print any messages other than errors."); getopt.add_option('t', "build-type", build_type_name, GetOpt::REQUIRED_ARG).set_help("Set build type.", "TYPE"); getopt.add_option('v', "verbose", verbose, GetOpt::NO_ARG).set_help("Print more information about what's going on."); @@ -87,7 +87,7 @@ Builder::Builder(int argc, char **argv): getopt.add_option( "arch", arch, GetOpt::REQUIRED_ARG).set_help("Build for architecture ARCH.", "ARCH"); getopt.add_option( "conf-only", conf_only, GetOpt::NO_ARG).set_help("Stop after configuring packages."); getopt.add_option( "full-paths", full_paths, GetOpt::NO_ARG).set_help("Output full paths in analysis."); - getopt.add_option( "max-depth", max_depth, GetOpt::REQUIRED_ARG).set_help("Show up to NUM levels in analysis..", "NUM"); + 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"); usagemsg = getopt.generate_usage(argv[0])+" [ ...]"; @@ -108,20 +108,10 @@ Builder::Builder(int argc, char **argv): logger.enable_channel("commands"); } if(verbose>=3) - { - logger.enable_channel("packagemgr"); - logger.enable_channel("configure"); - } - if(verbose>=4) { logger.enable_channel("files"); logger.enable_channel("auxcommands"); } - if(verbose>=5) - { - logger.enable_channel("tools"); - logger.enable_channel("vfs"); - } for(list::const_iterator i=log_channels.begin(); i!=log_channels.end(); ++i) { vector parts = split(*i, ','); @@ -168,6 +158,10 @@ Builder::Builder(int argc, char **argv): cwd = FS::getcwd(); + package_manager.append_package_path(cwd); + package_manager.append_package_path(cwd/".."); + package_manager.append_binary_package_path(FS::get_sys_data_dir(argv[0], "builder")); + package_manager.set_no_externals(no_externals); if(arch.empty()) @@ -175,8 +169,12 @@ Builder::Builder(int argc, char **argv): else current_arch = new Architecture(*this, arch); - load_build_file((FS::get_sys_data_dir(argv[0], "builder")/"builderrc").str()); - load_build_file((FS::get_user_data_dir("builder")/"rc").str()); + list start_files; + start_files.push_back(FS::get_sys_data_dir(argv[0], "builder")/"builderrc"); + start_files.push_back(FS::get_user_data_dir("builder")/"rc"); + for(list::const_iterator i=start_files.begin(); i!=start_files.end(); ++i) + if(FS::exists(*i)) + load_build_file(*i); if(prfx.empty()) { @@ -217,7 +215,8 @@ Builder::~Builder() int Builder::main() { - if(load_build_file(cwd/build_file)) + FS::Path main_file = cwd/build_file; + if(!FS::exists(main_file)) { if(help) { @@ -226,11 +225,13 @@ int Builder::main() } else { - IO::print(IO::cerr, "No build info here.\n"); + IO::print(IO::cerr, "The file %s does not exist.\n", main_file); return 1; } } + load_build_file(main_file); + if(help) { usage(0, "builder", false); @@ -307,7 +308,7 @@ int Builder::main() if(clean) exit_code = do_clean(); - else if(build) + if(build) exit_code = do_build(); return exit_code; @@ -355,20 +356,15 @@ void Builder::usage(const char *reason, const char *argv0, bool brief) } } -int Builder::load_build_file(const FS::Path &fn) +void Builder::load_build_file(const FS::Path &fn) { - if(!FS::exists(fn)) - return -1; - IO::BufferedFile in(fn.str()); 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 Builder::prepare_build() @@ -457,10 +453,11 @@ int Builder::do_build() bool fail = false; bool finish = false; + bool starved = false; while(!finish) { - if(tasks.size()get_buildable_target(); if(tgt) @@ -488,13 +485,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; @@ -505,6 +509,7 @@ int Builder::do_build() fail = true; if(tasks.empty() && fail) finish = true; + starved = false; } else ++i; @@ -518,6 +523,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; } @@ -544,9 +556,11 @@ int Builder::do_clean() } for(set::iterator i=clean_tgts.begin(); i!=clean_tgts.end(); ++i) - if(FileTarget *ft = dynamic_cast(*i)) - if(ft->get_mtime()) - FS::unlink(ft->get_path()); + { + logger.log("tasks", format("RM %s", (*i)->get_name())); + if(!dry_run) + (*i)->clean(); + } return 0; } @@ -579,9 +593,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); @@ -618,7 +631,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;