Я создал собственную сборку компилятора Rust, для которой требуется собственный компилятор C++. Как я могу сделать этот компилятор доступным для моих коллег, например. можно установить с помощью rustup
, иметь возможность обновлять/обновлять его, просматривать доступные версии и т. д.
Я думаю, что это только для локальной разработки компилятора, а не для распространения среди других разработчиков :(
Мы создаем компилятор Rust для QNX, который затем публикуется и распространяется внутри компании. Первым шагом является создание дистрибутива цепочки инструментов для вашей цели (целей), например:
#!/bin/sh -e
export build_env='
CC_aarch64-unknown-nto-qnx710=qcc
CFLAGS_aarch64-unknown-nto-qnx710=-Vgcc_ntoaarch64le_cxx
CXX_aarch64-unknown-nto-qnx710=qcc
AR_aarch64_unknown_nto_qnx710=ntoaarch64-ar
CC_x86_64-pc-nto-qnx710=qcc
CFLAGS_x86_64-pc-nto-qnx710=-Vgcc_ntox86_64_cxx
CXX_x86_64-pc-nto-qnx710=qcc
AR_x86_64_pc_nto_qnx710=ntox86_64-ar'
env $build_env \
./x.py dist \
--target \
x86_64-unknown-linux-gnu,aarch64-unknown-nto-qnx710,x86_64-pc-nto-qnx710
Вам необходимо адаптировать переменные и цели среды по мере необходимости. Важным параметром является dist
в команде x.py
.
Для распространения файлов Rustup вам также понадобятся некоторые дополнительные файлы «манифеста». Добавьте свои цели в src/tools/build-manifest/src/main.rs
, например. с этим различием:
diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs
index 21dad9eb74a..2964c2e916c 100644
--- a/src/tools/build-manifest/src/main.rs
+++ b/src/tools/build-manifest/src/main.rs
@@ -61,6 +61,7 @@
"aarch64-unknown-none-softfloat",
"aarch64-unknown-redox",
"aarch64-unknown-uefi",
+ "aarch64-unknown-nto-qnx710",
"arm-linux-androideabi",
"arm-unknown-linux-gnueabi",
"arm-unknown-linux-gnueabihf",
@@ -144,6 +145,7 @@
"x86_64-pc-windows-msvc",
"x86_64-sun-solaris",
"x86_64-pc-solaris",
+ "x86_64-pc-nto-qnx710",
"x86_64-unknown-freebsd",
"x86_64-unknown-illumos",
"x86_64-unknown-linux-gnu",
Создайте манифест (при необходимости обновите дату и URL-адрес!):
mkdir build/manifest
cargo run --release -p build-manifest build/dist build/manifest 1970-01-01 http://my-rustup-server:8000 stable
Если у вас нет подходящего веб-сервера, вы можете легко его создать, например. с фреймворком Rocket. Вам нужно сделать это только один раз.
cargo new own-rustup-server
cd own-rustup-server
cargo add [email protected]
Измените содержимое src/main.rs
:
#[macro_use]
extern crate rocket;
use std::fs::File;
#[get("/<_something>/<filename>")]
fn dist(_something: &str, filename: &str) -> Option<File> {
let filename = format!("dist/{filename}");
File::open(filename).ok()
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![dist])
}
... и создайте Rocket.toml
:
[default]
port = 8000
address = "0.0.0.0"
log_level = "normal"
Теперь мы можем скопировать дистрибутив на сервер Rustup и создать необходимые хэш-файлы sha256 (адаптируйте имя buildserver
и каталоги):
mkdir -p ~/own-rustup-server/dist
cd ~/own-rustup-server/dist
scp buildserver:/home/user/rust/build/manifest/* .
scp buildserver:/home/user/rust/build/dist/* .
for f in *.gz *.xz *.txt *.toml ; do [ -e $f.sha256 ] || sha256sum $f > $f.sha256 ; done
Скомпилируйте и запустите веб-сервер (cargo run --release
достаточно для тестирования; убедитесь, что он продолжает работать в фоновом режиме, например, создайте файлы конфигурации systemd, чтобы он запускался автоматически). Можно оставить сервер включенным при добавлении новых дистрибутивов.
Теперь ваши разработчики могут использовать Rustup для установки вашей цепочки инструментов. Лучше не путать официальный дистрибутив Rust и свой. Лучше всего устанавливать Rustup без установки какого-либо инструментария:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain none
Rustup использует переменную среды RUSTUP_DIST_SERVER
для доступа к серверу. Для простых случаев использования установите переменную при запуске Rustup; может иметь смысл установить переменную, например. в ~/.profile
.
Чтобы установить, например. Rust 1.71.0 со стандартной библиотекой для QNX 7.1 (aarch64) и локальным хостом (в моем случае x86_64):
RUSTUP_DIST_SERVER=http://my-rustup-server:8000 rustup install 1.71.0
RUSTUP_DIST_SERVER=http://my-rustup-server:8000 rustup target add aarch64-unknown-nto-qnx710 --toolchain 1.71.0-x86_64-unknown-linux-gnu
В зависимости от ваших потребностей либо укажите, какую цепочку инструментов использовать при запуске груза (например, cargo +1.71.0
), либо определите цепочку инструментов по умолчанию с помощью rustup default 1.71.0-x86_64-unknown-linux-gnu
.
спасибо! Не лучше ли использовать готовый веб-сервер (например, nginx) для статического обслуживания? А также, если RUSTUP_DIST_SERVER
будет изменен, не помешает ли это стандартной загрузке/обновлениям компилятора? Наконец, будет ли это работать с обновлениями? Спасибо!
Да, это не оптимальное решение, но нам оно подошло достаточно хорошо. Настройка nginx показалась более сложной, чем просто использование Rust (и Rocket.rs), но, конечно, тоже сработала. В этом свете использование коммерческого продукта, такого как Ферроцен (вам не нужен сертификат функциональной безопасности, только более дешевый компилятор), является своего рода заманчивым.
rust-lang.github.io/rustup/concepts/… возможно.