throw invalid_argument("GnuCompiler::GnuCompiler");
set_command((tag=="CXX" ? "g++" : "gcc"), true);
+ set_run(_run);
}
Target *GnuCompiler::create_source(const Component &comp, const FS::Path &path) const
return new CSourceFile(builder, path);
}
-Target *GnuCompiler::create_target(const list<Target *> &sources, const string &)
+Target *GnuCompiler::create_target(const vector<Target *> &sources, const string &)
{
if(sources.size()!=1)
- throw invalid_argument("GnuCCompiler::create_target");
+ throw invalid_argument("GnuCompiler::create_target");
SourceFile &source = dynamic_cast<SourceFile &>(*sources.front());
ObjectFile *obj = new ObjectFile(builder, *source.get_component(), source);
obj->set_tool(*this);
if(!executable)
return string();
- string result = FS::basename(executable->get_path());
+ string result = Tool::create_build_signature(binfo);
if(!architecture->get_cpu().empty())
{
result += ",m";
result += architecture->get_cpu();
}
- result += ',';
+ if(binfo.debug || binfo.optimize)
+ result += ',';
if(binfo.debug)
result += 'g';
if(binfo.optimize)
void GnuCompiler::do_prepare()
{
- executable = builder.get_vfs().find_binary(command);
prepare_syspath();
prepare_version();
}
argv.push_back("--sysroot="+sysroot.str());
argv.push_back("-");
- builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end())));
+ builder.get_logger().log("auxcommands", "Running %s", join(argv.begin(), argv.end()));
try
{
string output = ExternalTask::run_and_capture_output(argv, FS::Path(), true);
else if(record_path)
{
FS::Path path = strip(output.substr(start, newline-start));
- builder.get_logger().log("tools", format("Got %s system path: %s", tag, path));
+ builder.get_logger().log("tools", "Got %s system path: %s", tag, path);
system_path.push_back(path);
}
start = newline+1;
if(!path_found)
{
- builder.get_logger().log("tools", format("No %s system path found, using defaults", tag));
+ builder.get_logger().log("tools", "No %s system path found, using defaults", tag);
if(!sysroot.empty())
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");
+ system_path.push_back(format("/usr/%s/include", architecture->get_cross_prefix()));
}
}
prepare_version("-dumpversion");
if(version>=0x70000)
prepare_version("-dumpfullversion");
- builder.get_logger().log("tools", format("%s version is %d.%d.%d", FS::basename(executable->get_path()), version>>16, (version>>8)&0xFF, version&0xFF));
+ builder.get_logger().log("tools", "%s version is %d.%d.%d", FS::basename(executable->get_path()), version>>16, (version>>8)&0xFF, version&0xFF);
}
void GnuCompiler::prepare_version(const string &arg)
argv.push_back(executable->get_path().str());
argv.push_back(arg);
- builder.get_logger().log("auxcommands", format("Running %s", join(argv.begin(), argv.end())));
+ builder.get_logger().log("auxcommands", "Running %s", join(argv.begin(), argv.end()));
try
{
string version_str = strip(ExternalTask::run_and_capture_output(argv));
{ }
}
-Task *GnuCompiler::run(const Target &target) const
+Task *GnuCompiler::_run(const ObjectFile &object)
{
- const ObjectFile &object = dynamic_cast<const ObjectFile &>(target);
+ const GnuCompiler &tool = dynamic_cast<const GnuCompiler &>(*object.get_tool());
+ const Architecture &arch = *tool.get_architecture();
ExternalTask::Arguments argv;
- argv.push_back(executable->get_path().str());
+ argv.push_back(tool.get_executable()->get_path().str());
argv.push_back("-c");
BuildInfo binfo;
- target.collect_build_info(binfo);
+ object.collect_build_info(binfo);
- string tag_for_std = (tag=="OBJC" ? "CC" : tag);
+ const std::string &tool_tag = tool.get_tag();
+ string tag_for_std = (tool_tag=="OBJC" ? "CC" : tool_tag);
if(binfo.standards.count(tag_for_std))
- argv.push_back("-std="+get_item(binfo.standards, tag_for_std));
- if(tag=="OBJC" && binfo.standards.count(tag))
- argv.push_back("-fobjc-std="+get_item(binfo.standards, tag));
+ argv.push_back("-std="+get_item(binfo.standards, tag_for_std).str());
+ if(tool_tag=="OBJC" && binfo.standards.count(tool_tag))
+ argv.push_back("-fobjc-std="+get_item(binfo.standards, tool_tag).str());
if(binfo.warning_level>=1)
{
{
argv.push_back("-Wextra");
argv.push_back("-Wundef");
- if(version>=0x80000)
+ if(tool.version>=0x80000)
argv.push_back("-Wno-cast-function-type");
}
if(binfo.warning_level>=3)
argv.push_back("-pedantic");
argv.push_back("-Wno-long-long");
argv.push_back("-Wshadow");
- if(tag=="CC")
+ if(tool_tag=="CC")
{
argv.push_back("-Wc++-compat");
argv.push_back("-Wstrict-prototypes");
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)
+ for(const FS::Path &p: binfo.local_incpath)
{
argv.push_back("-iquote");
- argv.push_back(i->str());
+ argv.push_back(p.str());
}
- for(BuildInfo::PathList::const_iterator i=binfo.incpath.begin(); i!=binfo.incpath.end(); ++i)
- argv.push_back("-I"+i->str());
+ for(const FS::Path &p: binfo.incpath)
+ argv.push_back("-I"+p.str());
- for(BuildInfo::DefineMap::const_iterator i=binfo.defines.begin(); i!=binfo.defines.end(); ++i)
+ for(const auto &kvp: binfo.defines)
{
- if(i->second.empty())
- argv.push_back(format("-D%s", i->first));
+ if(kvp.second.empty())
+ argv.push_back(format("-D%s", kvp.first));
else
- argv.push_back(format("-D%s=%s", i->first, i->second));
+ argv.push_back(format("-D%s=%s", kvp.first, kvp.second));
}
if(binfo.debug)
if(binfo.debug)
argv.push_back("-fno-omit-frame-pointer");
}
- if(binfo.threads && architecture->get_system()!="windows" && architecture->get_system()!="darwin")
+ if(binfo.threads && arch.get_system()!="windows" && arch.get_system()!="darwin")
argv.push_back("-pthread");
- if(object.is_used_in_shared_library() && architecture->get_system()!="windows")
+ if(object.is_used_in_shared_library() && arch.get_system()!="windows")
argv.push_back("-fPIC");
- if((architecture->get_type()=="x86" || architecture->get_type()=="ppc") && !architecture->is_native())
- argv.push_back(format("-m%d", architecture->get_bits()));
+ if((arch.get_type()=="x86" || arch.get_type()=="ppc") && !arch.is_native())
+ argv.push_back(format("-m%d", arch.get_bits()));
- string cpu = architecture->get_cpu();
+ string cpu = arch.get_cpu();
if(!cpu.empty())
{
for(unsigned i=0; cpus[i]; i+=2)
argv.push_back("-march="+cpu);
}
- if(!architecture->get_fpu().empty())
+ if(!arch.get_fpu().empty())
{
- if(architecture->get_type()=="x86")
+ if(arch.get_type()=="x86")
{
- argv.push_back("-mfpmath="+architecture->get_fpu());
- if(architecture->get_fpu()=="sse")
+ if(arch.get_fpu()=="387")
+ argv.push_back("-mfpmath=387");
+ else if(!arch.get_fpu().compare(0, 3, "sse"))
+ argv.push_back("-mfpmath=sse");
+
+ if(arch.get_fpu()=="sse")
argv.push_back("-msse2");
+ else if(arch.get_fpu()=="sse3")
+ argv.push_back("-msse3");
+ else if(arch.get_fpu()=="sse4.1")
+ argv.push_back("-msse4.1");
}
- else if(architecture->get_type()=="arm")
+ else if(arch.get_type()=="arm")
{
- argv.push_back("-mfpu="+architecture->get_fpu());
+ argv.push_back("-mfpu="+arch.get_fpu());
argv.push_back("-mfloat-abi=softfp");
}
}