FASTBuild 是一款高性能、開源的構建系統,支持高度可擴展的編譯,緩存和網絡分發。
以上是FASTBuild官網對其產品的一句話介紹。
FASTBuild 的開源地址:https://github.com/fastbuild/fastbuild
眾所周知C/C++語言的一大特色就是需要人為地描述編譯過程,然后編譯器才會按照這個編譯過程一步一步生成你所需要的目標文件。Linux下有make命令和Makefile來完成這一任務,Windows下有各種界面化的IDE幫助開發人員完成這些瑣碎的工作,包括后來的CMake可以支持跨平台的編譯過程描述,其原理都是一樣的。
FASTBuild和上面列舉的這些工具作用很相似,就是通過解析輸入的編譯過程描述文件,調用編譯工具,按照步驟生成目標文件。但是如果僅限於此,FASTBuild和其他工具就沒什么區別了,它的優勢在於它可以通過緩存和網絡分發來加快構建的過程。
想要使用FASTBuild,首先得學會 fbuild.bff 文件的編寫,fbuild.bff本質上也是一個編譯過程描述文件,無非是指定編譯器路徑、鏈接器路徑、包含目錄、庫目錄、源代碼目錄、編譯參數等等一些編譯必要的信息,具體的語法可以在官網查到。
下面是一個多文件、多目標的 fbuild.bff 文件的示例。
完整工程路徑:https://gitee.com/tiger_git/FASTBuild_SimpleExample
// Windows Platform (VS 2015 Compiler, Windows 7.1A SDK) // 指定開發環境 //------------------------------------------------------------------------------ .VSBasePath = 'C:\Program Files (x86)\Microsoft Visual Studio 14.0' //------------------------------------------------------------------------------ Settings { .Environment = { "PATH=$VSBasePath$\Common7\IDE\;$VSBasePath$\VC\bin\x86_amd64\", "TMP=C:\Windows\Temp", "SystemRoot=C:\Windows" } } // X64 ToolChain // 指定具體的工具路徑 //------------------------------------------------------------------------------ // 編譯器 .Compiler = '$VSBasePath$\VC\bin\x86_amd64\cl.exe' // 編譯選項 .CompilerOptions = '"%1"' // Input + ' /Fo"%2"' // Output + ' /Z7' // Debug format (in .obj) + ' /c' // Compile only + ' /nologo' // No compiler spam + ' /EHsc' + ' /MTd' // 鏈接器 .Linker = '$VSBasePath$\VC\bin\x86_amd64\link.exe' // 鏈接選項 .LinkerOptions = ' /OUT:"%2"' // Output + ' "%1"' // Input + ' /nologo' // No linker spam + ' /DEBUG' // Keep debug info when linking + ' /NODEFAULTLIB:libcmt.lib' + ' /MACHINE:X64' // 庫生成器 .Librarian = '$VSBasePath$\VC\bin\x86_amd64\lib.exe' // 庫生成器選項 .LibrarianOptions = '"%1"' + ' /OUT:"%2"' + ' /nologo' + ' /MACHINE:X64' // 包含目錄 ----------------------------------------------------------------------- .BaseIncludePaths = ' /I"./"' + ' /I"$VSBasePath$\VC\include\"' + ' /I"$VSBasePath$\VC\atlmfc\include\"' + ' /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt"' + ' /I"C:\Program Files (x86)\Windows Kits\8.1\Include\um"' + ' /I"C:\Program Files (x86)\Windows Kits\8.1\Include\shared"' + ' /I"C:\Program Files (x86)\Windows Kits\8.1\Include\winrt"' .CompilerOptions + .BaseIncludePaths // 庫目錄 //------------------------------------------------------------------------------ .LibPaths = ' /LIBPATH:"$VSBasePath$\VC\lib\amd64"' + ' /LIBPATH:"$VSBasePath$\VC\atlmfc\lib\amd64"' + ' /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64"' + ' /LIBPATH:"C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64"' + ' /LIBPATH:"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\Lib\um\x64"' .LinkerOptions + .LibPaths // 常見的系統庫 // .CommonLibs = ' libcmt.lib' // + ' kernel32.lib' // + ' user32.lib' // + ' gdi32.lib' // + ' winspool.lib' // + ' comdlg32.lib' // + ' advapi32.lib' // + ' shell32.lib' // + ' ole32.lib' // + ' oleaut32.lib' // + ' uuid.lib' // + ' odbc32.lib' // + ' odbccp32.lib' // 生成utils.lib // utils------------------------------------------------------------------------------ Library('utils') { .CompilerInputPath = 'utils' // 源文件所在目錄,就是把該目錄下所有的.cxx\.c文件編譯成庫文件 .CompilerOutputPath = 'objs\utils' // .obj文件 輸出目錄 .LibrarianOutput = 'lib\utils.lib' // 庫文件 輸出目錄 } // 生成net.lib // net------------------------------------------------------------------------------ Library('net') { .CompilerInputPath = 'net' // 源文件所在目錄,就是把該目錄下所有的.cxx\.c文件編譯成庫文件 .CompilerOutputPath = 'objs\net' // .obj文件 輸出目錄 .LibrarianOutput = 'lib\net.lib' // 庫文件 輸出目錄 } // 生成frame.lib // frame------------------------------------------------------------------------------ Library('frame') { .CompilerInputPath = 'frame' // 源文件所在目錄,就是把該目錄下所有的.cxx\.c文件編譯成庫文件 .LibrarianOutput = 'lib\frame.lib' // .obj文件 輸出目錄 .CompilerOutputPath = 'objs\frame' // 庫文件 輸出目錄 } // 生成gate.exe // gate------------------------------------------------------------------------------ ObjectList('gate_objs') // 生成gate所需的objs文件 { .CompilerInputPath = 'gate' // 源文件所在目錄,就是把該目錄下所有的.cxx\.c文件編譯.obj(s)文件 .CompilerOutputPath = 'objs\gate' // .obj文件 輸出目錄 } Executable('gate') { .Libraries = { 'gate_objs', 'net', 'utils' } // 把gate.exe所需的.obj(s)文件和.lib(s)文件鏈接成.exe文件 .LinkerOutput = 'bin\gate.exe' // .exe文件輸出目錄 } // game------------------------------------------------------------------------------ ObjectList('game_objs') // 生成game所需的objs文件 { .CompilerInputPath = 'game' // 源文件所在目錄,就是把該目錄下所有的.cxx\.c文件編譯.obj(s)文件 .CompilerOutputPath = 'objs\game' // .obj文件 輸出目錄 } Executable('game') { .Libraries = { 'game_objs', 'net', 'utils', 'frame' } // 把game.exe所需的.obj(s)文件和.lib(s)文件鏈接成.exe文件 .LinkerOutput = 'bin\game.exe' // .exe文件輸出目錄 } // 設置all包含的所有目標,執行fbuild.exe的時候,會默認把all下所有的目標都生成一遍,目標之間的依賴關系會被自動推導 // All //------------------------------------------------------------------------------ Alias( 'all' ) { .Targets = { 'gate', 'game'} }
點擊 fbuild.bat