]> git.tdb.fi Git - builder.git/blobdiff - source/gnucompiler.cpp
Don't rely on component type in determining whether to use -fPIC
[builder.git] / source / gnucompiler.cpp
index bff5f8cd145106520005052184d04da274e4ae90..a86cb59d0567b06f4e88c07a72e2ddbd4dd17d49 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");
@@ -81,7 +86,9 @@ Task *GnuCompiler::run(const Target &target) const
        argv.push_back(executable->get_path().str());
        argv.push_back("-c");
 
-       const BuildInfo &binfo = comp.get_build_info_for_path(object.get_source().get_path());
+       BuildInfo binfo;
+       target.collect_build_info(binfo);
+
        if(binfo.warning_level>=1)
        {
                argv.push_back("-Wall");
@@ -113,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");
@@ -120,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())
@@ -127,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)
@@ -138,11 +151,11 @@ Task *GnuCompiler::run(const Target &target) const
        }
        if(binfo.threads && architecture->get_system()!="windows" && architecture->get_system()!="darwin")
                argv.push_back("-pthread");
-       if((comp.get_type()==Component::LIBRARY || comp.get_type()==Component::MODULE) && architecture->get_system()!="windows")
+       if(object.is_used_in_shared_library() && architecture->get_system()!="windows")
                argv.push_back("-fPIC");
 
        const Architecture &native_arch = builder.get_native_arch();
-       if(architecture->get_bits()!=native_arch.get_bits())
+       if(architecture->is_native() && architecture->get_bits()!=native_arch.get_bits())
                argv.push_back(format("-m%d", architecture->get_bits()));
 
        const string &cpu = architecture->get_cpu();