Как использовать 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 (что можно ожидать).

8 73

8 ответов:

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

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

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

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

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

по состоянию на CMAKE 3.4 вы можете сделать:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

Я не хотел устанавливать символическую ссылку от g++ to ccache. И CXX="ccache g++" не работает для меня, как некоторые cmake тестовый случай хотел иметь только программу компилятора без атрибутов.

поэтому я использовал небольшой скрипт bash вместо этого:

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

и сохранил его как исполняемый файл в /usr/bin/ccache-g++.

затем C настроил cmake для использования /usr/bin/ccache-g++ как компилятор C++. Таким образом, он проходит тестовые случаи cmake, и я чувствую себя более комфортно, чем с символическими ссылками, которые я могу забыть примерно через 2 или 3 недели, а затем, возможно, задаться вопросом, если что-то не работает...

С CMake 3.1 можно использовать ccache с генератором Xcode, а Ninja поддерживается с CMake 3.4 и далее. Ниндзя будет чтить 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 CMAKE_XCODE_ATTRIBUTE_... поддержка переменных. Настройка CC и CXX пользовательские атрибуты Xcode для управления командой компилятора и LD и LDPLUSPLUS для команды компоновщика не является, насколько я могу судить, документированным особенность проектов Xcode, но это, кажется, работает. Если кто-то может подтвердить, что он официально поддерживается Apple, я обновлю связанную статью и этот ответ соответственно.

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

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

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

export CC="ccache gcc" CXX="ccache g++" cmake ...

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

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

в моем случае ccache работал нормально при вызове 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++ попадаются!