Как использовать CCache с CMake?

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

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

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

Обновление:

Согласно этой ссылке, я попытался изменить свой сценарий на

     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 компилятора (чего и следовало ожидать).


person amit    schedule 29.11.2009    source источник
comment
Почему бы вам просто не привязать gcc к ccache? И если вы распространяете это, я бы подумал, что пользователь сам сделал бы символическую ссылку, если бы у него был установлен ccache и он хотел, чтобы он использовался ...   -  person int3    schedule 29.11.2009
comment
@ int3 Да, вероятно, это сработает (я не знал, что ccache имеет компилятор в качестве необязательного аргумента). Однако было бы чище быть более явным.   -  person amit    schedule 29.11.2009


Ответы (8)


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

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

person Nicolás    schedule 23.12.2009
comment
Обратите внимание, что этот путь ccache должен быть помещен перед путем, где ваш настоящий компилятор находится в $PATH, чтобы он работал. Что-то вроде export PATH = /usr/lib/ccache:$PATH - person Gui13; 24.02.2011
comment
@ Gui13: Лучше, чем обновлять PATH, было бы явно указать cmake, где gcc, который он должен использовать, например cmake -DCMAKE_CXX_COMPILER = / usr / lib / ccache / bin / g ++ - person cib; 29.04.2014
comment
После brew install ccache у меня /usr/local/Cellar/ccache/3.2.1/libexec/. - person cdunn2001; 19.10.2015

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

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
person Jacob    schedule 15.06.2016
comment
И -DCMAKE_CXX_COMPILER_LAUNCHER=ccache. Они прекрасно работают! Я не знаю, почему cmake настаивает на поиске clang из /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc (так что трюк с символической ссылкой не работает), а не из $PATH, но ваш ответ все равно работает. - person cdunn2001; 09.05.2017
comment
Это должен быть лучший ответ. Больше не нужно возиться с переменной пути и символическими ссылками на компилятор! - person ilya b.; 09.04.2018
comment
Я пробовал это, но это дает мне ошибку ccache: error: Recursive invocation (имя двоичного файла ccache должно быть ccache). Глядя на подробную трассировку, он пытается запустить / usr / local / bin / ccache ccache / usr / bin / c ++ ... - person Chris Dodd; 17.02.2019
comment
Как он взаимодействует с RULE_LAUNCH_COMPILE? - person Trass3r; 31.05.2019

Теперь можно указать 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) # Less useful to do it for linking, see edit2
endif(CCACHE_FOUND)

Также возможно установить эти свойства только для определенных каталогов или целей.

Для Ninja это возможно с версии 3.4. Для XCode Крейг Скотт дает обходной путь в своем ответе.

Изменить: благодаря uprego и комментарию Lekensteyn я отредактировал ответ, чтобы проверить, доступен ли ccache, прежде чем использовать его в качестве средства запуска, и для каких генераторов можно использовать средство запуска компиляции.

Edit2: @Emilio Cobos рекомендовал избегать этого для части связывания, поскольку ccache не улучшает скорость связывания и может связываться с другими типами кеша, такими как sccache

person Babcool    schedule 19.06.2014
comment
Многие сайты неявно рекомендуют использовать двойные кавычки, как в find_program(CCACHE_FOUND "ccache"), я не знаю, какой из них более переносимый, мой пробег отлично справился без двойных кавычек. - person 1737973; 16.06.2015
comment
Стоит отметить, что в настоящее время это работает только для генераторов Makefile (начиная с cmake 3.3.2). См. Страницу руководства cmake-properties. - person Lekensteyn; 05.10.2015
comment
Стоит отметить, что это конфликтует с настройкой CTEST_USE_LAUNCHERS. Эти свойства также задаются здесь: github.com/Kitware / CMake / blob / master / Modules / - person purpleKarrot; 15.05.2018
comment
Я думаю, вы можете изменить код на этот (кроме удаления текста изнутри endif()). Усовершенствования: 1. Есть опция конфигурации, чтобы отключить это, и 2. Оказывается, цвета исчезают из GCC / Clang в бэкэнде Make при использовании таким образом. Бэкэнд ninja работает над этим, добавляя параметр -fdiagnostics-color, поэтому желательно сделать это и для make бэкэнда. - person Hi-Angel; 06.10.2019

Начиная с CMake 3.1, можно использовать ccache с генератором Xcode, а Ninja поддерживается начиная с CMake 3.4. Ninja будет уважать RULE_LAUNCH_COMPILE точно так же, как генератор Makefiles Unix (так что ответ @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, я обновлю связанную статью и этот ответ соответственно.

person Craig Scott    schedule 09.04.2016
comment
Мне также понадобился set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}") из упомянутой статьи. - person Jörn Reimerdes; 10.01.2018
comment
Спасибо за напоминание, я обновил ответ, включив в него настройки LD и LDPLUSPLUS. - person Craig Scott; 10.01.2018
comment
ccache не поддерживает компиляторы VS, поэтому вы не можете использовать его для этого. Существует проект под названием clcache, целью которого является предоставление той же функциональности для VS, но я не могу комментировать от того, насколько хорошо это работает. - person Craig Scott; 01.06.2019

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

person jonas    schedule 29.10.2012

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

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

person amit    schedule 29.11.2009

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

export CC="ccache gcc" CXX="ccache g++" cmake ...
person Nadir SOUALEM    schedule 30.11.2009

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

При загрузке минималистичной системы сборки из образа докера 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 ++!

person Jürgen Weigert    schedule 13.04.2018
comment
Спасибо, я не знал о update-ccache-symlinks, я создавал c++ ссылку со сценарием для проекта, и он работал, но не для другого проекта (до сих пор не знаю, почему, ссылка была в порядке), update-ccache-symlinks решено. - person Alex; 29.05.2019