summaryrefslogtreecommitdiff
path: root/build-support/extra/rust/PKGBUILD
blob: b94c4e14fc8305acfd7b0b518e45176f99a0d7c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# Maintainer: Johannes Löthberg <johannes@kyriasis.com>
# Contributor: Alexander F Rødseth <xyproto@archlinux.org>
# Contributor: Daniel Micay <danielmicay@gmail.com>
# Contributor: userwithuid <userwithuid@gmail.com>

pkgname=('rust' 'rust-docs')
epoch=1
pkgver=1.38.0
pkgrel=2

_llvm_ver=9.0.0

pkgdesc='Systems programming language focused on safety, speed and concurrency'
url='https://www.rust-lang.org/'
arch=(i486 i686 pentium4 'x86_64')
license=('MIT' 'Apache')

#makedepends=('rust' "llvm=$_llvm_ver" 'libffi' 'perl' 'python' 'curl' 'cmake' 'inotify-tools' 'procps-ng')
makedepends=('rust' "llvm=$_llvm_ver" 'libffi' 'perl' 'python' 'curl' 'cmake')
checkdepends=('procps-ng' 'gdb')

options=('!emptydirs')

source=("https://static.rust-lang.org/dist/rustc-$pkgver-src.tar.gz"{,.asc}
        "https://github.com/llvm/llvm-project/releases/download/llvmorg-$_llvm_ver/compiler-rt-$_llvm_ver.src.tar.xz"{,.sig}
        bootstrap-1.38.patch
        0001-WIP-minimize-the-rust-std-component.patch)

sha256sums=('644263ca7c7106f8ee8fcde6bb16910d246b30668a74be20b8c7e0e9f4a52d80'
            'SKIP'
            '56e4cd96dd1d8c346b07b4d6b255f976570c6f2389697347a6c3dcb9e820d10e'
            'SKIP'
            '71935e8994d1045680cde22f72a12c4959e1877e5a42fc21fd034d677100dab3'
            '1d6b69444ef6ff033fe1612e56ecdaad5c52aa44395e704f78b1a047c65b9321')
validpgpkeys=('108F66205EAEB0AAA8DD5E1C85AB96E6FA1BE5FE'  # Rust Language (Tag and Release Signing Key) <rust-key@rust-lang.org>
              '474E22316ABF4785A88C6E8EA2C794A986419D8A'  # Tom Stellard <tstellar@redhat.com>
              'B6C8F98282B944E3B0D5C2530FC3042E345AD05D') # Hans Wennborg <hans@chromium.org>

prepare() {
  cd "rustc-$pkgver-src"

  # Fix bootstrap to compile with 1.38
  patch -Np1 -i ../bootstrap-1.38.patch

  # For https://bugzilla.redhat.com/show_bug.cgi?id=1756487
  # From https://src.fedoraproject.org/rpms/rust/tree/master
  patch -Np1 -i ../0001-WIP-minimize-the-rust-std-component.patch

  cat >config.toml <<END
[llvm]
link-shared = true

[build]
target = ["x86_64-unknown-linux-gnu", "i686-unknown-linux-gnu"]
cargo = "/usr/bin/cargo"
rustc = "/usr/bin/rustc"
python = "/usr/bin/python"
extended = true
sanitizers = false
profiler = true
vendor = true

[install]
prefix = "/usr"

[rust]
# LLVM crashes when passing an object through ThinLTO twice.  This is triggered when using rust
# code in cross-language LTO if libstd was built using ThinLTO.
# http://blog.llvm.org/2019/09/closing-gap-cross-language-lto-between.html
# https://github.com/rust-lang/rust/issues/54872
codegen-units-std = 1

debuginfo-level = 2

channel = "stable"

rpath = false

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

# Don't call build ? install will duplicate a lot of work and --keep-stage is not enough

package_rust() {
  depends=('gcc-libs' 'llvm-libs' 'curl' 'libssh2')
  provides=('cargo' 'rustfmt')
  conflicts=('cargo' 'rustfmt')
  replaces=('cargo' 'rustfmt')

  cd "rustc-$pkgver-src"

  export RUST_BACKTRACE=1
  export RUST_COMPILER_RT_ROOT="$srcdir/compiler-rt-$_llvm_ver.src"

  "$srcdir/watcher.sh" "$srcdir" &
  _kill_pid=$!
  sleep 10

  DESTDIR="$pkgdir" python ./x.py install -j"$(nproc)"

  kill $_kill_pid

  install -Dm644 -t "$pkgdir/usr/share/licenses/$pkgname" LICENSE*

  # delete unnecesary files, e.g. components and manifest files only used for the uninstall script
  cd "$pkgdir"/usr/lib/rustlib
  rm components install.log manifest-* rust-installer-version uninstall.sh

  # rustbuild always installs copies of the shared libraries to /usr/lib,
  # overwrite them with symlinks to the per-architecture versions
  ln -srft "$pkgdir"/usr/lib x86_64-unknown-linux-gnu/lib/*.so

  # move docs and lib32 libs out of the way for splitting
  mv "$pkgdir"/usr/share/doc "$srcdir"
  #mv "$pkgdir"/usr/lib/rustlib/i686-unknown-linux-gnu "$srcdir"

  install -d "$pkgdir"/usr/share/bash-completion
  mv "$pkgdir"/etc/bash_completion.d/ "$pkgdir"/usr/share/bash-completion/completions/
}

package_lib32-rust-libs() {
  descriptino=('32-bit libraries for Rust')
  depends=('lib32-gcc-libs')
  provides=('lib32-rust')
  conflicts=('lib32-rust')
  replaces=('lib32-rust')

  cd "rustc-$pkgver-src"
  install -Dm644 -t "$pkgdir/usr/share/licenses/$pkgname" LICENSE*

  install -d "$pkgdir"/usr/lib/rustlib/ "$pkgdir"/usr/lib32/
  mv "$srcdir"/i686-unknown-linux-gnu "$pkgdir"/usr/lib/rustlib
  ln -srft "$pkgdir"/usr/lib32 "$pkgdir"/usr/lib/rustlib/i686-unknown-linux-gnu/lib/*.so
}

package_rust-docs() {
  description=('Documentation for the Rust programming language')

  cd "rustc-$pkgver-src"
  install -Dm644 -t "$pkgdir/usr/share/licenses/$pkgname" LICENSE*

  mv "$srcdir"/doc "$pkgdir"/usr/share/doc
}

# vim:set ts=2 sw=2 et:
# enable i686-unknown-linux-gnu target
# and replace pentium4 (SSE2) with pentium3 (no SSE2) in the compiler spec file
#
# Also trying to reduce memory usage by building with
# -debuginfo-level-std=1
# see https://github.com/rust-lang/rust/issues/60294

source+=(config.toml.patch)
sha256sums+=('42e861ba90335d0e2e666e10b12d9ff85ea1bdb711176fb3c09e92375e193660')

eval "$(
  declare -f prepare | \
    sed '
      $ i patch -p1 -i "$srcdir/config.toml.patch"
    '
)"

# stop insanity of nproc (see FS#62952)
eval "$(
  declare -f build | \
    sed '
      s/-j"$(nproc)"/-j16/
    '
)"

if [ "${CARCH}" != 'pentium4' ]; then
  eval "$(
    declare -f prepare | \
      sed '
        $ i sed -i "s/pentium4/pentium3/g" "$srcdir/rustc-$pkgver-src/vendor/rustc-ap-rustc_target/spec/i686_unknown_linux_gnu.rs"
        $ i sed -i "s/pentium4/pentium3/g" "$srcdir/rustc-$pkgver-src/src/librustc_target/spec/i686_unknown_linux_gnu.rs"
        $ i sed -i "s/a75a6025d7e3424edf9baf3039056c0f8eea157631a175d00ac5a218aa54b510/484bf8be15015b330fa9a97b6dabb8c7627e59d5cddb2dd0e83478749f8aabad/g" "$srcdir/rustc-$pkgver-src/vendor/rustc-ap-rustc_target/.cargo-checksum.json"
      '
  )"
fi

# use binary rust-bin instead of rust (till we can bootstrap rust on IA-32)
# rust is ok on pentium4 but broken on i686 in bootstrap!
#makedepends=(${makedepends[@]//rust/})
#makedepends+=('rust-bin')

source+=('watcher.sh')
sha256sums+=('SKIP')