Распространение частных сборок компилятора Rust в организации, например. с "ржавчиной"

Я создал собственную сборку компилятора Rust, для которой требуется собственный компилятор C++. Как я могу сделать этот компилятор доступным для моих коллег, например. можно установить с помощью rustup, иметь возможность обновлять/обновлять его, просматривать доступные версии и т. д.

rust-lang.github.io/rustup/concepts/… возможно.

AKX 02.09.2024 07:57

Я думаю, что это только для локальной разработки компилятора, а не для распространения среди других разработчиков :(

Yuri Astrakhan 02.09.2024 08:12
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
3
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы создаем компилятор 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 будет изменен, не помешает ли это стандартной загрузке/обновлениям компилятора? Наконец, будет ли это работать с обновлениями? Спасибо!

Yuri Astrakhan 02.09.2024 21:27

Да, это не оптимальное решение, но нам оно подошло достаточно хорошо. Настройка nginx показалась более сложной, чем просто использование Rust (и Rocket.rs), но, конечно, тоже сработала. В этом свете использование коммерческого продукта, такого как Ферроцен (вам не нужен сертификат функциональной безопасности, только более дешевый компилятор), является своего рода заманчивым.

flba 04.09.2024 07:40

Другие вопросы по теме