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
; 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' }
}
;-------------------------------------------------------------------------------