/[packages]/cauldron/rust/current/SPECS/rust.spec
ViewVC logotype

Contents of /cauldron/rust/current/SPECS/rust.spec

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1861388 - (show annotations) (download)
Mon Jun 6 12:35:03 2022 UTC (22 months, 1 week ago) by akien
File size: 34594 byte(s)
- Sync with Fedora: Mon May 23 2022 Josh Stone <jistone@redhat.com> - 1.61.0-2
  o Update to 1.61.0.
  o Add rust-toolset for ELN.
  o Add missing target_feature to the list of well known cfg names
1 # (akien) This package is synced with Fedora / Josh Stone's spec.
2 # The aim is to work with them on a rust packaging policy we could share,
3 # so that we can ensure a good packaging and share the workload.
4
5
6 # Only x86_64 and i686 are Tier 1 platforms at this time.
7 # https://doc.rust-lang.org/nightly/rustc/platform-support.html
8 %global rust_arches x86_64 i686 armv7hl aarch64 ppc64le s390x
9
10 # The channel can be stable, beta, or nightly
11 %{!?channel: %global channel stable}
12
13 # To bootstrap from scratch, set the channel and date from src/stage0.json
14 # e.g. 1.59.0 wants rustc: 1.58.0-2022-01-13
15 # or nightly wants some beta-YYYY-MM-DD
16 %global bootstrap_version 1.60.0
17 %global bootstrap_channel 1.60.0
18 %global bootstrap_date 2022-04-07
19
20 # Only the specified arches will use bootstrap binaries.
21 # NOTE: Those binaries used to be uploaded with every new release, but that was
22 # a waste of lookaside cache space when they're most often unused.
23 # Run "spectool -g rust.spec" after changing this and then "fedpkg upload" to
24 # add them to sources. Remember to remove them again after the bootstrap build!
25 #global bootstrap_arches %%{rust_arches}
26
27 # To bootstrap a compiler for a Tier 2 platform, we first need to build a
28 # compiler for a Tier 1 platform that targets the Tier 2 platform, then use
29 # the resulting compiler in a second build. Set bootstrap_build_arch to the
30 # Tier 1 arch for the first build, leave it undefined for the second build.
31 %bcond_with bootstrap_i586
32 %if %with bootstrap_i586
33 %ifarch i586
34 %global bootstrap_build_arch i686
35 %endif
36 %endif
37
38 # Define a space-separated list of targets to ship rust-std-static-$triple for
39 # cross-compilation. The packages are noarch, but they're not fully
40 # reproducible between hosts, so only x86_64 actually builds it.
41 %ifarch x86_64
42 %if 0%{?fedora} || 0%{?mageia} >= 9
43 %global mingw_targets i686-pc-windows-gnu x86_64-pc-windows-gnu
44 %endif
45 %if 0%{?fedora} || 0%{?rhel} >= 8 || 0%{?mageia} >= 9
46 %global wasm_targets wasm32-unknown-unknown wasm32-wasi
47 %endif
48 %endif
49
50 # We need CRT files for *-wasi targets, at least as new as the commit in
51 # src/ci/docker/host-x86_64/dist-various-2/build-wasi-toolchain.sh
52 # (updated per https://github.com/rust-lang/rust/pull/96907)
53 %global wasi_libc_url https://github.com/WebAssembly/wasi-libc
54 %global wasi_libc_commit 9886d3d6200fcc3726329966860fc058707406cd
55 %global wasi_libc_name wasi-libc-%{wasi_libc_commit}
56 %global wasi_libc_source %{wasi_libc_url}/archive/%{wasi_libc_commit}/%{wasi_libc_name}.tar.gz
57 %global wasi_libc_dir %{_builddir}/%{wasi_libc_name}
58
59 # Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases.
60 %bcond_with llvm_static
61
62 # We can also choose to just use Rust's bundled LLVM, in case the system LLVM
63 # is insufficient. Rust currently requires LLVM 12.0+.
64 %global min_llvm_version 12.0.0
65 %global bundled_llvm_version 14.0.0
66 %bcond_with bundled_llvm
67 # (akien) Hacks below are needed on mga's buildsystem when we have to rebootstrap llvm.
68 ## Bundled LLVM has underlinking issues:
69 #%%global _disable_ld_no_undefined 1
70 #%%ifarch %%{arm} %%ix86
71 ## Decrease debuginfo verbosity to reduce memory consumption during final library linking
72 #%%global optflags %%(echo %%{optflags} | sed 's/-g /-g1 /')
73 #%%endif
74
75 # Requires stable libgit2 1.4, and not the next minor soname change.
76 # This needs to be consistent with the bindings in vendor/libgit2-sys.
77 %global min_libgit2_version 1.4.0
78 %global next_libgit2_version 1.5.0~
79 %global bundled_libgit2_version 1.4.2
80 %if 0%{?fedora} >= 99 || 0%{?mageia} >= 99
81 %bcond_with bundled_libgit2
82 %else
83 %bcond_without bundled_libgit2
84 %endif
85
86 # needs libssh2_userauth_publickey_frommemory
87 %global min_libssh2_version 1.6.0
88 %if 0%{?rhel}
89 # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949)
90 %bcond_without disabled_libssh2
91 %else
92 %bcond_with disabled_libssh2
93 %endif
94
95 %if 0%{?rhel} && 0%{?rhel} < 8
96 %bcond_with curl_http2
97 %else
98 %bcond_without curl_http2
99 %endif
100
101 # LLDB isn't available everywhere...
102 %if 0%{?rhel} && 0%{?rhel} < 8
103 %bcond_with lldb
104 %else
105 %bcond_without lldb
106 %endif
107
108 %if 0%{?mageia}
109 # (akien) Added by tv in mga8/rust 1.37.0.
110 %global _python_bytecompile_extra 0
111 %endif
112
113 Name: rust
114 Version: 1.61.0
115 Release: %mkrel 1
116 Summary: The Rust Programming Language
117 %if 0%{?mageia}
118 Group: Development/Other
119 %endif
120 License: (ASL 2.0 or MIT) and (BSD and MIT)
121 # ^ written as: (rust itself) and (bundled libraries)
122 URL: https://www.rust-lang.org
123 ExclusiveArch: %{rust_arches} i586
124
125 %if "%{channel}" == "stable"
126 %global rustc_package rustc-%{version}-src
127 %else
128 %global rustc_package rustc-%{channel}-src
129 %endif
130 Source0: https://static.rust-lang.org/dist/%{rustc_package}.tar.xz
131 Source1: %{wasi_libc_source}
132 # Sources for bootstrap_arches are inserted by lua below
133
134 # By default, rust tries to use "rust-lld" as a linker for WebAssembly.
135 Patch1: 0001-Use-lld-provided-by-system-for-wasm.patch
136
137 # Set a substitute-path in rust-gdb for standard library sources.
138 Patch2: rustc-1.61.0-rust-gdb-substitute-path.patch
139
140 # Infer the type that compiletest uses for TestDesc ignore_message
141 Patch3: rustc-1.61.0-fix-compiletest-ignore_message.patch
142
143 # Add missing target_feature to the list of well known cfg names
144 # https://github.com/rust-lang/rust/pull/96483
145 Patch4: 0001-Add-missing-target_feature-to-the-list-of-well-known.patch
146
147 # (akien) Those tests fail on armv7 - on Fedora too, and jistone ignores them
148 # https://github.com/rust-lang/rust/issues/83453
149 Patch11: rustc-1.50.0-allow_fail-armv7-instruction_set.patch
150
151 ### RHEL-specific patches below ###
152
153 # Simple rpm macros for rust-toolset (as opposed to full rust-packaging)
154 Source100: macros.rust-toolset
155
156 # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949)
157 Patch100: rustc-1.59.0-disable-libssh2.patch
158
159 # libcurl on RHEL7 doesn't have http2, but since cargo requests it, curl-sys
160 # will try to build it statically -- instead we turn off the feature.
161 Patch101: rustc-1.61.0-disable-http2.patch
162
163 # kernel rh1410097 causes too-small stacks for PIE.
164 # (affects RHEL6 kernels when building for RHEL7)
165 Patch102: rustc-1.58.0-no-default-pie.patch
166
167
168 # Get the Rust triple for any arch.
169 %{lua: function rust_triple(arch)
170 local abi = "gnu"
171 if arch == "armv7hl" then
172 arch = "armv7"
173 abi = "gnueabihf"
174 elseif arch == "ppc64" then
175 arch = "powerpc64"
176 elseif arch == "ppc64le" then
177 arch = "powerpc64le"
178 elseif arch == "riscv64" then
179 arch = "riscv64gc"
180 end
181 return arch.."-unknown-linux-"..abi
182 end}
183
184 %if %defined bootstrap_build_arch
185 %global rust_triple %{lua: print(rust_triple(rpm.expand("%{bootstrap_build_arch}")))}
186 %global target_triple %{lua: print(rust_triple(rpm.expand("%{_target_cpu}")))}
187 %else
188 %global rust_triple %{lua: print(rust_triple(rpm.expand("%{_target_cpu}")))}
189 %global target_triple %{rust_triple}
190 %endif
191
192 %if %defined bootstrap_arches
193 # For each bootstrap arch, add an additional binary Source.
194 # Also define bootstrap_source just for the current target.
195 %{lua: do
196 local bootstrap_arches = {}
197 for arch in string.gmatch(rpm.expand("%{bootstrap_arches}"), "%S+") do
198 table.insert(bootstrap_arches, arch)
199 end
200 local base = rpm.expand("https://static.rust-lang.org/dist/%{bootstrap_date}")
201 local channel = rpm.expand("%{bootstrap_channel}")
202 local target_arch = rpm.expand("%{_target_cpu}")
203 for i, arch in ipairs(bootstrap_arches) do
204 i = 1000 + i * 3
205 local suffix = channel.."-"..rust_triple(arch)
206 print(string.format("Source%d: %s/cargo-%s.tar.xz\n", i, base, suffix))
207 print(string.format("Source%d: %s/rustc-%s.tar.xz\n", i+1, base, suffix))
208 print(string.format("Source%d: %s/rust-std-%s.tar.xz\n", i+2, base, suffix))
209 if arch == target_arch then
210 rpm.define("bootstrap_source_cargo "..i)
211 rpm.define("bootstrap_source_rustc "..i+1)
212 rpm.define("bootstrap_source_std "..i+2)
213 rpm.define("bootstrap_suffix "..suffix)
214 end
215 end
216 end}
217 %endif
218
219 %ifarch %{bootstrap_arches}
220 %global local_rust_root %{_builddir}/rust-%{bootstrap_suffix}
221 Provides: bundled(%{name}-bootstrap) = %{bootstrap_version}
222 %else
223 BuildRequires: cargo >= %{bootstrap_version}
224 %if (0%{?rhel} && 0%{?rhel} < 8) || 0%{?mageia}
225 BuildRequires: %{name} >= %{bootstrap_version}
226 BuildConflicts: %{name} > %{version}
227 %else
228 BuildRequires: (%{name} >= %{bootstrap_version} with %{name} <= %{version})
229 %endif
230 %global local_rust_root %{_prefix}
231 %endif
232
233 BuildRequires: make
234 BuildRequires: gcc
235 BuildRequires: gcc-c++
236 BuildRequires: ncurses-devel
237 # explicit curl-devel to avoid httpd24-curl (rhbz1540167)
238 BuildRequires: curl-devel
239 BuildRequires: pkgconfig(libcurl)
240 BuildRequires: pkgconfig(liblzma)
241 BuildRequires: pkgconfig(openssl)
242 BuildRequires: pkgconfig(zlib)
243
244 %if %{without bundled_libgit2}
245 BuildRequires: pkgconfig(libgit2) >= %{min_libgit2_version}
246 BuildRequires: pkgconfig(libgit2) < %{next_libgit2_version}
247 %endif
248
249 %if %{without disabled_libssh2}
250 BuildRequires: pkgconfig(libssh2) >= %{min_libssh2_version}
251 %endif
252
253 %if 0%{?rhel} == 8
254 BuildRequires: platform-python
255 %else
256 BuildRequires: python3
257 %endif
258 BuildRequires: python3-rpm-macros
259
260 %if %with bundled_llvm
261 BuildRequires: cmake3 >= 3.13.4
262 BuildRequires: ninja-build
263 Provides: bundled(llvm) = %{bundled_llvm_version}
264 %else
265 BuildRequires: cmake >= 2.8.11
266 %if 0%{?epel} == 7
267 %global llvm llvm13
268 %endif
269 %if %defined llvm
270 %if 0%{?mageia}
271 %global llvm_root %{_prefix}/lib/%{llvm}
272 %else
273 %global llvm_root %{_libdir}/%{llvm}
274 %endif
275 %else
276 %global llvm llvm
277 %global llvm_root %{_prefix}
278 %endif
279 BuildRequires: %{llvm}-devel >= %{min_llvm_version}
280 %if %with llvm_static
281 BuildRequires: %{llvm}-static
282 BuildRequires: libffi-devel
283 %endif
284 %endif
285
286 # make check needs "ps" for src/test/ui/wait-forked-but-failed-child.rs
287 BuildRequires: procps-ng
288
289 # debuginfo-gdb tests need gdb
290 BuildRequires: gdb
291
292 # Virtual provides for folks who attempt "dnf install rustc"
293 Provides: rustc = %{version}-%{release}
294 Provides: rustc%{?_isa} = %{version}-%{release}
295
296 # Always require our exact standard library
297 Requires: %{name}-std-static%{?_isa} = %{version}-%{release}
298
299 # The C compiler is needed at runtime just for linking. Someday rustc might
300 # invoke the linker directly, and then we'll only need binutils.
301 # https://github.com/rust-lang/rust/issues/11937
302 %if 0%{?mageia}
303 Requires: gcc
304 %else
305 Requires: /usr/bin/cc
306 %endif
307
308 %if 0%{?epel} == 7
309 %global devtoolset_name devtoolset-9
310 BuildRequires: %{devtoolset_name}-binutils
311 BuildRequires: %{devtoolset_name}-gcc
312 BuildRequires: %{devtoolset_name}-gcc-c++
313 %global devtoolset_bindir /opt/rh/%{devtoolset_name}/root/usr/bin
314 %global __cc %{devtoolset_bindir}/gcc
315 %global __cxx %{devtoolset_bindir}/g++
316 %global __ar %{devtoolset_bindir}/ar
317 %global __ranlib %{devtoolset_bindir}/ranlib
318 %global __strip %{devtoolset_bindir}/strip
319 %else
320 %global __ranlib %{_bindir}/ranlib
321 %endif
322
323 # ALL Rust libraries are private, because they don't keep an ABI.
324 %global _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.*
325 %global __provides_exclude ^(%{_privatelibs})$
326 %global __requires_exclude ^(%{_privatelibs})$
327 %global __provides_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$
328 %global __requires_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$
329
330 # While we don't want to encourage dynamic linking to Rust shared libraries, as
331 # there's no stable ABI, we still need the unallocated metadata (.rustc) to
332 # support custom-derive plugins like #[proc_macro_derive(Foo)].
333 %if 0%{?rhel} && 0%{?rhel} < 8
334 # eu-strip is very eager by default, so we have to limit it to -g, only debugging symbols.
335 %global _find_debuginfo_opts -g
336 %undefine _include_minidebuginfo
337 %else
338 # Newer find-debuginfo.sh supports --keep-section, which is preferable. rhbz1465997
339 %global _find_debuginfo_opts --keep-section .rustc
340 %endif
341
342 %if %{without bundled_llvm}
343 %if "%{llvm_root}" == "%{_prefix}" || 0%{?scl:1}
344 %global llvm_has_filecheck 1
345 %endif
346 %endif
347
348 # We're going to override --libdir when configuring to get rustlib into a
349 # common path, but we'll fix the shared libraries during install.
350 %global common_libdir %{_prefix}/lib
351 %global rustlibdir %{common_libdir}/rustlib
352
353 %if %defined mingw_targets
354 BuildRequires: mingw32-filesystem >= 95
355 BuildRequires: mingw64-filesystem >= 95
356 BuildRequires: mingw32-crt
357 BuildRequires: mingw64-crt
358 BuildRequires: mingw32-gcc
359 BuildRequires: mingw64-gcc
360 BuildRequires: mingw32-winpthreads-static
361 BuildRequires: mingw64-winpthreads-static
362 %endif
363
364 %if %defined wasm_targets
365 BuildRequires: clang
366 BuildRequires: lld
367 # brp-strip-static-archive breaks the archive index for wasm
368 %global __os_install_post \
369 %__os_install_post \
370 find '%{buildroot}%{rustlibdir}'/wasm*/lib -type f -regex '.*\\.\\(a\\|rlib\\)' -print -exec '%{llvm_root}/bin/llvm-ranlib' '{}' ';' \
371 %{nil}
372 %endif
373
374 %description
375 Rust is a systems programming language that runs blazingly fast, prevents
376 segfaults, and guarantees thread safety.
377
378 This package includes the Rust compiler and documentation generator.
379
380
381 %package std-static
382 Summary: Standard library for Rust
383 Requires: %{name} = %{version}-%{release}
384 Requires: glibc-devel%{?_isa} >= 2.11
385
386 %description std-static
387 This package includes the standard libraries for building applications
388 written in Rust.
389
390 %if %defined mingw_targets
391 %{lua: do
392 for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do
393 local subs = {
394 triple = triple,
395 name = rpm.expand("%{name}"),
396 verrel = rpm.expand("%{version}-%{release}"),
397 mingw = string.find(rpm.expand("%{ix86}"), string.sub(triple, 1, 4)) and "mingw32" or "mingw64",
398 }
399 local s = string.gsub([[
400
401 %package std-static-{{triple}}
402 Summary: Standard library for Rust {{triple}}
403 BuildArch: noarch
404 Provides: {{mingw}}-rust = {{verrel}}
405 Provides: {{mingw}}-rustc = {{verrel}}
406 Requires: {{mingw}}-crt
407 Requires: {{mingw}}-gcc
408 Requires: {{mingw}}-winpthreads-static
409 Requires: {{name}} = {{verrel}}
410
411 %description std-static-{{triple}}
412 This package includes the standard libraries for building applications
413 written in Rust for the MinGW target {{triple}}.
414
415 ]], "{{(%w+)}}", subs)
416 print(s)
417 end
418 end}
419 %endif
420
421 %if %defined wasm_targets
422 %{lua: do
423 for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do
424 local subs = {
425 triple = triple,
426 name = rpm.expand("%{name}"),
427 verrel = rpm.expand("%{version}-%{release}"),
428 wasi = string.find(triple, "-wasi") and 1 or 0,
429 }
430 local s = string.gsub([[
431
432 %package std-static-{{triple}}
433 Summary: Standard library for Rust {{triple}}
434 BuildArch: noarch
435 Requires: {{name}} = {{verrel}}
436 Requires: lld >= 8.0
437 %if {{wasi}}
438 Provides: bundled(wasi-libc)
439 %endif
440
441 %description std-static-{{triple}}
442 This package includes the standard libraries for building applications
443 written in Rust for the WebAssembly target {{triple}}.
444
445 ]], "{{(%w+)}}", subs)
446 print(s)
447 end
448 end}
449 %endif
450
451
452 %package debugger-common
453 Summary: Common debugger pretty printers for Rust
454 BuildArch: noarch
455
456 %description debugger-common
457 This package includes the common functionality for %{name}-gdb and %{name}-lldb.
458
459
460 %package gdb
461 Summary: GDB pretty printers for Rust
462 BuildArch: noarch
463 Requires: gdb
464 Requires: %{name}-debugger-common = %{version}-%{release}
465
466 %description gdb
467 This package includes the rust-gdb script, which allows easier debugging of Rust
468 programs.
469
470
471 %if %with lldb
472
473 %package lldb
474 Summary: LLDB pretty printers for Rust
475 BuildArch: noarch
476 Requires: lldb
477 Requires: python3-lldb
478 Requires: %{name}-debugger-common = %{version}-%{release}
479
480 %description lldb
481 This package includes the rust-lldb script, which allows easier debugging of Rust
482 programs.
483
484 %endif
485
486
487 %package doc
488 Summary: Documentation for Rust
489 # NOT BuildArch: noarch
490 # Note, while docs are mostly noarch, some things do vary by target_arch.
491 # Koji will fail the build in rpmdiff if two architectures build a noarch
492 # subpackage differently, so instead we have to keep its arch.
493
494 %description doc
495 This package includes HTML documentation for the Rust programming language and
496 its standard library.
497
498
499 %package -n cargo
500 Summary: Rust's package manager and build tool
501 %if %with bundled_libgit2
502 Provides: bundled(libgit2) = %{bundled_libgit2_version}
503 %endif
504 # For tests:
505 BuildRequires: git-core
506 # Cargo is not much use without Rust
507 Requires: %{name}
508
509 # "cargo vendor" is a builtin command starting with 1.37. The Obsoletes and
510 # Provides are mostly relevant to RHEL, but harmless to have on Fedora/etc. too
511 Obsoletes: cargo-vendor <= 0.1.23
512 Provides: cargo-vendor = %{version}-%{release}
513
514 %description -n cargo
515 Cargo is a tool that allows Rust projects to declare their various dependencies
516 and ensure that you'll always get a repeatable build.
517
518
519 %package -n cargo-doc
520 Summary: Documentation for Cargo
521 BuildArch: noarch
522 # Cargo no longer builds its own documentation
523 # https://github.com/rust-lang/cargo/pull/4904
524 Requires: %{name}-doc = %{version}-%{release}
525
526 %description -n cargo-doc
527 This package includes HTML documentation for Cargo.
528
529
530 %package -n rustfmt
531 Summary: Tool to find and fix Rust formatting issues
532 Requires: cargo
533
534 # The component/package was rustfmt-preview until Rust 1.31.
535 Obsoletes: rustfmt-preview < 1.0.0
536 Provides: rustfmt-preview = %{version}-%{release}
537
538 %description -n rustfmt
539 A tool for formatting Rust code according to style guidelines.
540
541
542 %package -n rls
543 Summary: Rust Language Server for IDE integration
544 %if %with bundled_libgit2
545 Provides: bundled(libgit2) = %{bundled_libgit2_version}
546 %endif
547 Requires: %{name}-analysis
548 # /usr/bin/rls is dynamically linked against internal rustc libs
549 Requires: %{name}%{?_isa} = %{version}-%{release}
550
551 # The component/package was rls-preview until Rust 1.31.
552 Obsoletes: rls-preview < 1.31.6
553 Provides: rls-preview = %{version}-%{release}
554
555 %description -n rls
556 The Rust Language Server provides a server that runs in the background,
557 providing IDEs, editors, and other tools with information about Rust programs.
558 It supports functionality such as 'goto definition', symbol search,
559 reformatting, and code completion, and enables renaming and refactorings.
560
561
562 %package -n clippy
563 Summary: Lints to catch common mistakes and improve your Rust code
564 Requires: cargo
565 # /usr/bin/clippy-driver is dynamically linked against internal rustc libs
566 Requires: %{name}%{?_isa} = %{version}-%{release}
567
568 # The component/package was clippy-preview until Rust 1.31.
569 Obsoletes: clippy-preview <= 0.0.212
570 Provides: clippy-preview = %{version}-%{release}
571
572 %description -n clippy
573 A collection of lints to catch common mistakes and improve your Rust code.
574
575
576 %package src
577 Summary: Sources for the Rust standard library
578 BuildArch: noarch
579
580 %description src
581 This package includes source files for the Rust standard library. It may be
582 useful as a reference for code completion tools in various editors.
583
584
585 %package analysis
586 Summary: Compiler analysis data for the Rust standard library
587 Requires: %{name}-std-static%{?_isa} = %{version}-%{release}
588
589 %description analysis
590 This package contains analysis data files produced with rustc's -Zsave-analysis
591 feature for the Rust standard library. The RLS (Rust Language Server) uses this
592 data to provide information about the Rust standard library.
593
594
595 %if 0%{?rhel} && 0%{?rhel} >= 8
596
597 %package toolset
598 Summary: Rust Toolset
599 Requires: rust%{?_isa} = %{version}-%{release}
600 Requires: cargo%{?_isa} = %{version}-%{release}
601
602 %description toolset
603 This is the metapackage for Rust Toolset, bringing in the Rust compiler,
604 the Cargo package manager, and a few convenience macros for rpm builds.
605
606 %endif
607
608
609 %prep
610
611 %ifarch %{bootstrap_arches}
612 rm -rf %{local_rust_root}
613 %setup -q -n cargo-%{bootstrap_suffix} -T -b %{bootstrap_source_cargo}
614 ./install.sh --prefix=%{local_rust_root} --disable-ldconfig
615 %setup -q -n rustc-%{bootstrap_suffix} -T -b %{bootstrap_source_rustc}
616 ./install.sh --prefix=%{local_rust_root} --disable-ldconfig
617 %setup -q -n rust-std-%{bootstrap_suffix} -T -b %{bootstrap_source_std}
618 ./install.sh --prefix=%{local_rust_root} --disable-ldconfig
619 test -f '%{local_rust_root}/bin/cargo'
620 test -f '%{local_rust_root}/bin/rustc'
621 %endif
622
623 %if %defined wasm_targets
624 %setup -q -n %{wasi_libc_name} -T -b 1
625 %endif
626
627 %setup -q -n %{rustc_package}
628
629 %patch1 -p1
630 %patch2 -p1
631 %patch3 -p1
632 %patch4 -p1
633
634 %patch11 -p1
635
636 %if %with disabled_libssh2
637 %patch100 -p1
638 %endif
639
640 %if %without curl_http2
641 %patch101 -p1
642 rm -rf vendor/libnghttp2-sys/
643 %endif
644
645 %if 0%{?rhel} && 0%{?rhel} < 8
646 %patch102 -p1
647 %endif
648
649 # Use our explicit python3 first
650 sed -i.try-python -e '/^try python3 /i try "%{__python3}" "$@"' ./configure
651
652 # Set a substitute-path in rust-gdb for standard library sources.
653 sed -i.rust-src -e "s#@BUILDDIR@#$PWD#" ./src/etc/rust-gdb
654
655 %if %without bundled_llvm
656 rm -rf src/llvm-project/
657 mkdir -p src/llvm-project/libunwind/
658 %endif
659
660 # Remove other unused vendored libraries
661 rm -rf vendor/curl-sys/curl/
662 rm -rf vendor/*jemalloc-sys*/jemalloc/
663 rm -rf vendor/libmimalloc-sys/c_src/mimalloc/
664 rm -rf vendor/libssh2-sys/libssh2/
665 rm -rf vendor/libz-sys/src/zlib/
666 rm -rf vendor/libz-sys/src/zlib-ng/
667 rm -rf vendor/lzma-sys/xz-*/
668 rm -rf vendor/openssl-src/openssl/
669
670 %if %without bundled_libgit2
671 rm -rf vendor/libgit2-sys/libgit2/
672 %endif
673
674 %if %with disabled_libssh2
675 rm -rf vendor/libssh2-sys/
676 %endif
677
678 # This only affects the transient rust-installer, but let it use our dynamic xz-libs
679 sed -i.lzma -e '/LZMA_API_STATIC/d' src/bootstrap/tool.rs
680
681 %if %{with bundled_llvm} && 0%{?epel} == 7
682 mkdir -p cmake-bin
683 ln -s /usr/bin/cmake3 cmake-bin/cmake
684 %global cmake_path $PWD/cmake-bin
685 %endif
686
687 %if %{without bundled_llvm} && %{with llvm_static}
688 # Static linking to distro LLVM needs to add -lffi
689 # https://github.com/rust-lang/rust/issues/34486
690 sed -i.ffi -e '$a #[link(name = "ffi")] extern {}' \
691 compiler/rustc_llvm/src/lib.rs
692 %endif
693
694 # The configure macro will modify some autoconf-related files, which upsets
695 # cargo when it tries to verify checksums in those files. If we just truncate
696 # that file list, cargo won't have anything to complain about.
697 find vendor -name .cargo-checksum.json \
698 -exec sed -i.uncheck -e 's/"files":{[^}]*}/"files":{ }/' '{}' '+'
699
700 # Sometimes Rust sources start with #![...] attributes, and "smart" editors think
701 # it's a shebang and make them executable. Then brp-mangle-shebangs gets upset...
702 find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+'
703
704 # Set up shared environment variables for build/install/check
705 %global rust_env %{?rustflags:RUSTFLAGS="%{rustflags}"}
706 %if 0%{?cmake_path:1}
707 %global rust_env %{?rust_env} PATH="%{cmake_path}:$PATH"
708 %endif
709 %if %without disabled_libssh2
710 # convince libssh2-sys to use the distro libssh2
711 %global rust_env %{?rust_env} LIBSSH2_SYS_USE_PKG_CONFIG=1
712 %endif
713 %global export_rust_env %{?rust_env:export %{rust_env}}
714
715
716 %build
717 %{export_rust_env}
718
719 %ifarch aarch64 %{arm} %{ix86} s390x
720 # full debuginfo is exhausting memory; just do libstd for now
721 # https://github.com/rust-lang/rust/issues/45854
722 %if 0%{?rhel} && 0%{?rhel} < 8
723 # Older rpmbuild didn't work with partial debuginfo coverage.
724 %global debug_package %{nil}
725 %define enable_debuginfo --debuginfo-level=0
726 %else
727 %define enable_debuginfo --debuginfo-level=0 --debuginfo-level-std=2
728 %endif
729 %else
730 %define enable_debuginfo --debuginfo-level=2
731 %endif
732
733 # Some builders have relatively little memory for their CPU count.
734 # At least 2GB per CPU is a good rule of thumb for building rustc.
735 ncpus=$(/usr/bin/getconf _NPROCESSORS_ONLN)
736 max_cpus=$(( ($(free -g | awk '/^Mem:/{print $2}') + 1) / 2 ))
737 if [ "$max_cpus" -ge 1 -a "$max_cpus" -lt "$ncpus" ]; then
738 ncpus="$max_cpus"
739 fi
740
741 %if %defined mingw_targets
742 %{lua: do
743 local cfg = ""
744 for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do
745 local subs = {
746 triple = triple,
747 mingw = string.find(rpm.expand("%{ix86}"), string.sub(triple, 1, 4)) and "mingw32" or "mingw64",
748 }
749 local s = string.gsub([[
750 --set target.{{triple}}.linker=%{{{mingw}}_cc}
751 --set target.{{triple}}.cc=%{{{mingw}}_cc}
752 --set target.{{triple}}.ar=%{{{mingw}}_ar}
753 --set target.{{triple}}.ranlib=%{{{mingw}}_ranlib}
754 ]], "{{(%w+)}}", subs)
755 cfg = cfg .. " " .. s
756 end
757 cfg = string.gsub(cfg, "%s+", " ")
758 rpm.define("mingw_target_config " .. cfg)
759 end}
760 %endif
761
762 %if %defined wasm_targets
763 %make_build --quiet -C %{wasi_libc_dir} CC=clang AR=llvm-ar NM=llvm-nm
764 %{lua: do
765 local wasi_root = rpm.expand("%{wasi_libc_dir}") .. "/sysroot"
766 local cfg = ""
767 for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do
768 if string.find(triple, "-wasi") then
769 cfg = cfg .. " --set target." .. triple .. ".wasi-root=" .. wasi_root
770 end
771 end
772 rpm.define("wasm_target_config "..cfg)
773 end}
774 %endif
775
776 %configure --disable-option-checking \
777 --libdir=%{common_libdir} \
778 --build=%{rust_triple} --host=%{rust_triple} --target=%{target_triple} \
779 --set target.%{target_triple}.linker=%{__cc} \
780 --set target.%{target_triple}.cc=%{__cc} \
781 --set target.%{target_triple}.cxx=%{__cxx} \
782 --set target.%{target_triple}.ar=%{__ar} \
783 --set target.%{target_triple}.ranlib=%{__ranlib} \
784 %{?mingw_target_config} \
785 %{?wasm_target_config} \
786 --python=%{__python3} \
787 --local-rust-root=%{local_rust_root} \
788 --set build.rustfmt=/bin/true \
789 %{!?with_bundled_llvm: --llvm-root=%{llvm_root} \
790 %{!?llvm_has_filecheck: --disable-codegen-tests} \
791 %{!?with_llvm_static: --enable-llvm-link-shared } } \
792 --disable-llvm-static-stdcpp \
793 --disable-rpath \
794 %{enable_debuginfo} \
795 --set rust.codegen-units-std=1 \
796 --enable-extended \
797 --tools=analysis,cargo,clippy,rls,rustfmt,src \
798 --enable-vendor \
799 --enable-verbose-tests \
800 --dist-compression-formats=gz \
801 --release-channel=%{channel} \
802 --release-description="%{?mageia:Mageia }%{?fedora:Fedora }%{?rhel:Red Hat }%{version}-%{release}"
803
804 %{__python3} ./x.py build -j "$ncpus" --stage 2
805 %{__python3} ./x.py doc --stage 2
806
807 for triple in %{?mingw_targets} %{?wasm_targets}; do
808 %{__python3} ./x.py build --stage 2 --target=$triple std
809 done
810
811 %install
812 %{export_rust_env}
813
814 DESTDIR=%{buildroot} %{__python3} ./x.py install
815
816 for triple in %{?mingw_targets} %{?wasm_targets}; do
817 DESTDIR=%{buildroot} %{__python3} ./x.py install --target=$triple std
818 done
819
820 # These are transient files used by x.py dist and install
821 rm -rf ./build/dist/ ./build/tmp/
822
823 # Make sure the shared libraries are in the proper libdir
824 %if "%{_libdir}" != "%{common_libdir}"
825 mkdir -p %{buildroot}%{_libdir}
826 find %{buildroot}%{common_libdir} -maxdepth 1 -type f -name '*.so' \
827 -exec mv -v -t %{buildroot}%{_libdir} '{}' '+'
828 %endif
829
830 # The shared libraries should be executable for debuginfo extraction.
831 find %{buildroot}%{_libdir} -maxdepth 1 -type f -name '*.so' \
832 -exec chmod -v +x '{}' '+'
833
834 # The libdir libraries are identical to those under rustlib/. It's easier on
835 # library loading if we keep them in libdir, but we do need them in rustlib/
836 # to support dynamic linking for compiler plugins, so we'll symlink.
837 (cd "%{buildroot}%{rustlibdir}/%{rust_triple}/lib" &&
838 find ../../../../%{_lib} -maxdepth 1 -name '*.so' |
839 while read lib; do
840 if [ -f "${lib##*/}" ]; then
841 # make sure they're actually identical!
842 cmp "$lib" "${lib##*/}"
843 ln -v -f -s -t . "$lib"
844 fi
845 done)
846
847 # Remove installer artifacts (manifests, uninstall scripts, etc.)
848 find %{buildroot}%{rustlibdir} -maxdepth 1 -type f -exec rm -v '{}' '+'
849
850 # Remove backup files from %%configure munging
851 find %{buildroot}%{rustlibdir} -type f -name '*.orig' -exec rm -v '{}' '+'
852
853 # https://fedoraproject.org/wiki/Changes/Make_ambiguous_python_shebangs_error
854 # We don't actually need to ship any of those python scripts in rust-src anyway.
855 find %{buildroot}%{rustlibdir}/src -type f -name '*.py' -exec rm -v '{}' '+'
856
857 # FIXME: __os_install_post will strip the rlibs
858 # -- should we find a way to preserve debuginfo?
859
860 # Remove unwanted documentation files (we already package them)
861 rm -f %{buildroot}%{_docdir}/%{name}/README.md
862 rm -f %{buildroot}%{_docdir}/%{name}/COPYRIGHT
863 rm -f %{buildroot}%{_docdir}/%{name}/LICENSE
864 rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-APACHE
865 rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-MIT
866 rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-THIRD-PARTY
867 rm -f %{buildroot}%{_docdir}/%{name}/*.old
868
869 # Sanitize the HTML documentation
870 find %{buildroot}%{_docdir}/%{name}/html -empty -delete
871 find %{buildroot}%{_docdir}/%{name}/html -type f -exec chmod -x '{}' '+'
872
873 # Create the path for crate-devel packages
874 mkdir -p %{buildroot}%{_datadir}/cargo/registry
875
876 # Cargo no longer builds its own documentation
877 # https://github.com/rust-lang/cargo/pull/4904
878 mkdir -p %{buildroot}%{_docdir}/cargo
879 ln -sT ../rust/html/cargo/ %{buildroot}%{_docdir}/cargo/html
880
881 %if %without lldb
882 rm -f %{buildroot}%{_bindir}/rust-lldb
883 rm -f %{buildroot}%{rustlibdir}/etc/lldb_*
884 %endif
885
886 # We don't want Rust copies of LLVM tools (rust-lld, rust-llvm-dwp)
887 rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll*
888
889 %if 0%{?rhel} && 0%{?rhel} >= 8
890 # This allows users to build packages using Rust Toolset.
891 %{__install} -D -m 644 %{S:100} %{buildroot}%{rpmmacrodir}/macros.rust-toolset
892 %endif
893
894
895 %check
896 %{export_rust_env}
897
898 # Sanity-check the installed binaries, debuginfo-stripped and all.
899 %{buildroot}%{_bindir}/cargo new build/hello-world
900 env RUSTC=%{buildroot}%{_bindir}/rustc \
901 LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \
902 %{buildroot}%{_bindir}/cargo run --manifest-path build/hello-world/Cargo.toml
903
904 # Try a build sanity-check for other targets
905 for triple in %{?mingw_targets} %{?wasm_targets}; do
906 env RUSTC=%{buildroot}%{_bindir}/rustc \
907 LD_LIBRARY_PATH="%{buildroot}%{_libdir}:$LD_LIBRARY_PATH" \
908 %{buildroot}%{_bindir}/cargo build --manifest-path build/hello-world/Cargo.toml --target=$triple
909 done
910
911 # The results are not stable on koji, so mask errors and just log it.
912 # Some of the larger test artifacts are manually cleaned to save space.
913 %{__python3} ./x.py test --no-fail-fast --stage 2 || :
914 rm -rf "./build/%{rust_triple}/test/"
915
916 %{__python3} ./x.py test --no-fail-fast --stage 2 cargo || :
917 rm -rf "./build/%{rust_triple}/stage2-tools/%{rust_triple}/cit/"
918
919 %{__python3} ./x.py test --no-fail-fast --stage 2 clippy || :
920
921 env RLS_TEST_WAIT_FOR_AGES=1 \
922 %{__python3} ./x.py test --no-fail-fast --stage 2 rls || :
923
924 %{__python3} ./x.py test --no-fail-fast --stage 2 rustfmt || :
925
926
927 %{?ldconfig_scriptlets}
928
929
930 %files
931 %license COPYRIGHT LICENSE-APACHE LICENSE-MIT
932 %doc README.md
933 %{_bindir}/rustc
934 %{_bindir}/rustdoc
935 %{_libdir}/*.so
936 %{_mandir}/man1/rustc.1*
937 %{_mandir}/man1/rustdoc.1*
938 %dir %{rustlibdir}
939 %dir %{rustlibdir}/%{rust_triple}
940 %dir %{rustlibdir}/%{rust_triple}/lib
941 %{rustlibdir}/%{rust_triple}/lib/*.so
942 %if %defined bootstrap_build_arch
943 %dir %{rustlibdir}/%{target_triple}
944 %dir %{rustlibdir}/%{target_triple}/lib
945 %{rustlibdir}/%{target_triple}/lib/*.so
946 %endif
947
948
949 %files std-static
950 %dir %{rustlibdir}
951 %dir %{rustlibdir}/%{rust_triple}
952 %dir %{rustlibdir}/%{rust_triple}/lib
953 %{rustlibdir}/%{rust_triple}/lib/*.rlib
954 %if %defined bootstrap_build_arch
955 %dir %{rustlibdir}/%{target_triple}
956 %dir %{rustlibdir}/%{target_triple}/lib
957 %{rustlibdir}/%{target_triple}/lib/*.rlib
958 %endif
959
960
961 %if %defined mingw_targets
962 %{lua: do
963 for triple in string.gmatch(rpm.expand("%{mingw_targets}"), "%S+") do
964 local subs = {
965 triple = triple,
966 rustlibdir = rpm.expand("%{rustlibdir}"),
967 }
968 local s = string.gsub([[
969
970 %files std-static-{{triple}}
971 %dir {{rustlibdir}}
972 %dir {{rustlibdir}}/{{triple}}
973 %dir {{rustlibdir}}/{{triple}}/lib
974 {{rustlibdir}}/{{triple}}/lib/*.rlib
975 {{rustlibdir}}/{{triple}}/lib/rs*.o
976 %exclude {{rustlibdir}}/{{triple}}/lib/*.dll
977 %exclude {{rustlibdir}}/{{triple}}/lib/*.dll.a
978 %exclude {{rustlibdir}}/{{triple}}/lib/self-contained
979
980 ]], "{{(%w+)}}", subs)
981 print(s)
982 end
983 end}
984 %endif
985
986
987 %if %defined wasm_targets
988 %{lua: do
989 for triple in string.gmatch(rpm.expand("%{wasm_targets}"), "%S+") do
990 local subs = {
991 triple = triple,
992 rustlibdir = rpm.expand("%{rustlibdir}"),
993 wasi = string.find(triple, "-wasi") and 1 or 0,
994 }
995 local s = string.gsub([[
996
997 %files std-static-{{triple}}
998 %dir {{rustlibdir}}
999 %dir {{rustlibdir}}/{{triple}}
1000 %dir {{rustlibdir}}/{{triple}}/lib
1001 {{rustlibdir}}/{{triple}}/lib/*.rlib
1002 %if {{wasi}}
1003 %dir {{rustlibdir}}/{{triple}}/lib/self-contained
1004 {{rustlibdir}}/{{triple}}/lib/self-contained/crt*.o
1005 {{rustlibdir}}/{{triple}}/lib/self-contained/libc.a
1006 %endif
1007
1008 ]], "{{(%w+)}}", subs)
1009 print(s)
1010 end
1011 end}
1012 %endif
1013
1014
1015 %files debugger-common
1016 %dir %{rustlibdir}
1017 %dir %{rustlibdir}/etc
1018 %{rustlibdir}/etc/rust_*.py*
1019
1020
1021 %files gdb
1022 %{_bindir}/rust-gdb
1023 %{rustlibdir}/etc/gdb_*
1024 %exclude %{_bindir}/rust-gdbgui
1025
1026
1027 %if %with lldb
1028 %files lldb
1029 %{_bindir}/rust-lldb
1030 %{rustlibdir}/etc/lldb_*
1031 %endif
1032
1033
1034 %files doc
1035 %docdir %{_docdir}/%{name}
1036 %dir %{_docdir}/%{name}
1037 %dir %{_docdir}/%{name}/html
1038 %{_docdir}/%{name}/html/*/
1039 %{_docdir}/%{name}/html/*.html
1040 %{_docdir}/%{name}/html/*.css
1041 %{_docdir}/%{name}/html/*.js
1042 %{_docdir}/%{name}/html/*.png
1043 %{_docdir}/%{name}/html/*.svg
1044 %{_docdir}/%{name}/html/*.woff
1045 %{_docdir}/%{name}/html/*.woff2
1046 %license %{_docdir}/%{name}/html/*.txt
1047 %license %{_docdir}/%{name}/html/*.md
1048
1049
1050 %files -n cargo
1051 %license src/tools/cargo/LICENSE-APACHE src/tools/cargo/LICENSE-MIT src/tools/cargo/LICENSE-THIRD-PARTY
1052 %doc src/tools/cargo/README.md
1053 %{_bindir}/cargo
1054 %{_libexecdir}/cargo*
1055 %{_mandir}/man1/cargo*.1*
1056 %{_sysconfdir}/bash_completion.d/cargo
1057 %{_datadir}/zsh/site-functions/_cargo
1058 %dir %{_datadir}/cargo
1059 %dir %{_datadir}/cargo/registry
1060
1061
1062 %files -n cargo-doc
1063 %docdir %{_docdir}/cargo
1064 %dir %{_docdir}/cargo
1065 %{_docdir}/cargo/html
1066
1067
1068 %files -n rustfmt
1069 %{_bindir}/rustfmt
1070 %{_bindir}/cargo-fmt
1071 %doc src/tools/rustfmt/{README,CHANGELOG,Configurations}.md
1072 %license src/tools/rustfmt/LICENSE-{APACHE,MIT}
1073
1074
1075 %files -n rls
1076 %{_bindir}/rls
1077 %doc src/tools/rls/{README.md,COPYRIGHT,debugging.md}
1078 %license src/tools/rls/LICENSE-{APACHE,MIT}
1079
1080
1081 %files -n clippy
1082 %{_bindir}/cargo-clippy
1083 %{_bindir}/clippy-driver
1084 %doc src/tools/clippy/{README.md,CHANGELOG.md}
1085 %license src/tools/clippy/LICENSE-{APACHE,MIT}
1086
1087
1088 %files src
1089 %dir %{rustlibdir}
1090 %{rustlibdir}/src
1091
1092
1093 %files analysis
1094 %{rustlibdir}/%{rust_triple}/analysis/
1095 %if %defined bootstrap_build_arch
1096 %{rustlibdir}/%{target_triple}/analysis/
1097 %endif
1098
1099
1100 %if 0%{?rhel} && 0%{?rhel} >= 8
1101 %files toolset
1102 %{rpmmacrodir}/macros.rust-toolset
1103 %endif

  ViewVC Help
Powered by ViewVC 1.1.30