在FASTBuild中使用Distribution
在FASTBuild中使用分布式(distribution)编译需要注意以下四个环节。
一、编译器设置
某些编译过程与分布式相矛盾,如果一个对象不能被安全的分发出去,那它将自动在本地被编译,一个编译过程可以安全的混合可分发对象与不可分发对象。
对于GCC/SNC/Clang编译器,没有任何限制。
对于MSVC编译器:
/ZW 选项不能使用
预编译头文件不能被分发,他们是因机器而异的。(使用了PCH的对象可以被分发)
/clr 选项不能使用,因为微软编译器的预处理器有bug。
二、编译器同步
FASTBuild会把编译器(Compiler)同步到远端机器的一个隔离的环境中,这避免了远端机器也需要安装工具链,并且能保证编译器的一致性。为了实现这些,FASTBuild需要知道通过网络要同步哪些文件。这需要通过Compiler函数来实现。下面以一个实测可用的编译器配置,以 VS 2015 amd 64位编译器为例:
.VSBasePath = 'C:\Program Files (x86)\Microsoft Visual Studio 14.0' Compiler('MSVC2015') // (optional) Alias
{
.Executable = '$VSBasePath$\VC\bin\amd64\cl.exe'
.ExtraFiles = { '$VSBasePath$\VC\bin\amd64\1033\clui.dll',
'$VSBasePath$\VC\bin\amd64\c1.dll',
'$VSBasePath$\VC\bin\amd64\c2.dll',
'$VSBasePath$\VC\bin\amd64\c1xx.dll',
'$VSBasePath$\VC\bin\amd64\mspdb140.dll',
'$VSBasePath$\VC\bin\amd64\msobj140.dll',
'$VSBasePath$\VC\bin\amd64\mspdbcore.dll',
'$VSBasePath$\VC\bin\amd64\mspdbsrv.exe'}
}
三、工作者目录
工作者(Worker)就是除了主机之外,通过网络参与到分布式编译过程中的其他机器,他们的职责就是在空闲的时候,提供若干个(可设置)CPU内核出来,供主机编译使用。工作者(Worker)需要通过一个商定的位置被找到,这个商定的位置是一个主机(host)和工作者(Worker)都能找到的网络路径。这个路径要通过环境变量 FASTBUILD_BROKERAGE_PATH 来设置。工作者通过在这个位置写一个标记来示意自己可用。客户机通过检查这个位置来寻找可用的工作者。这里的重点是这个FASTBUILD_BROKERAGE_PATH 指定的必须是一个共享网络路径,而且能被所有参与分布式编译的机器自由地读写。
下面是一个简单的启动FASTBuildWorker的bat脚本(start_fbuild_worker.bat),如果发现该进程已存在,则不做任何操作。正常模式启动,启动后在桌面右下角会有图标显示。
echo off & color 0A
rem 在这里设置的环境变量只在bat脚本内有效
set FASTBUILD_BROKERAGE_PATH=\\192.168.22.31\.fastbuild.brokerage
tasklist | find /i "FBuildWorker.exe.copy" || start /min "" FBuildWorker.exe -cpus=2 -mode=idle
下面是一个简单的启动FASTBuildWorker的vbs脚本(start_fbuild_worker.vbs),如果发现该进程已存在,则不做任何操作。控制台模式启动(-console),并且隐藏了窗口,启动后只在任务管理器中才能被看到。具体用途自己体会。(在实际应用中发现,这个脚本第一次运行不会生效,大概是刚刚设置的环境变量在脚本中没有生效,不过Worker进程关闭之后,再次运行就会生效了)
set bag=getobject("winmgmts:\\.\root\cimv2")
set pipe=bag.execquery("select * from win32_process where name='FBuildWorker.exe'")
For Each id In pipe
wscript.quit
Next
wscript.CreateObject("Wscript.Shell").Environment("user").Item("FASTBUILD_BROKERAGE_PATH")="\\192.168.22.31\.fastbuild.brokerage"
wscript.CreateObject("Wscript.Shell").Run "FBuildWorker.exe -cpus=2 -mode=idle -console",
Worker启动后,会在刚才设置的那个网络路径中写一个标记,表示自己随时可以被调用,如下图:
大家不要担心这个Worker进程会占用太多资源,当你的CPU处于繁忙的状态,他会自动地把自己的标记取消,使自己不可被调用。换句话说,Worker(s)只会在自己有余力的时候才会帮助他人工作。
四、激活分布式编译
在上述步骤都顺利完成之后,便可以开始分布式编译了。执行fbuild.exe的时候,只需要加上 -dist 或者 -distverbose 参数,就可以调用远端的Worker为自己工作。
下面是一个简单的启动fbuild的bat脚本
echo off & color 0A
rem 在这里设置额环境变量只在bat脚本内有效
set FASTBUILD_BROKERAGE_PATH=\\192.168.22.31\.fastbuild.brokerage
call start_fbuild_worker.bat
fbuild.exe -cache -distverbose
pause
这里调用了start_fbuild_worker.bat脚本,其实使用分布式编译不一定非要在本机打开Worker进程,但是本着互惠互利的原则,在使用别人的CPU核心的时候,最好自己也开启Worker进程。
以上便是我学习使用FASTBuild的总结,不可否认FASTBuild作为一个免费开源的分布式编译工具,性能相当出色,之前我们的C++项目使用VS完全编译一次需要花费40min,在使用了FASTBuild之后,开启Caching和Distribution,可以在5min内完全编译一次,效率提升了近90%。感谢FASTBuild的开发人员,让我和同事们在工作的时候心情舒畅了很多。
在FASTBuild中使用Distribution的更多相关文章
- 在FASTBuild中使用Caching
上一篇:初识FASTBuild 在FASTBuild中使用缓存只需要注意三个环节: 一.设置编译选项 对于GCC\SNC\Clang编译器,没有特殊的要求 对于MSVC编译器,必须设置/Z7调试模式. ...
- 向安装包中添加设备 UDID. 蒲公英内测
向安装包中添加设备 UDID 前言 注:本文适用于只有苹果个人开发者账号.公司开发者账号.或教育开发者账号的 iOS 开发者. 对于没有企业开发者账号(299$)的开发者来说,要想使用蒲公英将自己的应 ...
- 初识FASTBuild 一个大幅提升C/C++项目编译速度的分布式编译工具
FASTBuild 是一款高性能.开源的构建系统,支持高度可扩展的编译,缓存和网络分发. 以上是FASTBuild官网对其产品的一句话介绍. FASTBuild 的开源地址:https://githu ...
- iOS 关于 Missing iOS Distribution signing identity for.... 等 打包 校验 出现的事故 处理经验
着实郁闷了一阵子,不知道为什么 证书和配置文件都没有问题 在Archieve后 validate 提示:"Missing iOS Distribution signing identity ...
- C++中的随机数
事情的开始是这样的,在大二的时候,写了几种排序算法,为了测试,就要为数组(或者容器)赋予一些随机初值,自然就用到了C/C++中的随机函数. 当时为了调用简单,将随机数赋值的过程写到了一个单独的函数里, ...
- IOS在自己网站发布APP(企业版$299上线流程)
最近刚上线一个企业内部应用,前期准备账号和后期上线过程发现网络上的资源不是非常全面,在这里写给大家分享一下我的发布过程 首先是企业账号的申请我们企业账号前前后后一共花了16天时间,由于公司各方面都非常 ...
- linux xwiki搭建过程
安装mysql数据库,并创建xwiki数据库及用户 mysql> create database xwiki; Query OK, 1 row affected (0.00 sec) mysql ...
- 事务复制中的snapshot
Snapshot agent读取article的信息,将article的内容和脚本放置到snapshot文件夹中: 接下来distribution agent会读取这些快照文件,传输到订阅,完 ...
- iOS中远程推送实现—在Apple的生产环境上测试Push Notifications功能
1.在“Provisioning Profiles”中点击“Add”按钮. 2.在“What type of provisioning profile do you need?”页面中选择“Distr ...
随机推荐
- 【 Keepalived 】Nginx or Http 主-主模式
上一篇:[ Keepalived ]Nginx or Http 主-备模式 在此基础上进行修改并实现 Keepalived主-主模式 首先,需要理解的是:主-备模式是一个VIP在工作,主-主模式则需要 ...
- 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件
好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...
- 在另一个文本框显示input file选择的文件名字
javascript 获取文件域 (type=file) 的完整路径一直是很麻烦的问题,问题主要出在一些浏览器基于安全性考虑而不能正常获取到文件域中选中图片的决对路径,尤其一些基于webkit的浏览器 ...
- docker从零开始网络(一)概述
概述 预计阅读时间: 4分钟 Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连接到非Docker工作负载.Docker容器和服务甚至不需要知道它们部署在Docker上,或 ...
- 【hdoj_2111】SavingHDU
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2111 题目理解:给出一个口袋的容量,若干种宝物的单价和体积,单个的宝物可以分割,待求的是最多能装价值多少的 ...
- Nodejs微信与Bot framework通过Direct Line连接
背景 最近开发了一个Bot Framework的小工具,能够通过Luis分析出用户输入的文本,对文本中的StyleNo/FabricNo/TrimNo提取出来,并传入另一个小系统进行查询出结果,包括文 ...
- 使用base64对图片的二进制进行编码,使其可以利用ajax进行显示
有时候我们需要动态的将图片的二进制在页面上进行显示,如我们需要弄一个验证码的功能,那么如果我们的验证码的图片在后台得到的是该图片的二进制,那么当我们需要在页面上点击一个按钮利用ajax进行切换的时候, ...
- 免费Jdk选择:jdkadoptOpenJdk
oracle公司的jdk即将要收费,不在给免费用户提供更新,点击查看. jira在7.13版本将jdk从oracle jdk变更为adoptOpenJdk.点击查看.
- Oracle 后台进程 详细说明
一. 进程概述 先来看一下Oracle 11g 的架构图. 看起来比较模糊,我已经上传到了csdn 的下载. 是个pdf 文件, 2m 多. 那个看起来比较清楚. 也对每个进程做了解释. 下载地址:O ...
- 【贪心】【二维偏序】【权值分块】bzoj1691 [Usaco2007 Dec]挑剔的美食家
既然题目中的要求满足二维偏序,那么我们很自然地想到将所有东西(草和牛)都读进来之后,对一维(美味度)排序,然后在另一维(价值)中取当前最小的. 于是,Splay.mutiset.权值分块什么的都支持查 ...