X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=7704a9634a0e7b086276086ddac50a236a3fc9d8;hb=dad4c41302de525a1456e9d5b738831487c8acac;hp=37ad766fe26c7a3ba501caef1c3217c730534a89;hpb=782df8c2a38d9f88d30fecc525d72c45db8efa8e;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index 37ad766..7704a96 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -1,23 +1,14 @@ -/* $Id$ - -This file is part of builder -Copyright © 2006-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include #include -#include #include #include #include #include #include #include -#include #include #include -#include +#include #include #include #include @@ -114,7 +105,7 @@ Builder::Builder(int argc, char **argv): else if(analyze_mode=="rdeps") analyzer->set_mode(Analyzer::RDEPS); else - throw UsageError("Invalid analyze mode"); + throw usage_error("Invalid analyze mode"); analyzer->set_max_depth(max_depth); analyzer->set_full_paths(full_paths); @@ -243,33 +234,42 @@ int Builder::main() return 0; } - if(!conf_only && create_targets()) - return 1; - - PackageList all_reqs = main_pkg->collect_requires(); - if(conf_only) return 0; + 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); } + if(verbose>=1) - IO::print("%d active packages, %d targets\n", all_reqs.size(), targets.size()); + { + 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(verbose>=2) { - for(PackageList::const_iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i) + for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) { - IO::print(" %s", (*i)->get_name()); - if(dynamic_cast(*i)) + if(!i->second->is_configured()) + continue; + + 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) - if(j->second->get_package()==*i) + if(j->second->get_package()==i->second) { ++count; if(j->second->get_rebuild()) @@ -328,7 +328,7 @@ string Builder::run_pkgconfig(const string &pkg, const string &what) int status; string res = run_command(argv, &status); if(status) - throw Exception(format("pkg-config for package %s failed", pkg)); + throw runtime_error(format("pkg-config for package %s failed", pkg)); return res; } @@ -370,13 +370,20 @@ Package *Builder::get_package(const string &name) Target *Builder::get_target(const string &n) const { - // XXX Used for getting targets by path. get_target(const FS::Path &)? TargetMap::const_iterator i = targets.find(n); if(i!=targets.end()) return i->second; return 0; } +FileTarget *Builder::get_target_by_path(const FS::Path &p) const +{ + TargetMap::const_iterator i = targets_by_path.find(p.str()); + if(i!=targets_by_path.end()) + return static_cast(i->second); + return 0; +} + Target *Builder::get_header(const string &include, const FS::Path &from, const list &path) { string hash(8, 0); @@ -454,6 +461,10 @@ Target *Builder::get_library(const string &lib, const list &path, LibMod { syspath.push_back("/lib"); syspath.push_back("/usr/lib"); + if(current_arch->match_name("pc-32-linux")) + syspath.push_back("/usr/lib/i386-linux-gnu"); + else if(current_arch->match_name("pc-64-linux")) + syspath.push_back("/usr/lib/x86_64-linux-gnu"); } else syspath.push_back("/usr/"+current_arch->get_cross_prefix()+"/lib"); @@ -491,16 +502,15 @@ void Builder::problem(const string &p, const string &d) problems.push_back(Problem(p, d)); } -void Builder::add_target(FileTarget *t) +void Builder::add_target(Target *t) { - targets.insert(TargetMap::value_type(t->get_path().str(), t)); + targets.insert(TargetMap::value_type(t->get_name(), t)); new_tgts.push_back(t); } -void Builder::add_target(VirtualTarget *t) +void Builder::register_path(const FS::Path &path, FileTarget *t) { - targets.insert(TargetMap::value_type(t->get_name(), t)); - new_tgts.push_back(t); + targets_by_path.insert(TargetMap::value_type(path.str(), t)); } void Builder::usage(const char *reason, const char *argv0, bool brief) @@ -578,7 +588,7 @@ int Builder::load_build_file(const FS::Path &fn) Loader loader(*this, fn.subpath(0, fn.size()-1)); loader.load(parser); } - catch(const IO::FileNotFound &) + catch(const IO::file_not_found &) { return -1; } @@ -599,10 +609,12 @@ int Builder::create_targets() Target *tarballs = new VirtualTarget(*this, "tarballs"); world->add_depend(tarballs); - PackageList all_reqs = main_pkg->collect_requires(); - for(PackageList::iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i) + for(PackageMap::const_iterator i=packages.begin(); i!=packages.end(); ++i) { - SourcePackage *spkg = dynamic_cast(*i); + if(!i->second || !i->second->is_configured()) + continue; + + SourcePackage *spkg = dynamic_cast(i->second); if(!spkg) continue; @@ -630,7 +642,7 @@ int Builder::create_targets() // Apply what-ifs for(StringList::iterator i=what_if.begin(); i!=what_if.end(); ++i) { - FileTarget *tgt = dynamic_cast(get_target((cwd/ *i).str())); + FileTarget *tgt = get_target_by_path(cwd/ *i); if(!tgt) { IO::print(IO::cerr, "Unknown what-if target %s\n", *i); @@ -641,19 +653,19 @@ int Builder::create_targets() // Make the cmdline target depend on all targets mentioned on the command line Target *cmdline = new VirtualTarget(*this, "cmdline"); - bool build_world = false; for(list::iterator i=cmdline_targets.begin(); i!=cmdline_targets.end(); ++i) { Target *tgt = get_target(*i); if(!tgt) - tgt = get_target((cwd/ *i).str()); + tgt = get_target_by_path(*i); + if(!tgt) + tgt = get_target_by_path(cwd/ *i); if(!tgt) { IO::print("I don't know anything about %s\n", *i); return -1; } - if(tgt==world) - build_world = true; + cmdline->add_depend(tgt); } @@ -668,7 +680,7 @@ int Builder::create_targets() Target *Builder::get_header(const FS::Path &fn) { - Target *tgt = get_target(fn.str()); + Target *tgt = get_target_by_path(fn); if(tgt) return tgt; if(FS::is_reg(fn)) @@ -704,8 +716,8 @@ Target *Builder::get_library(const string &lib, const FS::Path &path, LibMode mo for(StringList::iterator i=candidates.begin(); i!=candidates.end(); ++i) { - string full = (path/ *i).str(); - Target *tgt = get_target(full); + FS::Path full = path/ *i; + Target *tgt = get_target_by_path(full); if(tgt) { @@ -720,7 +732,7 @@ Target *Builder::get_library(const string &lib, const FS::Path &path, LibMode mo } else if(FS::is_reg(full)) { - tgt = new SystemLibrary(*this, full); + tgt = new SystemLibrary(*this, full.str()); return tgt; } } @@ -858,7 +870,6 @@ void Builder::package_help() } } -Application::RegApp Builder::reg; string Builder::usagemsg; string Builder::helpmsg;