X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuildercli.cpp;h=41a2429a48aba8307c00553bb45583c183134e7c;hb=5e00719d0c63e306786ff36df61797cdbc86f3e9;hp=0a84364c988e69bee2925f405573fcff63e66d74;hpb=c7df14c38a87ceca13df47fa700d3f9fa250be91;p=builder.git diff --git a/source/buildercli.cpp b/source/buildercli.cpp index 0a84364..41a2429 100644 --- a/source/buildercli.cpp +++ b/source/buildercli.cpp @@ -39,7 +39,7 @@ BuilderCLI::BuilderCLI(int argc, char **argv): bool no_externals = false; unsigned verbose = 1; bool silent = false; - list log_channels; + vector log_channels; string build_type; GetOpt getopt; @@ -95,12 +95,9 @@ BuilderCLI::BuilderCLI(int argc, char **argv): logger.enable_channel("files"); logger.enable_channel("auxcommands"); } - 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); - } + for(const string &c: log_channels) + for(const string &p: split(c, ',')) + logger.enable_channel(p); builder.set_logger(&logger); if(!analyze_mode.empty()) @@ -124,18 +121,6 @@ BuilderCLI::BuilderCLI(int argc, char **argv): else if(!clean && !create_makefile) build = true; - for(NameList::iterator i=cmdline_targets.begin(); i!=cmdline_targets.end(); ) - { - string::size_type equal = i->find('='); - if(equal!=string::npos) - { - cmdline_options.insert(Config::InputOptions::value_type(i->substr(0, equal), i->substr(equal+1))); - cmdline_targets.erase(i++); - } - else - ++i; - } - if(!work_dir.empty()) FS::chdir(work_dir); @@ -151,12 +136,12 @@ BuilderCLI::BuilderCLI(int argc, char **argv): builder.set_architecture(tolower(arch)); - list start_files; + vector start_files; start_files.push_back(FS::get_sys_data_dir()/"builderrc"); start_files.push_back(FS::get_user_data_dir()/"rc"); - for(list::const_iterator i=start_files.begin(); i!=start_files.end(); ++i) - if(FS::exists(*i)) - builder.load_build_file(*i); + for(const FS::Path &f: start_files) + if(FS::exists(f)) + builder.load_build_file(f); if(!prefix.empty()) builder.set_prefix(cwd/prefix); @@ -170,12 +155,18 @@ BuilderCLI::BuilderCLI(int argc, char **argv): builder.add_default_tools(); const Toolchain &toolchain = builder.get_toolchain(); - for(Config::InputOptions::iterator i=cmdline_options.begin(); i!=cmdline_options.end(); ) + for(auto i=cmdline_targets.begin(); i!=cmdline_targets.end(); ) { - if(toolchain.has_tool(i->first)) + string::size_type equal = i->find('='); + if(equal!=string::npos) { - toolchain.get_tool(i->first).set_command(i->second); - cmdline_options.erase(i++); + string key = i->substr(0, equal); + string value = i->substr(equal+1); + if(toolchain.has_tool(key)) + toolchain.get_tool(key).set_command(value); + else + cmdline_options.insert({ key, value }); + i = cmdline_targets.erase(i); } else ++i; @@ -212,47 +203,45 @@ int BuilderCLI::main() return 0; } - if(!prepare_build()) - return 1; - - if(conf_only) - return 0; - const Architecture &native_arch = builder.get_native_arch(); const Architecture ¤t_arch = builder.get_current_arch(); - 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", builder.get_prefix())); + logger.log("environment", "Building on %s, for %s%s", native_arch.get_name(), + current_arch.get_name(), (current_arch.is_native() ? " (native)" : "")); + logger.log("environment", "Prefix is %s", builder.get_prefix()); const FS::Path &tempdir = builder.get_temp_directory(); if(tempdir.is_absolute()) - logger.log("environment", format("Temporary directory is %s", tempdir)); + logger.log("environment", "Temporary directory is %s", tempdir); else - logger.log("environment", format("Using per-package temporary directory %s", tempdir)); + logger.log("environment", "Using per-package temporary directory %s", tempdir); const BuildType &build_type = builder.get_build_type(); - logger.log("environment", format("Build type is %s", build_type.get_name())); + logger.log("environment", "Build type is %s", build_type.get_name()); + + if(!prepare_build()) + return 1; + + if(conf_only) + return 0; BuildGraph &build_graph = builder.get_build_graph(); PackageManager &package_manager = builder.get_package_manager(); - const PackageManager::PackageMap &packages = package_manager.get_packages(); - list package_details; - for(PackageManager::PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) + vector package_details; + for(const auto &kvp: package_manager.get_packages()) { - if(!i->second->is_prepared()) + if(!kvp.second->is_prepared()) continue; - string line = i->second->get_name(); - if(dynamic_cast(i->second)) + string line = kvp.second->get_name(); + if(dynamic_cast(kvp.second)) { line += '*'; unsigned count = 0; unsigned to_be_built = 0; - const BuildGraph::TargetMap &targets = build_graph.get_targets(); - for(BuildGraph::TargetMap::const_iterator j=targets.begin(); j!=targets.end(); ++j) - if(j->second->get_package()==i->second) + for(const auto &kvp2: build_graph.get_targets()) + if(kvp2.second->get_package()==kvp.second) { ++count; - if(j->second->needs_rebuild()) + if(kvp2.second->needs_rebuild()) ++to_be_built; } if(count) @@ -267,19 +256,19 @@ int BuilderCLI::main() package_details.push_back(line); } - logger.log("summary", format("%d active packages, %d targets", package_details.size(), build_graph.get_targets().size())); - for(list::const_iterator i=package_details.begin(); i!=package_details.end(); ++i) - logger.log("packages", *i); + logger.log("summary", "%d active packages, %d targets", package_details.size(), build_graph.get_targets().size()); + for(const string &d: package_details) + logger.log("packages", d); if(analyzer) analyzer->analyze(); if(build_graph.get_goals().is_broken()) { - list problems = builder.collect_problems(); + vector problems = builder.collect_problems(); IO::print(IO::cerr, "The following problems were detected:\n"); - for(list::const_iterator i=problems.begin(); i!=problems.end(); ++i) - IO::print(IO::cerr, " %s\n", *i); + for(const string &p: problems) + IO::print(IO::cerr, " %s\n", p); if(!analyzer) IO::print(IO::cerr, "Please fix them and try again.\n"); return 1; @@ -307,12 +296,12 @@ bool BuilderCLI::prepare_build() package_manager.get_main_package().prepare(); // Add targets from command line as goals - for(NameList::iterator i=cmdline_targets.begin(); i!=cmdline_targets.end(); ++i) + for(const string &t: cmdline_targets) { - Target *tgt = resolve_target(*i); + Target *tgt = resolve_target(t); if(!tgt) { - IO::print("I don't know anything about %s\n", *i); + IO::print("I don't know anything about %s\n", t); return false; } @@ -322,12 +311,12 @@ bool BuilderCLI::prepare_build() build_graph.prepare(); // Apply what-ifs - for(NameList::iterator i=what_if.begin(); i!=what_if.end(); ++i) + for(const string &w: what_if) { - FileTarget *tgt = dynamic_cast(resolve_target(*i)); + FileTarget *tgt = dynamic_cast(resolve_target(w)); if(!tgt) { - IO::print(IO::cerr, "Unknown what-if target %s\n", *i); + IO::print(IO::cerr, "Unknown what-if target %s\n", w); return false; } tgt->touch(); @@ -358,34 +347,35 @@ void BuilderCLI::package_help() SourcePackage &main_pkg = dynamic_cast(package_manager.get_main_package()); const Config &config = main_pkg.get_config(); - const Config::OptionMap &options = config.get_options(); - - IO::print("\nRequired packages:\n "); + const auto &options = config.get_options(); const Package::Requirements &requires = main_pkg.get_required_packages(); - for(Package::Requirements::const_iterator i=requires.begin(); i!=requires.end(); ++i) + + if(!requires.empty() || !options.empty()) + IO::print("\nHelp for package %s:\n", main_pkg.get_name()); + + if(!requires.empty()) { - if(i!=requires.begin()) - IO::print(", "); - IO::print((*i)->get_name()); + IO::print("\nRequired packages:\n "); + for(auto i=requires.begin(); i!=requires.end(); ++i) + { + if(i!=requires.begin()) + IO::print(", "); + IO::print((*i)->get_name()); + } + IO::print("\n"); } - IO::print("\n"); if(!options.empty()) { IO::print("\nPackage configuration:\n"); - for(Config::OptionMap::const_iterator i=options.begin(); i!=options.end(); ++i) + for(const auto &kvp: options) { - const Config::Option &opt = i->second; + const Config::Option &opt = kvp.second; string line = format(" %s: %s (%s)", opt.name, opt.description, opt.value); if(!opt.choices.empty()) { line += " {"; - for(list::const_iterator j=opt.choices.begin(); j!=opt.choices.end(); ++j) - { - if(j!=opt.choices.begin()) - line += ' '; - line += *j; - } + line += join(opt.choices.begin(), opt.choices.end(), " "); line += '}'; } else if(opt.value!=opt.default_value)