Как использовать 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 ответов:
Я лично
/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 перед использованием его в качестве пусковой установки и для каких генераторов можно использовать пусковую установку компиляции.
Я не хотел устанавливать символическую ссылку от
g++
toccache
. И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 он полагается на помощь от CMakeCMAKE_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++ попадаются!