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. poj 2007(凸包)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8005   Accepted: 3798 ...

  2. C#关于log4net(Log For Net)

    1       介绍 log4net(Log For Net)是Apache开源的应用于.Net框架的日志记录工具,详细信息参见Apache网站.它是针对Java的log4j(Log For Java ...

  3. spark技术热点问题互动问答2

    决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第3期互动问答分享] Q1: groupbykey是排好序的吗?分组排序怎么实现? groupByKey在一个由(K,V)对组成的数据 ...

  4. Nodejs微信开发使用wechat-api回复多条消息

    在上一往篇文章<Nodejs微信开发>中,微信后台能够正常的接收到客户端的消息,并能够简单的回复一条消息至客户端. 但我的目录是将微信与Bot Framework进行关联,那么肯定就有一些 ...

  5. centos6.5 安装stardict 出现问题 [Errno 256] No more mirrors to try

    1. 下载startdict #wget http://downloads.naulinux.ru/pub/NauLinux/6x/i386/sites/School/RPMS/stardict-3. ...

  6. luogu P1038借教室【Noip提高组2012】

    这道题我读完题目的第一感觉是: 这不就是个线段树??用线段树维护区间最小值,检查是否满足订单要求即可判断. 对于修改操作直接在区间上进行. 据说会卡一卡线段树,但是貌似写一个懒标记,连zkw线段树都不 ...

  7. 通用数据库管理工具DBeaver

    通用数据库管理工具DBeaver   在渗透测试中,用户往往需要管理很多数据库.这些数据库可能是渗透软件使用的(如Metasploit使用的Postgresql),也有目标主机的数据库(如网站的数据库 ...

  8. CodeChef - UASEQ Chef and sequence

    Read problems statements in Mandarin Chinese and Russian. You are given an array that consists of n ...

  9. 【MySQL笔记】: unable to connect to remote host. catalog download has failed.

    安装完MySQL之后,它每天凌晨启动一个Intaller任务,甚是烦人:   这是一个Windows的计划服务,在这里删除即可,开始/附件/系统工具/任务计划程序,把mysql的定时任务计划取消/删除 ...

  10. 使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    原文:http://www.cnblogs.com/ityouknow/p/8403388.html 随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成, ...