初识FASTBuild 一个大幅提升C/C++项目编译速度的分布式编译工具
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 一个大幅提升C/C++项目编译速度的分布式编译工具的更多相关文章
- dWebpack编译速度优化实战
当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的 ...
- maven权威指南学习笔记(三)——一个简单的maven项目
目标: 对构建生命周期 (build lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...
- 如何使用maven建一个web3.0的项目
使用eclipse手动建一个maven的web project可能会有版本不合适的情况,例如使用spring的websocket需要web3.0什么的,不全面的修改可能会出现各种红叉,甚是苦恼.我从我 ...
- 并行编译加快 VS C++ 项目的编译速度
最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...
- 使用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 ...
- 并行编译加快VS C++项目的编译速度
最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...
- 大型项目使用Automake/Autoconf完成编译配置
http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...
- JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)
接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...
- 以sb7code为基础创建一个基本的OpenGL项目
以sb7code为基础创建一个基本的OpenGL项目 从github上面下载sb7code代码: https://github.com/openglsuperbible/sb7code 打开H ...
随机推荐
- 解决:centos7.3 tomcat7启动巨慢问题
目前公司大部分服务器操作系统还是centos6.5,tomcat用的是7,平时基本上没什么问题,启动也比较快,但是,最近有部分项目服务器更新至centos7.3 ,有些机器启动tomcat的时候巨慢无 ...
- 《Java编程思想》笔记 第八章 多态
1.向上转型 把子类引用当作父类引用.(子类对象赋值给父类引用) 2.绑定 确定方法属于哪个类. 3.前期绑定 程序执行前绑定. 4.后期绑定也叫动态绑定 程序运行时绑定. 5.多态 多个不同的对象对 ...
- nginx部署vue工程和反向代理nodejs工程
前端是vue,后端是nodejs 前端打包成dist目录,后端接口是localhost:4000/api server { listen 80; #listen [::]:80; server_nam ...
- 常用的WebService一览表
天气预报Web服务,数据来源于中国气象局Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmxDisco ...
- 使用vscode开发调试.net core应用程序并部署到Linux跨平台
使用VS Code开发 调试.NET Core RC2应用程序,由于.NET Core 目前还处于预览版. 本文使用微软提供的示例进行开发及调试. https://github.com/aspnet/ ...
- 【互动问答分享】第10期决胜云计算大数据时代Spark亚太研究院公益大讲堂
“决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第10期互动问答分享] Q1:Spark on Yarn的运行方式是什么? Spark on Yarn的运行方式有两种:Client ...
- 【转】Python模块subprocess
subprocess 早期的Python版本中,我们主要是通过os.system().os.popen().read()等函数.commands模块来执行命令行指令的,从Python 2.4开始官方文 ...
- 51nod 1183 编辑距离【线性dp+类似最长公共子序列】
1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...
- HDU 2567 寻梦(字符串,插入)
#include<iostream> #include<stdio.h> #include<string.h> #include<cmath> usin ...
- [P1580] yyy loves Easter_Egg I
Link: P1580 传送门 Solution: 拿来练练字符串的读入: 1.$gets()$相当于$c++$中的$getline()$,但返回值为指针!(无数据时为NULL) (都读入换行符,并将 ...