美文网首页
iOS使用ccache没有生效的解决方法

iOS使用ccache没有生效的解决方法

作者: Jimmy_P | 来源:发表于2019-07-16 17:35 被阅读0次

    关键词

    • exec:ccache:not found
    • ccache -s 没有ccache
    • jenkins打包,ccache没有生效
    • cachesize为空
    cache hit (direct) 0
    cache hit (preprocessed) 0
    cache miss 0
    cache hit rate 0.00 %
    couldn't find the compiler 2
    no input file 4
    cleanups performed 0
    files in cache 0
    cache size 0.0 kB
    

    解决方案

    修改 ccache-clang 脚本,替换为

    #!/bin/sh
    export PATH=$PATH:/usr/local/bin
    export CCACHE_MAXSIZE=10G
    export CCACHE_CPP2=true
    export CCACHE_HARDLINK=true
    export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
    
      # 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
    export CCACHE_LOGFILE=~/Desktop/CCache.log
    exec ccache /usr/bin/clang "$@"
    
    

    以下是分析和解决的思路


    前言

    这两天我们团队正在进行编译速度的优化, 参考了 [贝聊科技]如何将 iOS 项目的编译速度提高5倍的优化思路,最终选择了使用 ccache 进行优化方向进行集成。
    最终在我的mac集成成功,并将启动速度提高50%以上,但是在将代码合并到master分支进行Jenkins打包的时候发现编译速度反而增加了一倍
    找了很久的原因,最终发现编译的时候是走了ccache-clang脚本的,但是却进入了else分支,因此我们先来分析ccache-clang做了什么操作:

    //指定这是一个bash脚本
    #!/bin/sh   
    /*
    type -p ccache判断是否存在ccache命令
    /dev/null是空设备文件
    2>&1是把标准错误流重定向到标准输出流
    所以整行的作用是先判断命令是否存在
    如果不存在就把标准错误流重定向成标准输出流后,再重定向到空文件,这样错误就不会在控制台上打印出来了
    */
    if type -p ccache >/dev/null 2>&1; then 
    //设置最大的缓存  
    export CCACHE_MAXSIZE=10G
    /*
    设置源文件的编译模式,默认是true,ccache会先处理源文件,
    如果缓存没有命中,就编译源文件;
    而如果是false,就会在缓存没有命中时,不是直接编译源文件,
    而是编译处理后的文件,但是这可能会有问题,
    因为不同的编译器,预处理后的文件内容不完全相同
    */
      export CCACHE_CPP2=true
    /*
    设置为true,表明ccache直接利用缓存目录下的文件,
    而不是拷贝后的文件,这样可以加快编译速度,默认是false
    */
      export CCACHE_HARDLINK=true
    /*
    设置提高缓存命中率,忽略__FILE__、DATE、__TIME__等宏,
    也不检查文件的修改和创建时间是否是最新的等等
    */
      export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
    
    //指定日志文件的路径
      # 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
      export CCACHE_LOGFILE='~/Desktop/CCache.log'
    //执行/usr/bin/clang命令,"$@"是指所有参数
      exec ccache /usr/bin/clang "$@"
    else
    //执行系统默认的clang命令,"$@"是指所有参数
      exec clang "$@"
    fi
    

    所以然后把 if else 强行删掉 发现编译出现这个报错


    error

    最后定位到是机器的环境变量出现了问题 最后就成了文章顶部的解决方法
    希望帮助到大家 谢谢

    相关文章

      网友评论

          本文标题:iOS使用ccache没有生效的解决方法

          本文链接:https://www.haomeiwen.com/subject/jvltlctx.html