"... дело было вечером, делать было нечего...", хотя... история этого уже и не помнит, на кой оно было надо
(тут ls -al первого? варианта)
Код: Выделить всё
~ # ls -l rust/
итого 4
-rw-r--r-- 1 thebb 1668 авг 14 2019 Makefile
За основу было взято из проекта buildroot ( тут ссыль на проект)
(у OpenWrt тогда ещё не было PR, который висит до сих пор (тут ссыль на PR).
Ессна, попробовал на зуб, как оно. оно оказалось не очень, даже с набитыми костылями.
То, что собиралось своим вариантом, напрочь отказывалось собираться owrt`шным. Лень победила!)
Печаль первая: на cmake`и надо натянуть ssl - или libre, или open.
Пробовал оба-два, но, т.к. libre изначально не задействована, остался на open.
Код: Выделить всё
diff --git a/tools/Makefile b/tools/Makefile
index c354d818..0958a7d2 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -25,7 +25,7 @@ tools-y += autoconf autoconf-archive automake bc bison cmake cpio dosfstools
tools-y += e2fsprogs fakeroot findutils flex gengetopt
tools-y += go-bootstrap go-src
tools-y += libtool lzma m4 missing-macros
-tools-y += mklibs mm-macros mtools ninja
+tools-y += mklibs mm-macros mtools ninja openssl
tools-y += patchelf pkgconf quilt sstrip xxd zip zlib zstd
tools-$(BUILD_ISL) += isl
tools-$(BUILD_TOOLCHAIN) += expat gmp mpc mpfr
@@ -35,7 +35,7 @@ $(curdir)/autoconf/compile := $(curdir)/m4/compile
$(curdir)/automake/compile := $(curdir)/m4/compile $(curdir)/autoconf/compile $(curdir)/pkgconf/compile $(curdir)/xz/compile
$(curdir)/bc/compile := $(curdir)/bison/compile $(curdir)/libtool/compile
$(curdir)/bison/compile := $(curdir)/flex/compile
-$(curdir)/cmake/compile += $(curdir)/ninja/compile
+$(curdir)/cmake/compile += $(curdir)/openssl/compile $(curdir)/ninja/compile
$(curdir)/dosfstools/compile := $(curdir)/autoconf/compile $(curdir)/automake/compile
$(curdir)/e2fsprogs/compile := $(curdir)/libtool/compile
$(curdir)/fakeroot/compile := $(curdir)/libtool/compile
@@ -51,6 +51,7 @@ $(curdir)/mklibs/compile := $(curdir)/libtool/compile
$(curdir)/mm-macros/compile := $(curdir)/libtool/compile
$(curdir)/mpc/compile := $(curdir)/mpfr/compile $(curdir)/gmp/compile
$(curdir)/mpfr/compile := $(curdir)/gmp/compile
+$(curdir)/openssl/compile := $(curdir)/pkgconf/compile
$(curdir)/patchelf/compile := $(curdir)/libtool/compile
$(curdir)/quilt/compile := $(curdir)/autoconf/compile $(curdir)/findutils/compile
$(curdir)/zlib/compile := $(curdir)/cmake/compile
@@ -59,7 +60,7 @@ $(curdir)/zstd/compile := $(curdir)/cmake/compile
tools-y += coreutils
ifneq ($(CONFIG_CCACHE)$(CONFIG_SDK),)
-$(foreach tool, $(filter-out xz zstd patch pkgconf ninja cmake,$(tools-y)), $(eval $(curdir)/$(tool)/compile += $(curdir)/ccache/compile))
+$(foreach tool, $(filter-out xz zstd pkgconf patch openssl ninja cmake,$(tools-y)), $(eval $(curdir)/$(tool)/compile += $(curdir)/ccache/compile))
tools-y += ccache
$(curdir)/ccache/compile := $(curdir)/zstd/compile
endif
Код: Выделить всё
#
# Copyright (C) 2018-2021 Entware
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=openssl
PKG_BASE:=1.1.1
PKG_BUGFIX:=l
PKG_VERSION:=$(PKG_BASE)$(PKG_BUGFIX)
PKG_RELEASE:=1
PKG_CPE_ID:=cpe:/a:openssl:openssl
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:= \
http://www.openssl.org/source/ \
http://www.openssl.org/source/old/$(PKG_BASE)/ \
http://ftp.fi.muni.cz/pub/openssl/source/ \
http://ftp.fi.muni.cz/pub/openssl/source/old/$(PKG_BASE)/ \
ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/ \
ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/old/$(PKG_BASE)/
PKG_HASH:=0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1
include $(INCLUDE_DIR)/host-build.mk
HOST_CFLAGS += $(FPIC)
define Host/Prepare
$(call Host/Prepare/Default)
( cd $(HOST_BUILD_DIR); ./config \
--prefix=$(STAGING_DIR_HOST) \
--openssldir=$(STAGING_DIR_HOST)/etc/ssl \
no-asm \
no-shared \
386 \
)
endef
$(eval $(call HostBuild))
Печаль вторая: время сборки (зависит от железа)
Не считая время загрузки архивов, распаковки, bootstrap, да ещё и по фен-шуй, выходило накладно.
Будем резать!
~ минут 20 собирается LLVM - обрезаны неиспользуемые таргеты (BPF;Hexagon;MSP430;NVPTX;PowerPC;RISCV;Sparc;SystemZ;WebAssembly + AVR(experimental)), добавление каждого из них увеличивает время сборки.
+ ~ минут 25 собирается хостовый rust (было ~ 20 минут, увеличилось из-за добавления clippy & rustfmt)
+ ~ минут 15 собираются бибки для выбранной $arch.
Итого: выходит около часа на полную сборку для первой выбранной архитектуры, для следующей занимает ~ 15 минут.
Печаль третья: targets
Когда собиралось только для mips (be/el), можно было и забить, да и обходился одним патчем (+soft-float).
Код: Выделить всё
--- a/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs
+++ b/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs
@@ -10,7 +10,7 @@ pub fn target() -> Target {
options: TargetOptions {
endian: Endian::Big,
cpu: "mips32r2".to_string(),
- features: "+mips32r2,+fpxx,+nooddspreg".to_string(),
+ features: "+mips32r2,+soft-float".to_string(),
max_atomic_width: Some(32),
mcount: "_mcount".to_string(),
--- a/compiler/rustc_target/src/spec/mipsel_unknown_linux_gnu.rs
+++ b/compiler/rustc_target/src/spec/mipsel_unknown_linux_gnu.rs
@@ -9,7 +9,7 @@ pub fn target() -> Target {
options: TargetOptions {
cpu: "mips32r2".to_string(),
- features: "+mips32r2,+fpxx,+nooddspreg".to_string(),
+ features: "+mips32r2,+soft-float".to_string(),
max_atomic_width: Some(32),
mcount: "_mcount".to_string(),
Код: Выделить всё
--- a/library/std/src/sys/unix/rand.rs
+++ b/library/std/src/sys/unix/rand.rs
@@ -26,22 +26,10 @@ mod imp {
use crate::io::Read;
#[cfg(any(target_os = "linux", target_os = "android"))]
- use crate::sys::weak::syscall;
-
- #[cfg(any(target_os = "linux", target_os = "android"))]
- fn getrandom(buf: &mut [u8]) -> libc::ssize_t {
- // A weak symbol allows interposition, e.g. for perf measurements that want to
- // disable randomness for consistency. Otherwise, we'll try a raw syscall.
- // (`getrandom` was added in glibc 2.25, musl 1.1.20, android API level 28)
- syscall! {
- fn getrandom(
- buffer: *mut libc::c_void,
- length: libc::size_t,
- flags: libc::c_uint
- ) -> libc::ssize_t
+ fn getrandom(buf: &mut [u8]) -> libc::c_long {
+ unsafe {
+ libc::syscall(libc::SYS_getrandom, buf.as_mut_ptr(), buf.len(), libc::GRND_NONBLOCK)
}
-
- unsafe { getrandom(buf.as_mut_ptr().cast(), buf.len(), libc::GRND_NONBLOCK) }
}
#[cfg(target_os = "espidf")]
Засада первая: arm - armv5 vs armv7 - разрезать можно, но... см. ниже.
Засада вторая: arm(v7) - armv7-2.6 vs armv7-3.2 - а тут уже фих знаетъ чего прилепить.
Засада третья: x86_64 - $host vs $target - ну-с, делать нечего, переименовываем...
Что-то типа, $(ARCH)-entware-linux-gnu$(ABI)? Ага, щаззз. suricata (см. ниже)
Засада четвёртая: host,host_alias,host_triplet,target_alias... - шоб owrt`шникам икалось до-о-олго, переименовываем в... $(REAL_GNU_TARGET_NAME)
Засада пятая: вот это всё должно валяться в $(STAGING_DIR_HOSTPKG) - тута сразу и первая, и вторая, и третья вылезають.
Не по шен-фуй, но тоже могет быть... Закидываем в $(STAGING_DIR)/host
запчасти от лисапеда )))
Код: Выделить всё
# SPDX-License-Identifier: WTFPL
include $(TOPDIR)/rules.mk
PKG_NAME:=rustc
PKG_VERSION:=1.56.1
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-src.tar.xz
PKG_SOURCE_URL:=https://static.rust-lang.org/dist
PKG_HASH:=61fdcc8bc2530ee18f91318347e09b7cc07e9ca04b1c627c135ecc8dcb8f2ac5
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION)-src
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-src
PKG_LICENSE:=Apache-2.0 MIT
PKG_LICENSE_FILES:=LICENSE-APACHE LICENSE-MIT
HOST_BUILD_DEPENDS:=python3/host
PKG_BUILD_DEPENDS:=rustc/host
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/host-build.mk
define Package/rustc
SECTION:=devel
CATEGORY:=Development
TITLE:=Rust
URL:=https://crates.io/
BUILDONLY:=1
endef
define Package/rustc/description
Rust.
endef
# host
RUST_HOST_TRIPLE:=$(HOST_ARCH)-unknown-linux-gnu
define Host/Configure
( \
echo 'changelog-seen = 2'; \
echo '[llvm]'; \
echo 'targets = "AArch64;ARM;Mips;X86"'; \
echo 'experimental-targets = ""'; \
echo 'link-shared = true'; \
echo '[build]'; \
echo 'test-stage = 0'; \
echo 'dist-stage = 0'; \
echo 'bench-stage = 0'; \
echo 'target = ["$(RUST_HOST_TRIPLE)"]'; \
echo 'docs = false'; \
echo 'compiler-docs = false'; \
echo 'submodules = false'; \
echo 'python = "$(STAGING_DIR_HOSTPKG)/bin/python3"'; \
echo 'vendor = true'; \
echo 'extended = true'; \
echo 'tools = ["cargo", "clippy", "rustfmt"]'; \
echo 'verbose = 0'; \
echo '[install]'; \
echo 'prefix = "/"'; \
echo 'sysconfdir = "/etc"'; \
echo 'bindir = "/bin"'; \
echo 'libdir = "/lib"'; \
echo 'datadir = "/share"'; \
echo '[rust]'; \
echo 'backtrace = false'; \
echo 'incremental = true'; \
echo 'channel = "nightly"'; \
echo 'codegen-tests = false'; \
echo 'dist-src = false'; \
echo '[target.$(RUST_HOST_TRIPLE)]'; \
echo 'cc = "$(HOSTCC)"'; \
echo 'cxx = "$(HOSTCXX)"'; \
echo '[dist]'; \
echo 'src-tarball = false'; \
echo 'compression-formats = ["gz"]'; \
) > $(HOST_BUILD_DIR)/config.toml
endef
define Host/Compile
# ( cd $(HOST_BUILD_DIR); \
# $(STAGING_DIR_HOSTPKG)/bin/python3 x.py build; \
# )
endef
define Host/Install
( cd $(HOST_BUILD_DIR); \
DESTDIR=$(HOST_BUILD_DIR)/install \
$(STAGING_DIR_HOSTPKG)/bin/python3 x.py install \
)
endef
# target
#RUST_TARGET_TRIPLE:=
#ifeq ($(CONFIG_TARGET_armv5_3_2),y)
#RUST_TARGET_TRIPLE=armv5te-openwrt-linux-gnueabi
#else
#ifeq ($(or $(CONFIG_TARGET_armv7_2_6),$(CONFIG_TARGET_armv7_3_2)),y)
#RUST_TARGET_TRIPLE=armv7-openwrt-linux-gnueabi
#else
#ifeq ($(CONFIG_TARGET_x86_2_6),y)
#RUST_TARGET_TRIPLE=i486-openwrt-linux-gnu
#else
RUST_TARGET_TRIPLE=$(REAL_GNU_TARGET_NAME)
#endif
#endif
#endif
# XXX saved ~ 20 min (skip LLVM)
define Build/Prepare
$(call Build/Prepare/Default)
$(INSTALL_DIR) $(PKG_BUILD_DIR)/build/$(RUST_HOST_TRIPLE)
$(LN) $(HOST_BUILD_DIR)/build/$(RUST_HOST_TRIPLE)/llvm \
$(PKG_BUILD_DIR)/build/$(RUST_HOST_TRIPLE)
$(INSTALL_DIR) $(STAGING_DIR)/host/bin $(STAGING_DIR)/host/lib/rustlib
$(CP) $(HOST_BUILD_DIR)/install/bin/{cargo,clippy,rustc,rustd,rustf}* \
$(STAGING_DIR)/host/bin
$(CP) $(HOST_BUILD_DIR)/install/lib/lib* $(STAGING_DIR)/host/lib
$(CP) $(HOST_BUILD_DIR)/install/lib/rustlib/$(RUST_HOST_TRIPLE) \
$(STAGING_DIR)/host/lib/rustlib
endef
define Build/Configure
( \
echo 'changelog-seen = 2'; \
echo 'profile = "library"'; \
echo '[llvm]'; \
echo 'download-ci-llvm = false'; \
echo 'skip-rebuild = true'; \
echo 'allow-old-toolchain = true'; \
echo '[build]'; \
echo 'host = ["$(RUST_TARGET_TRIPLE)"]'; \
echo 'target = ["$(RUST_TARGET_TRIPLE)"]'; \
echo 'cargo = "$(STAGING_DIR)/host/bin/cargo"'; \
echo 'rustc = "$(STAGING_DIR)/host/bin/rustc"'; \
echo 'docs = false'; \
echo 'compiler-docs = false'; \
echo 'submodules = false'; \
echo 'python = "$(STAGING_DIR_HOSTPKG)/bin/python3"'; \
echo 'vendor = true'; \
echo 'full-bootstrap = false'; \
echo 'extended = false'; \
echo 'tools = [""]'; \
echo 'verbose = 0'; \
echo 'local-rebuild = false'; \
echo '[install]'; \
echo 'prefix = "/opt"'; \
echo 'sysconfdir = "/opt/etc"'; \
echo 'bindir = "/opt/bin"'; \
echo 'libdir = "/opt/lib"'; \
echo 'datadir = "/opt/share"'; \
echo '[rust]'; \
echo 'incremental = true'; \
echo 'channel = "nightly"'; \
echo 'rpath = false'; \
echo 'codegen-tests = false'; \
echo 'dist-src = false'; \
echo '[target.$(RUST_TARGET_TRIPLE)]'; \
echo 'cc = "$(TARGET_CROSS)gcc"'; \
echo 'cxx = "$(TARGET_CROSS)g++"'; \
echo 'ar = "$(TARGET_CROSS)ar"'; \
echo 'ranlib = "$(TARGET_CROSS)ranlib"'; \
echo 'linker = "$(TARGET_CROSS)gcc"'; \
echo '[dist]'; \
echo 'src-tarball = false'; \
echo 'compression-formats = ["gz"]'; \
) > $(PKG_BUILD_DIR)/config.toml
endef
# XXX saved ~ 10 min
define Build/Compile
# ( cd $(PKG_BUILD_DIR); \
# $(STAGING_DIR_HOSTPKG)/bin/python3 x.py build library/std \
# )
endef
define Build/Install
( cd $(PKG_BUILD_DIR); \
PKG_CONFIG_ALLOW_CROSS=1 \
DESTDIR=$(PKG_INSTALL_DIR) \
$(STAGING_DIR_HOSTPKG)/bin/python3 x.py install \
library/std --stage 1 \
)
endef
define Build/InstallDev
$(INSTALL_DIR) $(2)/lib/rustlib
$(CP) $(PKG_INSTALL_DIR)/opt/lib/rustlib/$(RUST_TARGET_TRIPLE) \
$(2)/lib/rustlib
$(INSTALL_DIR) $(2)/share/cargo/.cargo
( \
echo '[target.$(RUST_TARGET_TRIPLE)]'; \
echo 'linker = "$(TARGET_CROSS)gcc"'; \
) > $(2)/share/cargo/.cargo/config.toml
endef
$(eval $(call HostBuild))
$(eval $(call BuildPackage,rustc))
Код: Выделить всё
--- a/library/std/src/sys/unix/rand.rs
+++ b/library/std/src/sys/unix/rand.rs
@@ -26,22 +26,10 @@ mod imp {
use crate::io::Read;
#[cfg(any(target_os = "linux", target_os = "android"))]
- use crate::sys::weak::syscall;
-
- #[cfg(any(target_os = "linux", target_os = "android"))]
- fn getrandom(buf: &mut [u8]) -> libc::ssize_t {
- // A weak symbol allows interposition, e.g. for perf measurements that want to
- // disable randomness for consistency. Otherwise, we'll try a raw syscall.
- // (`getrandom` was added in glibc 2.25, musl 1.1.20, android API level 28)
- syscall! {
- fn getrandom(
- buffer: *mut libc::c_void,
- length: libc::size_t,
- flags: libc::c_uint
- ) -> libc::ssize_t
+ fn getrandom(buf: &mut [u8]) -> libc::c_long {
+ unsafe {
+ libc::syscall(libc::SYS_getrandom, buf.as_mut_ptr(), buf.len(), libc::GRND_NONBLOCK)
}
-
- unsafe { getrandom(buf.as_mut_ptr().cast(), buf.len(), libc::GRND_NONBLOCK) }
}
#[cfg(target_os = "espidf")]
Код: Выделить всё
--- /dev/null
+++ b/compiler/rustc_target/src/spec/aarch64_openwrt_linux_gnu.rs
@@ -0,0 +1,20 @@
+use crate::spec::{SanitizerSet, Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "aarch64-openwrt-linux-gnu".to_string(),
+ pointer_width: 64,
+ data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
+ arch: "aarch64".to_string(),
+ options: TargetOptions {
+ mcount: "\u{1}_mcount".to_string(),
+ max_atomic_width: Some(128),
+ supported_sanitizers: SanitizerSet::ADDRESS
+ | SanitizerSet::LEAK
+ | SanitizerSet::MEMORY
+ | SanitizerSet::THREAD
+ | SanitizerSet::HWADDRESS,
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/arm_openwrt_linux_gnueabi.rs
@@ -0,0 +1,17 @@
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "arm-openwrt-linux-gnueabi".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
+ arch: "arm".to_string(),
+ options: TargetOptions {
+ abi: "eabi".to_string(),
+ features: "+strict-align,+v6".to_string(),
+ max_atomic_width: Some(64),
+ mcount: "\u{1}__gnu_mcount_nc".to_string(),
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/armv5te_openwrt_linux_gnueabi.rs
@@ -0,0 +1,19 @@
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "armv5te-openwrt-linux-gnueabi".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
+ arch: "arm".to_string(),
+ options: TargetOptions {
+ abi: "eabi".to_string(),
+ features: "+soft-float,+strict-align".to_string(),
+ // Atomic operations provided by compiler-builtins
+ max_atomic_width: Some(32),
+ mcount: "\u{1}__gnu_mcount_nc".to_string(),
+ has_thumb_interworking: true,
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/armv7_openwrt_linux_gnueabi.rs
@@ -0,0 +1,20 @@
+use crate::spec::{Target, TargetOptions};
+
+// This target is for glibc Linux on ARMv7 without thumb-mode, NEON or
+// hardfloat.
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "armv7-openwrt-linux-gnueabi".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
+ arch: "arm".to_string(),
+ options: TargetOptions {
+ abi: "eabi".to_string(),
+ features: "+v7,+thumb2,+soft-float,-neon".to_string(),
+ max_atomic_width: Some(64),
+ mcount: "\u{1}__gnu_mcount_nc".to_string(),
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/i386_openwrt_linux_gnu.rs
@@ -0,0 +1,8 @@
+use crate::spec::Target;
+
+pub fn target() -> Target {
+ let mut base = super::i686_openwrt_linux_gnu::target();
+ base.cpu = "i386".to_string();
+ base.llvm_target = "i386-openwrt-linux-gnu".to_string();
+ base
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/i486_openwrt_linux_gnu.rs
@@ -0,0 +1,8 @@
+use crate::spec::Target;
+
+pub fn target() -> Target {
+ let mut base = super::i686_openwrt_linux_gnu::target();
+ base.cpu = "i486".to_string();
+ base.llvm_target = "i486-openwrt-linux-gnu".to_string();
+ base
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/i586_openwrt_linux_gnu.rs
@@ -0,0 +1,8 @@
+use crate::spec::Target;
+
+pub fn target() -> Target {
+ let mut base = super::i686_openwrt_linux_gnu::target();
+ base.cpu = "pentium".to_string();
+ base.llvm_target = "i586-openwrt-linux-gnu".to_string();
+ base
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/i686_openwrt_linux_gnu.rs
@@ -0,0 +1,20 @@
+use crate::spec::{LinkerFlavor, StackProbeType, Target};
+
+pub fn target() -> Target {
+ let mut base = super::openwrt_linux_gnu_base::opts();
+ base.cpu = "pentium4".to_string();
+ base.max_atomic_width = Some(64);
+ base.pre_link_args.entry(LinkerFlavor::Gcc).or_default().push("-m32".to_string());
+ // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved
+ base.stack_probes = StackProbeType::Call;
+
+ Target {
+ llvm_target: "i686-openwrt-linux-gnu".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
+ f64:32:64-f80:32-n8:16:32-S128"
+ .to_string(),
+ arch: "x86".to_string(),
+ options: base,
+ }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/mips_openwrt_linux_gnu.rs
@@ -0,0 +1,20 @@
+use crate::abi::Endian;
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "mips-openwrt-linux-gnu".to_string(),
+ pointer_width: 32,
+ data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".to_string(),
+ arch: "mips".to_string(),
+ options: TargetOptions {
+ endian: Endian::Big,
+ cpu: "mips32r2".to_string(),
+ features: "+mips32r2,+soft-float,+nooddspreg".to_string(),
+ max_atomic_width: Some(32),
+ mcount: "_mcount".to_string(),
+
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/mipsel_openwrt_linux_gnu.rs
@@ -0,0 +1,19 @@
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "mipsel-openwrt-linux-gnu".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".to_string(),
+ arch: "mips".to_string(),
+
+ options: TargetOptions {
+ cpu: "mips32r2".to_string(),
+ features: "+mips32r2,+soft-float,+nooddspreg".to_string(),
+ max_atomic_width: Some(32),
+ mcount: "_mcount".to_string(),
+
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- a/compiler/rustc_target/src/spec/mod.rs
+++ b/compiler/rustc_target/src/spec/mod.rs
@@ -73,6 +73,8 @@ mod linux_uclibc_base;
mod msvc_base;
mod netbsd_base;
mod openbsd_base;
+mod openwrt_linux_base;
+mod openwrt_linux_gnu_base;
mod redox_base;
mod solaris_base;
mod thumb_base;
@@ -738,6 +740,18 @@ macro_rules! supported_targets {
}
supported_targets! {
+ ("aarch64-openwrt-linux-gnu", aarch64_openwrt_linux_gnu),
+ ("arm-openwrt-linux-gnueabi", arm_openwrt_linux_gnueabi),
+ ("armv5te-openwrt-linux-gnueabi", armv5te_openwrt_linux_gnueabi),
+ ("armv7-openwrt-linux-gnueabi", armv7_openwrt_linux_gnueabi),
+ ("i386-openwrt-linux-gnu", i386_openwrt_linux_gnu),
+ ("i486-openwrt-linux-gnu", i486_openwrt_linux_gnu),
+ ("i586-openwrt-linux-gnu", i586_openwrt_linux_gnu),
+ ("i686-openwrt-linux-gnu", i686_openwrt_linux_gnu),
+ ("mips-openwrt-linux-gnu", mips_openwrt_linux_gnu),
+ ("mipsel-openwrt-linux-gnu", mipsel_openwrt_linux_gnu),
+ ("x86_64-openwrt-linux-gnu", x86_64_openwrt_linux_gnu),
+
("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
--- /dev/null
+++ b/compiler/rustc_target/src/spec/openwrt_linux_base.rs
@@ -0,0 +1,16 @@
+use crate::spec::{RelroLevel, TargetOptions};
+
+pub fn opts() -> TargetOptions {
+ TargetOptions {
+ os: "linux".to_string(),
+ dynamic_linking: true,
+ executables: true,
+ families: vec!["unix".to_string()],
+ has_rpath: false,
+ position_independent_executables: false,
+ relro_level: RelroLevel::None,
+ has_elf_tls: true,
+ crt_static_respected: true,
+ ..Default::default()
+ }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/openwrt_linux_gnu_base.rs
@@ -0,0 +1,5 @@
+use crate::spec::TargetOptions;
+
+pub fn opts() -> TargetOptions {
+ TargetOptions { env: "gnu".to_string(), ..super::openwrt_linux_base::opts() }
+}
--- /dev/null
+++ b/compiler/rustc_target/src/spec/x86_64_openwrt_linux_gnu.rs
@@ -0,0 +1,21 @@
+use crate::spec::{LinkerFlavor, SanitizerSet, StackProbeType, Target};
+
+pub fn target() -> Target {
+ let mut base = super::openwrt_linux_gnu_base::opts();
+ base.cpu = "x86-64".to_string();
+ base.max_atomic_width = Some(64);
+ base.pre_link_args.entry(LinkerFlavor::Gcc).or_default().push("-m64".to_string());
+ // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved
+ base.stack_probes = StackProbeType::Call;
+ base.supported_sanitizers =
+ SanitizerSet::ADDRESS | SanitizerSet::LEAK | SanitizerSet::MEMORY | SanitizerSet::THREAD;
+
+ Target {
+ llvm_target: "x86_64-openwrt-linux-gnu".to_string(),
+ pointer_width: 64,
+ data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+ .to_string(),
+ arch: "x86_64".to_string(),
+ options: base,
+ }
+}
Код: Выделить всё
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/aarch64_openwrt_linux_gnu.rs
@@ -0,0 +1,23 @@
+use crate::spec::{SanitizerSet, Target, TargetOptions};
+
+pub fn target() -> Target {
+ let mut base = super::linux_gnu_base::opts();
+ base.max_atomic_width = Some(128);
+ base.supported_sanitizers = SanitizerSet::ADDRESS
+ | SanitizerSet::LEAK
+ | SanitizerSet::MEMORY
+ | SanitizerSet::THREAD
+ | SanitizerSet::HWADDRESS;
+
+ Target {
+ llvm_target: "aarch64-openwrt-linux-gnu".to_string(),
+ pointer_width: 64,
+ data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".to_string(),
+ arch: "aarch64".to_string(),
+ options: TargetOptions {
+ unsupported_abis: super::arm_base::unsupported_abis(),
+ mcount: "\u{1}_mcount".to_string(),
+ ..base
+ },
+ }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/arm_openwrt_linux_gnueabi.rs
@@ -0,0 +1,19 @@
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ let mut base = super::openwrt_linux_gnu_base::opts();
+ base.max_atomic_width = Some(64);
+ Target {
+ llvm_target: "arm-openwrt-linux-gnueabi".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
+ arch: "arm".to_string(),
+
+ options: TargetOptions {
+ features: "+soft-float,+strict-align".to_string(),
+ unsupported_abis: super::arm_base::unsupported_abis(),
+ mcount: "\u{1}__gnu_mcount_nc".to_string(),
+ ..base
+ },
+ }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/armv5te_openwrt_linux_gnueabi.rs
@@ -0,0 +1,21 @@
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ let base = super::openwrt_linux_gnu_base::opts();
+ Target {
+ llvm_target: "armv5te-openwrt-linux-gnueabi".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
+ arch: "arm".to_string(),
+
+ options: TargetOptions {
+ features: "+soft-float,+strict-align".to_string(),
+ // Atomic operations provided by compiler-builtins
+ max_atomic_width: Some(32),
+ unsupported_abis: super::arm_base::unsupported_abis(),
+ mcount: "\u{1}__gnu_mcount_nc".to_string(),
+ has_thumb_interworking: true,
+ ..base
+ },
+ }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/armv7_openwrt_linux_gnueabi.rs
@@ -0,0 +1,22 @@
+use crate::spec::{Target, TargetOptions};
+
+// This target is for glibc Linux on ARMv7 without thumb-mode, NEON or
+// hardfloat.
+
+pub fn target() -> Target {
+ let base = super::openwrt_linux_gnu_base::opts();
+ Target {
+ llvm_target: "armv7-openwrt-linux-gnueabi".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
+ arch: "arm".to_string(),
+
+ options: TargetOptions {
+ features: "+v7,+thumb2,+soft-float,-neon".to_string(),
+ max_atomic_width: Some(64),
+ unsupported_abis: super::arm_base::unsupported_abis(),
+ mcount: "\u{1}__gnu_mcount_nc".to_string(),
+ ..base
+ },
+ }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/i386_openwrt_linux_gnu.rs
@@ -0,0 +1,8 @@
+use crate::spec::Target;
+
+pub fn target() -> Target {
+ let mut base = super::i686_openwrt_linux_gnu::target();
+ base.cpu = "i386".to_string();
+ base.llvm_target = "i386-openwrt-linux-gnu".to_string();
+ base
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/i486_openwrt_linux_gnu.rs
@@ -0,0 +1,8 @@
+use crate::spec::Target;
+
+pub fn target() -> Target {
+ let mut base = super::i686_openwrt_linux_gnu::target();
+ base.cpu = "i486".to_string();
+ base.llvm_target = "i486-openwrt-linux-gnu".to_string();
+ base
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/i586_openwrt_linux_gnu.rs
@@ -0,0 +1,8 @@
+use crate::spec::Target;
+
+pub fn target() -> Target {
+ let mut base = super::i686_openwrt_linux_gnu::target();
+ base.cpu = "pentium".to_string();
+ base.llvm_target = "i586-openwrt-linux-gnu".to_string();
+ base
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/i686_openwrt_linux_gnu.rs
@@ -0,0 +1,20 @@
+use crate::spec::{LinkerFlavor, StackProbeType, Target};
+
+pub fn target() -> Target {
+ let mut base = super::openwrt_linux_gnu_base::opts();
+ base.cpu = "pentium4".to_string();
+ base.max_atomic_width = Some(64);
+ base.pre_link_args.entry(LinkerFlavor::Gcc).or_default().push("-m32".to_string());
+ // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved
+ base.stack_probes = StackProbeType::Call;
+
+ Target {
+ llvm_target: "i686-openwrt-linux-gnu".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
+ f64:32:64-f80:32-n8:16:32-S128"
+ .to_string(),
+ arch: "x86".to_string(),
+ options: base,
+ }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/mips_openwrt_linux_gnu.rs
@@ -0,0 +1,20 @@
+use crate::abi::Endian;
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "mips-openwrt-linux-gnu".to_string(),
+ pointer_width: 32,
+ data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".to_string(),
+ arch: "mips".to_string(),
+ options: TargetOptions {
+ endian: Endian::Big,
+ cpu: "mips32r2".to_string(),
+ features: "+mips32r2,+soft-float,+nooddspreg".to_string(),
+ max_atomic_width: Some(32),
+ mcount: "_mcount".to_string(),
+
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/mipsel_openwrt_linux_gnu.rs
@@ -0,0 +1,19 @@
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ llvm_target: "mipsel-openwrt-linux-gnu".to_string(),
+ pointer_width: 32,
+ data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".to_string(),
+ arch: "mips".to_string(),
+
+ options: TargetOptions {
+ cpu: "mips32r2".to_string(),
+ features: "+mips32r2,+soft-float,+nooddspreg".to_string(),
+ max_atomic_width: Some(32),
+ mcount: "_mcount".to_string(),
+
+ ..super::openwrt_linux_gnu_base::opts()
+ },
+ }
+}
--- a/vendor/rustc-ap-rustc_target/src/spec/mod.rs
+++ b/vendor/rustc-ap-rustc_target/src/spec/mod.rs
@@ -73,6 +73,8 @@ mod linux_uclibc_base;
mod msvc_base;
mod netbsd_base;
mod openbsd_base;
+mod openwrt_linux_base;
+mod openwrt_linux_gnu_base;
mod redox_base;
mod riscv_base;
mod solaris_base;
@@ -701,6 +703,18 @@ macro_rules! supported_targets {
}
supported_targets! {
+ ("aarch64-openwrt-linux-gnu", aarch64_openwrt_linux_gnu),
+ ("arm-openwrt-linux-gnueabi", arm_openwrt_linux_gnueabi),
+ ("armv5te-openwrt-linux-gnueabi", armv5te_openwrt_linux_gnueabi),
+ ("armv7-openwrt-linux-gnueabi", armv7_openwrt_linux_gnueabi),
+ ("i386-openwrt-linux-gnu", i386_openwrt_linux_gnu),
+ ("i486-openwrt-linux-gnu", i486_openwrt_linux_gnu),
+ ("i586-openwrt-linux-gnu", i586_openwrt_linux_gnu),
+ ("i686-openwrt-linux-gnu", i686_openwrt_linux_gnu),
+ ("mips-openwrt-linux-gnu", mips_openwrt_linux_gnu),
+ ("mipsel-openwrt-linux-gnu", mipsel_openwrt_linux_gnu),
+ ("x86_64-openwrt-linux-gnu", x86_64_openwrt_linux_gnu),
+
("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/openwrt_linux_base.rs
@@ -0,0 +1,16 @@
+use crate::spec::{RelroLevel, TargetOptions};
+
+pub fn opts() -> TargetOptions {
+ TargetOptions {
+ os: "linux".to_string(),
+ dynamic_linking: true,
+ executables: true,
+ families: vec!["unix".to_string()],
+ has_rpath: false,
+ position_independent_executables: false,
+ relro_level: RelroLevel::None,
+ has_elf_tls: true,
+ crt_static_respected: true,
+ ..Default::default()
+ }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/openwrt_linux_gnu_base.rs
@@ -0,0 +1,5 @@
+use crate::spec::TargetOptions;
+
+pub fn opts() -> TargetOptions {
+ TargetOptions { env: "gnu".to_string(), ..super::openwrt_linux_base::opts() }
+}
--- /dev/null
+++ b/vendor/rustc-ap-rustc_target/src/spec/x86_64_openwrt_linux_gnu.rs
@@ -0,0 +1,21 @@
+use crate::spec::{LinkerFlavor, SanitizerSet, StackProbeType, Target};
+
+pub fn target() -> Target {
+ let mut base = super::openwrt_linux_gnu_base::opts();
+ base.cpu = "x86-64".to_string();
+ base.max_atomic_width = Some(64);
+ base.pre_link_args.entry(LinkerFlavor::Gcc).or_default().push("-m64".to_string());
+ // don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved
+ base.stack_probes = StackProbeType::Call;
+ base.supported_sanitizers =
+ SanitizerSet::ADDRESS | SanitizerSet::LEAK | SanitizerSet::MEMORY | SanitizerSet::THREAD;
+
+ Target {
+ llvm_target: "x86_64-openwrt-linux-gnu".to_string(),
+ pointer_width: 64,
+ data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+ .to_string(),
+ arch: "x86_64".to_string(),
+ options: base,
+ }
+}
Код: Выделить всё
# deps ???
#PKG_BUILD_DEPENDS:=rustc
CARGO_BUILD_DIR = $(PKG_BUILD_DIR)$(if $(CARGO_BINARY_SUBDIR),/$(CARGO_BINARY_SUBDIR))
CARGO:=$(STAGING_DIR)/host/bin/cargo
CARGO_HOME:=$(STAGING_DIR)/host/share/cargo
CARGO_TARGET_DIR:=$(PKG_BUILD_DIR)/openwrt-build
RUSTC:=$(STAGING_DIR)/host/bin/rustc
RUSTC_WRAPPER:=$(STAGING_DIR)/host/bin/rustc
RUSTDOC:=$(STAGING_DIR)/host/bin/rustdoc
RUSTFMT:=$(STAGING_DIR)/host/bin/rustfmt
RUST_TARGET_TRIPLE:=$(REAL_GNU_TARGET_NAME)
CARGO_ARGS:=
CARGO_VARS:=
RUSTC_VARS:=
RUSTFLAGS:=
# target
#RUST_TARGET_TRIPLE:=
#ifeq ($(CONFIG_TARGET_armv5_3_2),y)
#RUST_TARGET_TRIPLE=armv5te-openwrt-linux-gnueabi
#else
#ifeq ($(or $(CONFIG_TARGET_armv7_2_6),$(CONFIG_TARGET_armv7_3_2)),y)
#RUST_TARGET_TRIPLE=armv7-openwrt-linux-gnueabi
#else
#ifeq ($(CONFIG_TARGET_x86_2_6),y)
#RUST_TARGET_TRIPLE=i486-openwrt-linux-gnu
#else
#RUST_TARGET_TRIPLE=$(REAL_GNU_TARGET_NAME)
#endif
#endif
#endif
# for *-sys
RUSTC_VARS = \
CRATE_CC_NO_DEFAULTS="" \
CROSS_COMPILE="$(RUST_TARGET_TRIPLE)" \
PKG_CONFIG_ALLOW_CROSS=1 \
PKG_CONFIG_PATH="$(STAGING_DIR)/opt/lib/pkgconfig:$(STAGING_DIR)/opt/share/pkgconfig" \
PKG_CONFIG_SYSROOT_DIR="$(STAGING_DIR)/opt" \
TARGET="$(RUST_TARGET_TRIPLE)" \
AR="${TARGET_AR}" \
CC="${TARGET_CC}" \
CXX="${TARGET_CXX}" \
CFLAGS="${TARGET_CFLAGS}" \
CXXFLAGS="${TARGET_CXXFLAGS}" \
TARGET_AR="${TARGET_AR}" \
TARGET_CC="${TARGET_CC}" \
TARGET_CXX="${TARGET_CXX}" \
TARGET_CFLAGS="${TARGET_CFLAGS}" \
TARGET_CXXFLAGS="${TARGET_CXXFLAGS}" \
HOST_AR="${AR}" \
HOST_CC="${HOSTCC}" \
HOST_CXX="${HOSTCXX}" \
HOST_CFLAGS="${HOST_CFLAGS}" \
HOST_CXXFLAGS="${HOST_CFLAGS}"
# FIXME: */cargo: undefined symbol: ENGINE_init, version OPENSSL_1_1_0
#ifeq ($(CONFIG_x86_64),)
#RUSTC_VARS += \
# LD_LIBRARY_PATH="$(STAGING_DIR)/opt/lib"
#endif
RUSTFLAGS += \
-C embed-bitcode=yes \
-C link-arg=-Wl,--dynamic-linker=/opt/lib/$(DYNLINKER) \
-C linker=$(TARGET_CROSS)gcc \
-C opt-level=z \
-C panic=abort \
-C relocation-model=static \
-Z strip=symbols
define Build/Configure/Cargo
endef
# ( [ -f $(PKG_BUILD_DIR)/.cargo/config.toml ]; $(RM) $(PKG_BUILD_DIR)/.catgo/config.toml ; \
# $(INSTALL_DIR) $(PKG_BUILD_DIR)/.cargo; \
# ( \
# echo '[target.$(RUST_TARGET_TRIPLE)]'; \
# echo 'linker = "$(TARGET_CROSS)gcc"'; \
# echo '[install]'; \
# echo 'root = "$(PKG_INSTALL_DIR)/opt"'; \
# ) > $(PKG_BUILD_DIR)/.cargo/config.toml ; \
# )
#endef
define Build/Compile/Cargo
endef
# ( \
# cd $(CARGO_BUILD_DIR); \
# $(RUSTC_VARS) \
# RUSTFLAGS="$(RUSTFLAGS)" \
# CARGO_HOME="$(CARGO_HOME)" \
# CARGO_TARGET_DIR="$(CARGO_TARGET_DIR)" \
# $(CARGO) build \
# $(CARGO_ARGS) \
# --target $(RUST_TARGET_TRIPLE) \
# --release \
# $(CARGO_VARS); \
# )
#endef
define Build/Install/Cargo
( \
cd $(CARGO_BUILD_DIR); \
$(RUSTC_VARS) \
RUSTFLAGS="$(RUSTFLAGS)" \
CARGO_HOME="$(CARGO_HOME)" \
CARGO_TARGET_DIR="$(CARGO_TARGET_DIR)" \
$(CARGO) install \
$(CARGO_ARGS) \
--path . \
--root $(PKG_INSTALL_DIR)/opt \
--target $(RUST_TARGET_TRIPLE) \
$(CARGO_VARS); \
)
endef
Build/Configure=$(call Build/Configure/Cargo)
Build/Compile=$(call Build/Compile/Cargo)
Build/Install=$(call Build/Install/Cargo)
Из известного:
1) если в зависимости от зависимости зависимости зависимости... (здесь пламенный привет go, python, node и подобным) есть ring, mips`ы идут тёмным лесом, дальним полем - не то, что не взлетит, а даже не соберётся.
(тут ссыль на проект https://github.com/briansmith/ring | https://github.com/briansmith/ring/search?q=mips&type=issues)
2) т.к. таргеты растишки переименованы в $(REAL_GNU_TARGET_NAME), есть шанс отвала сборки на некоторых проектах, но решаемо, типа:
https://github.com/BurntSushi/memchr/blob/master/build.rs
fix for @(aarch64||arm||mips||mipsel):
Код: Выделить всё
RUSTFLAGS += --cfg memchr_disable_auto_simd
https://github.com/crossbeam-rs/crossbeam/blob/master/no_atomic.rs
fix for @(arm||mips||mipsel):
Код: Выделить всё
RUSTFLAGS += --cfg crossbeam_no_atomic_64
3) x11* - как повезёт...
а тут картинки:
btm (bottom) https://github.com/ClementTsang/bottom
screen_btm.png
screen_coreutils-rs.png
screen_dust.png
screen_gping.png
screen_nushell.png
screen_ripgrep.png
screen_rustscan.png
замазывать было лень, смотрим на сайте
---
фиксик: было `RUSTC_VARS += \`, стало `RUSTC_VARS = \`