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. PHP定时执行

    参考一 test.bat D:\myamp\php\php.exe -q D:\myamp\Apache\htdocs\dingshi.php dingshi.php <?php ignore_ ...

  2. 正则表达式筛选出jpg、png的图片url

    有些字符串也不是富文本,也不是带标准标签的图片地址和文字.想筛选出所有图片或地址怎么办呢.话不多说直接上带码. private static void reg() { // TODO Auto-gen ...

  3. [BZOJ4006][JLOI2015]管道连接 状压dp+斯坦纳树

    4006: [JLOI2015]管道连接 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1020  Solved: 552[Submit][Statu ...

  4. AC日记——Keywords Search hdu 2222

    2222 思路: ac自动机模板题: 代码: #include <cstdio> #include <cstring> #include <iostream> #i ...

  5. 浙江省第十二届省赛 Beauty of Array(思维题)

    Description Edward has an array A with N integers. He defines the beauty of an array as the summatio ...

  6. centos6.5 中文输入法图标和提示都不见了【解决】

    原因python升级引起的 两步解决: # vi /usr/bin/ibus-setup # vi /usr/libexec/ibus-ui-gtk 把这两个文件中的exec python 修改为 e ...

  7. (转载)grep的使用

    R的意思是递归的对目录下的所有文件(包括子目录)进行 grep. 比如 grep -R main src就会搜索src目录下所有文件中是否包含 main 这个字符串. 因此grep -R " ...

  8. opencv图像二值化的函数cvThreshold()。 cvAdaptiveThreshol

    OpenCV中对图像进行二值化的关键函数——cvThreshold(). 函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvThreshold( const CvArr* sr ...

  9. 洛谷 P1012 拼数 [字符串]

    题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...

  10. Codeforces #428 Div2 D

    #428 Div2 D 题意 给出一些数,现在要求找出一些数满足 \(i_1 < i_2 < i_3 < ... < i_k\) 以及 \(gcd(a_{i_1}, a_{i_ ...