Introduksjon til Rust
Rust programmeringsspråket er
utformet for å være et trygt, samtidig, praktisk språk.
Denne pakken oppdateres i en seksukers utgivelsessyklus. Fordi den
er en så stor og treg pakke å bygge, er for øyeblikket bare
nødvendig av noen få pakker i denne boken, og spesielt fordi nyere
versjoner har en tendens til å bryte eldre mozilla pakker, mener
BLFS redaktørene at den skal bare oppdateres når det er nødvendig
(enten for å fikse problemer, eller for å la en ny versjon av en
pakke bygges).
Som med mange andre programmeringsspråk, rustc (rustkompilatoren)
trenger en binær for oppstartssekvensen. Den vil laste ned en
stage0 binær ved starten av bygningen, så du kan ikke kompilere den
uten en Internett tilkobling.
Notat
Selv om BLFS vanligvis installeres i /usr
, når du senere oppgraderer til en nyere
versjon av rust de gamle
bibliotekene i /usr/lib/rustlib
vil
forbli, med div hasher i navnene deres, men vil ikke være
brukbare og vil kaste bort plass. Redaktører anbefaler å plassere
filene i /opt
mappen. Spesielt hvis
du har grunn til å gjenoppbygge med en modifisert konfigurasjon
(f.eks. ved å bruke sendt LLVM etter å ha bygget med delt LLVM,
kanskje for å kompilere crates for arkitekturer som BLFS LLVM
bygget ikke støtter) det er mulig for installasjonen å etterlate
et ødelagt cargo
program. I en slik situasjon, fjern enten den eksisterende
installasjonen først, eller bruk et annet prefiks som f.eks
/opt/rustc-1.82.0-build2.
Hvis du foretrekker det, kan du selvfølgelig endre prefikset til
/usr
.
Det nåværende rustbuild
byggesystemet vil bruke alle prosessorer, selv om den ikke skalerer
godt og ofte faller tilbake til bare å bruke én kjerne mens du
venter på at et bibliotek skal kompileres. Imidlertid kan det stort
sett begrenses til et spesifisert antall prosessorer av en
kombinasjon av å legge til bryteren --jobs
<N>
(f.eks. '--jobs 4' for å begrense til 4
prosessorer) på hver påkalling av python3 x.py og ved hjelp av en miljøvariabel
CARGO_BUILD_JOBS=<N>
. For
øyeblikket er dette ikke effektivt når noen av rustc testene
kjøres.
Den nåværende versjonen av rusts num_cpus crate gjenkjenner nå at
cgroups kan brukes til å begrense hvilke prosessorer det er tillatt
å bruke. Så hvis din maskin mangler DRAM (vanligvis mindre enn 2 GB
DRAM per kjerne) som kan være et alternativ til å ta CPUer offline.
Les «Bruk Linux
Control Group for å begrense ressursbruken» for hvordan du
bruker en cgroup.
For øyeblikket Rust gir ingen
garantier for en stabil ABI.
Notat
Rustc bygger som standard for ALLE støttede arkitekturer, ved å
bruke en sendt kopi av LLVM. I BLFS er bygget bare for X86
arkitektur. Hvis du har tenkt å utvikle rust crates, kan det
hende at denne konstruksjonen ikke er bra nok til dine formål.
Byggetidene for denne versjonen når den gjentas på samme maskin
er ofte rimelig konsekvent, men som med alle kompilatorer som
bruker rustc det
kan være noen veldig langsomme avvikere.
Notat
Utviklingsversjoner av BLFS kan ikke bygge eller kjøre noen
pakker riktig hvis LFS eller avhengigheter har blitt oppdatert
siden den siste stabile versjonene av bøkene.
Pakkeinformasjon
-
Nedlasting (HTTP): https://static.rust-lang.org/dist/rustc-1.82.0-src.tar.xz
-
Nedlasting MD5 sum: 8d6a14f1c8d0ab03dffbc81f7a839aa7
-
Nedlastingsstørrelse: 210 MB
-
Estimert diskplass som kreves: 8.9 GB (298 MB installert);
legg til 6,4 GB hvis du kjører testene
-
Estimert byggetid: 6.7 SBU (inkludert nedlastingstid; legg
til 6,2 SBU for tester, begge med parallellisme=8)
Rust Avhengigheter
Påkrevd
CMake-3.31.0 og cURL-8.11.0
Notat
En Internett-tilkobling er nødvendig for å bygge denne pakken.
Anbefalt
libssh2-1.11.1, LLVM-19.1.0 (bygget med -D
LLVM_LINK_LLVM_DYLIB=ON slik at rust kan lenke til systemets LLVM i
stedet for å bygge den sendte versjonen), og SQLite-3.47.0
Notat
Hvis en anbefalt avhengighet ikke er installert, en sendt kopi i
Rustc kildetarballen blir bygd og brukt.
Valgfri
GDB-15.2
(brukes av testpakken hvis den er til stede), git-2.47.0 (kreves av
testpakken), cranelift,
jemalloc,
libgccjit (les parameterforklaringer i GCC-14.2.0), og libgit2
Redaktørens notater: https://wiki.linuxfromscratch.org/blfs/wiki/rust
Installasjon av Rust
For å installere i /opt
mappen,
fjerne evt eksisterende /opt/rustc
symbolkobling og opprett en ny mappe (dvs. med et annet navn hvis
du prøver en modifisert versjon av samme versjon). Som root
bruker:
mkdir -pv /opt/rustc-1.82.0 &&
ln -svfn rustc-1.82.0 /opt/rustc
Notat
Hvis flere versjoner av Rust er
installert i /opt
, endre til en
annen versjonen krever bare å endre /opt/rustc
symbolsk lenke og deretter kjøre
ldconfig.
Opprett en passende config.toml
fil
som vil konfigurere bygget.
cat << EOF > config.toml
# see config.toml.example for more possible options
# See the 8.4 book for an old example using shipped LLVM
# e.g. if not installing clang, or using a version before 13.0
# Tell x.py the editors have reviewed the content of this file
# and updated it to follow the major changes of the building system,
# so x.py will not warn us to do such a review.
change-id = 129295
[llvm]
# by default, rust will build for a myriad of architectures
targets = "X86"
# When using system llvm prefer shared libraries
link-shared = true
[build]
# omit docs to save time and space (default is to build them)
docs = false
# install extended tools: cargo, clippy, etc
extended = true
# Do not query new versions of dependencies online.
locked-deps = true
# Specify which extended tools (those from the default install).
tools = ["cargo", "clippy", "rustdoc", "rustfmt"]
# Use the source code shipped in the tarball for the dependencies.
# The combination of this and the "locked-deps" entry avoids downloading
# many crates from Internet, and makes the Rustc build more stable.
vendor = true
[install]
prefix = "/opt/rustc-1.82.0"
docdir = "share/doc/rustc-1.82.0"
[rust]
channel = "stable"
description = "for BLFS -wip"
# Enable the same optimizations as the official upstream build.
lto = "thin"
codegen-units = 1
[target.x86_64-unknown-linux-gnu]
# NB the output of llvm-config (i.e. help options) may be
# dumped to the screen when config.toml is parsed.
llvm-config = "/usr/bin/llvm-config"
[target.i686-unknown-linux-gnu]
# NB the output of llvm-config (i.e. help options) may be
# dumped to the screen when config.toml is parsed.
lvm-config = "/usr/bin/llvm-config"
EOF
Fjern nå noen tester som utløser en fullstendig gjenoppbygging av
Rust standarden bibliotek og kompilator, fjern en spesiell sak for
å støtte cargo
testpakken (som vi ikke kjører fordi den forventes å kjøre i et
Rustc git depot), men utløse en gjenoppbygging av cargo når python3 x.py install kjøres, og
hindre bygging av en komponent ubrukelig for BLFS:
sed '/MirOpt/d' -i src/bootstrap/src/core/builder.rs &&
sed 's/!path.ends_with("cargo")/true/' \
-i src/bootstrap/src/core/build_steps/tool.rs &&
sed 's/^.*build_wasm.*$/#[allow(unreachable_code)]&return false;/' \
-i src/bootstrap/src/lib.rs
Kompiler Rust ved å kjøre følgende
kommandoer:
[ ! -e /usr/include/libssh2.h ] || export LIBSSH2_SYS_USE_PKG_CONFIG=1
[ ! -e /usr/include/sqlite3.h ] || export LIBSQLITE3_SYS_USE_PKG_CONFIG=1
python3 x.py build
Notat
Testpakken vil generere noen meldinger i systemd journal for feller på ugyldige opkoder,
og for segmenteringsfeil. I seg selv er disse ingenting å bekymre
seg for, bare en måte for test å avslutte.
Å kjøre testene (igjen ved å bruke alle tilgjengelige CPUer)
utsted:
python3 x.py test --verbose --no-fail-fast | tee rustc-testlog
Fire tester i tests/run-make
mappen
er kjent for å mislykkes fordi de trenger mål som ikke er aktivert
i BLFS LLVM-19.1.0 konfigurasjonen (og heller ikke
llvm.targets
i config.toml
, i tilfelle bygging med den sendte
LLVM). En test som heter core::config::tests::download_ci_llvm
er kjent for
å mislykkes. Og en test som heter 121444.rs
er kjent for å mislykkes med LLVM 19.1
eller nyere fordi en krasj er fikset med den nye LLVM men Rustc
testselen har ikke konseptet uventede pasninger.
Som med alle store testserier, kan noen tester mislykkes på noen
maskiner - hvis antallet ekstra feil er lavt, sjekk loggen for
"failures:" og se gjennom linjene over det, spesielt 'stderr:'
linjer. Enhver omtale av SIGSEGV eller signal 11 i en sviktende
test er en grunn til bekymring.
Hvis du får noen andre
sviktende tester som rapporterer et utgavenummer, så bør du søke
etter det problemet. For eksempel når rustc >= 1.41.1 ble bygget
med en versjon av sysllvm før 10.0 testen for problem 69225
mislyktes https://github.com/rust-lang/rust/issues/69225
og det burde være betraktet som en kritisk feil (de ga ut 1.41.1 på
grunn av det). De fleste andre feil vil ikke være kritiske.
Derfor bør du bestemme antall feil. Antall tester som har bestått
og ikke bestått finner du ved å kjøre:
grep '^test result:' rustc-testlog |
awk '{sum1 += $4; sum2 += $6} END { print sum1 " passed; " sum2 " failed" }'
De andre tilgjengelige feltene er $8 for de som ble ignorert (dvs.
hoppet over), $10 for "målt" og $12 for "filtrert ut", men begge de
to siste er sannsynligvis null.
Nå, som root
bruker, installer
pakken:
Notat
Hvis sudo eller
su er påberopt for
å bytte til root
bruker, sikre at
LIBSSH2_SYS_USE_PKG_CONFIG
og
LIBSQLITE3_SYS_USE_PKG_CONFIG
er
riktig sendt ellers kan følgende kommando gjenoppbygge
cargo med sendte
kopier av libssh2 og sqlite. For sudo, bruk --preserve-env=LIB{SSH2,SQLITE3}_SYS_USE_PKG_CONFIG
alternativet. For su, ikke bruk -
eller --login
alternativene.
python3 x.py install rustc std &&
python3 x.py install --stage=1 cargo clippy rustfmt
Fortsatt som root
bruker, fiks
installasjonen av dokumentasjonen, symbolkoble en Zsh fullføringsfilen til riktig plassering, og
flytt en Bash fullføringsfil til
lokasjonen anbefalt av Bash
ferdigstillelse vedlikeholdere:
rm -fv /opt/rustc-1.82.0/share/doc/rustc-1.82.0/*.old &&
install -vm644 README.md \
/opt/rustc-1.82.0/share/doc/rustc-1.82.0 &&
install -vdm755 /usr/share/zsh/site-functions &&
ln -sfv /opt/rustc/share/zsh/site-functions/_cargo \
/usr/share/zsh/site-functions
mv -v /etc/bash_completion.d/cargo /usr/share/bash-completion/completions
Til slutt, deaktiver eksporterte miljøvariabler:
unset LIB{SSH2,SQLITE3}_SYS_USE_PKG_CONFIG
Parameterforklaringer
ln -svfn rustc-1.82.0
/opt/rustc: hvis dette ikke er den første bruken av
/opt/rustc
symbolkobling, overskriv
den ved å tvinge, og bruk '-n'-flagget for å unngå å få forvirrende
resultater fra f.eks. ls
-l.
targets = "X86"
: dette unngår å bygge
alt tilgjengelig linux krysskompilatorer (AArch64, MIPS, PowerPC,
SystemZ, etc). Dessverre, rust insisterer på å installere
kildefiler for disse nedenfor /opt/rustc/lib/src
.
extended = true
: dette installerer
flere verktøy (spesifisert av tools
oppføring) ved siden av rustc.
tools = ["cargo", "clippy", "rustdoc",
"rustfmt"]
: bygg bare verktøyene fra 'standard' profilen i
binær kommando rustup
som anbefales for de fleste brukere. De andre verktøyene er neppe
nyttige med mindre du bruker (gammel) kode analysatorer eller
redigering av standardbiblioteket.
channel = "stable"
: dette sikrer at
kun stabile funksjoner kan brukes, standard i config.toml
er å bruke utviklingsfunksjoner, som
ikke passer for en utgitt versjon.
[target.x86_64-unknown-linux-gnu]
:
syntaksen til config.toml
krever en
llvm-config
oppføring for hvert mål
som system-llvm skal brukes for. Endre målet til [target.i686-unknown-linux-gnu]
hvis du bygger på
32-bit x86. Hele denne delen kan utelates hvis du ønsker å bygge
mot den sendte llvm, eller ikke har clang, men den resulterende
bygget vil være større og ta lengre tid.
export
LIBSSH2_SYS_USE_PKG_CONFIG=1: tillat cargo å koble til systemets
libssh2.
export
LIBSQLITE3_SYS_USE_PKG_CONFIG=1: Tillat
cargo for å linke til
systemets sqlite.
--verbose
: denne bryteren
kan noen ganger gi mer informasjon om en test som mislykkes.
--no-fail-fast
: denne
bryteren sikrer at testpakken ikke vil stoppe ved den første
feilen.
--stage=1
: denne bryteren
løser et problem som forårsaker at noen Rustc komponenter
gjenoppbygges unødvendig python3 x.py
install.