Сборка и перекрестная компиляция Rust Cargo для конкретного процессора

#rust #cross-compiling #rust-cargo

#Ржавчина #кросс-компиляция #rust-cargo

Вопрос:

Я хочу скомпилировать два двоичных файла для разных целевых архитектур (например. Скайлейк и Сэнди Бридж). Обычно это две длинные команды cargo:

RUSTFLAGS=»-C target-cpu=skylake» сборка груза -target x86_64-неизвестно-linux-gnu -релиз

Как я могу настроить cargo для сборки обоих двоичных файлов (с разными именами) из одного и того же main.rs автоматически? В идеале либо в config.toml , либо в Cargo.toml , чтобы я мог добавить его в репозиторий.

Комментарии:

1. Почему бы просто не создать build.sh , который запускает обе команды?

2. Я мог бы это сделать, но это не похоже на хорошую практику. Тем более, что цели сборки обычно указываются в файле Cargo.toml

3. Не совсем то, что вы просили, но в модуле arch есть docu для динамического обнаружения функций процессора , чтобы избежать создания нескольких двоичных файлов.

4. @maxy интересно. Но пока я доверяю компилятору оптимизировать на основе целевой арки.

Ответ №1:

Вы можете добавить следующий текст в свой config.toml :

 [build]
target = x86_64-unknown-linux-gnu
rustflags = ["-C","target-cpu=skylake"]

[profile.dev]   #do not need to add `--release` now
opt-level = 3
debug = false
debug-assertions = false
overflow-checks = false
lto = false
panic = 'unwind'
incremental = false
codegen-units = 16
rpath = false
  

Но похоже, что он не может скомпилироваться для двух разных целевых архитектур с помощью одной config.toml , поэтому вам, возможно, придется создать две config.toml и использовать cargo --manifest-path PATH/TO/CONFIG для компиляции двух двоичных файлов отдельно.