FASTBuild Configuration

Overview

FASTBuild has been robust enough for some time, such that it is now used for its own development. The configuration shown here is used by FASTBuild to compile itself.

The example shows how to configure:

  • Multiple targets (debug & release)
  • Multiple platforms (x86 & x64)
  • Unity/Blobs to accelerate compilation
  • Unit Tests
  • Caching
  • Configuration
    ; FBuild ;------------------------------------------------------------------------------- ;------------------------------------------------------------------------------- ; Windows Platform ;------------------------------------------------------------------------------- .VSBasePath = '../External/SDK/VS11.0' .WindowsSDKBasePath = '../External/SDK/Windows8.0' ;------------------------------------------------------------------------------- ; Settings ;------------------------------------------------------------------------------- Settings { .CachePath = "C:\.fbuild.cache" } .OutputBase = '..\tmp' .BaseIncludePaths = ' /I"./"' + ' /I"$VSBasePath$/VC/include/"' + ' /I"$WindowsSDKBasePath$/include/um"' + ' /I"$WindowsSDKBasePath$/include/shared"' .BaseDefines = ' /D"WIN32_LEAN_AND_MEAN" /D_WIN32' .CompilerOptions = '%1 /Fo%2 /W4 /WX /Z7 /nologo /c $BaseDefines$' .LibrarianOptions = '/NODEFAULTLIB /WX /NOLOGO /OUT:%2 %1' .LinkerOptions = '/NODEFAULTLIB /WX /NOLOGO /OUT:%2 %1' + ' /IGNORE:4001' ; don't complain about linking libs only + ' /DEBUG' + ' /SUBSYSTEM:CONSOLE' + " kernel32.lib" + " Ws2_32.lib" + " LIBCMT.LIB" + " User32.lib" ;------------------------------------------------------------------------------- ; Unity/Blob files (shared across configs) ;------------------------------------------------------------------------------- Unity( "TestFramework-UnityGenerate" ) { .UnityInputPath = "TestFramework\" .UnityOutputPath = "$OutputBase$\Unity\TestFramework\" } Unity( "Core-UnityGenerate" ) { .UnityInputPath = "Core\" .UnityInputExcludePath = 'Core\CoreTest\' .UnityOutputPath = "$OutputBase$\Unity\Core\" } Unity( "CoreTest-UnityGenerate" ) { .UnityInputPath = "Core\CoreTest\" .UnityOutputPath = "$OutputBase$\Unity\Core\CoreTest\" } Unity( "FBuildCore-UnityGenerate" ) { .UnityInputPath = "Tools\FBuild\FBuildCore\" .UnityOutputPath = "$OutputBase$\Unity\Tools\FBuild\FBuildCore\" } Unity( "FBuildApp-UnityGenerate" ) { .UnityInputPath = "Tools\FBuild\FBuildApp\" .UnityOutputPath = "$OutputBase$\Unity\Tools\FBuild\FBuildApp\" } Unity( "FBuildTest-UnityGenerate" ) { .UnityInputPath = "Tools\FBuild\FBuildTest\" .UnityInputExcludePath = "Tools\FBuild\FBuildTest\Data\" .UnityOutputPath = "$OutputBase$\Unity\Tools\FBuild\FBuildTest\" } ;------------------------------------------------------------------------------- ; x86/x64 ;------------------------------------------------------------------------------- .Platforms = { 'x86', 'x64' } .PlatformDefines = { '/DWIN32', '/DWIN64' } .PlatformCompilers = { '$VSBasePath$\VC\bin\cl.exe', '$VSBasePath$\VC\bin\x86_amd64\cl.exe' } .PlatformLibrarians = { '$VSBasePath$\VC\bin\lib.exe', '$VSBasePath$\VC\bin\x86_amd64\lib.exe' } .PlatformLinkers = { '$VSBasePath$\VC\bin\link.exe', '$VSBasePath$\VC\bin\x86_amd64\link.exe' } .PlatformLinkerOptions = { '/MACHINE:X86 /LIBPATH:"$WindowsSDKBasePath$/lib/win8/um/x86" /LIBPATH:"$VSBasePath$/VC/lib"', '/MACHINE:X64 /LIBPATH:"$WindowsSDKBasePath$/lib/win8/um/x64" /LIBPATH:"$VSBasePath$/VC/lib/amd64"' } ForEach( .Platform in .Platforms, .PlatformDefine in .PlatformDefines .PlatformCompiler in .PlatformCompilers, .PlatformLibrarian in .PlatformLibrarians, .PlatformLinker in .PlatformLinkers, .PlatformLinkerOption in .PlatformLinkerOptions ) { .Compiler = '$PlatformCompiler$' .CompilerOptions + ' $PlatformDefine$' .Librarian = '$PlatformLibrarian$' .Linker = '$PlatformLinker$' .LinkerOptions + ' $PlatformLinkerOption$' ;------------------------------------------------------------------------------- ; Debug/Release ;------------------------------------------------------------------------------- .Configs = { 'Debug', 'Release' } .ConfigDefines = { '/DDEBUG', '/DRELEASE' } .ConfigCompilerOptions = { '/MTd /Od /RTC1 /GS /Oy-', '/MT /Ox /Oy /Oi /GS- /GF /GL /Gy' } .ConfigLibrarianOptions = { '', '/LTCG' } .ConfigLinkerOptions = { '', '/LTCG /OPT:REF,ICF' } ForEach( .Config in .Configs, .ConfigDefine in .ConfigDefines, .ConfigCompilerOption in .ConfigCompilerOptions, .ConfigLibrarianOption in .ConfigLibrarianOptions, .ConfigLinkerOption in .ConfigLinkerOptions ) { .CompilerOptions + ' $ConfigDefine$' + ' $BaseIncludePaths$' + ' $ConfigCompilerOption$' .LibrarianOptions + ' $ConfigLibrarianOption$' .LinkerOptions + ' $ConfigLinkerOption$' .OutputBase + '\$Platform$\$Config$' ;------------------------------------------------------------------------------- ; TestFramework ;------------------------------------------------------------------------------- Library( 'TestFramework-$Platform$-$Config$-Unity' ) { .CompilerInputUnity = 'TestFramework-UnityGenerate' .CompilerOutputPath = '$OutputBase$\TestFramework\' .CompilerOptions + ' /EHsc' .LibrarianOutput = '$OutputBase$\TestFramework\TestFramework-Unity.lib' } ;------------------------------------------------------------------------------- ; Core ;------------------------------------------------------------------------------- Library( 'Core-$Platform$-$Config$-Unity' ) { .CompilerInputUnity = 'Core-UnityGenerate' .CompilerOutputPath = '$OutputBase$\Core\' .LibrarianOutput = '$OutputBase$\Core\Core-Unity.lib' } ;------------------------------------------------------------------------------- ; CoreTest ;------------------------------------------------------------------------------- Library( 'CoreTest-$Platform$-$Config$-Unity' ) { .CompilerInputUnity = 'CoreTest-UnityGenerate' .CompilerOutputPath = '$OutputBase$\Core\CoreTest\' .LibrarianOutput = '$OutputBase$\Core\CoreTest\CoreTest-Unity.lib' } Executable( 'CoreTest-Exe-$Platform$-$Config$' ) { .Libraries = { "Core-$Platform$-$Config$-Unity", "CoreTest-$Platform$-$Config$-Unity", "TestFrameWork-$Platform$-$Config$-Unity" } .LinkerOutput = '$OutputBase$\Core\CoreTest\CoreTest.exe' } Test( "CoreTest-Test-$Platform$-$Config$" ) { .TestOutput = "$OutputBase$\Core\CoreTest\TestOutput.txt" .TestExecutable = "$OutputBase$\Core\CoreTest\CoreTest.exe" } ;------------------------------------------------------------------------------- ; FBuildCore ;------------------------------------------------------------------------------- Library( 'FBuildCore-$Platform$-$Config$-Unity' ) { .CompilerInputUnity = 'FBuildCore-UnityGenerate' .CompilerOutputPath = '$OutputBase$\Tools\FBuild\FBuildCore\' .LibrarianOutput = '$OutputBase$\Tools\FBuild\FBuildCore\FBuildCore-Unity.lib' } ;------------------------------------------------------------------------------- ; FBuildApp ;------------------------------------------------------------------------------- Library( 'FBuildApp-$Platform$-$Config$-Unity' ) { .CompilerInputUnity = 'FBuildApp-UnityGenerate' .CompilerOutputPath = '$OutputBase$\Tools\FBuild\FBuildApp\' .LibrarianOutput = '$OutputBase$\Tools\FBuild\FBuildApp\FBuildApp-Unity.lib' } Executable( 'FBuildApp-Exe-$Platform$-$Config$' ) { .Libraries = { "Core-$Platform$-$Config$-Unity", "FBuildCore-$Platform$-$Config$-Unity", "FBuildApp-$Platform$-$Config$-Unity" } .LinkerOutput = '$OutputBase$\Tools\FBuild\FBuildApp\FBuild.exe' } ;------------------------------------------------------------------------------- ; FBuildTest ;------------------------------------------------------------------------------- Library( 'FBuildTest-$Platform$-$Config$-Unity' ) { .CompilerInputUnity = 'FBuildTest-UnityGenerate' .CompilerOutputPath = '$OutputBase$\Tools\FBuild\FBuildTest\' .LibrarianOutput = '$OutputBase$\Tools\FBuild\FBuildTest\FBuildTest-Unity.lib' } Executable( 'FBuildTest-Exe-$Platform$-$Config$' ) { .Libraries = { "Core-$Platform$-$Config$-Unity", "FBuildCore-$Platform$-$Config$-Unity", "FBuildTest-$Platform$-$Config$-Unity", "TestFrameWork-$Platform$-$Config$-Unity" } .LinkerOutput = '$OutputBase$\Tools\FBuild\FBuildTest\FBuildTest.exe' } Test( "FBuildTest-Test-$Platform$-$Config$" ) { .TestOutput = "$OutputBase$\Tools\FBuild\FBuildTest\FBuildTest.txt" .TestExecutable = "$OutputBase$\Tools\FBuild\FBuildTest\FBuildTest.exe" .TestWorkingDir = "Tools\FBuild\FBuildTest" } ;------------------------------------------------------------------------------- ; All-$Platform$-$Config$ ;------------------------------------------------------------------------------- Alias( "All-$Platform$-$Config$" ) { .Targets = { ; tests 'CoreTest-Exe-$Platform$-$Config$', 'FBuildTest-Exe-$Platform$-$Config$', ; executables 'FBuildApp-Exe-$Platform$-$Config$' } } } ;------------------------------------------------------------------------------- ; All-$Platform$ ;------------------------------------------------------------------------------- Alias( "All-$Platform$" ) { .Targets = { 'All-$Platform$-Debug', 'All-$Platform$-Release' } } } ;------------------------------------------------------------------------------- ; All ;------------------------------------------------------------------------------- Alias( 'All' ) { .Targets = { 'All-x86', 'All-x64' } } ;------------------------------------------------------------------------------- ; Tests ;------------------------------------------------------------------------------- Alias( 'Tests' ) { .Targets = { 'CoreTest-Test-x86-Debug', 'CoreTest-Test-x86-Release', 'CoreTest-Test-x64-Debug', 'CoreTest-Test-x64-Release', 'FBuildTest-Test-x86-Debug' } } ;------------------------------------------------------------------------------- ; All+Tests ;------------------------------------------------------------------------------- Alias( 'All+Tests' ) { .Targets = { 'All', 'Tests' } } ;-------------------------------------------------------------------------------