• 在FASTBuild中使用Distribution


    上一篇:在FASTBuild中使用Caching

    在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$VCinamd64cl.exe' .ExtraFiles = { '$VSBasePath$VCinamd641033clui.dll', '$VSBasePath$VCinamd64c1.dll', '$VSBasePath$VCinamd64c2.dll', '$VSBasePath$VCinamd64c1xx.dll', '$VSBasePath$VCinamd64mspdb140.dll', '$VSBasePath$VCinamd64msobj140.dll', '$VSBasePath$VCinamd64mspdbcore.dll', '$VSBasePath$VCinamd64mspdbsrv.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:\.
    ootcimv2")
    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",0

      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中使用Caching

     

  • 相关阅读:
    增删改查
    兴趣爱好
    兴趣爱好界面
    购物商城
    计算器
    安卓第四周作业
    安卓第一周作业
    第十五周作业
    十三周作业-集合
    第十三周上机练习
  • 原文地址:https://www.cnblogs.com/tangxin-blog/p/8653715.html
Copyright © 2020-2023  润新知