Introdução ao Rust
        
        
          A linguagem de programação Rust
          foi projetada para ser uma linguagem segura, simultânea e prática.
        
        
          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
          
          
            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.89.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
          
          
            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.4.
        
        
          Informação do Pacote
        
        
          
            - 
              
                Transferência (HTTP): https://static.rust-lang.org/dist/rustc-1.89.0-src.tar.xz
              
             
            - 
              
                Transferência (FTP): 
              
             
            - 
              
                Soma de verificação MD5 da transferência:
                982f087479302e6d91432efc81852b00
              
             
            - 
              
                Tamanho da transferência: 256 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-4.1.0 e cURL-8.15.0
        
        
          
          
            Nota
          
          
            Uma conexão com a Internet é necessária para construir esse
            pacote. A loja de certificados do sistema pode necessitar ser
            configurada com make-ca-1.16.1 antes de se construir
            esse pacote.
          
         
        
          Recomendadas
        
        
          libssh2-1.11.1, LLVM-20.1.8 (construído com -D
          LLVM_LINK_LLVM_DYLIB=ON, de forma que Rust consiga vincular ao LLVM
          do sistema em vez de construir a versão fornecida dele) e SQLite-3.50.4
        
        
          
          
            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.3
          (usado pela suíte de teste se estiver presente), git-2.50.1 (exigido pela
          suíte de teste), cranelift,
          jemalloc,
          libgccjit (leia-se Explicação 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.89.0     &&
ln -svfn rustc-1.89.0 /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 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 = 142379
[llvm]
# When using system llvm prefer 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 12.4"
# Omit docs to save time and space (default is to build them).
docs = false
# 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.89.0"
docdir = "share/doc/rustc-1.89.0"
[rust]
channel = "stable"
# Enable the same optimizations as the official upstream build.
lto = "thin"
codegen-units = 1
# Don't build lld which does not belong to this package and seems not
# so useful for BLFS.  Even if it turns out to be really useful we'd build
# it as a part of the LLVM package instead.
lld = false
# 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:
        
        
[ ! -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
          
          
            A suíte de teste gerará algumas mensagens no registro do sistema 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
        
          Oito testes na suíte de teste de interface de usuário(a) são
          conhecidos por falharem com description configurado na seção build do arquivo bootstrap.toml. Quatro testes na suíte de teste
          das instruções de autoaprimoramento são conhecidos por falharem
          porque eles esperam executar no repositório Git do Rust. O teste
          chamado tests/run-make/musl-default-linking é conhecido
          por falhar porque nós não habilitamos o alvo AArch64 no LLVM-20.1.8. O
          teste chamado tests/run-make/linker-warning é conhecido por
          falhar devido a algum motivo ainda desconhecido.
        
        
          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.
        
        
          
          
            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.
          
          
            Nós ainda estamos investigando a causa raiz desse problema, mas,
            por enquanto, substituímos --strip-unneeded por --strip-debug tanto no livro do LFS
            quanto na “Despojando Mais Uma Vez” para
            contornar o problema. Se você encontrar esse problema, reconstrua
            a Glibc e substitua o arquivo /usr/lib/libc.a pela libc.a não despojada proveniente da nova
            construçã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
          
          
            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
        
          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.89.0/share/doc/rustc-1.89.0/*.old   &&
install -vm644 README.md                                \
               /opt/rustc-1.89.0/share/doc/rustc-1.89.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.89.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.
        
        
          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
          bootstrap.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 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 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.