require 'package' class Rust < Package description 'Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.' homepage 'https://www.rust-lang.org/' version '1.84.1' license 'Apache-2.0 and MIT' compatibility 'all' source_url 'https://github.com/rust-lang/rustup.git' git_hashtag '1.27.1' binary_compression 'tar.zst' binary_sha256({ aarch64: '99e5404d8c24e1ccdf02695f4a4f3c676ec649592adf112f7e8d5ab528b25cd8', armv7l: '99e5404d8c24e1ccdf02695f4a4f3c676ec649592adf112f7e8d5ab528b25cd8', i686: 'b0631ca573a28f1c0c1368d6987574242d1e36a9585a92f5c05489020126f06c', x86_64: 'e7a30ea7fb1d3567ac86d3fe23fa4581b1da4b48139e8703774d654c6604917e' }) depends_on 'gcc_lib' # R depends_on 'glibc' # R depends_on 'zlib' # R no_strip no_shrink print_source_bashrc def self.install ENV['RUSTUP_PERMIT_COPY_RENAME'] = 'unstable' ENV['RUSTUP_INIT_SKIP_PATH_CHECK'] = 'yes' ENV['RUST_BACKTRACE'] = 'full' ENV['CARGO_HOME'] = "#{CREW_DEST_PREFIX}/share/cargo" ENV['RUSTUP_HOME'] = "#{CREW_DEST_PREFIX}/share/rustup" default_host = ARCH == 'aarch64' || ARCH == 'armv7l' ? 'armv7-unknown-linux-gnueabihf' : "#{ARCH}-unknown-linux-gnu" system "sed -i 's,$(mktemp -d 2>/dev/null || ensure mktemp -d -t rustup),#{CREW_PREFIX}/tmp,' rustup-init.sh" FileUtils.mkdir_p(CREW_DEST_HOME) FileUtils.mkdir_p("#{CREW_DEST_PREFIX}/bin") FileUtils.mkdir_p("#{CREW_DEST_PREFIX}/share/cargo") FileUtils.mkdir_p("#{CREW_DEST_PREFIX}/share/rustup") system "RUSTFLAGS='-Clto=thin' bash ./rustup-init.sh -y --no-modify-path --default-host #{default_host} --default-toolchain #{version} --profile minimal" FileUtils.mkdir_p("#{CREW_DEST_PREFIX}/share/bash-completion/completions/") FileUtils.touch "#{CREW_DEST_PREFIX}/share/bash-completion/completions/rustup" FileUtils.mv("#{CREW_DEST_PREFIX}/share/rustup/toolchains/#{version}-#{default_host}/share/man/", "#{CREW_DEST_PREFIX}/share/") FileUtils.rm_rf("#{CREW_DEST_PREFIX}/share/rustup/toolchains/#{version}-#{default_host}/share/doc/") FileUtils.ln_sf("#{CREW_PREFIX}/share/cargo", "#{CREW_DEST_HOME}/.cargo") FileUtils.ln_sf("#{CREW_PREFIX}/share/rustup", "#{CREW_DEST_HOME}/.rustup") FileUtils.mkdir_p "#{CREW_DEST_PREFIX}/etc/env.d/" system "sed -i 's,#{CREW_DEST_PREFIX}/share/cargo,#{CREW_PREFIX}/share/cargo,g' #{CREW_DEST_PREFIX}/share/cargo/env" @rustconfigenv = <<~RUSTCONFIGEOF # Rustup and cargo configuration export CARGO_HOME=#{CREW_PREFIX}/share/cargo export RUSTUP_HOME=#{CREW_PREFIX}/share/rustup source #{CREW_PREFIX}/share/cargo/env RUSTCONFIGEOF File.write("#{CREW_DEST_PREFIX}/etc/env.d/rust", @rustconfigenv) FileUtils.mkdir_p "#{CREW_DEST_PREFIX}/etc/bash.d/" @rustcompletionenv = <<~RUSTCOMPLETIONEOF # Rustup and cargo bash completion source #{CREW_PREFIX}/share/bash-completion/completions/rustup RUSTCOMPLETIONEOF File.write("#{CREW_DEST_PREFIX}/etc/bash.d/rust", @rustcompletionenv) system "#{CREW_DEST_PREFIX}/share/cargo/bin/rustup completions bash > #{CREW_DEST_PREFIX}/share/bash-completion/completions/rustup" Dir.chdir "#{CREW_DEST_PREFIX}/share/cargo/bin" do Dir.children('.').delete_if { |f| f == 'cargo' }.each do |filename| FileUtils.ln_sf 'cargo', filename end end Dir.chdir "#{CREW_DEST_PREFIX}/bin" do Dir.each_child('../share/cargo/bin') do |f| FileUtils.ln_sf "../share/cargo/bin/#{f}", f end end end def self.postinstall system 'rustup default stable' end def self.postremove Package.agree_to_remove("#{HOME}/.rustup") Package.agree_to_remove("#{CREW_PREFIX}/share/rustup") Package.agree_to_remove("#{HOME}/.cargo") Package.agree_to_remove("#{CREW_PREFIX}/share/cargo") end end