代码之家  ›  专栏  ›  技术社区  ›  amit kumar

如何将ccache与cmake结合使用?

  •  77
  • amit kumar  · 技术社区  · 15 年前

    我想做以下工作:如果路径中存在ccache,请使用“ccache g++”进行编译,否则使用g++。我试着写一个小的包含

        CC="ccache gcc" CXX="ccache g++" cmake $*
    

    但它似乎不起作用(运行make仍然不使用ccache;我使用cmake_verbose_makefile on检查了这一点)。

    更新:

    按照 this link 我试着把剧本改成

         cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*
    

    但cmake抱怨测试未能使用编译器ccache(这是可以预料的)。

    8 回复  |  直到 7 年前
        1
  •  58
  •   Nicolás    15 年前

    我个人有 /usr/lib/ccache 在我的 $PATH . 此目录包含编译器可以调用的每个可能名称的符号链接(如 gcc gcc-4.3 )全部指向中央结算系统。

    我甚至没有创建符号链接。当我在Debian上安装ccache时,这个目录是预先填充的。

        2
  •  80
  •   Babcool    9 年前

    现在可以指定ccache作为编译命令和链接命令的启动程序(自cmake 2.8.0以来)。它适用于makefile和忍者生成器。为此,只需设置以下属性:

    find_program(CCACHE_FOUND ccache)
    if(CCACHE_FOUND)
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
        set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
    endif(CCACHE_FOUND)
    

    也可以仅为特定目录或目标设置这些属性。

    对于忍者来说,这是可能的,因为版本3.4。 对于Xcode,CraigScott给出了一个解决方案。

    编辑:多亏了uprego和lekensteyn的评论,我编辑了答案,以检查ccache在用作启动程序之前是否可用,以及哪些生成器可以使用编译启动程序。

        3
  •  59
  •   Jacob    9 年前

    从CMAKE 3.4开始,您可以执行以下操作:

    -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
    
        4
  •  8
  •   Jed    12 年前

    我不喜欢从 g++ ccache . 和 CXX="ccache g++" 并不是为我工作,因为一些CMAKE测试用例只想拥有没有属性的编译器程序。

    所以我用了一个小的bash脚本:

    #!/bin/bash
    ccache g++ "$@"
    

    并将其作为可执行文件保存在 /usr/bin/ccache-g++ .

    然后c配置cmake使用 /USR/BIN/CCACHE-G型++ 作为C++编译器。 这样它就通过了cmake测试用例,我感觉比拥有符号链接更舒服,我可能会在2或3周内忘记这些符号链接,然后可能会怀疑某些东西是否不起作用…

        5
  •  7
  •   Craig Scott    7 年前

    从cmake 3.1开始,可以将ccache与xcode生成器一起使用,从cmake 3.4开始支持忍者。忍者将荣誉 RULE_LAUNCH_COMPILE 就像unix makefiles生成器一样(所以@babcool的答案也能让你找到忍者),但是让ccache为xcode生成器工作需要更多的工作。以下文章详细解释了该方法,重点介绍了适用于所有三个cmake生成器的一般实现,并且没有对设置ccache符号链接或所使用的底层编译器做出任何假设(它仍然允许cmake决定编译器):

    https://crascit.com/2016/04/09/using-ccache-with-cmake/

    本文的大意如下。你的开始 CMakeLists.txt 文件应该设置如下:

    cmake_minimum_required(VERSION 2.8)
    
    find_program(CCACHE_PROGRAM ccache)
    if(CCACHE_PROGRAM)
        # Support Unix Makefiles and Ninja
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
    endif()
    
    project(SomeProject)
    
    get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
    if(RULE_LAUNCH_COMPILE AND CMAKE_GENERATOR STREQUAL "Xcode")
        # Set up wrapper scripts
        configure_file(launch-c.in   launch-c)
        configure_file(launch-cxx.in launch-cxx)
        execute_process(COMMAND chmod a+rx
                                "${CMAKE_BINARY_DIR}/launch-c"
                                "${CMAKE_BINARY_DIR}/launch-cxx")
    
        # Set Xcode project attributes to route compilation through our scripts
        set(CMAKE_XCODE_ATTRIBUTE_CC         "${CMAKE_BINARY_DIR}/launch-c")
        set(CMAKE_XCODE_ATTRIBUTE_CXX        "${CMAKE_BINARY_DIR}/launch-cxx")
        set(CMAKE_XCODE_ATTRIBUTE_LD         "${CMAKE_BINARY_DIR}/launch-c")
        set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx")
    endif()
    

    两个脚本模板文件 launch-c.in launch-cxx.in 如下所示(它们应该与 CMAKLISTS.TXT 文件):

    启动:

    #!/bin/sh
    export CCACHE_CPP2=true
    exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"
    

    CXCH-CXX.IN:

    #!/bin/sh
    export CCACHE_CPP2=true
    exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"
    

    以上用途 规则启动编译 对于unix makefiles和ninja单独使用,但是对于xcode生成器,它依赖于cmake的帮助 CMAKE_XCODE_ATTRIBUTE_... 变量支持。的设置 CC CXX 用户定义的xcode属性,用于控制编译器命令和 LD LDPLUSPLUS 据我所知,linker命令并不是Xcode项目的文档化特性,但它似乎确实有效。如果有人能确认它得到了苹果的官方支持,我会相应地更新链接文章和这个答案。

        6
  •  6
  •   amit kumar    15 年前

    我核实了以下工作(资料来源: this link ):

            CC="gcc" CXX="g++" cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*
    

    更新 我后来意识到即使这样也不行。奇怪的是,它每隔一段时间就工作(另一段时间CMAKE抱怨)。

        7
  •  4
  •   Nadir SOUALEM    15 年前

    在我看来,最好的方法是将gcc、g++符号链接到ccache,但是如果您想在cmake中使用,请尝试以下方法:

    export CC="ccache gcc" CXX="ccache g++" cmake ...
    
        8
  •  0
  •   Jürgen Weigert    7 年前

    让我添加一个以前没有提到的重要项目。

    当从Ubunutu:18.04 Docker映像中引导一个极简的构建系统时,我发现安装顺序会有所不同。

    在我的情况下,卡奇打电话时工作得很好 gcc ,但未能通过其他名称捕获同一编译器的调用: cc c++ . 要完全安装ccache,您需要确保首先安装了所有编译器, 添加一个调用以更新ccache符号链接以确保安全。

    sudo apt-get install ccache build-essential # and everyhting ... sudo /usr/sbin/update-ccache-symlinks export PATH="/usr/lib/ccache/:$PATH"

    …然后(由于更新的链接)也调用CC和C++被抓到!