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 -fshort-enums ";
if (settings.CompileSettings.DebugInformation)
{
result += "-ggdb3 ";
}
if (file == null || file.Extension == ".cpp")
{
switch (settings.CompileSettings.CppLanguageStandard)
{
case CppLanguageStandard.Cpp98:
result += "-std=c++98 ";
break;
case CppLanguageStandard.Cpp03:
result += "-std=c++03 ";
break;
case CppLanguageStandard.Cpp11:
result += "-std=c++11 ";
break;
case CppLanguageStandard.Cpp14:
result += "-std=c++14 ";
break;
case CppLanguageStandard.Cpp17:
result += "-std=c++17 ";
break;
default:
break;
}
}
if (file == null || file.Extension == ".c")
{
switch (settings.CompileSettings.CLanguageStandard)
{
case CLanguageStandard.C89:
result += "-std=c89 ";
break;
case CLanguageStandard.C99:
result += "-std=c99 ";
break;
case CLanguageStandard.C11:
result += "-std=c11 ";
break;
}
}
switch (settings.CompileSettings.Fpu)
{
case FPUSupport.Soft:
result += "-mfpu=fpv4-sp-d16 -mfloat-abi=softfp ";
break;
case FPUSupport.Hard:
result += "-mfpu=fpv4-sp-d16 -mfloat-abi=hard ";
break;
}
// 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 ";
}
}
}
switch (settings.CompileSettings.Fpu)
{
case FPUSupport.Soft:
{
result += "-mfpu=fpv4-sp-d16 -mfloat-abi=softfp ";
}
break;
case FPUSupport.Hard:
{
result += "-mfpu=fpv4-sp-d16 -mfloat-abi=hard ";
}
break;
}
// TODO make this an option.
result += "-ffunction-sections -fdata-sections ";
switch (settings.CompileSettings.Optimization)
{
case OptimizationLevel.None:
{
result += "-O0 ";
}
break;
case OptimizationLevel.Debug:
{
result += "-O2 ";
}
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 + " ";
// 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);
}
var toolchainIncludes = GetToolchainIncludes(file);
foreach (var include in toolchainIncludes)
{
result += string.Format("-isystem\"{0}\" ", include);
}
// 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);
}
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;
}