X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=96df23b7df5c0394800fa21caf59160fff8cdac0;hb=a5b439969c06a4794a3914580a29256773f24778;hp=2c28b7931631e2a3d06bf7f32b2c4e8539f8a0ac;hpb=5eab9f87fc3203d7c2d16be312be74a63a8c8980;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index 2c28b79..96df23b 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -17,7 +17,6 @@ #include "binarypackage.h" #include "builder.h" #include "copy.h" -#include "externaltask.h" #include "gnuarchiver.h" #include "gnuccompiler.h" #include "gnucxxcompiler.h" @@ -35,6 +34,7 @@ using namespace std; using namespace Msp; Builder::Builder(int argc, char **argv): + package_manager(*this), main_pkg(0), native_arch(*this, string()), vfs(*this), @@ -43,7 +43,6 @@ Builder::Builder(int argc, char **argv): clean(0), dry_run(false), help(false), - verbose(1), show_progress(false), build_file("Build"), jobs(1), @@ -59,6 +58,10 @@ Builder::Builder(int argc, char **argv): StringList cmdline_warn; string prfx; string arch; + bool no_externals = false; + unsigned verbose = 1; + bool silent = false; + list log_channels; GetOpt getopt; getopt.add_option('a', "analyze", analyze_mode, GetOpt::REQUIRED_ARG).set_help("Perform analysis. MODE can be deps, alldeps or rebuild.", "MODE"); @@ -67,7 +70,9 @@ Builder::Builder(int argc, char **argv): getopt.add_option('f', "file", build_file, GetOpt::REQUIRED_ARG).set_help("Read info from FILE instead of Build.", "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('s', "silent", silent, GetOpt::NO_ARG).set_help("Don't print any messages other than errors."); getopt.add_option('v', "verbose", verbose, GetOpt::NO_ARG).set_help("Print more information about what's going on."); getopt.add_option('x', "no-externals", no_externals, GetOpt::NO_ARG).set_help("Do not load external source packages."); getopt.add_option('A', "conf-all", conf_all, GetOpt::NO_ARG).set_help("Apply configuration to all packages."); @@ -85,6 +90,40 @@ Builder::Builder(int argc, char **argv): helpmsg = getopt.generate_help(); getopt(argc, argv); + if(silent) + --verbose; + if(verbose>=1) + { + logger.enable_channel("summary"); + logger.enable_channel("tasks"); + } + if(verbose>=2) + { + logger.enable_channel("packages"); + 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, ','); + for(vector::const_iterator j=parts.begin(); j!=parts.end(); ++j) + logger.enable_channel(*j); + } + if(!analyze_mode.empty()) { analyzer = new Analyzer(*this); @@ -124,6 +163,8 @@ Builder::Builder(int argc, char **argv): cwd = FS::getcwd(); + package_manager.set_no_externals(no_externals); + load_build_file((FS::get_sys_data_dir(argv[0], "builder")/"builderrc").str()); load_build_file((FS::get_user_data_dir("builder")/"rc").str()); @@ -142,14 +183,6 @@ Builder::Builder(int argc, char **argv): } } - toolchain.add_tool(new GnuCCompiler(*this)); - toolchain.add_tool(new GnuCxxCompiler(*this)); - toolchain.add_tool(new GnuLinker(*this)); - toolchain.add_tool(new GnuArchiver(*this)); - toolchain.add_tool(new Copy(*this)); - toolchain.add_tool(new Tar(*this)); - toolchain.add_tool(new PkgConfigGenerator(*this)); - if(prfx.empty()) { if(current_arch->is_native()) @@ -171,14 +204,17 @@ Builder::Builder(int argc, char **argv): warnings.insert(warnings.end(), warns.begin(), warns.end()); } - pkg_path.push_back(cwd/"."); - pkg_path.push_back(cwd/".."); + toolchain.add_tool(new GnuCCompiler(*this, *current_arch)); + toolchain.add_tool(new GnuCxxCompiler(*this, *current_arch)); + toolchain.add_tool(new GnuLinker(*this, *current_arch)); + toolchain.add_tool(new GnuArchiver(*this, *current_arch)); + toolchain.add_tool(new Copy(*this)); + toolchain.add_tool(new Tar(*this)); + toolchain.add_tool(new PkgConfigGenerator(*this)); } Builder::~Builder() { - for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i) - delete i->second; for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i) delete i->second; delete analyzer; @@ -235,32 +271,22 @@ int Builder::main() if(create_targets()) return 1; - if(verbose>=2) - { - IO::print("Building on %s, for %s%s\n", native_arch.get_name(), - current_arch->get_name(), (current_arch->is_native() ? " (native)" : "")); - IO::print("Prefix is %s\n", prefix); - } + 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)); - if(verbose>=1) + const PackageManager::PackageMap &packages = package_manager.get_packages(); + list package_details; + for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) { - unsigned n_packages = 0; - for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) - if(i->second && i->second->is_configured()) - ++n_packages; - IO::print("%d active packages, %d targets\n", n_packages, targets.size()); - } + if(!i->second || !i->second->is_configured()) + continue; - if(verbose>=2) - { - for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) + string line = i->second->get_name(); + if(dynamic_cast(i->second)) { - if(!i->second->is_configured()) - continue; + line += '*'; - IO::print(" %s", i->second->get_name()); - if(dynamic_cast(i->second)) - IO::print("*"); unsigned count = 0; unsigned to_be_built = 0; for(TargetMap::iterator j=targets.begin(); j!=targets.end(); ++j) @@ -272,15 +298,20 @@ int Builder::main() } if(count) { - IO::print(" (%d targets", count); + line += format(" (%d targets", count); if(to_be_built) - IO::print(", %d to be built", to_be_built); - IO::print(")"); + line += format(", %d to be built", to_be_built); + line += ')'; } - IO::print("\n"); } + + package_details.push_back(line); } + logger.log("summary", format("%d active packages, %d targets", package_details.size(), targets.size())); + for(list::const_iterator i=package_details.begin(); i!=package_details.end(); ++i) + logger.log("packages", *i); + if(analyzer) analyzer->analyze(); @@ -302,72 +333,6 @@ int Builder::main() return exit_code; } -string Builder::run_pkgconfig(const string &pkg, const string &what) -{ - ExternalTask::Arguments argv; - argv.push_back("pkg-config"); - if(what=="cflags" || what=="libs") - argv.push_back("--"+what); - else if(what=="flags") - { - argv.push_back("--cflags"); - argv.push_back("--libs"); - } - else - argv.push_back("--variable="+what); - argv.push_back(pkg); - - if(verbose>=4) - IO::print("Running %s\n", join(argv.begin(), argv.end())); - - ExternalTask task(argv); - task.set_stdout(ExternalTask::CAPTURE); - task.set_stderr(ExternalTask::IGNORE); - task.start(); - Task::Status status; - while((status=task.check())==Task::RUNNING) - Time::sleep(10*Time::msec); - if(status==Task::ERROR) - throw runtime_error(format("pkg-config for package %s failed", pkg)); - - return task.get_output(); -} - -Package *Builder::get_package(const string &name) -{ - PackageMap::iterator i = packages.find(format("%s/%s", name, current_arch->get_system())); - if(i==packages.end()) - i = packages.find(name); - if(i!=packages.end()) - return i->second; - - if(!no_externals) - { - FS::Path path = get_package_location(name); - if(!path.empty() && !load_build_file(path/"Build")) - { - i = packages.find(name); - if(i!=packages.end()) - return i->second; - } - } - - Package *pkg = 0; - try - { - // Package source not found - create a binary package - pkg = BinaryPackage::from_pkgconfig(*this, name); - } - catch(...) - { - problem(name, "not found"); - } - - packages.insert(PackageMap::value_type(name, pkg)); - - return pkg; -} - Target *Builder::get_target(const string &n) const { TargetMap::const_iterator i = targets.find(n); @@ -398,7 +363,6 @@ void Builder::problem(const string &p, const string &d) void Builder::add_target(Target *t) { targets.insert(TargetMap::value_type(t->get_name(), t)); - new_tgts.push_back(t); } void Builder::usage(const char *reason, const char *argv0, bool brief) @@ -417,52 +381,6 @@ void Builder::usage(const char *reason, const char *argv0, bool brief) } } -FS::Path Builder::get_package_location(const string &name) -{ - if(verbose>=3) - IO::print("Looking for package %s\n", name); - - try - { - // Try to get source directory with pkgconfig - string srcdir = strip(run_pkgconfig(name, "source")); - if(!srcdir.empty()) - return srcdir; - } - catch(...) - { } - - if(pkg_dirs.empty()) - { - for(list::const_iterator i=pkg_path.begin(); i!=pkg_path.end(); ++i) - { - list files = list_files(*i); - for(list::const_iterator j=files.begin(); j!=files.end(); ++j) - { - FS::Path full = *i / *j; - if(FS::exists(full/"Build")) - pkg_dirs.push_back(full); - } - } - if(verbose>=3) - IO::print("%d packages found in path\n", pkg_dirs.size()); - } - - bool msp = !name.compare(0, 3, "msp"); - for(list::const_iterator i=pkg_dirs.begin(); i!=pkg_dirs.end(); ++i) - { - string base = basename(*i); - unsigned dash = base.rfind('-'); - - if(!base.compare(0, dash, name)) - return *i; - else if(msp && !base.compare(0, dash-3, name, 3, string::npos)) - return *i; - } - - return FS::Path(); -} - int Builder::load_build_file(const FS::Path &fn) { if(!FS::exists(fn)) @@ -470,8 +388,7 @@ int Builder::load_build_file(const FS::Path &fn) IO::BufferedFile in(fn.str()); - if(verbose>=3) - IO::print("Reading %s\n", fn); + logger.log("files", format("Reading %s", fn)); DataFile::Parser parser(in, fn.str()); Loader loader(*this, fn.subpath(0, fn.size()-1)); @@ -493,7 +410,8 @@ int Builder::create_targets() Target *tarballs = new VirtualTarget(*this, "tarballs"); world->add_depend(tarballs); - for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) + const PackageManager::PackageMap &packages = package_manager.get_packages(); + for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) if(i->second && i->second->is_configured()) i->second->create_targets(); @@ -536,7 +454,7 @@ int Builder::create_targets() i->second->force_rebuild(); } - for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i) + for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) if(SourcePackage *spkg = dynamic_cast(i->second)) spkg->get_deps_cache().save(); @@ -554,11 +472,10 @@ int Builder::do_build() if(!total) { - IO::print("Already up to date\n"); + logger.log("summary", "Already up to date"); return 0; } - if(verbose>=1) - IO::print("Will build %d target%s\n", total, (total!=1 ? "s" : "")); + logger.log("summary", format("Will build %d target%s", total, (total!=1 ? "s" : ""))); vector tasks; @@ -575,12 +492,11 @@ int Builder::do_build() if(tgt) { if(tgt->get_tool()) - IO::print("%-4s %s\n", tgt->get_tool()->get_tag(), tgt->get_name()); + logger.log("tasks", format("%-4s %s", tgt->get_tool()->get_tag(), tgt->get_name())); Task *task = tgt->build(); if(task) { - if(verbose>=2) - IO::print("%s\n", task->get_command()); + logger.log("commands", format("%s", task->get_command())); if(dry_run) { task->signal_finished.emit(true); @@ -624,9 +540,9 @@ int Builder::do_build() if(show_progress) IO::print("\033[K"); if(fail) - IO::print("Build failed\n"); + logger.log("summary", "Build failed"); else if(show_progress) - IO::print("Build complete\n"); + logger.log("summary", "Build complete"); return fail; } @@ -703,7 +619,6 @@ void Builder::Loader::binpkg(const string &n) { BinaryPackage *pkg = new BinaryPackage(bld, n); load_sub(*pkg); - bld.packages.insert(PackageMap::value_type(n, pkg)); } void Builder::Loader::cross_prefix(const string &a, const string &p) @@ -726,7 +641,6 @@ void Builder::Loader::package(const string &n) bld.main_pkg = pkg; load_sub(*pkg); - bld.packages.insert(PackageMap::value_type(n, pkg)); }