Как использовать CCache с CMake?
Я хотел бы сделать следующее: если CCache присутствует в PATH, используйте "ccache g++" для компиляции, иначе используйте g++. Я попытался написать небольшой my-cmake script содержащий
CC="ccache gcc" CXX="ccache g++" cmake $*
но, похоже, он не работает (при запуске make still не используется ccache, я проверил это, используя CMAKE_VERBOSE_MAKEFILE).
Update:
По эта ссылка Я попытался изменить свой script на
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 компилятора (что можно ожидать).
Ответы
Ответ 1
У меня лично /usr/lib/ccache
у меня $PATH
. Этот каталог содержит множество символических ссылок для каждого возможного имени, из которого может быть вызван компилятор (например, gcc
и gcc-4.3
), все указывают на ccache.
И я даже не создал символические ссылки. Этот каталог поставляется предварительно заполненным, когда я устанавливаю ccache на Debian.
Ответ 2
Теперь можно указать 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)
Также можно установить эти свойства только для определенных каталогов или целей.
Для ниндзя это возможно начиная с версии 3.4.
Для XCode Крейг Скотт предлагает обходной путь в своем ответе.
Изменение: Благодаря комментариям uprego и Lekensteyn я отредактировал ответ, чтобы проверить, доступен ли ccache, прежде чем использовать его в качестве средства запуска и для каких генераторов можно использовать средство запуска компиляции.
Edit2: @Emilio Cobos рекомендовал избегать этого для части компоновки, поскольку ccache не улучшает скорость компоновки и может испортить другие типы кэша, такие как sccache
Ответ 3
В соответствии с CMAKE 3.4 вы можете:
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
Ответ 4
Начиная с 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}" "[email protected]"
launch-cxx.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "[email protected]"
Вышесказанное использует только RULE_LAUNCH_COMPILE
для Unix Makefiles и Ninja, но для генератора Xcode оно опирается на помощь от поддержки переменных CMake CMAKE_XCODE_ATTRIBUTE_...
. Установка пользовательских атрибутов Xcode CC
и CXX
для управления командой компилятора, а также LD
и LDPLUSPLUS
для команды компоновщика не является, насколько я могу судить, документированной функцией проектов Xcode, но это похоже на работу. Если кто-нибудь может подтвердить, что Apple официально поддерживает его, я обновлю связанную статью и этот ответ соответственно.
Ответ 5
Мне не нравилось устанавливать символическую ссылку от g++
до ccache
. И CXX="ccache g++"
не работал у меня, так как в каком-то тестовом примере cmake хотелось иметь только программу-компилятор без атрибутов.
Итак, я использовал небольшой bash script:
#!/bin/bash
ccache g++ "[email protected]"
и сохранил его как исполняемый файл в /usr/bin/ccache-g++
.
Затем C сконфигурировал cmake для использования /usr/bin/ccache-g++
в качестве компилятора С++.
Таким образом, он проходит тестовые примеры cmake, и я чувствую себя более комфортно, чем наличие символических ссылок, о которых я мог бы забыть через 2 или 3 недели, а затем, может быть, интересно, что-то не работает...
Ответ 6
Я проверил следующие работы (источник: эта ссылка):
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" $*
Обновление. Позже я понял, что даже это не работает. Странно это работает каждый раз в разное время (в других случаях смейк жалуется).
Ответ 7
На мой взгляд, лучший способ - сопоставить gcc, g++ с ccache, но если вы хотите использовать в cmake, попробуйте следующее:
export CC="ccache gcc" CXX="ccache g++" cmake ...
Ответ 8
Позвольте мне добавить один важный пункт, который здесь не упоминался ранее.
При загрузке минималистичной системы сборки из образа докера 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++ попадают!