X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=7825a20c85dbd091a845e232ac3a1a7764e6c08f;hb=57bdb055acb0453c75b22cb64f35cc0e817a2827;hp=8cb836abed682b9b49bf5541bc11f83f8f2b9ec3;hpb=40eb101a642b9ed2e898eec39e0916fa71066b23;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index 8cb836a..7825a20 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -97,6 +97,10 @@ Builder::Builder(int argc, char **argv): chdir(work_dir.c_str()); cwd=Path::getcwd(); + + archs.insert(StringMap::value_type("native", "")); + archs.insert(StringMap::value_type("arm", "arm-linux-gnu-")); + archs.insert(StringMap::value_type("win32", "i586-mingw32msvc-")); } /** @@ -205,12 +209,11 @@ 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 / shared mode - 0: always shared, 1: static for buildable - packages, otherwise shared, 2: always static +@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, unsigned mode) +Target *Builder::get_library(const string &lib, const list &path, LibMode mode) { string hash(8, 0); for(list::const_iterator i=path.begin(); i!=path.end(); ++i) @@ -238,6 +241,15 @@ Target *Builder::get_library(const string &lib, const list &path, unsign return tgt; } +const string &Builder::get_arch_prefix(const string &arch) const +{ + StringMap::const_iterator i=archs.find(arch); + if(i==archs.end()) + throw InvalidParameterValue("Unknown architecture"); + + return i->second; +} + int Builder::main() { if(load_build_file(cwd/build_file)) @@ -265,18 +277,24 @@ int Builder::main() return 0; } - StringList missing; + StringMap problems; for(PackageMap::iterator i=packages.begin(); i!=packages.end(); ++i) + { + string prob; if(!i->second) - missing.push_back(i->first); + prob="missing"; + else if(i->second->get_buildable() && i->second->get_arch()!=default_pkg->get_arch()) + prob="wrong architecture ("+i->second->get_arch()+")"; + if(!prob.empty()) + problems.insert(StringMap::value_type(i->first, prob)); + } - if(!missing.empty()) + if(!problems.empty()) { - missing.sort(); - cerr<<"The following packages were not found on the system:\n"; - for(list::iterator i=missing.begin(); i!=missing.end(); ++i) - cerr<<" "<<*i<<'\n'; - cerr<<"Please install them and try again.\n"; + cerr<<"The following problems were detected:\n"; + for(StringMap::iterator i=problems.begin(); i!=problems.end(); ++i) + cerr<<" "<first<<": "<second<<'\n'; + cerr<<"Please fix them and try again.\n"; return 1; } @@ -411,8 +429,8 @@ int Builder::create_targets() continue; Path::Path inst_base; - if(i->second->get_config().is_option("prefix")) - inst_base=i->second->get_config().get_option("prefix").value; + if(i->second->get_buildable()) + inst_base=i->second->get_prefix(); const ComponentList &components=i->second->get_components(); for(ComponentList::const_iterator j=components.begin(); j!=components.end(); ++j) @@ -591,17 +609,17 @@ Target *Builder::get_header(const Msp::Path::Path &fn) return 0; } -Target *Builder::get_library(const string &lib, const Path::Path &path, unsigned mode) +Target *Builder::get_library(const string &lib, const Path::Path &path, LibMode mode) { string full; - if(mode>=1) + if(mode!=DYNAMIC) { full=(path/("lib"+lib+".a")).str(); Target *tgt=get_target(full); // Targets can only be associated with buildable packages (or no package at all) - if(tgt && (tgt->get_package() || mode==2)) return tgt; + if(tgt && (tgt->get_package() || mode==ALL_STATIC)) return tgt; } - if(mode<=1) + if(mode!=ALL_STATIC) { full=(path/("lib"+lib+".so")).str(); Target *tgt=get_target(full); @@ -707,6 +725,9 @@ int Builder::build() } } + if(fail) + cout<<"Build failed\n"; + return fail?-1:0; }