Как перестать смотреть на индикатор сборки и начать жить
Представьте: вы поправили одну строчку в коде, нажали cargo build или make, и ушли пить кофе, потому что проект пересобирается десять минут. Знакомая история? Особенно обидно, когда вы точно знаете, что 90% кода не изменилось, но компилятор всё равно решает перепроверить половину зависимостей. В Mozilla с этой проблемой сталкиваются постоянно — сборка Firefox занимает вечность. Именно так появился sccache.
Что это такое и зачем оно мне
Если коротко, sccache — это кэширующий прокси для компилятора. Он перехватывает команды сборки, считает хеш от исходников и флагов, и если такая комбинация уже встречалась, просто подсовывает готовый объектный файл из кэша.
Проект идейно продолжает традиции старого доброго ccache, но с парой критических отличий. Во-первых, он написан на Rust (что логично для Mozilla). Во-вторых, он умеет работать с облачными хранилищами. Это значит, что вы можете расшарить кэш между всеми разработчиками в команде или между разными стадиями CI/CD.
Чем sccache отличается от обычного ccache
Главная фишка здесь — поддержка Rust. Обычные инструменты кэширования часто пасуют перед rustc, а sccache справляется с ним на ура. Кроме того, список поддерживаемых языков и компиляторов внушает уважение:
- C/C++ (gcc, clang, MSVC)
- Rust
- CUDA (nvcc)
- NVIDIA HPC (nvc++)
- AMD ROCm (hipcc)
Интересная деталь: sccache работает по модели клиент-сервер. Когда вы запускаете сборку, локальный демон висит в памяти и держит часть данных под рукой, что ускоряет процесс. Если сервера нет, sccache сам его поднимет.
Облачный кэш: магия для командной разработки
Локальный кэш на диске — это приятно, но sccache раскрывается по-настоящему, когда вы подключаете внешнее хранилище. Список бэкендов огромный: S3, Google Cloud Storage, Azure, Redis, Memcached и даже GitHub Actions Cache.
Зачем это нужно? Допустим, ваш коллега уже собрал проект утром. Когда вы придете и сделаете git pull, sccache подтянет готовые артефакты из общего S3-бакета. Ваша «первая» сборка пройдет за секунды вместо минут. В CI это экономит не только время, но и деньги, особенно если вы платите за минуты работы раннеров.
Как завести это у себя
Установка максимально простая. На macOS хватит brew install sccache, на Windows — scoop install sccache. Если у вас установлен Rust, можно просто выполнить:
cargo install sccache --locked
Чтобы заставить Rust использовать кэш, добавьте переменную окружения:
export RUSTC_WRAPPER=sccache
cargo build
Для C++ проектов с CMake всё тоже прозрачно:
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..
Нюансы и подводные камни
Не всё так идеально, как кажется на первый взгляд. Есть несколько моментов, которые стоит учитывать перед внедрением.
Во-первых, sccache по умолчанию требует абсолютные пути к файлам. Если вы собираете проект в /home/user/project, а ваш коллега в /home/dev/project, кэш не сойдется. Чтобы это победить, нужно настроить SCCACHE_BASEDIRS — тогда пути станут относительными внутри указанных директорий.
Во-вторых, в Rust есть ограничения. Инструмент не умеет кэшировать инкрементальную компиляцию (её придется выключить) и финальную линковку бинарников или динамических библиотек. То есть lib секции кэшируются отлично, а вот финальный bin всё равно потребует времени на сборку.
Стоит ли пробовать
Если вы работаете над проектом, который собирается дольше пары минут, — однозначно да. Даже локальный кэш заметно ускоряет переключение между ветками (git checkout).
Особенно sccache пригодится тем, кто:
- Мучается с долгими сборками в CI/CD.
- Работает в большой команде над общим C++/Rust кодом.
- Использует специфические вещи вроде CUDA.
Проект живой, поддерживается Mozilla и активно используется в крупных Open Source проектах. Это не просто «еще одна утилита», а проверенный временем инструмент, который реально экономит часы жизни разработчика.
Посмотреть статистику работы (сколько раз вы сэкономили время) можно командой:
sccache --show-stats
Видеть там Cache hits вместо Misses — отдельный вид удовольствия.