using static Facepunch.Constants;
namespace Facepunch.Steps;
///
/// Build type options for the native build process
///
public enum BuildConfiguration
{
///
/// Developer build with all components needed for development
///
Developer,
///
/// Developer build with memory debugging enabled
///
DeveloperMemoryDebug,
///
/// Retail build with optimizations for release
///
Retail
}
///
/// Step to build the native code components
///
internal class BuildNative( string name, BuildConfiguration configuration = BuildConfiguration.Developer, bool clean = false ) : Step( name )
{
private readonly Platform platform = Platform.Create();
protected override ExitCode RunInternal()
{
// Build strategy based on build type
if ( configuration == BuildConfiguration.Retail )
{
return BuildRetail();
}
else
{
return BuildDeveloper();
}
}
private ExitCode CompileSolution( string solutionName, bool forceRebuild = false )
{
if ( !platform.CompileSolution( solutionName, forceRebuild ) )
{
Log.Error( $"Failed to build {solutionName}." );
return ExitCode.Failure;
}
return ExitCode.Success;
}
private ExitCode BuildRetail()
{
Log.Info( "Starting Retail build..." );
// Ignore clean flag and don't rebuild on CI
bool forceRebuild = clean && !Utility.IsCi();
if ( CompileSolution( "schemacompiler_all", forceRebuild ) != ExitCode.Success )
return ExitCode.Failure;
if ( CompileSolution( $"buildbot_all_{platform.PlatformID}", forceRebuild ) != ExitCode.Success )
return ExitCode.Failure;
// For tools, we always use rebuild in retail mode regardless of the CleanBuild setting
if ( platform is WindowsPlatform )
{
if ( CompileSolution( $"buildbot_tools_{platform.PlatformID}", true ) != ExitCode.Success )
return ExitCode.Failure;
}
return ExitCode.Success;
}
private ExitCode BuildDeveloper()
{
Log.Info( "Starting Developer build..." );
if ( CompileSolution( "schemacompiler_all", clean ) != ExitCode.Success )
return ExitCode.Failure;
if ( CompileSolution( $"developer_all_{platform.PlatformID}", clean ) != ExitCode.Success )
return ExitCode.Failure;
return ExitCode.Success;
}
}