Как использовать CCache с CMake? - PullRequest
80 голосов
/ 29 ноября 2009

Я хотел бы сделать следующее: Если в PATH присутствует CCache, используйте «ccache g ++» для компиляции, иначе используйте g ++. Я попытался написать небольшой скрипт my-cmake, содержащий

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

но, похоже, это не работает (при запуске make все еще не используется ccache; я проверил это, используя CMAKE_VERBOSE_MAKEFILE)

Обновление:

По этой ссылке Я попытался изменить свой скрипт на

     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 ]

82 голосов
/ 19 июня 2014

Теперь можно указывать ccache в качестве средства запуска для команд компиляции и команд линковки (начиная с cmake 2.8.0). Это работает для генераторов Makefile и Ninja. Для этого просто установите следующие свойства:

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 Крейг Скотт предлагает обходной путь в своем ответе.

Редактировать: Благодаря комментариям Апрего и Лекенштейна я отредактировал ответ, чтобы проверить, доступен ли ccache, прежде чем использовать его в качестве модуля запуска и для каких генераторов можно использовать модуль запуска компиляции.

63 голосов
/ 15 июня 2016

Начиная с CMAKE 3.4, вы можете:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
60 голосов
/ 23 декабря 2009

лично у меня /usr/lib/ccache в моем $PATH. Этот каталог содержит множество символических ссылок для каждого возможного имени, из которого может вызываться компилятор (например, gcc и gcc-4.3), все они указывают на ccache.

И я даже не создал символические ссылки. Этот каталог предварительно заполняется, когда я устанавливаю ccache в Debian.

8 голосов
/ 09 апреля 2016

Из CMake 3.1 можно использовать ccache с генератором Xcode, а Ninja поддерживается начиная с CMake 3.4 и далее. Ninja будет чтить RULE_LAUNCH_COMPILE точно так же, как генератор Unix Makefiles (поэтому ответ @ Babcool поможет вам и для Ninja), но работа 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 выглядят следующим образом (они должны находиться в том же каталоге, что и файл CMakeLists.txt):

launch-c.in:

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

launch-cxx.in:

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

В приведенном выше примере RULE_LAUNCH_COMPILE используется только для Unix Makefiles и Ninja, но для генератора Xcode он опирается на помощь от поддержки переменных CMAKE_XCODE_ATTRIBUTE_... в CMake. Установка пользовательских атрибутов Xcode CC и CXX для управления командой компилятора и LD и LDPLUSPLUS для команды компоновщика не является, насколько я могу судить, документированной возможностью проектов Xcode, но это похоже на работу. Если кто-нибудь может подтвердить, что Apple официально поддерживает его, я обновлю связанную статью и этот ответ соответственно.

8 голосов
/ 29 октября 2012

Я не хотел устанавливать символическую ссылку от 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 недели, а потом, возможно, задаться вопросом, не работает ли что-то ...

6 голосов
/ 29 ноября 2009

Я проверил следующие работы (источник: эта ссылка ):

        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 жалуется).

4 голосов
/ 30 ноября 2009

На мой взгляд, лучший способ - использовать символическую ссылку gcc, g ++ на ccache, но если вы хотите использовать в cmake, попробуйте это:

export CC="ccache gcc" CXX="ccache g++" cmake ...
2 голосов
/ 13 апреля 2018

Позвольте мне добавить один важный элемент, который не был упомянут здесь ранее.

Во время начальной загрузки минималистической системы сборки из образа док-станции ubunutu: 18.04 я обнаружил, что порядок установки имеет значение.

В моем случае ccache работал нормально при вызове gcc, но не смог отловить вызовы того же компилятора под другими именами: cc и c++. Чтобы полностью установить ccache, вы должны сначала убедиться, что все компиляторы установлены, или добавить безопасный вызов символических ссылок update-ccache, чтобы они были безопасными.

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

... а затем (из-за обновленных символических ссылок) также обращаются к cc и c ++!

...