X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=3838ae5c0ba14813cb0c3ae795ad7c1f40649d60;hb=242c55b17e6608b29a77ca17a5b677e202a3ca90;hp=dda6c6148df51a7c726f1b1bf0e1258d9c48104e;hpb=77461a8c0e2b5686b04cf15f3a9333b215813992;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index dda6c61..3838ae5 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of builder -Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions +Copyright © 2006-2009 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -41,6 +41,17 @@ Distributed under the LGPL using namespace std; using namespace Msp; +namespace { + +void update_hash(string &hash, const string &value) +{ + for(unsigned i=0; isecond; + for(TargetMap::iterator i=targets.begin(); i!=targets.end(); ++i) + delete i->second; + delete analyzer; +} -@param name Package name +int Builder::main() +{ + if(load_build_file(cwd/build_file)) + { + cerr<<"No build info here.\n"; + return 1; + } + + main_pkg->configure(cmdline_options, conf_all?2:1); + + if(help) + { + usage(0, "builder", false); + cout<<'\n'; + package_help(); + return 0; + } + + if(!conf_only && create_targets()) + return 1; + + PackageList all_reqs=main_pkg->collect_requires(); + + if(conf_only) + return 0; + + if(verbose>=2) + cout<<"Building on "<get_name()<<", for "<get_name()<<'\n'; + if(verbose>=1) + cout<=2) + { + for(PackageList::const_iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i) + { + cout<<' '<<(*i)->get_name(); + if(dynamic_cast(*i)) + cout<<'*'; + unsigned count=0; + unsigned ood_count=0; + for(TargetMap::iterator j=targets.begin(); j!=targets.end(); ++j) + if(j->second->get_package()==*i) + { + ++count; + if(j->second->get_rebuild()) + ++ood_count; + } + if(count) + { + cout<<" ("<analyze(); + + if(!problems.empty()) + { + cerr<<"The following problems were detected:\n"; + for(ProblemList::iterator i=problems.begin(); i!=problems.end(); ++i) + cerr<<" "<package<<": "<descr<<'\n'; + cerr<<"Please fix them and try again.\n"; + return 1; + } + + //if(create_makefile + + if(clean) + exit_code=do_clean(); + else if(build) + exit_code=do_build(); + + return exit_code; +} -@return Pointer to the package, or 0 if the package could not be located -*/ Package *Builder::get_package(const string &name) { PackageMap::iterator i=packages.find(format("%s/%s", name, current_arch->get_name())); @@ -206,9 +298,6 @@ Package *Builder::get_package(const string &name) return pkg; } -/** -Returns the target with the given name, or 0 if no such target exists. -*/ Target *Builder::get_target(const string &n) const { TargetMap::const_iterator i=targets.find(n); @@ -217,12 +306,6 @@ Target *Builder::get_target(const string &n) const return 0; } -/** -Tries to locate a header included from a given location and with a given include -path. Considers known targets as well as existing files. If a matching target -is not found but a file exists, a new SystemHeader target will be created and -returned. -*/ Target *Builder::get_header(const string &include, const string &from, const list &path) { string hash(8, 0); @@ -278,17 +361,6 @@ Target *Builder::get_header(const string &include, const string &from, const lis return tgt; } -/** -Tries to locate a library with the given library path. Considers known targets -as well as existing files. If a matching target is not found but a file exists, -a new SystemLibrary target will be created and returned. - -@param lib Name of the library to get (without "lib" prefix or extension) -@param path List of paths to search for the library -@param mode Shared / static mode - -@return Some kind of library target, if a match was found -*/ Target *Builder::get_library(const string &lib, const list &path, LibMode mode) { string hash(8, 0); @@ -351,104 +423,12 @@ void Builder::problem(const string &p, const string &d) problems.push_back(Problem(p, d)); } -/** -Adds a target to both the target map and the new target queue. Called from -Target constructor. -*/ void Builder::add_target(Target *t) { targets.insert(TargetMap::value_type(t->get_name(), t)); new_tgts.push_back(t); } -int Builder::main() -{ - if(load_build_file(cwd/build_file)) - { - cerr<<"No build info here.\n"; - return 1; - } - - main_pkg->configure(cmdline_options, conf_all?2:1); - - if(help) - { - usage(0, "builder", false); - cout<<'\n'; - package_help(); - return 0; - } - - if(!conf_only && create_targets()) - return 1; - - PackageList all_reqs=main_pkg->collect_requires(); - - if(conf_only) - return 0; - - if(verbose>=2) - cout<<"Building on "<get_name()<<", for "<get_name()<<'\n'; - if(verbose>=1) - cout<=2) - { - for(PackageList::const_iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i) - { - cout<<' '<<(*i)->get_name(); - if(dynamic_cast(*i)) - cout<<'*'; - unsigned count=0; - unsigned ood_count=0; - for(TargetMap::iterator j=targets.begin(); j!=targets.end(); ++j) - if(j->second->get_package()==*i) - { - ++count; - if(j->second->get_rebuild()) - ++ood_count; - } - if(count) - { - cout<<" ("<analyze(); - - if(!problems.empty()) - { - cerr<<"The following problems were detected:\n"; - for(ProblemList::iterator i=problems.begin(); i!=problems.end(); ++i) - cerr<<" "<package<<": "<descr<<'\n'; - cerr<<"Please fix them and try again.\n"; - return 1; - } - - //if(create_makefile - - if(clean) - exit_code=do_clean(); - else if(build) - exit_code=do_build(); - - return exit_code; -} - -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; -} - void Builder::usage(const char *reason, const char *argv0, bool brief) { if(reason) @@ -485,10 +465,6 @@ void Builder::usage(const char *reason, const char *argv0, bool brief) } } -/** -Determines the source directory of a package. pkg-config is consulted first, -and if it fails, the package path is searched for matches. -*/ FS::Path Builder::get_package_location(const string &name) { if(verbose>=3) @@ -536,13 +512,6 @@ FS::Path Builder::get_package_location(const string &name) return FS::Path(); } -/** -Loads the given build file. - -@param fn Path to the file - -@return 0 on success, -1 if the file could not be opened -*/ int Builder::load_build_file(const FS::Path &fn) { try @@ -564,12 +533,6 @@ int Builder::load_build_file(const FS::Path &fn) return 0; } -/** -Creates targets for all packages and prepares them for building. - -@return 0 if everything went ok, -1 if something bad happened and a build - shouldn't be attempted -*/ int Builder::create_targets() { Target *world=new VirtualTarget(*this, "world"); @@ -644,8 +607,10 @@ int Builder::create_targets() } /* If world is to be built, prepare cmdline. If not, add cmdline to world - and prepare world. I don't really like this, but it keeps the graph - acyclic. */ + and prepare world. I don't really like this, but it keeps the graph + acyclic. + + XXX Could we skip preparing targets we are not interested in? */ if(build_world) cmdline->prepare(); else @@ -661,10 +626,6 @@ int Builder::create_targets() return 0; } -/** -Check if a header exists, either as a target or a file. Either an existing -target or a new SystemHeader target will be returned. -*/ Target *Builder::get_header(const Msp::FS::Path &fn) { Target *tgt=get_target(fn.str()); @@ -728,19 +689,6 @@ Target *Builder::get_library(const string &lib, const FS::Path &path, LibMode mo return 0; } -/** -Updates a hash with a string. This is used from get_header and get_library. -*/ -void Builder::update_hash(string &hash, const string &value) -{ - for(unsigned i=0; iget_config();