X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=723930a315b3c6e16c9d30192e4847762c5b5a26;hb=b6dcf65b5e1b99f6c65454358c7610f3e9c8af2b;hp=8cb836abed682b9b49bf5541bc11f83f8f2b9ec3;hpb=40eb101a642b9ed2e898eec39e0916fa71066b23;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index 8cb836a..723930a 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -1,12 +1,11 @@ #include #include #include -#include -#include #include #include #include #include +#include #include #include #include "action.h" @@ -30,10 +29,15 @@ using namespace Msp; Builder::Builder(int argc, char **argv): analyzer(0), do_build(false), + dry_run(false), + help(false), verbose(1), chrome(false), build_file("Build"), - jobs(1) + jobs(1), + conf_all(false), + conf_only(false), + build_all(false) { string analyze_mode; string work_dir; @@ -85,7 +89,7 @@ Builder::Builder(int argc, char **argv): { unsigned equal=i->find('='); if(equal!=string::npos) - cmdline_options.insert(RawOptionMap::value_type(i->substr(0, equal), i->substr(equal+1))); + cmdline_options.insert(StringMap::value_type(i->substr(0, equal), i->substr(equal+1))); else cmdline_targets.push_back(*i); } @@ -97,6 +101,35 @@ 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-")); + + StringMap &native_tools=tools.insert(ToolMap::value_type("native", StringMap())).first->second; + native_tools.insert(StringMap::value_type("CC", "gcc")); + native_tools.insert(StringMap::value_type("CXX", "g++")); + native_tools.insert(StringMap::value_type("LD", "gcc")); + native_tools.insert(StringMap::value_type("LDXX", "g++")); + native_tools.insert(StringMap::value_type("AR", "ar")); + + StringMap &release_profile=profile_tmpl.insert(ProfileTemplateMap::value_type("release", StringMap())).first->second; + release_profile.insert(StringMap::value_type("optimize", "3")); + release_profile.insert(StringMap::value_type("outdir", "$profile")); + + StringMap &debug_profile=profile_tmpl.insert(ProfileTemplateMap::value_type("debug", StringMap())).first->second; + debug_profile.insert(StringMap::value_type("debug", "1")); + debug_profile.insert(StringMap::value_type("outdir", "$profile")); + + for(StringMap::iterator i=archs.begin(); i!=archs.end(); ++i) + { + if(i->first=="native") + continue; + + StringMap &arch_profile=profile_tmpl.insert(ProfileTemplateMap::value_type(i->first, StringMap())).first->second; + arch_profile.insert(StringMap::value_type("arch", i->first)); + arch_profile.insert(StringMap::value_type("prefix", "$HOME/local/$arch")); + } } /** @@ -205,12 +238,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 +270,48 @@ 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; +} + +string Builder::get_tool(const std::string &tool, const std::string &arch) +{ + ToolMap::iterator i=tools.find(arch); + if(i!=tools.end()) + { + StringMap::iterator j=i->second.find(tool); + if(j!=i->second.end()) + return j->second; + } + + // Either the arch, or the tool within the arch was not found + i=tools.find("native"); + StringMap::iterator j=i->second.find(tool); + if(j==i->second.end()) + throw InvalidParameterValue("Unknown tool"); + + return get_arch_prefix(arch)+j->second; +} + +void Builder::apply_profile_template(Config &config, const string &pt) const +{ + vector parts=split(pt, '-'); + + for(vector::iterator i=parts.begin(); i!=parts.end(); ++i) + { + ProfileTemplateMap::const_iterator j=profile_tmpl.find(*i); + if(j==profile_tmpl.end()) + continue; + + config.update(j->second); + } +} + int Builder::main() { if(load_build_file(cwd/build_file)) @@ -265,18 +339,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 +491,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() && i->second->get_install_flags()) + 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 +671,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 +787,9 @@ int Builder::build() } } + if(fail) + cout<<"Build failed\n"; + return fail?-1:0; }