Rustc-1.93.1

Introdução ao Rust

A linguagem de programação Rust foi projetada para ser uma linguagem segura, simultânea e prática.

Como com muitas outras linguagens de programação, rustc (o compilador da rust) precisa de um binário a partir do qual autoaperfeiçoar-se. Ele baixará um binário de estágio 0 no início da construção, de modo que você precisa ter uma conexão com a Internet para construir esse pacote.

[Nota]

Nota

Embora o BLFS normalmente instale em /usr, quando você atualizar posteriormente para uma versão mais recente do rust, as bibliotecas antigas em /usr/lib/rustlib permanecerão, com vários resumos nos nomes delas, mas não serão usáveis e desperdiçarão espaço. Os(As) editores(as) recomendam colocar os arquivos no diretório /opt. Em particular, se você tiver que reconstruir esse pacote com uma configuração modificada (por exemplo, usando o LLVM enviado depois de construir com LLVM compartilhado, talvez para compilar caixas para arquiteturas as quais a construção do LLVM do BLFS não suporta), é possível para a instalação deixar um programa quebrado cargo. Se isso ocorrer, você deveria ou remover a instalação existente primeiro ou usar um prefixo diferente, como /opt/rustc-1.93.1-build2.

Se preferir, você pode, certamente, mudar o prefixo para "/usr".

O atual sistema de construção do rustbuild usará todos os processadores, embora não escale bem e frequentemente recorra a usar somente um núcleo enquanto espera que uma biblioteca compile. No entanto, ele pode ser limitado principalmente a um número especificado de processadores por uma combinação da adição da chave --jobs <N> (por exemplo, '--jobs 4' para limitar a 4 processadores) em cada invocação de ./x.py e de usar-se a variável de ambiente CARGO_BUILD_JOBS=<N>. No momento, isso não é eficaz quando alguns dos testes do rustc forem executados.

A versão atual da caixa num_cpus da rust agora reconhece que cgroups pode ser usado para restringir quais processadores ele está autorizado a usar. Se tua máquina carecer de DRAM (normalmente, menos de 2 GB de DRAM por núcleo), isso pode ser uma alternativa para colocar CPUs offline. Leia-se “Usar Grupo de Controle do Linux para Limitar o Uso de Recursos” para informações acerca de como usar um cgroup.

No momento, Rust não oferece nenhuma garantia de uma ABI estável.

[Nota]

Nota

Rustc padroniza para construir para TODAS as arquiteturas suportadas, usando uma cópia enviada do LLVM. No BLFS, a construção é somente para a arquitetura X86. Se você vai desenvolver caixas rust, essa construção possivelmente não seja suficiente para os teus propósitos.

Os tempos de construção dessa versão, quando repetidos na mesma máquina, frequentemente são razoavelmente consistentes, mas como com todas as compilações usando-se rustc, podem existir alguns valores discrepantes muito lentos.

[Nota]

Nota

Esse pacote é conhecido por construir e funcionar adequadamente usando-se uma plataforma LFS 13.0.

Informação do Pacote

  • Transferência (HTTP): https://static.rust-lang.org/dist/rustc-1.93.1-src.tar.xz

  • Transferência (FTP):

  • Soma de verificação MD5 da transferência: 65de3c1b0a9304b16ff27433a0dafb95

  • Tamanho da transferência: 258 MB

  • Espaço em disco estimado exigido: 10 GB (324 MB instalado); adicionar 11 GB se executar os testes

  • Tempo de construção estimado: 10 UPC (incluindo tempo de transferência; adicionar 15 UPC para testes, ambos usando paralelismo=8)

Dependências do Rust

Exigidas

CMake-4.2.3 e cURL-8.18.0

[Nota]

Nota

Uma conexão com a Internet é necessária para se construir esse pacote. A loja de certificados do sistema possivelmente precise estar configurada com make-ca-1.16.1 antes de se construir esse pacote.

Recomendadas

[Nota]

Nota

Se uma dependência recomendada não estiver instalada, você precisará modificar as instruções para construir e usar uma cópia enviada no tarball do fonte do Rustc. Veja-se a seção Explicações dos Comandos para mais detalhes.

Opcionais

GDB-17.1 (usado pela suíte de teste se estiver presente), git-2.53.0 (exigido pela suíte de teste), cranelift, jemalloc, libgccjit (leiam-se as Explicações do Comando em GCC-15.2.0) e libgit2

Observações de Editor(a): https://wiki.linuxfromscratch.org/blfs/wiki/rust

Instalação do Rust

Para instalar no diretório "/opt", remova qualquer link simbólico "/opt/rustc" existente e crie um novo diretório (ou seja, com um nome diferente se tentar uma construção modificada da mesma versão). Como o(a) usuário(a) "root":

mkdir -pv /opt/rustc-1.93.1     &&
ln -svfn rustc-1.93.1 /opt/rustc
[Nota]

Nota

Se múltiplas versões do "Rust" estiverem instaladas em "/opt", [então] a mudança para outra versão exige somente mudar o link simbólico "/opt/rustc" e então executar "ldconfig".

Crie um arquivo bootstrap.toml adequado que configurará a construção.

cat << EOF > bootstrap.toml
# See bootstrap.toml.example for more possible options,
# and see src/bootstrap/defaults/bootstrap.dist.toml for a few options
# automatically set when building from a release tarball
# (unfortunately, we have to override many of them).

# Tell x.py that 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 users to review that information.
change-id = 148795

[llvm]
# When using the system installed copy of LLVM, prefer the shared libraries
link-shared = true

# If building the shipped LLVM source, only enable the x86 target
# instead of all the targets supported by LLVM.
targets = "X86"

[build]
description = "for BLFS 13.0"

# Omit the documentation to save time and space (the default is to build them).
docs = false

# Do not look for new versions of the dependencies online.
locked-deps = true

# Only install these extended tools. Cargo, clippy, rustdoc, and rustfmt
# are installed by a default rustup installation, and rust-src is needed
# to build the Rust code in Linux kernel (in case you need such a kernel
# feature).
tools = ["cargo", "clippy", "rustdoc", "rustfmt", "src"]

[install]
prefix = "/opt/rustc-1.93.1"
docdir = "share/doc/rustc-1.93.1"

[rust]
channel = "stable"

# Enable the same optimizations as the official upstream build.
lto = "thin"
codegen-units = 1

# Don't build llvm-bitcode-linker which is only useful for the NVPTX
# backend that we don't enable.
llvm-bitcode-linker = false

[target.x86_64-unknown-linux-gnu]
llvm-config = "/usr/bin/llvm-config"

[target.i686-unknown-linux-gnu]
llvm-config = "/usr/bin/llvm-config"
EOF

Compile "Rust" executando os seguintes comandos:

export LIBSSH2_SYS_USE_PKG_CONFIG=1
export LIBSQLITE3_SYS_USE_PKG_CONFIG=1
./x.py build
[Nota]

Nota

A suíte de teste gerará algumas mensagens no diário do systemd para interceptações sobre códigos inválidos de operação e para falhas de segmentação. Por si só, elas não são motivo de preocupação, e são apenas uma maneira para um teste ser terminado.

Para executar os testes, emita:

./x.py test --verbose --no-fail-fast | tee rustc-testlog

O teste nominado tests/run-make/rustdoc-target-modifiers é conhecido por falhar porque nós não habilitamos o alvo AArch64 no LLVM-21.1.8. Os testes nominados missing_span_in_backtrace.rs e trimmed_multiline_suggestion.rs possivelmente falhem porque eles dependem da largura do terminal.

Como com todas as grandes suítes de teste, alguns testes podem falhar em algumas máquinas - se o número de falhas adicionais for baixo, verifique se existem 'failures:' no registro e revise as linhas acima, especialmente as linhas 'stderr:'. Qualquer menção a um SIGSEGV ou ao sinal onze (11) em um teste falho é motivo de preocupação.

[Nota]

Nota

Se você tiver despojado /usr/lib/libc.a com strip --strip-unneeded, todos os programas Rust lincados estaticamente travarão com o SIGSEGV na inicialização, fazendo com que vários testes (por exemplo, tests/ui/process/nofile-limit.rs) falhem com o SIGSEGV.

Isso é causado por um defeito da Glibc que afeta o Glibc-2.42 e vários lançamentos anteriores, de modo que, por enquanto, nós substituímos --strip-unneeded por --strip-debug tanto no livro do LFS quanto na “Despojando Mais Uma Vez” para contornar o problema. Se você se deparar com esse problema, reconstrua a Glibc e substitua o arquivo /usr/lib/libc.a pelo libc.a não despojado originário da nova construção.

Se você obtiver algum outro teste falho que informe um número de problema, então você deveria procurar por esse problema. Por exemplo, quando rustc >= 1.41.1 era construído com uma versão do LLVM do sistema anterior à 10.0, o teste para o problema 69225 falhava https://github.com/rust-lang/rust/issues/69225 e isso deveria ser considerado como uma falha crítica (eles(as) lançaram 1.41.1 por causa disso). A maioria das outras falhas não será crítica.

Portanto, você deveria determinar o número de falhas. O número de testes que passaram e falharam pode ser encontrado executando-se:

grep '^test result:' rustc-testlog |
 awk '{sum1 += $4; sum2 += $6} END { print sum1 " passed; " sum2 " failed" }'

Os outros campos disponíveis são "$8" para aqueles que foram ignorados (ou seja, pulados), "$10" para 'medido' e "$12" para 'filtrado', mas ambos os dois últimos provavelmente sejam zero.

Agora, como o(a) usuário(a) "root", instale o pacote:

[Nota]

Nota

Se sudo ou su for invocado para comutar para o(a) usuário(a) root, certifique-se de que LIBSSH2_SYS_USE_PKG_CONFIG e LIBSQLITE3_SYS_USE_PKG_CONFIG sejam passados corretamente ou o comando a seguir pode reconstruir cargo com cópias enviadas da libssh2 e do sqlite. Para sudo, use a opção --preserve-env=LIB{SSH2,SQLITE3}_SYS_USE_PKG_CONFIG. Para su, não use as opções - ou --login.

./x.py install

Ainda como o(a) usuário(a) root, corrija a instalação da documentação, linque simbolicamente um arquivo de completação do Zsh para o local correto, e mova um arquivo de completação do Bash para o local recomendado pelos(as) mantenedores(as) da completação do Bash:

rm -fv /opt/rustc-1.93.1/share/doc/rustc-1.93.1/*.old   &&
install -vm644 README.md                                \
               /opt/rustc-1.93.1/share/doc/rustc-1.93.1 &&

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

Finalmente, desconfigure as variáveis de ambiente exportadas:

unset LIB{SSH2,SQLITE3}_SYS_USE_PKG_CONFIG

Explicações do Comando

ln -svfn rustc-1.93.1 /opt/rustc: se esse não for o primeiro uso do link simbólico /opt/rustc, sobrescreva-o por força e use o sinalizador '-n' para evitar obter resultados confusos oriundos, por exemplo, de ls -l.

tools = ["cargo", "clippy", "rustdoc", "rustfmt"]: construa somente as ferramentas originárias do perfil 'padrão', a partir do comando binário rustup, as quais são recomendadas para a maioria dos(as) usuários(as). As outras ferramentas são improváveis que sejam úteis, a menos que se use analisadores (antigos) de código ou se edite a biblioteca padrão.

channel = "stable": isso garante que somente recursos estáveis sejam usados. O padrão no bootstrap.toml é o de usar recursos de desenvolvimento, os quais não são apropriados para uma versão lançada da rust.

[target.x86_64-unknown-linux-gnu]: a sintaxe do bootstrap.toml exige uma entrada llvm-config para cada alvo para o qual o LLVM do sistema esteja para ser usado. Mude o alvo para [target.i686-unknown-linux-gnu] se você estiver construindo em x86 de 32 bits. Esta seção inteira deveria ser omitida se você desejar construir contra o LLVM enviado, porém a construção resultante será maior e demorará mais.

export LIBSSH2_SYS_USE_PKG_CONFIG=1: Permite cargo se lincar à cópia instalada do sistema da libssh2. Omita esse comando se você não tiver instalado libssh2-1.11.1.

export LIBSQLITE3_SYS_USE_PKG_CONFIG=1: Permite cargo se lincar à cópia instalada do sistema do sqlite.

--verbose: essa chave às vezes pode fornecer mais informações relativas a um teste que falhe.

--no-fail-fast: essa chave garante que a suíte de teste não parará no primeiro erro.

Configurando o Rust

Informação de Configuração

Se você instalou "rustc" em "/opt", [então] você precisa atualizar os seguintes arquivos de configuração, de forma que "rustc" seja encontrado corretamente por outros pacotes e processos do sistema.

Como o(a) usuário(a) "root", crie o arquivo "/etc/profile.d/rustc.sh":

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

Imediatamente depois da instalação, atualize o PATH atual para teu shell atual como um(a) usuário(a) normal:

source /etc/profile.d/rustc.sh

Conteúdo

Aplicativos Instalados: cargo-clippy, cargo-fmt, cargo, clippy-driver, rust-gdb, rust-gdbgui, rust-lldb, rustc, rustdoc e rustfmt
Bibliotecas Instaladas: librustc_driver-<16-byte-hash>.so e libstd-<16-byte-hash>.so
Diretórios Instalados: ~/.cargo, /opt/rustc, link simbólico para /opt/rustc-1.93.1

Descrições Curtas

cargo-clippy

realiza verificações lint sobre um pacote da cargo

cargo-fmt

formata todos os arquivos "bin" e "lib" da caixa atual usando "Rustfmt"

cargo

é o Gerenciador de Pacote para "Rust"

clippy-driver

realiza verificações lint sobre código da Rust

rust-gdb

é um conjunto de comandos sequenciados envolucradores para gdb, os quais extraem os módulos de impressão bonita do Python instalados em /opt/rustc-1.93.1/lib/rustlib/etc

rust-gdbgui

é um "script" envólucro para uma estrutura gráfica de interação direta com o(a) usuário(a) para "gdb" que executa em um navegador

rust-lldb

é um conjunto de comandos sequenciados envolucradores para LLDB (o depurador LLVM) os quais extraem os módulos de impressão bonita do Python

rustc

é o compilador "rust"

rustdoc

gera documentação a partir do código fonte "rust"

rustfmt

formata código "rust"

libstd-<resumo_de_16_bytes>.so

é a biblioteca padrão do "Rust", a fundação do logiciário portável "Rust"