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

下一篇:在FASTBuild中使用Caching

初识FASTBuild 一个大幅提升C/C++项目编译速度的分布式编译工具的更多相关文章

  1. dWebpack编译速度优化实战

    当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的 ...

  2. maven权威指南学习笔记(三)——一个简单的maven项目

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  3. 如何使用maven建一个web3.0的项目

    使用eclipse手动建一个maven的web project可能会有版本不合适的情况,例如使用spring的websocket需要web3.0什么的,不全面的修改可能会出现各种红叉,甚是苦恼.我从我 ...

  4. 并行编译加快 VS C++ 项目的编译速度

    最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...

  5. 使用Maven创建一个Spring MVC Web 项目

    使用Maven创建java web 项目(Spring MVC)用到如下工具: 1.Maven 3.2 2.IntelliJ IDEA 13 3.JDK 1.7 4.Spring 4.1.1 rele ...

  6. 并行编译加快VS C++项目的编译速度

    最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...

  7. 大型项目使用Automake/Autoconf完成编译配置

    http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...

  8. JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)

    接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...

  9. 以sb7code为基础创建一个基本的OpenGL项目

      以sb7code为基础创建一个基本的OpenGL项目   从github上面下载sb7code代码: https://github.com/openglsuperbible/sb7code 打开H ...

随机推荐

  1. BZOJ 1800

    1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1622  Solved: 1293[Submit][St ...

  2. Request 部分功能

    Request 六大功能: 1.获取客户端请求信息: getRequestURL方法 -- 返回客户端发出请求完整URL getRequestURI方法 -- 返回请求行中的资源名部分 getQuer ...

  3. Codeforces 1023 C.Bracket Subsequence-STL(vector) (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)

    C. Bracket Subsequence ... 代码: 1 //C 2 #include<iostream> 3 #include<cstdio> 4 #include& ...

  4. HDU 6319.Problem A. Ascending Rating-经典滑窗问题求最大值以及COUNT-单调队列 (2018 Multi-University Training Contest 3 1001)

    2018 Multi-University Training Contest 3 6319.Problem A. Ascending Rating 题意就是给你长度为k的数列,如果数列长度k<n ...

  5. HDU 4355.Party All the Time-三分

    Party All the Time Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. (21)python Anaconda

    1.安装 Anaconda下载镜像      --官网下载太慢 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 下载安装后 2.添加第三方源 管 ...

  7. E - A strange lift 【数值型BFS+上下方向】

    There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 ...

  8. CSU 1337 搞笑版费马大定理【优化枚举】

    费马大定理:当n>2时,不定方程an+bn=cn没有正整数解.比如a3+b3=c3没有正整数解.为了活跃气氛,我们不妨来个搞笑版:把方程改成a3+b3=c3,这样就有解了,比如a=4, b=9, ...

  9. web前端读取文本文件内容

    html5+js实现,参照xxyy888的CSDN博客文章<使用HTML+javascrpt读取txt文本文件>失败,将作者文章中的代码重新整理了下依然不行,文章代码存在的问题是括号错误, ...

  10. Visual Studio 2017 编译Clang

    到http://releases.llvm.org/download.html下载LLVM和clang源码 比如: http://releases.llvm.org/6.0.0/llvm-6.0.0. ...