Yuri Astrakhan Asked: 2024-09-02 13:53:47 +0800 CST2024-09-02 13:53:47 +0800 CST 2024-09-02 13:53:47 +0800 CST 在组织内分发私有 Rust 编译器版本,例如使用“rustup” 772 我创建了一个自定义的 rust 编译器版本,它需要专有的 c++ 编译器。我怎样才能让我的同事可以使用这个编译器,例如可以使用 安装rustup、能够刷新/更新它、查看可用版本等。 rust 1 个回答 Voted Best Answer flba 2024-09-02T14:21:27+08:002024-09-02T14:21:27+08:00 我们正在为 QNX 构建一个 Rust 编译器,然后在内部发布/分发。第一步是为您的目标构建工具链的分发,例如: #!/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: 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 如果您没有合适的 Web 服务器,您可以轻松创建一个,例如使用 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 编译并运行 Web 服务器(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。 例如,要为 QNX 7.1(aarch64)和本地主机(在我的情况下是 x86_64)安装带有 stdlib 的 Rust 1.71.0: 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 时使用的工具链(如cargo +1.71.0),或者使用 定义默认工具链rustup default 1.71.0-x86_64-unknown-linux-gnu。
我们正在为 QNX 构建一个 Rust 编译器,然后在内部发布/分发。第一步是为您的目标构建工具链的分发,例如:
您需要根据需要调整环境变量和目标。重要的参数
dist
在命令中x.py
。要分发 rustup 文件,您还需要一些额外的“清单”文件。将您的目标添加到
src/tools/build-manifest/src/main.rs
,例如使用此 diff:创建清单(根据需要更新日期和 URL!):
如果您没有合适的 Web 服务器,您可以轻松创建一个,例如使用 Rocket 框架。您只需执行一次此操作。
更改内容
src/main.rs
:...并创建一个
Rocket.toml
:现在我们可以将分发复制到 rustup 服务器并创建所需的 sha256 哈希文件(调整名称
buildserver
和目录):编译并运行 Web 服务器(
cargo run --release
测试用即可;确保它在后台持续运行,例如创建 systemd 配置文件让其自动运行)。在添加新发行版时让服务器持续运行即可。现在,您的开发人员可以使用 rustup 安装您的工具链。最好不要混淆官方 Rust 发行版和您的发行版。最好在不安装任何工具链的情况下安装 rustup:
Rustup 使用环境变量
RUSTUP_DIST_SERVER
来访问服务器。对于简单的用例,在运行 rustup 时设置变量;在 中设置变量是有意义的~/.profile
。例如,要为 QNX 7.1(aarch64)和本地主机(在我的情况下是 x86_64)安装带有 stdlib 的 Rust 1.71.0:
根据您的需要,可以指定运行 Cargo 时使用的工具链(如
cargo +1.71.0
),或者使用 定义默认工具链rustup default 1.71.0-x86_64-unknown-linux-gnu
。