Rustc-1.81.0

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]

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.81.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]

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]

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.81.0-src.tar.xz

  • Nedlasting MD5 sum: 4f202568150660f369de3afbfb410970

  • Nedlastingsstørrelse: 207 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.30.4 og cURL-8.10.1

[Notat]

Notat

En Internett-tilkobling er nødvendig for å bygge denne pakken.

Anbefalt

[Notat]

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.46.2 (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.81.0      &&
ln -svfn rustc-1.81.0 /opt/rustc
[Notat]

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 = 127866

[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.81.0"
docdir = "share/doc/rustc-1.81.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

Deaktiver en eksperimentell funksjon som ikke klarer å bygge med LLVM 19.1 eller nyere, og fjern testene for det:

sed '/CondBitmap/,/^}/s/LLVM_VERSION.*/& \&\& LLVM_VERSION_LT(19, 0)/' \
        -i compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp &&

rm -v tests/coverage/mcdc/{cond*,if,inline*,nest*,non_*}.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]

Notat

Testpakken vil generere noen meldinger i system log 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]

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.81.0/share/doc/rustc-1.81.0/*.old   &&
install -vm644 README.md                                \
               /opt/rustc-1.81.0/share/doc/rustc-1.81.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.81.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.

Konfigurere Rust

Konfigurasjonsinformasjon

Hvis du har installert rustc i /opt, må du oppdatere følgende konfigurasjonsfiler slik at rustc er riktig funnet av andre pakker og systemprosesser.

Som root bruker, opprett /etc/profile.d/rustc.sh filen:

cat > /etc/profile.d/rustc.sh << "EOF"
# Begin /etc/profile.d/rustc.sh

pathprepend /opt/rustc/bin           PATH

# End /etc/profile.d/rustc.sh
EOF

Oppdater gjeldende PATH umiddelbart etter installasjonen for ditt nåværende skall som en vanlig bruker:

source /etc/profile.d/rustc.sh

Innhold

Installerte Programmer: cargo-clippy, cargo-fmt, cargo, clippy-driver, rust-gdb, rust-gdbgui, rust-lldb, rustc, rustdoc, og rustfmt
Installerte Biblioteker: librustc-driver-<16-byte-hash>.so, libstd-<16-byte-hash>.so, og libtest-<16-byte-hash>.so
Installerte Mapper: ~/.cargo, /opt/rustc, symbolsk lenke til /opt/rustc-1.81.0

Korte Beskrivelser

cargo-clippy

gir lint sjekker for en cargo pakke

cargo-fmt

formaterer alle bin og lib filer i gjeldende crate ved hjelp av rustfmt

cargo

er Pakkebehandler for Rust

clippy-driver

gir lint sjekker for rust

rust-gdb

er et innpakningsskript for gdb, som trekker inn Python pretty-printing moduler installert i /opt/rustc-1.81.0/lib/rustlib/etc

rust-gdbgui

er et innpakningsskript for et grafisk grensesnitt til gdb som kjører i en nettleser

rust-lldb

er et innpakningsskript for LLDB (LLVM-feilsøkeren) rekke inn Python pretty-printing modulene

rustc

er rust kompilatoren

rustdoc

genererer dokumentasjon fra rust kildekode

rustfmt

formaterer rust kode

libstd-<16-byte-hash>.so

er Rust Standard Bibliotek, grunnlaget for flyttbar Rust programvare