]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
Add profile templates
[builder.git] / source / builder.cpp
index 1afc741ef59ee3c9b6c060c55800dea0238f97f0..723930a315b3c6e16c9d30192e4847762c5b5a26 100644 (file)
@@ -1,12 +1,11 @@
 #include <fstream>
 #include <iostream>
 #include <msp/progress.h>
-#include <msp/strconv.h>
-#include <msp/strutils.h>
 #include <msp/core/error.h>
 #include <msp/getopt++/getopt++.h>
 #include <msp/parser/parser.h>
 #include <msp/path/utils.h>
+#include <msp/strings/utils.h>
 #include <msp/time/units.h>
 #include <msp/time/utils.h>
 #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);
        }
@@ -101,6 +105,31 @@ Builder::Builder(int argc, char **argv):
        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"));
+       }
 }
 
 /**
@@ -250,6 +279,39 @@ const string &Builder::get_arch_prefix(const string &arch) const
        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<string> parts=split(pt, '-');
+
+       for(vector<string>::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))