Contact | License

# Changelog

v1.05 (22nd-May-2021)
Notes

- DB Version Changed : clean build will occur
- Changed how command lines are processed internally to greatly reduce the need for distributed protocol bumps in future versions

Fixes

- -profile emits correctly escaped JSON
- Clang explicit language args (-x) are updated for FASTBuild's second compilation pass (Thanks to dummyunit)
- Various args are correctly handled (for example removing -I with clang after preprocessing) when quoted with "
- LightCache works correctly when MSVC /FI option is used
- Compilation database includes correct executable path in json
- Fix several problems with function headers for aliases using variables. e.g. Copy( .Var ) or Copy( ."$Var$" )
- -MD and -MF args are stripped from second pass, avoiding problems they can cause (Thanks to Nick Edwards)
- CLR use is detected when using /clr with args (such as /clr:netcore)

Improvements

- Caching

- Add LightCache support for MSVC /external:I paths (Thanks to Javier Blazquez)

- BFF Parsing:

- If() supports complex compound expressions and literals (Thanks to Logan Zhou)
- BFF parsing speed greatly improved for projects with many executable or dll configurations

- Project Generation

- Visual Studio project generation automatically populates FI (NMakeForcedIncludes) properties
- Add Intellisense support for MSVC /external:I paths (Thanks to Javier Blazquez)

v1.04 (18th-Jan-2021)
Notes

- DB Version Changed : clean build will occur
- Distributed compilation protocol has changed: please update workers

New

- -profile option emits fbuild_profile.json in Chrome tracing format, which can be used to visualize the build
- Dependencies can be exported in DOT format using -dot and -dotfull

Fixes

- OSX binaries explicitly target OSX 10.7 (the minimum supported version)
- Unity fixup is applied when using Clang-cl with static analysis so errors are correctly reported
- Compilation with Clang doesn't fail when output is empty (can occur with Clang-cl with empty files)
- SourceMapping_Experimental is applied correcly when using Clang-cl
- Clang-cl distributed compilation is auto disabled when using SourceMapping_Experimental (remapping is not currently distributed)
- Warnings are printed for remotely built objects when using Clang-cl even if "warning as errors" is off
- -fixuperrorpaths is correctly applied to Clang warnings using (x,y) style line numbering
- [OSX][Linux] -fixuperrorpaths with VBCC doesn't change slash direction on Linux/OSX
- Fix typo in 'Could not resolve macro' LightCache messages
- Executable and DLL '%1[1]' is now correctly expanded even if '%1[0]' is not used
- Output messages no longer missing when using LightCache with -cachewrite and no distribution

Improvements

- Distributed Compilation:

- Distributed compilation scheduling latency reduced by upto 100ms in certain scenarios
- Distributed compilation performance improved slightly due to LZ4 compressor update (1.9.3)
- Network Protocol bandwidth usage reduced slightly
- FBuildWorker idle CPU usage reduced, particularly for systems with many cpu cores
- FBuildWorker shuts down more quickly due to improved thread management
- Jobs are scheduled in a more efficient order when using distributed compilation (both locally and remotely)
- [Windows] Avoid per-CPU core stall updating FBuildWorker UI, which could also delay exiting (up to 100ms per core)

- Cache:

- Cache performance improved slightly due to LZ4 compressor update (1.9.3)
- LightCache use is no longer inhibited by unused includes using macros: #include SOME_MACRO

- Compilation ordering improved by remove unnecesary dependencies from ObjectList and Library
- [Windows] Reduce CPU overhead of FBuild slightly, particularly with many CPU cores
- When using Clang with static analysis, results are written to output file if no output is written by Clang itself
- Dependency database memory usage reduced slightly
- FastCancel is enabled by default and can be disabled with -nofastcancel
- Remove deprecated -nooutputbuffering (option hasn't done anything for a long time)
- Build database read/write optimized slightly

v1.03 (13th-Dec-2020)
Notes

- DB Version Changed : clean build will occur

New

- Support integration of FASTBuild, Windows Subsystem for Linux and Visual Studio
- -wsl option can forward to Windows Subsystem for Linux in Visual Studio
- FASTBuild can be built as a native exe for Apple ARM (Thanks to Javier Blazquez)
- ListDependencies() function can output discovered dependencies (Thanks to poppolopoppo)

Fixes

- BFF Parsing:

- $ Subsititutions in string literal args to User Functions were not handled in the correct scope
- Escaped characters in string literal args to User Functions were not escaped correctly
- #if directives were not correctly handled when used inside list declarations (and possibly other cases)

- -Bstatic and -Bdynamic are respected when parsing linker command line (Thanks to dummyunit)
- -l option checks for dynamic libs first to match GNU ld behavior (Thanks to dummyunit)
- Visual Studio solution header for VS2019 so version selector works correctly
- Add missing \n to ListDependenciesNode output (Thanks to mhoulier)
- Fix features documentation typo (Thanks to Aleksey Kladov)
- Respect minimum stack size constraint on OSX and Linux (Thanks to Nicolas)
- Missing errors for preprocessors that write to stdout on failure

Improvements

- Distributed Compilation:

- Workers write their IP directly to brokerage to improve discoverability (Thanks to Joe Kirchoff)
- Workers can be explicity listed with a FASTBUILD_WORKERS env var (Thanks to eclazi)

- Project Generation:

- Intellisense/CodeSense detects more path types (/imsvsc, -isystem and others) (Thanks to dummyunit)

- Add explicit support for Clang on windows in clang-cl mode (Thanks to Lambert Clara)
- Detect libraries provided directly on command line via -l:filename (Thanks to dummyunit)
- MSVC linker failure LNK1201 is automatically retried to work around VS2019 bug
- Allow FASTBuild to be compiled for ARM on Linux (Thanks to Nicolas)
- Add .Libraries2 to Executable and DLL which can be accessed with %1[1]

v1.02 (25th-Aug-2020)
Notes

- DB Version Changed : clean build will occur

Fixes

- BFF Parsing:

- ForEach correctly handles comma separator in parallel loops

- [Windows] Prevent deadlock in FBuildWorker on shutdown when it's sent a WM_QUIT by another application
- Fix documentation errors for VCXProject and XCodeProject
- Exec node times are emitted to the -monitor log (Thanks to Joe Kirchoff)
- CSAssembly() handles forward and backslashes correctly on all platforms in .CompilerInputExcludePattern
- Exec() handles forward and backslashes correctly on all platforms in .ExecInputExcludePattern
- ObjectList() handles forward and backslashes correctly on all platforms in .CompilerInputExcludePattern
- Test() handles forward and backslashes correctly on all platforms in .TestInputExcludePattern
- [Linux] Various "CanUseResponseFile" options are respected on Linux
- Fix a failure path writing response files that was not stopping compilation correctly

Improvements

- Caching:

- Increase thread stack size to avoid unexpected problems with cache plugins
- Cache plugin can be initialized via InitEx which provides details of operating mode (read/write/verbose)
- Settings exposes .CachePluginDLLConfig to all passing of custom config to cache plugins
- [Windows] Cache plugin DLL function names no longer need to be mangled

- BFF Parsing:

- #if operator supports compound expressions using && and || (Thanks to ggnkua)

- AllowResponseFile can be set on Compiler (Thanks to Axel Wefers)
- LibrarianAllowResponseFile can be set on Library (Thanks to Axel Wefers)
- LinkerAllowResponseFile can be set on DLL or Executable (Thanks to Axel Wefers)
- ObjectLists can be chained using .CompilerInputObjectLists
- VCXProject and XCodeProject include .editorconfig files by default
- Add troubleshooting documentation for the Cache (Thanks to Layla Mah)
- Add .SourceMapping_Experimental to Compiler() to control -fdebug-source-map (Thanks to Jaview Blazquez)
- Compiler() response file use can be forced with .ForceResponseFile
- Library() response file use can be forced with .LibrarianForceResponseFile
- Executable()/DLL() response file use can be forced with .LinkerForceResponseFile
- [Linux] Command line limits (128 KiB) are enforced on Linux to make problems more obvious

v1.01 (6th-Jun-2020)
Notes

- DB Version Changed : clean build will occur
- Network protocol version has changed. Please update FBuildWorkers

Fixes

- Distributed Compilation:

- [Windows] Terminated remote jobs are once again system failues (Regression in v1.0)

- BFF Parsing:

- Environment variables imported with #import no longer have carets (^) swallowed
- Environment variables containing $ imported with #import no longer cause parsing errors

- [Windows] Correctly handle long paths on Windows (if enabled at OS level)
- Many documentation typos fixed (Thanks to Fedya Zentsev)

Improvements

- Distributed Compilation:

- [OSX][Linux] Remote Clang and GCC disk space erorrs are System Failures and are re-scheduled

- BFF Parsing:

- BFF parsing speed improved significantly (as much as 2x)

- Unity node supports relative paths with UseRelativePaths_Experimental
- Minor improvements to error documentation
- CSharp compiler is auto detected, removing need to set "custom" .CompilerFamily

v1.00 (3rd-May-2020)
Notes

- BFF directives (#if/#include etc) are now processed in a preprocessor pass, consistent with C/C++. This fix means it is no longer possible to use variables inside include paths.
- Unity order was potentially inconsistent between platforms, OSs, filesystems and locales. A fix for this may result in a change of include order in Unity files.
- DB Version Changed : clean build will occur
- Cache version has changed

New

- BFF syntax supports users defined functions
- TextFile allows the generation of text files (Thanks to mkujawa)
- file_exists directive can be used with #if to detect the presence of files
- -why command line option details the trigger for each thing that builds

Fixes

- Distributed Compilation:

- FBuildWorker CPU drop down scrolls when there are many CPUs
- [Windows] Fix FBuildWorker menu item not hiding correctly (Thanks to deter2030)
- [OSX][Linux] Periodically touch synchronized toolchains to prevent deletion from tmp dir

- Project Generation:

- XCodeProjectGenerator properly quotes strings containing '+' (Thanks to Javier Blazquez)
- Add missing documentation for several XCode project generation debugging settings

- Caching:

- -cacheinfo and -cachetrim work correctly on case-sensitive filesystems (Thanks to dummyunit)
- Crash in LightCache when #includes via macros are encountered (Thanks to Francisco Facioni & Brian Burgin)
- Fix LightCache missing dependency information when using macros (Thanks to Francisco Facioni)
- If LightCache cannot handle a macro-based include, it will fall back to normal caching correctly

- Order of files in Unity is consistent between OSs, file systems and locales
- Rebuilds correctly trigger if dependent files are deleted even if no other changes occur
- Rebuilds correctly trigger when mod times change to the past
- Rebuilds occur correctly if time is adjusted during or shortly after a build (daylight savings, clock drift, timezone change etc)
- Rebuilds occur correctly if files are modified externally during a build
- CopyDir and RemoveDir report error when target name is not specified (Thanks to dummyunit)
- -fixuperrorpaths no longer mangles "function" level errors when using VBCC
- MSVC PrecompiledHeader works correctly when .obj filename is different from .pch file (Thanks to Francisco Facioni)
- [Linux][OSX] Fix directory being treated as a file in some situations
- Executable/DLL .LinkerAssemblyResources accepts ObjectLists as input (Thanks to Lambert Clara)
- Prevent malformed errors with -fixuperrorpaths and VBCC
- -verbose info for directory lists is contiguous
- Fix Green Hills linker detection when exe is specified without .exe extension (Thanks to Francisco Facioni)
- -showtargets no longer returns error code -7 when -wrapper is used

Improvements

- Distributed Compilation:

- [Windows] FBuildWorker has a -debug option to match FBuild to assist debugging (Thanks to Lambert Clara)
- [Windows] FBuildWorker checks available mem before taking jobs (control with -minfreememory) (Thanks to Lambert Clara)
- FBuildWorker brokerage file contains configuration info (Thanks to Lambert Clara)
- FBuildWorker CPU idle detection level can be set in the UI (Thanks to Lambert Clara)
- FASTBUILD_BROKERAGE_PATH can contain multiple ; delimited paths (Thanks to Lambert Clara)
- Local race of distributed jobs can be disable with -nolocalrace debug option (Thanks to Lambert Clara)
- Brokers periodically (~12hrs) delete stale tokens (>24hrs old) left by other workers (Thanks to Lambert Clara)
- Improved -help/usage option for FBuild and FBuildWorker
- Workers periodically update brokerage modification time to allow pruning (Thanks to Brian Burgin)
- [Windows] Decompression speed on remote workers improved by ~10%

- Project Generation:

- iOS deployment target can be set with XCodeIphoneOSDeploymentTarget option
- VSProjectExternal allows existing project use in FASTBuild generated VS Solutions (Thanks to Lucian Muresan)
- Clang static analysis is applied consistently to files in Unity
- Visual Studio Solution() generation supports "Solution Items" (Thanks to Lucian Muresan)

- Caching:

- Stronger compression can be enabled for cache artifacts via the command line (Thanks to Lambert Clara)
- -cachecompressionlevel controls level of compression for cache artifacts
- LightCache emits reason for not being used when -cacheverbose is active

- BFF Parsing:

- BFF parsing consistently handles comments and whitespace everywhere
- BFF parsing speed improved significantly for many scenarios
- BFF includes are handled during preprocessing (consistent with C/C++)
- Parsing errors relating to invalid characters avoid printing garbage
- BFF parsing speed improved slightly by reducing memory allocations and string copying

- ExecAlwaysShowOutput option allows Exec to alway print output (Thanks to Lambert Clara)
- Add .Environment option to TestNode (Thanks to Brian Burgin)
- --continueafterdbmove allows a clean build after warning of DB move (Thanks to Lambert Clara)
- Warning when retrieving corrupt data from the cache constains cache key
- Unknown variables in dynamic variable names emit error 1009 instead of 1026
- Multiple ObjectLists building the same obj with different settings are now detected
- "conflicting files found" error improved to include "owner" ObjectList info
- Clang/GCC #line directives are ignored unless they result from the preprocessor including a file (Thanks to crondog)
- Corrupt DB does not prevent builds. Corrupt db is renamed and a warning is emitted (Thanks to Lambert Clara)
- Updated bash completion script (Thanks to dummyunit)
- -showcmdoutput cmdline option shows the full output of all external processes
- Librarian() exposed .LibrarianType to allow explicit control of type (Thanks to Francisco Facioni)
- Unity can isolate files listed in an file specified by .UnityInputIsolateListFile (Thanks to poppolopoppo)
- PrecompiledHeaders can be re-used between multiple ObjectLists
- Dependency graph traversal optimized by parallelizing file timestamp retrieval
- Unity evaluation is avoided when no inputs have changed
- [Windows] Directly listing cost reduced by ~30%

v0.99 (3-Nov-2019)
Notes

- DB Version Changed : clean build will occur
- Distributed compilation protocol version changed : please update workers
- Cache version has changed

New

- When bff changes, only affected targets are rebuilt
- [OSX] FBuildWorker UI implemented for OSX

Fixes

- Distributed Compilation:

- [Linux][OSX] Fix occasional compilation failure when a remote host wins a distributed race (Thanks to dummyunit)
- ObjectiveC/C++ distribution is automatically disabled (can't be robustly distributed)
- Distributed compilation automatically disabled for incompatible /analyze options with MSVC compiler
- preprocessor inconsistencies prevent distributed compilation
- [OSX][Linux] FBuildWorker restarts when it detects it has been modified
- [OSX][Linux] Avoid unnecessary thread creation on Linux and OSX for failed network connections (Thanks to dummyunit)
- Warnings no longer swallowed when generated remotely if /WX not set (Thanks to Leonid Mashinskiy)

- Project Generation:

- Fix slow Visual Studio project generation for projects with over 1024 files
- Files in folders in the XCode tree view are sorted alphabetically
- XCode "-doc" projects are hidden by default
- Intellisense/CodeSense information is correctly populated if project references a Copy()

- Caching:

- Expermental LightCache feature detects unsupported #import directives (Thanks to dummyunit)
- Cache write only + dist no longer uses an incorrect key for storing
- With this combination of options, the returned compilation result was used instead of the source for hashing
- Caching with /analyze no longer uses preprocessed output so SAL-reliant errors work correctly

- BFF Parsing:

- Fix %s 'is not an ObjectNode (type: File)' error when migrating DB after bff edit
- Error 1034 no longer malformed for certain operators (was printing ??? in some cases) (Thanks to dummyunit)
- Concatenating empty arrays of a different type could produce incorrect results (Thanks to dummyunit)

- Emit error when database (.fdb) cannot be loaded correctly due to corruption (was silently failing)
- [Linux] Correct fbuild.linux.fdb is used for database file as intended (Thanks to dummyunit)
- Add missing line feeds to some error messages (Thansk to dummyunit)
- Emit error instead of hanging when fbuild.exe fails to spawn in wrapper mode (Thanks to dummyunit)
- Clang and GCC warnings are shown when -Werror is not set, just like MSVC without /WX
- GCC preprocessed extension fixed so language is correct regardless of compiler exe name or -x options (Thanks to dummyunit)
- Missing properties added to integration files (usertype.dat and notepad++markup.xml)
- Relative path generation was not case sensitive on Windows and OSX (Thanks to ohoughton)

Improvements

- Distributed Compilation:

- Add proportional FBuildWorker mode - scale to consume available idle CPU (Thanks to Tomáš Nezval)
- FBuildWorker stops accepting work more quickly when machine leaves idle state (Thanks to Tomáš Nezval)
- C1060 (out of heap mem) only considered a system failure when C1076 & C3859 not present (Thanks to Lambert Clara)
- Defer loading of Compiler() files until needed, saving some time for distributed builds
- Compiler() avoids re-hashing files after DB migration
- Reduce process shutdown time for distributed builds when closing connections
- [OSX] FBuildWorker for OSX supports simple Idle Detection

- Project Generation:

- Optimize Visual Studio project generation 10%
- VCXProject automatically populates the LocalDebuggerCommand if a .Target is specified for a config
- Intellisense/Codesense includes -isystem -isystem-after and -iquote include paths
- VCXProj exposes .Keyword, .ApplicationType, .ApplicationTypeRevision, .PackagePath and .AdditionalSymbolPath per-config
- VCXProject exposes .ProjectProjectImports to allow importing of custom .targets files
- VCXProject imports Android .targets if available to better support debugging on Android
- XCode projects are generated to more closely match manually created projects
- XCode projects can set .XCodeBaseSDK (macosx, iphoneos etc) in .ProjectConfigs
- XCode projects can set .CommandLineArguments and .CommandLineArgumentsDisabled
- XCode projects have "Document Versioning" disabled by default (can enable with .XCodeDocumentVersioning)
- XCode projects can set .XCodeDebugWorkingDir in .ProjectConfigs
- XCode projects set various options to avoid warnings in later XCode versions

- Caching:

- -cacheverbose provides details about compression timing (Thanks to Lambert Clara)
- -cacheverbose shows more detailed info for cache stores, to match cache hits
- LightCache can handle includes from macros
- Significant improvement to LightCache performance (Thanks to Ben Craig)

- BFF Parsing:

- Optimize BFFParser parsing when creating structs (speedups for 20% or more are not uncommon)
- BFFParsing speed improved ~2.5%
- Use StackArray to improve BFF parsing performance ~2.5%

- Library, ObjectList, Alias and Unity nodes can be hidden from -showtargets (Thanks to Philipp Mirzayants)
- -report includes cache timing information (Thanks to Lambert Clara)
- Directory lists in the -summary shown in a more human readable format (Thanks to Lambert Clara)
- Failed builds terminate up to 0.5s faster
- UnityInputIsolatedFiles allows files to be automatically exluded from Unity, but still compiled (Thanks to Martin Donlon)
- Output for failed tasks no longer deleted - failed output can be useful for triage
- [OSX] nsec filetimes supported on OS X 10.13 and higher with APFS
- [Linux] Reduce process overhead (particularly for short-lived ones)
- [Linux] Reduce per-process buffer size usage to scale better on multi-core systems

v0.98 (29-Apr-2019)
Notes

- DB Version Changed : clean build will occur
- Distributed compilation protocol version changed : please update workers

New

- .UseLightCache_Experimental mode on Compiler() can be used for massively accelerated caching
- -compdb option can create a JSON Compilation Database (Thanks to dummyunit)

Fixes

- Distributed Compilation:

- Fix race condition resulting in crash when a local race is won (Thanks to dummyunit, Sam Hocevar & Lambert Clara)
- Prevent rare crash during startup when using distributed compilation

- BFF Parsing:

- Variable self-assignment is handled correctly during bff parsing (Thanks to dummyunit)
- Fix inconsistent parsing of bff function headers without args (Thanks to dummyunit)

- [OSX][Linux] FASTBUILD_CACHE_PATH env var is respected on OSX and Linux (Thanks to Damian Szuberski)
- GCC is corrently detected for when version specific exe is referenced (Thanks to Damian Szuberski)
- Strip -isysroot when compiling preprocessed output; should only be used during preprocessing (Thanks to Nick Edwards)
- Paths terminated with .. are correctly canonicalized (Thanks to Yaroslav Kovtun)
- DLL() detects dll when a library is configured via -Wl,--oformat=prx (Thanks to jfr2)
- Precompiled headers are migrated when using AllowDBMigration_Experimental (Thanks to Yaroslav Kovtun)
- MSVC precompiled header users are retrievable from cache after DB migration using AllowDBMigration_Experimental
- [Windows] UNC paths are respected in some places they were not (Thanks to Brian Burgin)
- MSVC .pchast is correctly cached when folder name contains a period (Thanks to Brian Burgin)
- MSVC .pchast is correctly cached when filename contains a period

Improvements

- Distributed Compilation:

- FBuildWorker responds to quite notifications (Thanks to Brian Burgin)
- Compiler files sent for distributed compilation are compressed (Thanks to Brian Burgin)
- -forceremote no longer modifies caching options
- Remote MSVC out of heap space is automatically retried
- Remote MSVC failing to write compiler tmp file is automatically retried
- Remove worker timeout mechanism which could cause unnecessary disconnections under heavy network load
- Workers will reject connections from mismatched platforms

- BFF Parsing:

- Non-bff parsing error formats standardized (Thanks to Brian Burgin)

- Project Generation:

- XCode schemes appear alphabetically
- XCode project folders appear alphabetically
- XCode "doc" schemes are hidden by default

- [Linux][OSX] Significantly improve compile times by fixing process output capture (Thanks to Yaroslav Kovtun)
- Improve resilience against corrupt files in the network cache
- Exec() can be made to run every time with new .ExecAlways property
- Test will print test output if a test times out to assist triage (Thanks to dummyunit)
- .i extension is used for preprocessed files when using gcc (Thanks to Damian Szuberski)
- Colored output from Clang and GCC is supported (Thanks to dummyunit)
- .Environment can be set per Compiler, Library, Executable and DLL (Thanks to Brian Burgin)
- .CompilerOutputKeepBaseExtension can be set on ObjectList if extension is needed to uniquify (Thanks to Yaroslav Kovtun)
- The .fdb is uniquified per-platform to allow filesystem shared between operating systems/VMs
- Improve compression speed slightly (Upgrade to LZ4)

v0.97 (9-Jan-2019)
Notes

- DB Version Changed : clean build will occur

New

- [Experimental] .AllowDBMigration_Experimental (Settings) allows retention of build state across BFF changes
- [OSX][Linux] Settings() .CachePathMountPoint option allows enforcing of cache mount validity
- _CURRENT_BFF_DIR_ is defined containing path to the bff being parsed
- Error() function allows user errors to be emitted during BFF parsing (Error 1999)

Fixes

- Distributed Compilation:

- Fix occasional build failure with error 0x1 when a distributed race is won
- [OSX][Linux] Sockets are not inheritable by child processes
- [OSX] Sockets don't trigger spurious SIG_PIPE errors
- [OSX] Port reuse updated for OS X behavior change (SO_REUSEADDR vs SO_REUSEPORT)
- Nagle's algorithm is disabled for return connection from server->client
- Fix -distverbose stack overflow when remote worker is deny listed (and possibly in other situations)
- Fix file handle leak on IO error transferring compiler files (Thanks to dummyunit)
- Remote system failure info is shown when -distverbose is used

- BFF Parsing:

- If() error correctly reports type when lhs is unsupported for operator "in"
- If() reports an error if extraneous text is found after a valid expression

- Project Generation:

- VCXProject files correctly pathed for project in sub-directory of BasePath
- VCXProject generation correctly handles files and folders with common sub-strings (Thanks to Jeremy Moore)
- Solution() errors in .Projects or .Dependencies print the correct property name in the error
- Solution() paths to .vcxproject are relative even when .vcxproject is not in a sub-directory (Thanks to Chris Helvig)

- Prevent duplicate symbols in libraries when using ar.exe in some situations
- Emit error when failing to delete .exe/.dll/.pdb/.ilk
- Folders are created for .asm and .pdb files when paths contain inconsistent slashes
- Add missing -monitor option to cmd line usage info
- Add missing -monitor and -progress option documentation
- [OSX][Linux] .lock files are no longer inherited by child processes, preventing "FASTBuild is already running" messages
- Fix incremental link when NOREF, NOICF or NOLBR options are used on cmd line (Thanks to Lambert Clara)
- [Windows] Prevent deadlock if Ctrl+C is used to terminate certain tools like Clang (Thanks to Brian Burgin)
- Settings() .CachePath takes precedence over environment variable as intended
- [OSX][Linux] Child processes no longer inherit file handles, avoiding issues like .lock files being held incorrectly
- Linker removes bad trailing slashes from LIBPATH that would escape quotes
- -monitor works if build is started before monitor application has ever been run (Thanks to Lambert Clara)
- [Linux][OSX] -cacheinfo age is correctly calculated (Thanks to Yaroslav Kovtun)
- Fixed typo in options documentation for -report (Thanks to Brian Burgin)

Improvements

- Distributed Compilation:

- Remote failure details are shown when -distverbose is used
- Brokerage path shown as part of "Workers Found" message (Thanks to Lambert Clara)

- BFF Parsing:

- If() supports operator >, <, >= and <=
- If() supports integers in comparisson syntax
- Add _FASTBUILD_VERSION_ and _FASTBUILD_VERSION_STRING_ built-in variables
- If() Documentation lists all currently supported syntax and operators
- Small speedup to bff parsing when parsing Linker (Executable/DLL) nodes (Thanks to dummyunit)
- Small optimization to BFF parsing, avoiding memory allocations appending strings to arrays (Thanks to dummyunit)

- Project Generation:

- Solution() generates solutions with paths to projects using Windows style slashes on Linux and OSX
- Solution() "deploy" project scan be set via SolutionDeployProjects
- Solution() "build" and "deploy" projects can be set per SolutionConfiguration
- Intellisense AdditionalOptions are auto-populated for /std: option

- Improve IO performance on local disk and SMB shares
- Work around Windows file system permission problems when creating response files
- FASTBuild detects MSVC linker error LNK1136 (pdb corruption) and retries linking

v0.96 (5-Jul-2018)
Notes

- DB Version Changed : clean build will occur
- FBuildWorker version has changed - ensure all workers are updated
- Visual Studio Project generation uses new GUID scheme
- FBuildWorker no longer shows balloon tip when being minimized

New

- Add _WORKING_DIR_ built-in variable
- If() function allows basic branching logic in bff config (Thanks to clevijoki)
- [Experimental] Add "-nounity" option: build individually all files that would normally be in Unity

Fixes

- Distributed Compilation:

- Local fbuild.exe was deleting the worker token on build completion (Thanks to Lambert Clara)
- Fix crash in distributed compilation caused by race condition (Thanks to dummyunit)
- Processes terminated on a remote worker don't cause the build to fail with error 0x1
- Errors from remote workers are emitted to the -monitor log (Thanks to hillin)
- [Windows] Avoid file creation error 32 when a remote worker wins a race (Thanks to Alexandre Ganea)
- FBuildWorker retries restarting for 10s when updated, so occasional locks don't preventing re-spawning
- FBuildWorker tooltip restored (Thanks to Lambert Clara)

- BFF Parsing:

- Fix inifinte loop when an unterminated string is not handled correctly (Thanks to dummyunit)
- Attempting to modify frozen variables in nested ForEach loops reports an error (Thanks to dummyunit)
- Cyclic dependencies result in new error 1043 during parsing instead of crashing during shutdown
- Fix crash when struct is replaced by its member in Using() (Thanks to dummyunit)
- Fix closing brace in string incorrectly terminating scope in some rare cases (Thanks to dummyunit)

- Project Generation:

- Visual Studio Project GUID generation allows multiple projects with the same name (Thanks to James Leitch)
- VSSolution errors relating to missing projects report correct property in errors
- Avoid generating invalid Visual Studio projects when duplicate files are specified
- Fix incorrect ToolsVersion (4.0 -> 15.0) in .vcxproj file (Thanks to Layla Mah)
- VCXProject and XCodeProjects missing targets for some configs if one target was empty

- Fix MS linker error when command line length is exactly 32767 (Thanks to Lambert Clara)
- Fix typo in Executable error when ExecExecutable is missing (Thanks to dummyunit)
- /analyze- is no longer incorrectly detected as enabling static analysis (Thanks to dummyunit)
- CopyDir SourceExcludePaths paths are correctly applied (Thanks to James Leitch)
- [OSX] Ctrl+C supported on OSX (build progress not lost when using Ctrl+C)
- LIB variable from Settings() is used when finding libs (Thanks to Francisco Facioni)
- [OSX][Linux] Fix thread handle leaks (Thanks to dummyunit)
- Add missing keywords to VisualStudio and Notepad++ syntax highlighting (Thanks to Lucian Muresan)
- Exec() correctly depends on dynamically discovered files (Thanks to James Leitch)
- [Windows] Avoid temp file creation failures (anti-virus or async termination) (Thanks to Alexandre Ganea)
- CopyDir reports error when target already exists (regression in v0.95) (Thanks to dummyunit)
- RemoveDir reports error when target already exists (regression in v0.95) (Thanks to dummyunit)
- Executable/DLL respect gcc/clang style cmd line dependencies (Thanks to Francisco Facioni)
- Correctly handle nested aliases in .Compiler for ObjectList/Library
- Fix "buidl" typo in -help text

Improvements

- Distributed Compilation:

- FBuildWorker no longer steals focus briefly on startup (Thanks to v1ne)
- FBuildWorker no longer adds Windows 10 notification on startup (Thanks to v1ne)
- FBuildWorker no longer steals focus when launched (or restarted) unminimized
- -distverbose provides information about attempted and failed connections

- Project Generation:

- .SolutionBuildProject doesn't need to be specified redundantly in .SolutionProjects
- VSSolution() .SolutionBuildProject supports multiple projects for increased flexibility

- Upgrade LZ4 compression to v1.8.2 for improved cache and distribution performance
- Compiler() can reference executables compiled by FASTBuild (Thanks to gkoreman)
- Orbis-wave-psslc is auto-detected as a supported compiler (Thanks to gkoreman)
- BFF parsing speed improved ~5%
- Allow UnityInputExcludedFiles to handle partial paths (Thanks to Lambert Clara)
- Exec() supports InputPath, InputPattern etc to dynamically discover files
- [Linux] Reduce glibc dependencies to version 2.6 (Thanks to dummyunit)
- Test() supports TestInput* options for additional dependency specification (Thanks to James Leitch)
- Compiler detection works for Android when using .cmd wrappers (Thanks to Pavel Bibergal)
- Progress output is automatically disabled when redirecting output (Thanks to dummyunit)
- Better handling of symlinks in file operations; specifically when copying files (Thanks to James Leitch)
- Add .CompilerInputAllowNoFiles to ObjectList/Library (Don't fail if no files are found)
- Remove redundant "x64" from various places (help, ui) now that only x64 is supported
- Report (-report) specifies host OS (Windows, OSX, Linux) rather than x64

v0.95 (4-Feb-2018)
Notes

- DB Version Changed : clean build will occur
- Cache version changed : previous cache entries will be ignored
- Behaviour Changed: Sub struct concatenation order has been fixed (see fixes)
- Pre-built executables for 32-bit Windows version will no longer be released

New

- The VBCC compiler is now supported
- -cacheinfo option dumps information about the cache
- -cachetrim option trims the cache to the desired size
- Support WindRiver compiler (dcc.exe) (treat as gcc) (Thanks to Mohamed El-Shahawi)
- Add -cacheverbose command line option

Fixes

- Distributed Compilation:

- Prevent rare shutdown crash or deadlock when using distributed compilation
- [Windows] Fix handle leak in FBuildWorker
- FBuildWorker no longer exits if exe is deleted prior to replacement

- BFF Parsing:

- Concatenation of members in first level of sub-structs was reversed
- Internal string copies avoid some potentially unsafe operations (Thanks to dummyunit)
- Fix crash when accessing variable from parent scope that doesn't exist (Thanks to dummyunit)
- Fix crash when mismatched types are provided in an Array declaration (Thanks to dummyunit)
- Empty strings in Arrays report 'Empty string not allowed' instead of being silently accepted
- Empty strings sepcified for files report 'Empty string not allowed' insead of 'Path not allowed'
- Empty arrays being set for required properties are no longer silently accepted
- Strings with embedded nuls not being copied properly during a grow operation (Thanks to dummyunit)
- Mismatched types in Struct concatenation reports error #1034 instead of crashing

- Project Generation:

- Generated Visual Studio projects are compatible with Visual Studio Selector (Thanks to slonopotamus)
- [OSX][Linux] .vcxproj Intellisense includes are generated with Windows-style slashes
- Intellisense and CodeSense options are discovered when using spaces (e.g. "-D WIN32")
- [Windows] .xcodeproj CodeSense include paths are generated with OSX-style slashes

- Cache:

- [OSX][Linux] Error message when failing to load cache plugin dll is correctly output (Thanks to dummyunit)
- Cache entries not being unique when only filename changes
- Cache stores additional files required by /analyze flag with msvc compiler

- Prevent source files being deleted due to a rare race condition using experimental -fastcancel (Thanks to Lambert Clara)
- [Linux] Fix FileCopy when dest file is read-only
- Prevent precompiled headers using deoptimzation settings (Thanks to Jean-Sebastien Pelletier)
- [Linux] Fix unsafe readlink retrieving executable path for fbuild (Thanks to dummyunit)
- [Linux] Performance of hashing & compression was 5-10x slower due to incorrect optimizations (Thanks to dummyunit)
- [OSX] [Linux] Handle DT_UNKNOWN correctly when walking directories on some file systems (Thanks to fuzzac)
- [Windows] Clang/GCC remote failures no longer incorrectly report as System Failures (Thanks to Arturmazurek)
- DLL() and Exectuable() have a proper dependency on the linker executable
- [Linux] Tests which crash are correctly reported as failed (Thanks to dummyunit)
- Failure to create temp files when compiling objects reports correct error (Thanks to dummyunit)
- Work around VS2013/15 bug resulting in missing dependencies when an old .pch is on disk (Thanks to Lambert Clara)
- Fix include detection when Clang is used as cl.exe (Thanks to Poppolopoppo)
- Prevent crash breaking via Ctrl+C when -wrapper mode is used (-vs, -ide etc)
- -config paths with spaces are correctly handled when using -vs or -ide (Thanks to liamkf)

Improvements

- Distributed Compilation:

- Remote compilation can win a race, improving compile times
- Greatly reduce memory usage of FBuildWorker
- FBuildWorker idle CPU usage reduced (check every 500ms instead of 100ms)
- Expose local .DistributableJobMemoryLimitMiB in Settings
- Increase distributable job memory limit to 2GiB for 64bit builds
- Increase FBuildWorker idle detection threshold to 20%
- Increase connection timeout which was too aggressive (0.5s -> 2.0s)
- [Linux] FBuildWorker idle detection implemented

- Project Generation:

- VCXProj Intellisense info can be derived automatically in more situations
- .ProjectAllowedFileExtensions includes *.asm and *.s by default

- Copy with multiple .Source and non-dir .Dest generates an explicit error (#1400)
- Avoid Copy() error setting timestamps for copy if dst file is locked by another application
- Remove CopyNode serializing SourceBasePath property to DB unnecessarily
- Error 1009 'Unknown variable.' includes variable name in case it's not obvious from the context
- .CompilerFamily can be explicitly set on Compiler() to override auto-detection (Thanks to Layla Mah)
- Unity pragmas are commented out for files isolated from unity
- DLL() and Executable() support .PreBuildDependencies
- Test() supports .PreBuildDependencies
- Bash completion script updates for latest options (Thanks to dummyunit)

v0.94 (28-Sep-2017)
Notes

- DB Version Changed : clean build will occur

New

- -quiet option can be used to supress build output (Thanks to Nik Reiman)
- -showdeps displays dependencies, useful for debugging build configs (Thanks to Layla Mah)
- FBuildWorker -console cmd line arg enables UI-less "console" mode
- -nosummaryonerror option supresses -summary if the build fails (Thanks to Lambert Clara)
- Added -forceremote option for troubleshooting (Thanks to Lambert Clara)

Fixes

- CSAssembly pattern defaults to *.cs again (regression introduced in v0.93)
- Fix compatibility with Recode (include paths removed sometimes) (regression introduced in v0.93)
- Return code in wrapper mode is now non-zero when child process crashes (Thanks to Sam Hocevar)
- Restore custom Preprocessor functionality (regression in v0.93)
- [Linux] Ctrl+C no longer causes build progress to be lost on Linux (Thanks to comicfans)
- Keep-alive timeout was too low, causing dropped connections during distributed compilation
- Prevent unsafe caching of precompiled headers that differ only in unused defines (Thanks to Lambert Clara)
- Fix rare crash when using distributed compilation
- Distributed job local memory limit is now correctly respected
- Prevent rare crash when using distributed compilation (Thanks to Jean-Sebastien Pelletier)
- [OSX] Fix init failure on some configurations when using -dist due to TCP send/recv buffer size (Thanks to myevan)
- Fix socket leak when send/recv buffer size could not be set
- Prevent network disconnections due to too small Send timeouts
- DirCopy no longer fails if a source file is deleted (Thanks to kwayle)
- Remote workers failing to read files no longer fail without error (Thanks to Lambert Clara)
- Fix -wrapper mode on Windows if fbuild.exe is renamed (Thanks to James Leitch)
- Exe name is printed correctly in usage info if exe is renamed (Thanks to James Leitch)
- Exe name is printed correctly in usage info on OSX and Linux (Thanks to James Leitch)
- MSVC linker and lib warnings shown when not using /WX (Thanks to Lambert Clara)
- [Linux] CopyFile and CopyDir transfer file permissions on copy (Thanks to Javier Blazquez)

Improvements

- [Experimental] New -fastcancel option allows immediate termination on build failure (Thanks to Jean-Sebastien Pelletier)
- Remote internal compiler errors will be retried to avoid breaks due to faulty hardware (Thanks to Sam Hocevar)
- Paths inside VisualStudio projects are relative where possible, including Intellisense (Thanks to Eric Arnold)
- [Windows] FASTBuild supports >64 cores on x64 and >32 cores on x86 (Thanks to missmah)
- Visual Studio projects can be generated with generic source bindings via ProjectSccEntrySAK (Thanks to Lucian Muresan)
- Increase distributed job local memory limit to 1GiB (was 512MiB)
- Add work around for bugs in MS Linker causing PDB corruption (LNK1318), seen in VS2017
- Add basic documentation for operator + when used on Structs
- Lib uses source objects for other libs where possible (Thanks to Javier Blazquez)
- Add link to Syntax highlighting link by Manuzor (Thanks to Manuzor)
- Distributed compilation worked limit can be set via .WorkerConnectionLimit
- Add -distverbose command line to help with troubleshooting distributed compilation issues
- Improve summary output for CopyFile, CopyDir and RemoveDir
- .BuildLogFile path can be set for generated Visual Studio projects (thanks to lucianm)
- Libraries are flattened for non-MSVC librarian when nesting libs (Thanks to Javier Blazquez)
- New FASTBUILD_TEMP_PATH env var can set TEMP dir for FASTBuild to use (Thanks to comicfans)
- Objects and Libs are only deleted before building if using -clean, reducing overhead
- Small memory usage and performance optimization during builds and bff parsing
- Avoid opening files unnecessarily when #once directive is used

v0.93 (13-Mar-2017)
Notes

- DB Version Changed : clean build will occur
- Distributed protocol version has changed

New

- New .SimpleDistributionMode allows distributed compilation of arbitrary single file objects (Thanks to gkoreman)

Fixes

- Prevent error D8049 when compiling remotely with really long command line args
- Fix missing depencies when using Clang with empty files and mixed line endings (Thanks to Wickerwaka)
- Fix unescaped ampersands in VCXProject documentation
- [Linux][OSX] Fix cache paths using wrong slash type (Thanks to dummyunit)
- Slashes are escaped in response files for ar.exe in Windows (useful when building for Android)
- Assignment of .String to .ArrayOfStrings silently failing in some cases
- Cache plugin DLL is correctly handled on X86 Windows
- Copy, CSAssembly and Unity can have PreBuildDependencies which are ObjectLists
- Alias .Targets can be ObjectLists
- Libraries are rebuilt when Librarian changes
- Correct documentation for -ide option (add note about -ideo enabling -fixuperrorpaths on Windows only)

Improvements

- XCode Projects now support CodeSense
- Support for optional environment variables via "#if exists(VAR_NAME)" (Thanks to Javier Blazquez)
- [Linux][OSX] New LZ4 (v1.7.4.2) improves compression speed for OSX and Linux ~10-30%, improving cache performance
- BFF parsing speed significantly increased (upto 2x)
- Exec() can have a PreBuildDependency on a CopyDir node
- .CustomEnvironmentVariables can be set for distributed compilation (Thanks to gkoreman)
- .ExecutableRootPath can control root of distributed toolchains (Thanks to gkoreman)
- Allow string properties to be set to empty strings if they are optional
- Compiler exposes .ClangRewriteIncludes to allow use of -frewrite-includes to be disabled if needed
- Add Sublime Text markup (Thanks to Andreas Haferburg)

v0.92 (27-Nov-2016)
Notes

- DB Version Changed : clean build will occur
- Cache version has changed : Existing cache entries will be ignored

New

- [Experimental] -monitor option writes a machine-readable log for external visualizers (Thanks to Yass007 and LiamKF)
- bash completion script for fbuild executable now available (Thanks to dummyunit)

Fixes

- Prevent MSVC Error C1382 due to an .obj and .pch mismatch due to multiple machines partially populating the cache
- FASTBuild is no longer incompatilble with Clang's static analyzer (-analyze) (Thanks to Pavel Bibergal)
- Fix various MSVC compiler args not being detected when using -X instead of /X syntax
- Fix various MSVC linker args not being detected when using -X instead of /X syntax
- Fix various MSVC linker args being assumed to be case-sensitive (linker args are case insensitive)
- Linking against Orbis .prxs built by FASTBuild uses _stub_weak.a (Thanks to jairbubbles)
- Fix CopyDir destination path not being normalized causing failures
- Fix typo in Report when there are no includes (Thanks to Leandros)
- -showtargets now includes targets defined by ObjectList and Unity
- .Target property in XCodeProject() .Configs is optional
- Removing empty strings in bff with operator - is ignored instead of being incredibly slow (Thanks to dummyunit)

Improvements

- Solution() allows the same folder to be specified multiple times for added flexibility (Thanks to Poppolopoppo)
- Documentation for Test() (Thanks to Manuzor)
- ObjectList(), Library() and CSAssembly() support .CompilerInputPatternExclude (Thanks to Fitzymj)
- Added .TestAlwaysShowOutput option to Test() which prints the test output even if it passes
- Optimize network sends, reducing kernel call overhead
- Improved diagnostic messages for distributed compilation (Thanks to Sam Hocevar)
- Copy() .Source can now be empty as this allows for greater configuration flexibility
- An invalid .Target in an XCode configuration will now fail during bff parsing

v0.91 (25-Aug-2016)
Notes

- DB Version Changed : clean build will occur
- Cache Version changed : prior version cache items will be ignored

Fixes

- Array of Structures behaves consistently with Array of Strings (Thanks to dummyunit)

- Empty arrays are now essentially treated as untyped

- Edge cases which allowed variables to silently change type are now prevented (Thanks to dummyunit)
- Integer addition works with explicit values as well as variables (Thanks to dummyunit)
- Database detects when it is moved or copied, avoiding difficult to diagnose build errors
- Fix crash when .UnityInputFiles and .UnityInputIsolateWritableFiles were used together
- Pre-build deletion of MSVC pch object file didn't work in some cases
- TestTimeOut value is correctly interpretted as being in seconds (not milliseconds)

Improvements

- Optimizations:

- Precompiled Header with MSVC can be cached
- Precompiled header acceleration is no longer disabled for MSVC when writing to the cache

- Empty arrays can now be treated as arrays of structures (Thanks to dummyunit)
- Allow for longer variable names in BFF files (256 vs 64) (Thanks to poppolopoppo)
- Subtraction operator behaviour is handled more consistently (Thanks to dummyunit)
- Bools and Ints can be formatted into string with $var$ syntax (Thanks to poppolopoppo)
- CSAssembly supports PreBuildDependencies (Thanks to poppolopoppo)
- Unity supports PreBuildDependencies
- BFF syntax now supports #else directive
- Remove .PCHOptionsDeoptimized option - it's not useful and causes problems
- Use Clang's -frewrite-includes option to avoid preprocessing inconsistencies (Thanks to Jean-Sebastien Pelletier)

v0.90 (2-Jul-2016)
Notes

- DB Version Changed : clean build will occur
- Behaviour Change: code compiled with /ZW can now be cached

New

- VCXProject can automatically derive intellisense settings if new Target property is set
- .SolutionPlatform and .SolutionConfig added to Visual Studio sln generation (Thanks to Agga)
- .CompilerInputFilesRoot allows root path setting for .obj path generation for explicitly listed files (Thanks to Sergey Makeev)
- Test() supports an optional .TestTimeOut, after which it will be terminated with failure

Fixes

- Warnings shown when using Microsoft compiler, even if "warnings as errors" (/WX) is not enabled (Thanks to matlec)
- Avoid anonymous namespace conflicts with distributed compilation with MS Compiler (Thanks to Sergey Makeev)
- [OSX][Linux] Fix occasional hang in process spawning
- [OSX] Overridden environment is correctly set for spawned processes
- Fix corrupt solution generation when Folder path is specified with a trailing slash
- Prevent exit being delayed when some workers are incommunicado (cuts as much as 2s off some no-op builds)
- BFFs changes are correctly detected when switching between .bff files using -config option (Thanks to Jalal El Mansouri)
- Fix cmdline usage info for FBuildWorker (should read -mode=dedicated not -mode=always)
- Create directory for .pdb and .asm files if different from .obj file (Thanks to Tengato)
- [OSX][Linux] -ide was reformatting errors on OSX/Linux, preventing IDEs (like XCode) parsing them

Improvements

- Optimizations:

- Reduce time to hand out and accept distributed compilation
- Optimize large command line processing, reducing overhead spawning processes with > 4KiB of cmd line
- [Windows] Reduce process spawning overhead by ~8ms on average
- Speed up worker discovery when some workers are incommunicado (improves distributed compilation performance)
- Hostname to IP resolution of valid workers no longer stalled by incommunicado worker timeout

- Config files hash is used during parsing to reduce rebuilds on edit/revert (Thanks to dummyunit)
- Rebuilding is minimized when manually switching between .bff files using -config option (Thanks to Jalal El Mansouri)
- .natvis fils are included in project generation by default for enhanced debugging support in VS
- .ProjectPatternToExclude can be used to exclude files from project generation (Thanks to Keith Gunning)
- Add support for caching /ZW (Windows Runtime) object files (Thanks to ClxS)
- Continued work on distributed compilation for OSX and Linux

v0.89 (13-Feb-2016)
New

- Operator '-' can be used to remove substrings from strings
- -showtargets cmdline option displays primary build targets (Thanks to Cyberkm)

Fixes

- Precompiled headers used with GCC now work correctly (acceleration is no longer prevented)
- -include option is correctly handled with GCC and Clang
- Exec() works with non-zero return codes on Linux and OS X
- Fix race condition in shutdown of fbuild that could cause an extremely rare hang
- Correct position of arrow for error 1009 and 1034 in some situations
- FBuildWorker only checks free space of drive containing temp directory

Improvements

- Small optimization (0-10%) to cache storage and retrieval (updated LZ4 from r127 to r131)
- When specifying an invalid target on the cmdline, similar targets are suggested (Thanks to poppolopoppo)
- Avoid local hostname lookup when not running in distributed compilation mode for small speedup

v0.88 (9-Dec-2015)
Note

- DB version has changed : clean build will occur
- Cache version changed : existing cached items will be ignored.

New

- Support dependency tracking for Qt resource files (.qrc)
- RemoveDir can be used to create cleanup build steps (Thanks to Poppolopoppo)
- Optional .LinkerType on DLL & Executable allows explicit specification of linker type (Thanks to Josh Green)
- Caching and Distribution can be disabled for an ObjectList or Library using
- Variable names can by dynamically constructed, such as: .Var = ."MyThing_$Config$" (Thanks to Poppolopoppo)

Fixes

- Config (.bff) #include works when a full path is specified
- Prevent Compiler() node from unnecessarily re-hashing files in some cases
- Fix Compiler() node not re-hashing in some cases
- .Environment in Settings() is now respected on Linux and OS X
- Fix stale dependency when a file in an ObjectList() fed into Unity() is deleted or moved
- Both command lines are shown when doing two-stage compilation and -verbose or -showcmds is used
- Ensure command line length limit is correctly respected in all cases
- Automatically handle response file line length limit with MS tools (avoid LNK1170)
- Fix caching when output object is *.cpp.obj (e.g. Unreal Build Tool)
- Don't let inaccessible drives trigger low-space disabling of FBuildWorker
- Parent scoping ^ now works correctly with ^X = { .Y } syntax
- A parse-time error will be emitted for conflicting files listed in Compiler()
- Fix crash caching of objects with preprocessed source > 2GiB (replace MurmurHash3a with xxHash)
- Treat remote failure with 0xC0000142 (Windows) as system error and retry (occurs during "force shutdown screen") (Thanks to Jean-Sebastien Pelletier)
- -nostoponerror no longer skips some parts of hierarchy when errors occur (Thanks to Jean-Sebastien Pelletier)

Improvements

- Report an error when command line is too long and response files can't be used
- Cache plugin now supported for OS X and Linux (Thanks to gdaow)
- Cache lookup using faster hashing algorithm (replace MurmurHash3a with xxHash)
- Add work-around for VS2012 Compiler enum pre-processing bug (Thanks to Jean-Sebastien Pelletier)
- VCXProject supports wildcards for file extensions
- Work towards feature parity on OS X and Linux

v0.87 (26-Sep-2015)
Note

- DB version has changed : clean build will occur

New

- The Intel Compiler is now a supported compiler (icl.exe)
- Variable prefix ^ allows access/modification of higher-level scope variables (Thanks to poppolopoppo)
- #define/#undef directives allow for user defined tokens (thanks to Poppolopoppo)

Fixes

- Fix missing dependency in some cases where #include was preceded by whitespace with MSVC compiler
- Prevent jobs being accepted if disk-space drops below threshold after a build has already started
- Improve detection of disk space failures with MSVC compiler
- Support /IMPLIB for Executables with MSVC Linker (Thanks to Josh Green)
- link.exe is recognized as a valid librarian, since it can be used with /LIB (Thanks to Josh Green)
- Fix VS Solution generated GUIDs being inconsistent in some situations, causing Solution to always be "dirty" (Thanks to Arttu Peltonen)

Improvements

- FBuildWorker UI shows warning in title when disk-space is low
- Missing documentation for Exec() .ExecReturnCode added (thanks to Josh Green)
- Exec() has new .UseStdOutAsOutput option, for executables which don't normally generate a file (thanks to Josh Green)
- Exec() function now supports multiple inputs (Thanks to Josh Green)
- Support for negating #if directive - i.e. #if !TOKEN (thanks to Poppolopoppo)
- Add .SourceBasePath to Copy() function - allows duplicating partial source path hierarchies into destination
- Multiple Wildcard Support:

- CompilerInputPattern (CSAssembly, ObjectList and Library) supports multiple wildcards
- UnityInputPattern (Unity) supports multiple wildcards
- SourcePathsPattern (CopyDir) supports multiple wildcards

- Optimizations:

- Latency of local job consumption is reduced by upto 15ms
- Optimize include discovery with MSVC compiler when using the preprocessor (cached or distributed compilation)

- Visual Studio Solution Generation:

- VSSolution Folder structs support String or ArrayOfStrings for .Project list
- VSSolution .SolutionProjects is now optional to avoid duplication in .SolutionFolders
- VSSolution supports setting inter-project dependencies; Useful in some situations

v0.86 (6-Aug-2015)
Note

- DB version has changed : clean build will occur

Fixes

- More robust fix for bug causing unnecessary rebuilds with MSVC compiler in some situations

- if a warning was generated, and /WX was not enabled, an invalid path could enter the dependency database
- bug introduced in v0.84

v0.85 (3-Aug-2015)
Note

- DB version has changed : clean build will occur

Fixes

- Fix bug causing unnecessary rebuilds with MSVC compiler in some situations

- if a warning was generated, and /WX was not enabled, an invalid path could enter the dependency database
- bug introduced in v0.84

v0.84 (28-Jul-2015)
Note

- DB version has changed : clean build will occur
- Behaviour of operator + on structs has changed

New

- #import directive allows importation of environment variables (Thanks to Poppolopoppo)
- Workers will self-deactivate when low on disk space (Thanks to Jean-Sebastien Pelletier)
- Visual Studio Solution generation (thanks to Poppolopoppo)
- Add "-nostoponerror" option: Try to build as much as possible instead of stopping on the first error

Fixes

- Includes are correctly tracked when using /showIncludes with non-English MSVC compiler (Thanks to Poppolopoppo)
- .StructA + .StructB results in members being recursively concatenated instead of replaced (Thanks to Poppolopoppo)
- Recognize -c as well as /c when checking for required compiler options with MSVC
- [OSX/Linux] Fix crash using -report
- Automatically strip /Gm compiler option with MSVC compiler (incompatible with FASTBuild)
- Compiled object extension defaults to .o on Linux/OS X
- Fix formatting of ToolManifest errors so they appear in VS Error Window (Thanks to Josh Green)
- Warn about invalid values passed to -j[x] option (local thread count) (values <0 or >64 are invalid)
- Prevent UnityNode excluded file list containing duplicates if using Precompiled Headers
- Ensure path exists /IMPLIB option if different from normal output to prevent linker option (Thanks to Josh Green)
- Fix crash when using /Fi or /P command line option with MSVC compiler (Thanks to Poppolopoppo)

Improvements

- Print() can now output any variable, array or structure with new Print( .Var ) syntax
- Optimizations

- Reduce latency starting a new jobs on a remote worker
- Reduce latency returning completed remote jobs
- Workers request 1 more job than available CPUs to overlap network transfer and compilation
- Reduce remote worker thread context switches

- #include now supports variable substitutions (e.g. #include "Compilers/$VSVersion$.h") (Thanks to Poppolopoppo)
- Excluded files support relative paths (starting with ../ or ..\) (Unity, ObjectList, Library and CSAssembly)

v0.83 (18-Jun-2015)
Note

- DB version has changed : clean build will occur

Fixes

- Fix formating of "-nooutputbuffering is deprecated" message
- Fix Exec and Copy steps fed explicitly to ObjectList/Library (via .CompilerInputFiles) being ignored
- Fix ObjectList sometimes being displayed as "??" in the -report output
- Don't look for import .lib when linking a DLL unless using the MS linker
- Unity() correctly depends on .UnityInputFiles that are output by other build steps

Improvements

- BFF parsing no longer complains about missing libs (leave this upto the linker)
- CompilerInputUnity can accept multiple Unity inputs in ObjectList() and Library()
- Unity can take output of an ObjectList(s) as input via new UnityInputObjectLists
- Add CompilerOutputPrefix option to ObjectList() and Library()
- Optimizations

- Reduce latency of Worker requesting jobs from Client
- Avoid remote workers underrequesting jobs when available job count is low (start and end of build)
- Use timing information from previous builds to improve local and remote scheduling
- Compile time improved slightly by using reponse files only when args are > 32767 characters
- Small optimization to console output
- Reduce external process invocation overhead by upto 16ms
- Reduce main thread context switches

v0.82 (30-May-2015)
Note

- DB version has changed : clean build will occur
- Location of compiled object files has changed (now in relative sub-dirs)
- "-nooutputbuffering" is deprecated: output is now always written in a timely fashion

Fixes

- Object files are built into sub dirs, avoiding "Conflicting objects found:" for cpp files with the same name in the same library
- Unity node no longer silently ignores input files that don't exist
- [Linux][OS X] Fix missing progress bar on Linux and OS X
- Fix dll (-shared and -dynamiclib) detection for gcc/clang linker

Improvements

- Auto-fixup incorrectly escaped closing quotes in MSVC include paths (common user error)
- Detect missing /c or -c compiler options (common user error)
- Total build time shown is more accurate (includes -summary and -report time)
- CompilerOutputpath in ObjectList and Library is auto-slash terminated
- Optimizations

- Network brokerage is no longer accessed if not in distributed mode
- Optimize thread pool creation, saving upto 16ms per cpu core
- Reduce all job scheduling latency by upto 30ms
- Optimized scheduling to eliminate additional latency in various situations
- Optimize unity file generation
- Optimize database loading for Compiler() nodes by eliminating unnecessary IO
- Reduce latency of distributed compilation by disabling TCP Nagle
- Reduce context switches on network threads (FBuild and FBuildWorker)
- Eliminate unnecessary progress calculation during shutdown
- Reduce context switches on main thread
- Optimized -summary output
- Optimized all console output slightly

v0.81 (9-May-2015)
Note

- DB version has changed : clean build will occur

New

- Add custom preprocessor support for ObjectList and Library (Thanks to Jussi Knuuttila):
  This allows for:

- Different complier version for preprocessor
- Completely different preprocessor (e.g. clang)
- Compiler for preprocessor/dependency tracking, combined with calling a custom tool

Fixes

- [Linux] UnityInputExcludedFiles is now case-sensitive on Linux
- Includes now discovered correctly with Clang for Windows and -fms-compatibility
- Avoid LNK4221 warning when all files in a unity are isolated due to .UnityInputIsolateWritableFiles
- Fix incorrect 'missing despite success' error message when primary compiler executable is not found

Improvements

- Print "WARNING:" instead of "PROBLEM:" in output when compiler passes, but emits text to stderr (like msvc when /nologo is not specified)
- Show exe path when failing to spawn linker (typically due to bad path to exe)
- Add CompilerInputExcludedFiles option to ObjectList, Library and CSNode (Thanks to Jean-Sebastien Pelletier)

v0.80 (5-Apr-2015)
Note

- DB version has changed : clean build will occur
- Protocol version changed : update workers

New

- OS X & Linux now supported (Alpha)

- All features except distributed compilation (coming in Beta)

- Add #if/#endif directives to assist in cross-platform bff configs
- Add built-in __WINDOWS__, __LINUX__ & __OSX__ symbols for use with #if

Fixes

- Toolchain distribution is correctly uniquified when compiler uses exe name to alter behaviour (PS4 Clang)
- Aliases to missing items will now report an error at build time
- Use response files to avoid command line limit on Windows when compiling C# (Thanks to Vitalii Trubchaninov)
- Linking a dynamic library created with GCC/SNC/Clang in a subsequent link step no longer causes an error

Improvements

- Support multiple concurrent FASTBuilds if run in different root folders (Thanks to Vitalii Trubchaninov)

v0.77 (19-Mar-2015)
Note

- DB version has changed : clean build will occur
- Various internal changes to prepare for Linux & OSX

New

- Unity supports wildcard ExcludePattern (String or ArrayOfStrings)

Fixes

- Fix path canonicalization bug for files with double slashes in path
- Cache path env variable is no longer ignored when Settings() is missing in BFF
- Database is once again saved when Ctrl+C is used from cmd line (broken in v0.73)
- Fix potential crash in string/path manipulation
- Test now correctly detects write failure when storing results to disk
- Avoid hanging parent process if FBuildWorker launched from script/Visual Studio

Improvements

- Detect and report as error missing %1 or %2 args for Compiler/Librarian/Linker
- Remove unnecessary re-parsing of BFF when cache path changes
- Out of disc space on remote worker for detected and handeld for MSVC, GCC and Clang
- Precompiled header generation is prioritized during scheduling

v0.76 (9-Feb-2015)
Note

- Distributed protocol version changed; update workers (Updated to isolate from workers without fixes from v0.72+)
- Various internal changes to prepare for Linux & OSX

Fixes

- Fix broken incremental linking with MSVC compiler (.ilk and .pdb were being deleted every time)
- Fix bug handling UNC paths in CachePath (leading double slashes were not respected)
- Fix double quotes not correctly canonizalized in some situations
- Stop LinkerStampExe being incorrectly attached to the link line

Improvements

- Remove some unnecessary command line manipulation with MSVC compiler for Recode compatibility

v0.75 (11-Dec-2014)
Improvements

- Large optimization for highly recursive dependency graphs
- Progress calculation optimized
- Progress calculation accuracy greatly improved

v0.74 (1-Dec-2014)
Note

- Database version changed : Clean build will occur
- Various internal changes to prepare for Linux & OSX

New

- CopyDir function - copy contents of one or more directories

Improvements

- Add explicit check and error msg for missing DLLs on remote machine
- Alias can refer directly to files not built by FASTBuild

Fixes

- Massive speedup to directory listing performance when dealing with > 4096 files
- Copy() dest timestamp is correctly set when using PreBuildDependencies
- #once include directive not being respected in some cases
- Fix included bff being considered always dirty in some cases
- VCXProjectNodes can be referenced as files (allows copying)
- Various cases where empty strings was not correctly reported as error 1004
- Empty Alias() .Targets is reported as an error instead of silently doing nothing

v0.73 (11-Nov-2014)
Note

- Database version changed : Clean build will occur
- Various internal changes to prepare for Linux & OSX

New

- Link steps (DLL/Exe) have new options for post-link in-place stamping (.LinkerStampExe and .LinkerStampExeArgs)

Fixes

- Preserve case of files discovered during compilation
- Fix BFF parser crash caused by unterminated strings, arrays or structs under some circumstances (now emit Error 1002)
- Ensure UnityInputExcludedFiles works correctly with full paths
- Ensure directories for VS Project generation are created before use
- Clang detection: *clang[.exe] and *clang-cl[.exe] detected in addition to existing *clang++[.exe]

v0.72 (28-Sep-2014)
Note

- Database version changed : Clean build will occur

New

- Support for Wii toolchain (CodeWarrior)
- Support for WiiU toolchain (GreenHills)
- Support for CUDA (nvcc.exe) compiler

Improvements

- Synchronized compiler files are locked by FBuildWorker.exe to prevent deletion on remote machine
- Project generation includes CUDA *.cu files by default

Fixes

- UnityInputExcludedFiles matches only full filenames instead of just matching the end of file names
- UnityInputExcludedFiles are canonicalized so double slashes no longer cause failure to exclude files
- Gracefully handle compiler being terminated remotely due to shutdown of PC

v0.71 (19-Jul-2014)
Note

- DB version has been increased; clean build will result after upgrading
- Distributed worker protocol has changed; update workers

New

- "-showcmds" option shows commands being executed during compilation (far less verbose than verbose)
- "-cpus=n" option allows number of cpus to be controlled from the command line
- "-mode=x" option allows worker mode to be controlled from the command line
- "-wait" command line options to allow queueing of multiple builds
- Add DeoptimizeWritableFiles option (use deoptimized settings for writable files)

Improvements

- Prevent Executables/DLLs re-linking when a DLL they depend on changes, but the interface stays the same
- Incremental link files (.ilk) deleted before linking when doing a -clean build
- PDB files deleted before linking (if non-incremental) to avoid pdb bloat and link slowdown
- Automatically strip /MP argument for MSVC compilers (FASTBuild controlls the parallelization)

Fixes

- Differentiate remote "system" failures from compilation failures
  - a remote failure will cause the worker to be deny listed and the task retried on another worker
  - remote failure on 3 different workers will fail as before (indicates a configuration problem)
- Error path fixup now handles "remark:" and "fatal error:" style messages
- Fix path fixup for SNC compiler output (errors, warnings etc)
- PS4 linker uses response files to avoid 32KiB cmd line limit
- PS4 linker tracks library dependencies passed directly on compiler command line
- FBuildWorker.exe correctly exits on WM_CLOSE notifications (taskkill for example) instead of minimizing
- PreBuildDependencies are correctly processed for -summary and -report

v0.70 (21-Jun-2014)
Note

- DB version has been increased; clean build will result after upgrading
- Cache format has changed; existing cache data will be ignored
- Distributed worker protocol has changed; update workers

New

- Distributed compilation is no longer in Beta.

Improvements

- Cache size & speed optimizations
  - Cache compression switched to LZ4
  - 20-30% reduced output size (less space used on cache, less network transfer)
  - 20-30% faster compression (less time spent on local machine when storing to cache)
  - 600% faster decompression speed (when decompressing on local machine after retrieval from cache)
- FBuildWorker can use tools synchronized from a previous run to reduce network IO
- Distributed compilation speed optimizations
  - Replace distributed compilation compression with LZ4
  - 50% reduced transfer size (half the data sent to remote machine, half the memory usage locally when pending)
  - 230% faster compression speed (less time spent compressing before sending)
  - 700% faster decompression speed (7x less work to decompress on remote machine)
- Use 64bit MurMur3 hash for faster/better cache key generation
  - 300% faster hash of preprocessed cache input
  - Less chance of collisions vs CRC32
  - Using 64bits MurMur3 for further reduced collision potential
- Optimize include parsing for all compilers
- Support /7i and /ZI debug format for distribution with MSVC compiler

Fixes

- Handle tool synchronization failure properly to avoid leaked jobs
- Fix remote worker over-requesting jobs when not using full cpu allocation (was causing reduced scheduling efficiency)
- Includes no longer implictly push an addition {} scope (this was preventing includes being useful in many cases)
- -config args are correctly passed to sub-process when in -vs or -wrapper mode
- Fix race condition preventing copy in FBuildWorker auto-restart, causing update to fail

v0.62 (28-Apr-2014)
Note

- DB version has changed: full build will occur
- Wrapper Mode (-wrapper) is now active as part of Visual Studio mode (-vs)

New

- FBuildWorker will auto-restart when updated (i.e. new version sync'd from revision control)

Improvements

- Allow ObjectList, Library and CSAssembly to take multiple exclusion paths
- Add "DeploymentType" and "DeploymentFiles" to vcxproj generation for Xbox360
- .m and .mm files are included in vcxproj generation by default
- Multiple targets are built in parallel
- Cost of progress calculation is massively reduced
- Remotely compiled tasks are written to the cache on return
- -summary shows total remote CPU time
- Reduce FBuildWorker CPU usage when worker is idle

Fixes

- Deoptimized compilation settings were being ignored if using distributed compilation
- Files using /FI (Force Include) with MSVC compiler compile correctly when using the cache or distribution
- Fix -summary time output when building multiple targets
- Consider PreBuildDependencies correctly in progress estimation
- Fix report/chart colours not working in -report due to bad html
- Fix bad report generation when using ObjectList
- Fix collapsable report sections in IE and Firefox
- Correct -summary build count for remotely compiled objects
- Locally build distributable tasks can be written to the cache
- Correct use of reponse files with orbis-ar.exe which requires slashes to be escaped in file

v0.61 (29-Mar-2014)
Note

- DB version has been increased; clean build will result after upgrading
- Cache format has changed; existing cache data will be ignored
- Distributed worker protocol has changed; update workers

New

- Cache Plugin Architecture - allows cache IO functionality to be provided by a plugin dll

Improvements

- Distributed Compilation

- Increase distributed connection limit to 15
- Minimization state of worker is persisted between runs
- Worker default CPU allocation is 50%
- Add icon the FBuildWorker.exe
- Memory usage for distributed compilation is massively reduced
- Distributed compilation will race remaining remote jobs locally, when there is no other work to do

- Improve validation of .LinkerOutput argument (ensure a file and not a path is provided)
- Safely handle empty libraries passed to linker .Libraries
- Check for and handle truncated data being returned from the cache

Fixes

- Distributed Compilation

- Fix crash in worker when compilation error contains %
- Fix job leak causing hang when synchronizing the same toolchain for 2 clients at the same time
- Prevent some unsafe access to management structures on Worker
- Fix potentially long shutdown when a remote worker is unresponsive
- Prevent potential hangs in networking
- Fix memory leak in worker if disconnected during tool synchronization

- Fix crash when doing multiple rapid build/cancel cyles with -wrapper mode
- Use the compiler toolchain hash in the cache key
- Fix inability to detect fully pathed libs passed to .LinkerOptions
- Detect MSVC linker correctly when provided as file only (i.e. relying on system path for discovery)
- Fix path canonicalization when a relative path begins with a slash
- Fix crash if cache path is empty, or a UNC path only to a machine
- A failure in one of multiple targets on the command line no longer causes all subsequent tasks to fail
- Librarian step uses response files to avoid 32KiB command line length limit

v0.60 (10-Mar-2014)
Note

- DB version has been increased; clean build will result after upgrading

New

- [BETA] Distributed compilation support
- Deoptimization of writable files containing FASTBUILD_DEOPTIMIZE_OBJECT token

Improvements

- Project Generation

- Generated projects can directly launch/debug PS3/PS4
- Allow options to be set per-configuration
- Many new project generation options exposed
- Supports multiple base paths

- Caching

- Show cache hits in standard output
- Caching automatically disabled for files isolated from unity
- Cache mode can be controlled via FASTBUILD_CACHE_MODE environment variable ('r', 'w' or 'rw')
- Allow cache path to be set via an environment variable "FASTBUILD_CACHE_PATH"

- FASTBuild runs at below normal priority for improved machine responsiveness
- When MS linker crashes and we retry, supress the error to prevent visual studio from failing
- Exec with -verbose prints in a cut and pasteble format to assist config debugging
- Saving of the dependency graph is performed atomically to reduce chance of corruption if fbuild.exe is terminated during DB serialization
- [BETA] Add "-wrapper" command line argument for Process Isolation. Allows graceful shutdown when terminated from Visual Studio.
- Add .PreBuildDependencies to Copy() and Exec()
- Add '-fixuperrorpaths' command line to reformat GCC/SNC/Clang errors to Visual Studio format
- Prevent two objects being built to the same obj
- Enabled Unity generation on multiple threads
- PrecompiledHeader is used when locally building a distributable job, or if cache is in read-only mode

Fixes

- Prevent #pragma messages being incorrectly parsed as includes in some cases with GCC/SNC/Clang
- Fix -I arguments not being removed from Clang when using preprocessed output
- Precompiled headers with Clang are not prevented from working usefully
- Don't try to use precompiled headers in link step with GCC/SNC/Clang
- Project generation LocalDebuggerWorkingDirectory written to correct part of project
- Fix missing carriage return in output with --help
- Exec with -verbose prints args after substitutions (%1 etc)
- Handle UNC cache path correctly
- Format FASTBuild errors so that column is interpretted by VisualStudio correctly
- Fix performance degradation when failure output is massive (>1MiB) - (e.g. link failure)
- Correctly return error when multiple targets are built and one fails
- Replace pattern matching of FindNextFile with our own (so *.cpp doesn't return files like *.cpp~)
- Fix items not under project path not being double clickable
- Library() deleted libraries before creation to ensure old symbols don't remain in library
- Prevent bff included with ../ being considered dirty every time

v0.58 (23-Jan-2014)
Note

- DB version has been increased; clean build will result after upgrading
- BFF includes are now relative to includer (no "system" includes)

New

- Clang & PS4 support
- Add #once pragma which allows BFF files to be included multiple times, but parsed only once
- MSVC linker crashes (LNK1000) will be retried once as work around for bug in x64 incremental linker

Improvements

- VCXProject creates projects which are compatible with VS2010 as well as 2012/2013
- VCXProject can specify debugger args (working dir, startup exe etc)
- Path canonicalization handles \.\ and \..\ for better consistency in target names
- Failure find include shows full path of where the include was expected to be found
- Greatly improve performance of VS project generation when there are many folders
- Dependencies passed directly to linker (instead of .Libraries) and have their dependencies tracked
- Copy step shows source and dest for copy in tty
- -verbose mode will specify the reason for building any nodes
- Exec function supports build time substitutions %1 (input) and %2 (output)
- /IMPLIB supported for MSVC linker. Import lib specified will be used by dependent dlls.
- Show in output when DB version has changed and rebuild will occur
- Show when BFF files are modified and config re-parsing will occur
- CachePath of wrong type emits an error instead of silently being ignored
- Various system error messages are now formatted to appear in Visual Studio error window
- Improve GCC detection - recognize g++ as well as gcc
- Repeat name of object when compilation fails so task is clear

Fixes

- Caching can be safely used on objects using precompiled headers with MSVC, avoiding missing debug info.
- CLR code is not distributed/cached (compiler bug prevents safe use of the preprocessor)
- Fix temp file writing failure detection (ensure whole file is written)
- Compiler and Linker use response files to avoid Windows 32KiB args limit
- Detect cyclic BFF include dependencies and report new Error 1035 instead of crashing with stack overflow
- Correctly detect changes to BFF files with the same name when one is bff relative and one is in the system directory
- Fix duplicate folders in generated VS project, causing project size bloat
- Correctly handle '-o FileName' as well as '-oFileName' arguments with GCC/SNC compiler when manipulating args
- Fix error in command line arguments to SNC when using cache
- Fix bad file extension for preprocessed temp file with SNC compiler
- Disable cache when using /ZW (consume WinRT) with MSVC compiler due to incompatibility
- Fix cache sensitivity on working dir drive letter causing cache misses
- Correct reversed types in Error 1027 with String + ArrayOfStrings
- Fix formatting so first error with GCC/SNC is always double-clickable in Visual Studio

v0.57 (8-Dec-2013)
Note

- DB version has been increased; clean build will result after upgrading

New

- VisualStudio project generation
- New .LinkerLinkObjects option on Executable() & DLL() allows control over linking objects instead of libs.
- New .CompilerForceUsing option on Library() and ObjectList(), with %4 build-time substitution for use with MSVC /FU option.
- New .LinkerAssemblyResources option on Executable() & DLL(), with %3 build-time substitution for use with MSVC /ASSEMBLYRESOURCE option.
- New .PreBuildDependencies option for Library(), allows forced execution of an external process before a Library/ObjectList is built to better support extenal code generation.
- New ObjectList() function allows building a list of items without linking into a library, to support buiding objects or resources without making libraries.
- .LibrarianAdditionalInputs option on Library() to allow merging of objects, libraries or resources built externally or with Exec() or ObjectList().

Improvements

- Add '.UnityInputFiles' option to allow an explicit file list to be provided to a Unity node
- Support various assignment/concatenation oprerations with ArrayOfStrings and ArrayOfStructs
- For libraries with mixed Unity and Non-Unity nodes, favour Unity nodes for compilation
- Prioritize linking over compiling to reduce DLL bottlenecks
- Job queue manipulation overhead is reduced
- DLL & Executable support referencing a library or dll via a copy (to ensure the copy happens at build time)
- Copy() supports multiple inputs if an output path is specified
- Unity files emit #pragma messages to clearly show file being compiled in case of failure
- .CompilerOutputExtension can be specified on Library() to control the extension for built objects
- FASTBuild emits an error and exits if another instance is already running
- Allow use of %3 Compiler build-time expansion for PCH object in object compilation as well as precompiled header compilation

Fixes

- Escaping correctly works for all characters, not just "
- -summary option shows cache hit time for cache hit nodes, instead of last known build time
- Prevent a race where some additional jobs could be started after a failed task
- Fix incorrect error message when attempting to concatenate Struct to ArrayOfStrings
- Fix crash when self-assigning variables (i.e. .MyString = .MyString)
- Assignment of structs was functioning as a concatenation (was keeping old members when it shouldn't)
- Handle quoted build-time substitutions correctly to support spaces in paths (i.e. "%1" becomes "A" "B" "C" (instead of "A B C")
- Unity uses "" style includes (instead of <>) to satisfy compilers like Clang
- Fix bug causing massive slowdown generating large reports (-report)
- Fix output to stdout being truncated to 8KiB in some cases when using -verbose
- Copy can reference an alias as a source, including those aliasing multiple inputs
- Correct bad formatting of Exec node in -verbose mode
- Executable & DLL linking can accept an input built by Executable()
- Fix failure to extract includes when include as on last line with no carriage return

v0.56 (10-Nov-2013)
Note

- DB version has been increased; clean build will result after upgrading

New

- New -report command line argument which outputs a detailed report of the build, including:
  - Processing time by item.
  - Processing time by library.
  - Processing time by type (obj, exe, dll etc).
  - Cache statistics.
  - Include file usage.
- Add 'UnityInputIsolateWritableFiles' to unity generation. Allows files which are "open for edit" in revision control to be built individually to speed up iterative compile times.

Improvements

- Tests can reference execuable via alias
- -verbose output for Objects is improved: Timing is more accurate and number of includes found is displayed.
- Include processing optimizations
- Dependency graph traversal optimizations
- Progress estimation optimizations
- Large database load/save time is greatly reduced
- Database size is greatly reduced
- Total build time includes some previously excluded overheads
- Job queue contention optimization
- Small optimization to Unity generation

Fixes

- Avoid using preprocessor with MSVC compiler unnecessarily
- Fix C# dependencies not being tracked properly when using -clean
- Fix C# dependencies not being tracked correctly for multiple explicitly listed .cs files
- GCC includes not being correcly detected
- MSVC includes being missed on some rare occasions
- Fix poor unity splitting logic resulting in bad distribution and occassional empty unity files
- Cache stats in -summary were not being displayed when in "writeonly" mode
- Cache commit to existing entry no longer results in removal of entry
- Allow concatenation of a String variable to an ArrayOfStrings variable instead of generating error 1034
- Copy step outputs a line to the tty during build, consistent with other tasks
- Copy outputs detailed information when -verbose is used
- Copy outputs a failure message when copy fails
- Fix progress calculation reaching 100% before completion
- Fix small memory leak when generating unity files
- Handle some highly unlikely cases of failing to set file time for cache retrieval
- Empty arrays containing whitespace or comments are now handled correctly

v0.55 (5-Oct-2013)
Note

- DB version has been increased; clean build will result after upgrading

Improvements

- Language Syntax Enhancements

- A new variable of type Struct can be defined, grouping other variables
- Structures can be kept in Arrays and Arrays can be iterated over
- A new Using function takes all the variables in a Struct and pushes them into the current scope
- Add Print function to assist debugging configurations
- Allow 0 size ForEach loops
- Allow String to be concantenated to ArrayOfStrings

- Build Functionality Enhancements

- Add SNC compiler detection
- Add Exec() function - calls an arbitrary executable to create a file
- Test() function can use existing executable, as well as one built by FASTBuild

- Static libs and DLLs automatically use precompiled header obj files
- Errors are output contiguously, improving readability when there are multiple failed nodes
- Improve thread number output when compiling with > 9 threads
- Unity 'InputUnityExludePath' supports multiple exlude paths
- More detailed errors when failing to write temp files
- Linker failure message is imrproved (specifies Dll or Exe, rather than just "Linker")
- Add wesbite and copyright info to "-version" output
- Show total time taken by node type in -summary output
- Various -summary formatting enhancements
- Small performance improvement for processing very large objects

Fixes

- DLL Fixes

- DLLs comiled with MSVC correctly link export symbols
- When linking a DLL, "DLL:" is shown in output instead of "Exe:"
- Linking a DLL with another DLL deduces the import library automatically
- Ensure DLLs are not rebuilt unnecessarily

- GCC/SNC/PS3 Fixes

- Fix broken PS3/SNC compilation (was reading stderr instead of stdout)
- Standardize GCC and MSVC compiler detection (allow with and without .exe extension)
- Fix detection of GCC compiler in PS3 SDK
- Fix detection of C vs C++ for GCC/SNC when using the cache

- Correct errors not being double-clickable in VisualStudio in some situations due to thread numbering
- Ensure active job count doesn't underflow when performing local jobs
- Correct formatting of cache path to stdout in -verbose mode
- Correct error message when attempting to append String to incompatible type
- Don't spin @ 0% when failing the build
- Save completion of items which are succesful even after the build as a whole has failed
- -summary formatting is no longer reliant on tab width

v0.54 (3-Jun-2013)
Note

- DB version has been increased; clean build will result after upgrading

Improvements

- Allow {} to be used alone to create a local scope (like a function)
- Config files (bff) can now include other config files, e.g. #include "file.bff"
- Direct variable assignment/concatenation now supported for variables (.X = .Y)

Fixes

- Unity generation parameter UnityInputExcludedFiles is no longer sensitive to slash type used
- Stop tasks sometimes being started after build is aborted with Ctrl+C
- Fix typographical error in command line usage output
- Fix hang at startup if database file (.fdb) has been corrupted
- Fix corrupt "Unknown argument" error message when passed bad cmd line arguments

v0.53 (24-Feb-2013)
Note

- The cache is invalidated due to path/version changes (no old entries will be used)

Improvements

- Cache performance and space usage improvements

- Cache directory hierarchy is simplified to reduce IO
- Cache contents are compressed, saving ~50% of disk space
- Compression yields speedups on IO bound (local or network) builds

- Handle transient file opening failures due to other applications opening our files (Antivirus etc)
- Add "Copy" function which can copy a file during the build
- Library and CSAssembly 'CompilerInputPath' can now accept a list of paths (or a single path as before)
- Optimize node lookups to reduce CPU usage
- Hide distributed task counts on progress bar when not in distributed mode

Fixes

- Correct misleading error when unexpected character follows a variable operator (was displaying #1016, now displays new #1017)
- Correctly handle comments in the middle of variable assignments (e.g. ".Var // comment" or ".Var = // comment")
- Comments are correctly parsed inside {} scopes when starting at column 0
- Add missing type safety checks on various CSAssembly and Library properties
- Unity files are forced to be regenerated when "-clean" option is used
- Build no longer gets stuck upon cache hit when running with "-j0"
- Temp directory now correctly initialized when running with "-j0"

v0.52 (18-Feb-2013)
Note

- The build database (fdb) version has changed, a clean build will forced on first use of this version

Improvements

- Unity 'UnityInputPath' can now accept a list of paths (or a single path as before)

Fixes

- Fix crash emitting a large errors to the TTY (>64KB)
- Detect non-unique Unity, Executable and DLL nodes (emit Error #1100)
- Handle Unity output paths that are not \ terminated

v0.51 (17-Feb-2013)
New

- Config file now supports // style line comments as well as ; style
- Add checks and errors (#1302, #1303) for bad precompiled header setup for cl.exe
- Config markup helpers for VisualStudio and NotePad++

Improvements

- Improve precision of timer used to track task durations

Fixes

- All object and pch files are deleted before compilation to ensure rebuild/no old files left behind
- Fix bad string output in "Unknown build target" message in x64
- Compiler executable (MSVC & GCC) detection is no longer case sensitive
- Removed detection of lower-case /z7 is as using Z7 debug format for cl.exe. (Z7 debug format arg is uppercase, and cl.exe compiler options are case sensitive)

v0.50 (12-Feb-2013)
The first public release of FASTBuild, with stable support for:

- Optimal multi-threaded compilation
- Build caching (network and/or local)
- Unity/Blob generation
- Unit Test Integration