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
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
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
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
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
libssh2-1.11.1 e LLVM-21.1.8 (construído com -D
LLVM_LINK_LLVM_DYLIB=ON de modo que rust consiga lincar-se à versão
instalada do sistema do LLVM em vez de construir versão dele
enviada)
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
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
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
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
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.