public override string GetCompilerArguments(IStandardProject superProject, IStandardProject project, ISourceFile file)
{
var result = string.Empty;
//var settings = GetSettings(project).CompileSettings;
var settings = GetSettings(superProject);
result += "-Wall -c ";
if (settings.CompileSettings.DebugInformation)
{
result += "-g ";
}
// TODO remove dependency on file?
if (file != null)
{
if (file.Extension == ".cpp")
{
if (!settings.CompileSettings.Rtti)
{
result += "-fno-rtti ";
}
if (!settings.CompileSettings.Exceptions)
{
result += "-fno-exceptions ";
}
result += "-std=c++14 ";
}
}
// TODO make this an option.
result += "-ffunction-sections -fdata-sections ";
switch (settings.CompileSettings.Optimization)
{
case OptimizationLevel.None:
{
result += "-O0 ";
}
break;
case OptimizationLevel.Debug:
{
result += "-Og ";
}
break;
case OptimizationLevel.Level1:
{
result += "-O1 ";
}
break;
case OptimizationLevel.Level2:
{
result += "-O2 ";
}
break;
case OptimizationLevel.Level3:
{
result += "-O3 ";
}
break;
}
switch (settings.CompileSettings.OptimizationPreference)
{
case OptimizationPreference.Size:
{
result += "-Os ";
}
break;
case OptimizationPreference.Speed:
{
result += "-Ofast ";
}
break;
}
result += settings.CompileSettings.CustomFlags + " ";
// toolchain includes
// Referenced includes
var referencedIncludes = project.GetReferencedIncludes();
foreach (var include in referencedIncludes)
{
result += string.Format("-I\"{0}\" ", Path.Combine(project.CurrentDirectory, include));
}
// global includes
var globalIncludes = superProject.GetGlobalIncludes();
foreach (var include in globalIncludes)
{
result += string.Format("-I\"{0}\" ", include);
}
// public includes
foreach (var include in project.PublicIncludes)
{
result += string.Format("-I\"{0}\" ", Path.Combine(project.CurrentDirectory, include));
}
// includes
foreach (var include in project.Includes)
{
result += string.Format("-I\"{0}\" ", Path.Combine(project.CurrentDirectory, include.Value));
}
var referencedDefines = project.GetReferencedDefines();
foreach (var define in referencedDefines)
{
result += string.Format("-D{0} ", define);
}
// global includes
var globalDefines = superProject.GetGlobalDefines();
foreach (var define in globalDefines)
{
result += string.Format("-D{0} ", define);
}
foreach (var define in project.Defines)
{
result += string.Format("-D{0} ", define.Value);
}
if (Platform.PlatformIdentifier == PlatformID.Win32NT)
{
result += string.Format("-D{0} ", "WIN32NT");
}
foreach (var arg in superProject.ToolChainArguments)
{
result += string.Format(" {0}", arg);
}
foreach (var arg in superProject.CompilerArguments)
{
result += string.Format(" {0}", arg);
}
// TODO factor out this code from here!
if (file != null)
{
switch (file.Extension)
{
case ".c":
{
foreach (var arg in superProject.CCompilerArguments)
{
result += string.Format(" {0}", arg);
}
}
break;
case ".cpp":
{
foreach (var arg in superProject.CppCompilerArguments)
{
result += string.Format(" {0}", arg);
}
}
break;
}
}
return result;
}