Files
FlaxEngine/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs
Wojtek Figat 7606c9ac12 Update minimum CPU arch requirement on Windows to AVX2 with SSE4.2
94.48% support on PC according to Steam Hardware & Software Survey: May 2025 (https://store.steampowered.com/hwsurvey/)
2025-06-12 17:03:19 +02:00

299 lines
8.3 KiB
C#

// Copyright (c) Wojciech Figat. All rights reserved.
using System;
using System.Collections.Generic;
namespace Flax.Build.NativeCpp
{
/// <summary>
/// The compilation optimization hint.
/// </summary>
public enum FavorSizeOrSpeed
{
/// <summary>
/// The default option.
/// </summary>
Neither,
/// <summary>
/// The fast code.
/// </summary>
FastCode,
/// <summary>
/// The small code.
/// </summary>
SmallCode
}
/// <summary>
/// The code sanitizers for core errors detection by compiler-supported checks.
/// </summary>
[Flags]
public enum Sanitizer
{
/// <summary>
/// No sanitizers in use.
/// </summary>
None = 0,
/// <summary>
/// Memory errors detector,
/// </summary>
Address = 1,
/// <summary>
/// Data races and deadlocks detector.
/// </summary>
Thread = 2,
/// <summary>
/// Uninitialized memory reads detector.
/// </summary>
Memory = 4,
/// <summary>
/// Undefined behavior (UB) detector.
/// </summary>
Undefined = 8,
}
/// <summary>
/// The compilation optimization hint.
/// </summary>
public enum CppVersion
{
/// <summary>
/// C++14
/// </summary>
Cpp14,
/// <summary>
/// C++17
/// </summary>
Cpp17,
/// <summary>
/// C++20
/// </summary>
Cpp20,
/// <summary>
/// The latest version supported by the compiler.
/// </summary>
Latest,
}
/// <summary>
/// The SIMD architecture to use for code generation.
/// </summary>
public enum CpuArchitecture
{
/// <summary>
/// No specific architecture set.
/// </summary>
None,
/// <summary>
/// Intel Advanced Vector Extensions.
/// </summary>
AVX,
/// <summary>
/// Enables Intel Advanced Vector Extensions 2.
/// </summary>
AVX2,
/// <summary>
/// Intel Advanced Vector Extensions 512.
/// </summary>
AVX512,
/// <summary>
/// Intel Streaming SIMD Extensions 2.
/// </summary>
SSE2,
/// <summary>
/// Intel Streaming SIMD Extensions 4.2.
/// </summary>
SSE4_2,
/// <summary>
/// ARM Neon.
/// </summary>
NEON,
}
/// <summary>
/// The C++ compilation environment required to build source files in the native modules.
/// </summary>
public class CompileEnvironment : ICloneable
{
/// <summary>
/// C++ standard version to use for compilation.
/// </summary>
public CppVersion CppVersion = CppVersion.Cpp14;
/// <summary>
/// Selects a predefined set of options that affect the size and speed of generated code.
/// </summary>
public FavorSizeOrSpeed FavorSizeOrSpeed = FavorSizeOrSpeed.Neither;
/// <summary>
/// Selects a sanitizers to use (as flags).
/// </summary>
public Sanitizer Sanitizers = Sanitizer.None;
/// <summary>
/// SIMD architecture to use.
/// </summary>
public CpuArchitecture CpuArchitecture = CpuArchitecture.None;
/// <summary>
/// Enables exceptions support.
/// </summary>
public bool EnableExceptions = false;
/// <summary>
/// Enables RTTI.
/// </summary>
public bool RuntimeTypeInfo = true;
/// <summary>
/// Enables functions inlining support.
/// </summary>
public bool Inlining = false;
/// <summary>
/// Enables code optimization.
/// </summary>
public bool Optimization = false;
/// <summary>
/// Enables the whole program optimization.
/// </summary>
public bool WholeProgramOptimization = false;
/// <summary>
/// Enables functions level linking support.
/// </summary>
public bool FunctionLevelLinking = false;
/// <summary>
/// Enables debug information generation.
/// </summary>
public bool DebugInformation = false;
/// <summary>
/// Hints to use Debug version of the standard library.
/// </summary>
public bool UseDebugCRT = false;
/// <summary>
/// Hints to compile code for WinRT.
/// </summary>
public bool CompileAsWinRT = false;
/// <summary>
/// Enables WinRT component extensions.
/// </summary>
public bool WinRTComponentExtensions = false;
/// <summary>
/// Enables documentation generation.
/// </summary>
public bool GenerateDocumentation = false;
/// <summary>
/// Enables runtime checks.
/// </summary>
public bool RuntimeChecks = false;
/// <summary>
/// Enables string pooling.
/// </summary>
public bool StringPooling = false;
/// <summary>
/// Enables the compiler intrinsic functions.
/// </summary>
public bool IntrinsicFunctions = false;
/// <summary>
/// Enables buffer security checks.
/// </summary>
public bool BufferSecurityCheck = true;
/// <summary>
/// Hints to treat warnings as errors.
/// </summary>
public bool TreatWarningsAsErrors = false;
/// <summary>
/// The collection of defines with preprocessing symbol for a source files.
/// </summary>
public readonly HashSet<string> PreprocessorDefinitions = new HashSet<string>();
/// <summary>
/// The additional paths to add to the list of directories searched for include files.
/// </summary>
public readonly List<string> IncludePaths = new List<string>();
/// <summary>
/// The collection of custom arguments to pass to the compilator.
/// </summary>
public readonly HashSet<string> CustomArgs = new HashSet<string>();
/// <summary>
/// The Precompiled Header File (PCH) usage.
/// </summary>
public PrecompiledHeaderFileUsage PrecompiledHeaderUsage = PrecompiledHeaderFileUsage.None;
/// <summary>
/// The Precompiled Header File (PCH) binary path. Null if not created.
/// </summary>
public string PrecompiledHeaderFile;
/// <summary>
/// The Precompiled Header File (PCH) source path. Null if not provided.
/// </summary>
public string PrecompiledHeaderSource;
/// <inheritdoc />
public object Clone()
{
var clone = new CompileEnvironment
{
CppVersion = CppVersion,
FavorSizeOrSpeed = FavorSizeOrSpeed,
Sanitizers = Sanitizers,
CpuArchitecture = CpuArchitecture,
EnableExceptions = EnableExceptions,
RuntimeTypeInfo = RuntimeTypeInfo,
Inlining = Inlining,
Optimization = Optimization,
WholeProgramOptimization = WholeProgramOptimization,
FunctionLevelLinking = FunctionLevelLinking,
DebugInformation = DebugInformation,
UseDebugCRT = UseDebugCRT,
CompileAsWinRT = CompileAsWinRT,
WinRTComponentExtensions = WinRTComponentExtensions,
GenerateDocumentation = GenerateDocumentation,
RuntimeChecks = RuntimeChecks,
StringPooling = StringPooling,
IntrinsicFunctions = IntrinsicFunctions,
BufferSecurityCheck = BufferSecurityCheck,
TreatWarningsAsErrors = TreatWarningsAsErrors,
PrecompiledHeaderUsage = PrecompiledHeaderUsage,
PrecompiledHeaderFile = PrecompiledHeaderFile,
PrecompiledHeaderSource = PrecompiledHeaderSource,
};
clone.PreprocessorDefinitions.AddRange(PreprocessorDefinitions);
clone.IncludePaths.AddRange(IncludePaths);
clone.CustomArgs.AddRange(CustomArgs);
return clone;
}
}
}