Rustc-1.85.0

Introdução ao Rust

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

Esse pacote é atualizado em um ciclo de lançamento de seis semanas. Por ser um pacote tão grande e lento para construir, é, no momento, exigido somente por uns poucos pacotes neste livro, e particularmente porque versões mais novas tendem a quebrar pacotes mais antigos do Mozilla, os(as) editores(as) do BLFS consideram que ele deveria ser atualizado somente quando necessário (ou para corrigir problemas ou para permitir que uma nova versão de um pacote construa).

Tal como acontece com muitas outras linguagens de programação, o "Rustc" (o compilador "Rust") precisa de um binário a partir do qual inicializar. Ele baixará um binário stage0 no início da construção, de forma que você não consegue compilá-lo sem uma conexão com a Internet.

[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 "hashes" 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 motivos para reconstruir com uma configuração modificada (por exemplo, usando o "LLVM" enviado após construir com "LLVM" compartilhado, talvez para compilar caixas para arquiteturas que a construção "LLVM" do BLFS não suporta), [então] é possível que a instalação deixe um aplicativo quebrado "cargo". Em tal situação, remova a instalação existente primeiro ou use um prefixo diferente, como "/opt/rustc-1.85.0-build2".

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

O sistema de construção rustbuild atual usará todos os processadores, embora não escale bem e frequentemente recorra a usar apenas 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 usando uma variável de ambiente CARGO_BUILD_JOBS=<N>. No momento, isso não é eficaz quando alguns dos testes rustc são executados.

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

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

[Nota]

Nota

O padrão do "Rustc" é o de 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ê pretende desenvolver caixas "Rust", [então] essa construção possivelmente não seja boa o suficiente para os teus propósitos.

Os tempos de construção dessa versão, quando repetidos na mesma máquina, costumam ser razoavelmente consistentes, mas como acontece com todas as compilações usando "rustc", pode existir alguns valores discrepantes muito lentos.

Esse pacote é conhecido por construir e funcionar corretamente usando uma plataforma LFS 12.3.

Informação do Pacote

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

  • Transferência (FTP):

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

  • Tamanho da transferência: 261 MB

  • Espaço em disco estimado exigido: 9,4 GB (252 MB instalado); adicionar 7,4 GB se executar os testes

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

Dependências do Rust

Exigidas

CMake-3.31.5 e cURL-8.12.1

[Nota]

Nota

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

Recomendadas

[Nota]

Nota

Se uma dependência recomendada não estiver instalada, [então] uma cópia enviada no "tarball" do fonte do "Rustc" será construída e usada.

Opcionais

GDB-16.2 (usado pela suíte de teste se estiver presente), git-2.48.1 (exigido pela suíte de teste), cranelift, jemalloc, libgccjit (leia-se Explicação do Comando em GCC-14.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.85.0     &&
ln -svfn rustc-1.85.0 /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 "config.toml" adequado que configurará a construção.

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

[llvm]
# When using system llvm prefer shared libraries
link-shared = true

# Do not download pre-built LLVM, instead either use the system
# LLVM or build LLVM from the shipped source.
download-ci-llvm = false

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

[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"]

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

[rust]
channel = "stable"
description = "for BLFS 12.3"

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

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

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

Agora remova alguns testes que deflagram uma reconstrução completa da biblioteca padrão e do compilador Rust:

sed '/MirOpt/d' -i src/bootstrap/src/core/builder/mod.rs

Compile "Rust" executando os seguintes comandos:

[ ! -e /usr/include/libssh2.h ] || export LIBSSH2_SYS_USE_PKG_CONFIG=1
[ ! -e /usr/include/sqlite3.h ] || 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 em códigos inválidos de operação e para falhas de segmentação. Por si só, isso não é motivo de preocupação, apenas uma maneira do teste ser terminado.

Para executar os testes (novamente usando todas as "CPUs" disponíveis), emita:

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

Seis testes na suíte de teste de instruções de autoaprimoramento são conhecidos por falharem porque eles esperam executar no repositório Git da Rust.

Tal como acontece 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 ao SIGSEGV ou ao sinal onze (11) em um teste falho é motivo de preocupação.

Se você receber 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 de libssh2 e 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 rustc std &&
./x.py install --stage=1 cargo clippy rustfmt

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.85.0/share/doc/rustc-1.85.0/*.old   &&
install -vm644 README.md                                \
               /opt/rustc-1.85.0/share/doc/rustc-1.85.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

Finalmente, desconfigure as variáveis de ambiente exportadas:

unset LIB{SSH2,SQLITE3}_SYS_USE_PKG_CONFIG

Explicações do Comando

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

targets = "X86": isso evita construir todos os compiladores cruzados disponíveis do Linux (AArch64, MIPS, PowerPC, SystemZ, etc). Infelizmente, o Rust insiste em instalar os arquivos fonte para esses abaixo de /opt/rustc/lib/src.

extended = true: isso instala várias ferramentas (especificadas pela entrada tools) juntamente com o rustc.

tools = ["cargo", "clippy", "rustdoc", "rustfmt"]: construa somente as ferramentas a partir do perfil 'padrão' no comando binário rustup que é recomendado 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 possam ser usados. O padrão no config.toml é o de usar recursos de desenvolvimento, o que não é apropriado para uma versão lançada.

[target.x86_64-unknown-linux-gnu]: a sintaxe do config.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. Essa seção inteira pode ser omitida se você desejar construir contra o LLVM enviado ou não tiver clang, mas a construção resultante será maior e demorará mais.

export LIBSSH2_SYS_USE_PKG_CONFIG=1: Permite que o "cargo" se vincule à "libssh2" do sistema.

export LIBSQLITE3_SYS_USE_PKG_CONFIG=1: Permite cargo lincar ao sqlite do sistema.

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

--stage=1: essa chave contorna um problema que faz com que alguns componentes do Rustc sejam reconstruídos desnecessariamente ao se executar ./x.py install.

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-<resumo_de_16_bytes>.so, libstd-<resumo_de_16_bytes>.so e libtest-<resumo_de_16_bytes>.so
Diretórios Instalados: ~/.cargo, /opt/rustc, link simbólico para /opt/rustc-1.85.0

Descrições Curtas

cargo-clippy

fornece verificações "lint" para um pacote "cargo"

cargo-fmt

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

cargo

é o Gerenciador de Pacote para "Rust"

clippy-driver

fornece verificações "lint" para "Rust"

rust-gdb

é um "script" envólucro para "gdb", extraindo módulos de impressão bonita do "Python" instalados em "/opt/rustc-1.85.0/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 "script" envólucro para "LLDB" (o depurador "LLVM") que extrai 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"