]> git.tdb.fi Git - builder.git/commitdiff
Add sysroot support for BuildInfo and compilers
authorMikko Rasa <tdb@tdb.fi>
Fri, 3 Oct 2014 22:04:28 +0000 (01:04 +0300)
committerMikko Rasa <tdb@tdb.fi>
Fri, 3 Oct 2014 22:04:28 +0000 (01:04 +0300)
Embedded SDKs commonly ship with a sysroot to use with their compilers.
It might also come useful for compiling things for different Linux
distributions.

12 files changed:
source/buildinfo.cpp
source/buildinfo.h
source/gnuccompiler.cpp
source/gnuccompiler.h
source/gnucompiler.cpp
source/gnucompiler.h
source/gnucxxcompiler.cpp
source/gnucxxcompiler.h
source/gnulinker.cpp
source/gnulinker.h
source/gnuobjccompiler.cpp
source/gnuobjccompiler.h

index d346fe693299ca520fd658967581514bbb187335..2246ad4b2d7a5ce97ac35997b951f427ab61982c 100644 (file)
@@ -57,6 +57,7 @@ void BuildInfo::update_from(const BuildInfo &bi, UpdateLevel level)
        threads = bi.threads;
        if(level==LOCAL)
        {
+               sysroot = bi.sysroot;
                local_incpath.insert(local_incpath.begin(), bi.local_incpath.begin(), bi.local_incpath.end());
                libmode = bi.libmode;
                for(LibModeMap::const_iterator i=bi.libmodes.begin(); i!=bi.libmodes.end(); ++i)
@@ -87,6 +88,7 @@ BuildInfo::Loader::Loader(BuildInfo &bi):
        add("local_incpath", &Loader::local_incpath);
        add("optimize", &BuildInfo::optimize);
        add("strip",    &BuildInfo::strip);
+       add("sysroot",  &Loader::sysroot);
        add("threads",  &BuildInfo::threads);
        add("warning_level", &BuildInfo::warning_level);
        add("fatal_warnings", &BuildInfo::fatal_warnings);
@@ -122,6 +124,11 @@ void BuildInfo::Loader::local_incpath(const string &s)
        obj.local_incpath.push_back(s);
 }
 
+void BuildInfo::Loader::sysroot(const string &s)
+{
+       obj.sysroot = s;
+}
+
 
 void operator>>(const LexicalConverter &conv, BuildInfo::LibraryMode &libmode)
 {
index ee831f3c4da453dfdfc3c16567e5350a9174026d..691ec549589889aeca464aab8be32c3c88892af0 100644 (file)
@@ -32,6 +32,7 @@ public:
                void libpath(const std::string &);
                void library(const std::string &);
                void local_incpath(const std::string &);
+               void sysroot(const std::string &);
        };
        
        enum UpdateLevel
@@ -72,6 +73,7 @@ public:
        typedef std::list<std::string> WordList;
        typedef std::map<std::string, LibraryMode> LibModeMap;
 
+       Tracked<Msp::FS::Path> sysroot;
        DefineMap defines;
        PathList incpath;
        PathList local_incpath;
index cedea1050bb7390df3d6e3424c2bcb916a2f0c75..0210a6c4e4e152e2713854a2beebc38972b1e915 100644 (file)
@@ -4,8 +4,8 @@
 using namespace std;
 using namespace Msp;
 
-GnuCCompiler::GnuCCompiler(Builder &b, const Architecture &a):
-       GnuCompiler(b, a, "CC")
+GnuCCompiler::GnuCCompiler(Builder &b, const Architecture &a, const FS::Path &sysroot):
+       GnuCompiler(b, a, "CC", sysroot)
 {
        set_command("gcc", true);
        input_suffixes.push_back(".c");
index c533337f38c85ddafe3f37aa9201e65ad39dc753..c0b570156e652509d6d29e7b459e7a03154257ea 100644 (file)
@@ -9,7 +9,7 @@ The GNU C compiler, commonly known as gcc.
 class GnuCCompiler: public GnuCompiler
 {
 public:
-       GnuCCompiler(Builder &, const Architecture &);
+       GnuCCompiler(Builder &, const Architecture &, const Msp::FS::Path & = Msp::FS::Path());
 
        virtual Target *create_source(const Component &, const Msp::FS::Path &) const;
        virtual Target *create_source(const Msp::FS::Path &) const;
index 16e24c0090c5bf43a45cd3d69a0559ddcb56acd9..1b05a5cb6e99b459ff9f4f3ea3a63f3a8378295f 100644 (file)
 using namespace std;
 using namespace Msp;
 
-GnuCompiler::GnuCompiler(Builder &b, const Architecture &a, const string &t):
+GnuCompiler::GnuCompiler(Builder &b, const Architecture &a, const string &t, const FS::Path &sysroot):
        Tool(b, a, t)
 {
-       if(architecture->is_native())
+       if(!sysroot.empty())
+       {
+               build_info.sysroot = sysroot;
+               system_path.push_back(sysroot/"usr/include");
+       }
+       else if(architecture->is_native())
                system_path.push_back("/usr/include");
        else
                system_path.push_back("/usr/"+architecture->get_cross_prefix()+"/include");
@@ -115,6 +120,10 @@ Task *GnuCompiler::run(const Target &target) const
                if(binfo.fatal_warnings)
                        argv.push_back("-Werror");
        }
+
+       const FS::Path &sysroot = binfo.sysroot;
+       if(!sysroot.empty())
+               argv.push_back("--sysroot="+sysroot.str());
        for(BuildInfo::PathList::const_iterator i=binfo.local_incpath.begin(); i!=binfo.local_incpath.end(); ++i)
        {
                argv.push_back("-iquote");
@@ -122,6 +131,7 @@ Task *GnuCompiler::run(const Target &target) const
        }
        for(BuildInfo::PathList::const_iterator i=binfo.incpath.begin(); i!=binfo.incpath.end(); ++i)
                argv.push_back("-I"+i->str());
+
        for(BuildInfo::DefineMap::const_iterator i=binfo.defines.begin(); i!=binfo.defines.end(); ++i)
        {
                if(i->second.empty())
@@ -129,6 +139,7 @@ Task *GnuCompiler::run(const Target &target) const
                else
                        argv.push_back(format("-D%s=%s", i->first, i->second));
        }
+
        if(binfo.debug)
                argv.push_back("-ggdb");
        if(binfo.optimize)
index 9f0304d82daa0408c4ae3817b36d7b828a5d4ee7..cd6aa52b6c8b73ca96b459c2d549554972d54137 100644 (file)
@@ -15,7 +15,7 @@ class GnuCompiler: public Tool
 protected:
        std::string version;
 
-       GnuCompiler(Builder &, const Architecture &, const std::string &);
+       GnuCompiler(Builder &, const Architecture &, const std::string &, const Msp::FS::Path & = Msp::FS::Path());
 
 public:
        virtual Target *create_target(const std::list<Target *> &, const std::string &);
index af001b3b569cfcd68e06dd67b5a4f16b4a6320af..d1d05d8b80b9ce6b5b1da5a24b8b0491c4f5a899 100644 (file)
@@ -5,8 +5,8 @@
 using namespace std;
 using namespace Msp;
 
-GnuCxxCompiler::GnuCxxCompiler(Builder &b, const Architecture &a):
-       GnuCompiler(b, a, "CXX")
+GnuCxxCompiler::GnuCxxCompiler(Builder &b, const Architecture &a, const FS::Path &sysroot):
+       GnuCompiler(b, a, "CXX", sysroot)
 {
        set_command("g++", true);
        input_suffixes.push_back(".cpp");
index 04c1fb22b5b2d5c38d5a056edf289b028d7fda1f..491307ecc7fb9f59ede6acea0903106a48d53c87 100644 (file)
@@ -9,7 +9,7 @@ The GNU C++ compiler, commonly known as g++.
 class GnuCxxCompiler: public GnuCompiler
 {
 public:
-       GnuCxxCompiler(Builder &, const Architecture &);
+       GnuCxxCompiler(Builder &, const Architecture &, const Msp::FS::Path & = Msp::FS::Path());
 
        virtual Target *create_source(const Component &, const Msp::FS::Path &) const;
        virtual Target *create_source(const Msp::FS::Path &) const;
index 2d7438d61b547e01f137c0905c049ed7f1f7d89d..e266a8ea6123a53e59d4d06cc3666a04dbc7dc22 100644 (file)
 using namespace std;
 using namespace Msp;
 
-GnuLinker::GnuLinker(Builder &b, const Architecture &a):
+GnuLinker::GnuLinker(Builder &b, const Architecture &a, const FS::Path &sysroot):
        Tool(b, a, "LINK")
 {
        input_suffixes.push_back(".o");
        input_suffixes.push_back(".a");
 
-       if(architecture->is_native())
+       if(!sysroot.empty())
+       {
+               build_info.sysroot = sysroot;
+               system_path.push_back(sysroot/"usr"/"lib");
+       }
+       else if(architecture->is_native())
        {
                system_path.push_back("/lib");
                system_path.push_back("/usr/lib");
@@ -201,6 +206,11 @@ Task *GnuLinker::Linker::run(const Target &target) const
 
        BuildInfo binfo;
        target.collect_build_info(binfo);
+
+       const FS::Path &sysroot = binfo.sysroot;
+       if(!sysroot.empty())
+               argv.push_back("--sysroot="+sysroot.str());
+
        for(BuildInfo::PathList::const_iterator i=binfo.libpath.begin(); i!=binfo.libpath.end(); ++i)
                argv.push_back("-L"+i->str());
        if(binfo.strip)
index 4673c070f2f725e007510201925b65b9ceea49c4..8d63538631adff8e27e45eba49f58a00082ca777 100644 (file)
@@ -34,7 +34,7 @@ private:
        Linker *cxx_linker;
 
 public:
-       GnuLinker(Builder &, const Architecture &);
+       GnuLinker(Builder &, const Architecture &, const Msp::FS::Path & = Msp::FS::Path());
        ~GnuLinker();
 
        virtual Target *create_target(const std::list<Target *> &, const std::string &);
index 228eecb5249a91452ff76cb1f17147ef409f4365..16e5215c1c0d6528e9c12c7a4ef5a004d56d5bf5 100644 (file)
@@ -3,8 +3,8 @@
 
 using namespace Msp;
 
-GnuObjCCompiler::GnuObjCCompiler(Builder &b, const Architecture &a):
-       GnuCompiler(b, a, "OBJC")
+GnuObjCCompiler::GnuObjCCompiler(Builder &b, const Architecture &a, const FS::Path &sysroot):
+       GnuCompiler(b, a, "OBJC", sysroot)
 {
        set_command("gcc", true);
        input_suffixes.push_back(".m");
index 11fbd9132a3fe46fdda1d68743a2d10165e6ece4..d82da03d9e1488fdc1249cd6ad411807e79b9771 100644 (file)
@@ -6,7 +6,7 @@
 class GnuObjCCompiler: public GnuCompiler
 {
 public:
-       GnuObjCCompiler(Builder &, const Architecture &);
+       GnuObjCCompiler(Builder &, const Architecture &, const Msp::FS::Path & = Msp::FS::Path());
 
        virtual Target *create_source(const Component &, const Msp::FS::Path &) const;
        virtual Target *create_source(const Msp::FS::Path &) const;