Cargo
Link: Cargo profiles - https://doc.rust-lang.org/cargo/reference/profiles.html Mold linker - https://github.com/rui314/mold Условная компиляция - https://doc.rust-lang.org/reference/conditional-compilation.html
Cargo
Use Cargo for managing projects.
Source code is in src folder.
Documentation of methods & traits used in code can be compiled an opened in browser with Cargo command:
Зависимости кода в cargo.toml
[dependencies]— Package library dependencies - видно отовсюду, из тестов;[dev-dependencies]— Dependencies for examples, tests, and benchmarks. При сборке ПО видны только для тестов (в рамках#[cfg(test)] mod tests {});[build-dependencies]— Dependencies for build scripts.
Сборка бинарных файлов
Можно в src папке создать подпапку bin, и там сложить вариации бинарных файлов. После чего указывать при сборке cargo run --bin <название файла в папке bin>
Сборка Examples
Create “examples” folder beside the “src” folder. Create a file named, for example, “variables.rs” and place some test code in the folder. Then in the project root folder run:
❗Примеры в Examples папке наследуют features и прочие параметры из общего Cargo.toml. В случае условной компиляции (см, далее) команда будет выглядеть: cargo run --example variables --features mock
Условная компиляция
Позволяет исключить часть кода в зависимости от условий.
Атрибут #[cfg(condition)]
Атрибут #[cfg_attr(condition, attribute)]
Макрос cfg!(condition)
Можно комбинировать условия с помощью all(), any(), not():
Mock-компиляция
Вариант условной компиляции в целях тестирования:
Features нужно специально включать при сборке командой cargo run --features debug. Либо можно прописать флаг включения default = ["debug"] в файле Cargo.toml:
Отключить работу флага default можно командой cargo run --no-default-features.
Условная компиляция, встроенная в Cargo, позволяет подключать зависимости опционально. Можно проверять фичи в коде:
Пример с подключением библиотеки rand только для создания случайного значения в “mock-варианте” кода:
Диагностика сборки
cargo-bloat для поиска проблем
Определяет, какие зависимости задерживают сборку.
cargo build –timings
Создаёт отчёт в HTML с указанием трат времени:
cargo-llvm-lines
Показывает, какие generic-функции создают больше всего нагрузки для LLVM:
Generics создают мономорфизм - каждый новый тип создаёт новый код при сборке.
Ускорение сборки
Профили Cargo
Можно управлять ходом сборки проекта с помощью профилей. В том числе это сильно виляет на скорость сборки. Примеры профилей, которые можно создать в cargo.toml файле:
Для debug сборок, opt-level = 0 и высокое число codegen-units даю самую высокую скорость сборки (разница в скорости в 108 раз!).
Кеширование сборки зависимостей
С помощью sccache можно кешировать собранные артефакты, в том числе таскать кеш между системами.
cargo-wizard - быстрая оптимизация
Простой инструмент выбора типа оптимизации:
Даёт 3 шаблона: fast compilation, fast execution, и small binary size
Удалить лишние неиспользуемые зависимости
Создание RAM-disk для пути сборки
Linux/macOS:
Управление потоками сборки
Использовать все ядра, кроме 2 (чтобы ОС не повисла):
Либо указать в .cargo/config.toml:
Panic Response
В ответ на панику, по умолчанию программа разматывает стек (unwinding) - проходит по стеку и вычищает данные всех функций. Для уменьшения размера можно просто отключать программу без очистки - abort. Для этого в файле Cargo.toml надо добавить в разделы [profile]:
Mold (только для Linux)
Проект для Linux (в macOS есть коммерческий аналог Sold, который ненамного лучше сборщику в XCode 15+, потому использование не оправдано).
Настройка
- Ubuntu:
sudo apt-get install mold clang - Fedora:
sudo dnf install mold clang - Arch Linux:
sudo pacman -S mold clang
Создать в проекте папку и файл .cargo/config.toml (либо для всех проектов сразу - папка и файл ~/.cargo/config.toml) и вписать:
Где архитектуру нужно заменить на текущую: узнать её командой rustc -vV.
Проверка работы
Для проверки в папке с бинарным файлом запустить команду: