source: general/prog/rust.xml@ 31ee0ed

10.0 10.1 11.0 11.1 11.2 11.3 12.0 12.1 8.4 9.0 9.1 bdubbs/svn kea ken/TL2024 ken/inkscape-core-mods ken/tuningfonts lazarus lxqt plabs/newcss plabs/python-mods python3.11 qt5new rahul/power-profiles-daemon renodr/vulkan-addition trunk upgradedb xry111/intltool xry111/llvm18 xry111/soup3 xry111/test-20220226 xry111/xf86-video-removal
Last change on this file since 31ee0ed was 1575ce1, checked in by Douglas R. Reno <renodr@…>, 5 years ago

Various build fixes, and add a command explanation to gnome-color-manager about the Exiv2 API changes.

git-svn-id: svn://svn.linuxfromscratch.org/BLFS/trunk/BOOK@20984 af4574ff-66df-0310-9fd7-8a98e5e911e0

  • Property mode set to 100644
File size: 17.3 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4 <!ENTITY % general-entities SYSTEM "../../general.ent">
5 %general-entities;
6
7 <!ENTITY rust-download-http "https://static.rust-lang.org/dist/rustc-&rust-version;-src.tar.gz">
8 <!ENTITY rust-download-ftp " ">
9 <!ENTITY rust-md5sum "6790c24fe5e8fb5a5f7efbfbcc6fea65">
10 <!ENTITY rust-size "101 MB">
11 <!ENTITY rust-buildsize "6.5 GB (679 MB installed) including 270MB of ~/.cargo files for the user building this (add 1.4GB if running the tests)">
12 <!ENTITY rust-time "27 SBU (add 13 SBU for tests, both with 4 processors)">
13]>
14
15<sect1 id="rust" xreflabel="rustc-&rust-version;">
16 <?dbhtml filename="rust.html"?>
17
18 <sect1info>
19 <othername>$LastChangedBy$</othername>
20 <date>$Date$</date>
21 </sect1info>
22
23 <title>Rustc-&rust-version;</title>
24
25 <indexterm zone="rust">
26 <primary sortas="a-rust">Rust</primary>
27 </indexterm>
28
29 <sect2 role="package">
30 <title>Introduction to Rust</title>
31
32 <para>
33 The <application>Rust</application> programming language is designed
34 to be a safe, concurrent, practical language.
35 </para>
36
37 <para>
38 As with many other programming languages, rustc (the rust compiler)
39 needs a binary from which to bootstrap. It will download a stage0 binary
40 and many cargo crates (these are actually .tar.gz source archives) at
41 the start of the build, so you cannot compile it without an internet
42 connection.
43 </para>
44
45 <para>
46 The current <application>rustbuild</application> build-system will use
47 all available processors, although it does not scale well and often falls
48 back to just using one core while waiting for a library to compile.
49 </para>
50
51 <para>
52 At the moment <application>Rust</application> does not provide any
53 guarantees of a stable ABI.
54 </para>
55
56 <note>
57 <para>
58 Rustc defaults to building for ALL supported architectures, using a
59 shipped copy of LLVM. In BLFS the build is only for the X86 architecture.
60 If you
61 intend to develop rust crates, this build may not be good enough for your
62 purposes.
63 </para>
64 <para>
65 Repeated builds of this package on the same machine show a wide range
66 of build times. Some of this might be due to variations in downloading
67 the required cargo files if they are not already present, but this does
68 not seem to adequately explain the variations.
69 </para>
70 <para>
71 Unusually, a DESTDIR-style method is being used to install this package.
72 This is because running the install as root not only downloads all of the
73 cargo files again (to <filename>/root/.cargo</filename>), it then spends
74 a very long time recompiling. Using this method saves a lot of time, at
75 the cost of extra disk space.
76 </para>
77 </note>
78
79 &lfs83_checked;
80
81 <bridgehead renderas="sect3">Package Information</bridgehead>
82 <itemizedlist spacing="compact">
83 <listitem>
84 <para>
85 Download (HTTP): <ulink url="&rust-download-http;"/>
86 </para>
87 </listitem>
88 <listitem>
89 <para>
90 Download (FTP): <ulink url="&rust-download-ftp;"/>
91 </para>
92 </listitem>
93 <listitem>
94 <para>
95 Download MD5 sum: &rust-md5sum;
96 </para>
97 </listitem>
98 <listitem>
99 <para>
100 Download size: &rust-size;
101 </para>
102 </listitem>
103 <listitem>
104 <para>
105 Estimated disk space required: &rust-buildsize;
106 </para>
107 </listitem>
108 <listitem>
109 <para>
110 Estimated build time: &rust-time;
111 </para>
112 </listitem>
113 </itemizedlist>
114
115 <bridgehead renderas="sect3">Rust Dependencies</bridgehead>
116
117 <bridgehead renderas="sect4">Required</bridgehead>
118 <para role="required">
119 <xref linkend="curl"/>,
120 <xref linkend="cmake"/>,
121 <xref linkend="libssh2"/>, and
122 <xref linkend="python2"/>
123 </para>
124
125 <bridgehead renderas="sect4">Recommended</bridgehead>
126 <para role="recommended">
127 <package>clang</package> from <xref linkend="llvm"/>
128 (built with -DLLVM_LINK_LLVM_DYLIB=ON)
129 </para>
130
131 <bridgehead renderas="sect4">Optional</bridgehead>
132 <para role="optional">
133 <xref linkend="gdb"/> (recommended if running the testsuite)
134 </para>
135
136 <para condition="html" role="usernotes">
137 User Notes: <ulink url="&blfs-wiki;/rust"/>
138 </para>
139 </sect2>
140
141 <sect2 role="installation">
142 <title>Installation of Rust</title>
143
144 <note>
145 <para>
146 This package is updated on a six-weekly release cycle. Because it is
147 such a large and slow package to build, and is at the moment only required
148 by five packages in this book, the BLFS editors take the view that it
149 should only be updated when that is necessary.
150 </para>
151 </note>
152
153 <para>
154 First create a suitable <filename>config.toml</filename> file
155 which will configure the build :
156 </para>
157
158<screen><userinput>cat &lt;&lt; EOF &gt; config.toml
159# see config.toml.example for more possible options
160[llvm]
161targets = "X86"
162
163# When using system llvm prefer shared libraries
164link-shared = true
165
166[build]
167# install cargo as well as rust
168extended = true
169
170[install]
171prefix = "/usr"
172docdir = "share/doc/rustc-&rust-version;"
173
174[rust]
175channel = "stable"
176rpath = false
177
178# BLFS does not install the FileCheck executable from llvm,
179# so disable codegen tests
180codegen-tests = false
181
182[target.x86_64-unknown-linux-gnu]
183# delete this *section* if you are not using system llvm.
184# NB the output of llvm-config (i.e. help options) may be
185# dumped to the screen when config.toml is parsed.
186llvm-config = "/usr/bin/llvm-config"
187
188EOF</userinput></screen>
189
190 <para>
191 Now install <application>Rust</application> by running the following
192 commands:
193 </para>
194
195<screen><userinput>export RUSTFLAGS="$RUSTFLAGS -C link-args=-lffi" &amp;&amp;
196./x.py build</userinput></screen>
197
198 <para>
199 The build will report it failed to compile <filename>miri</filename>
200 because of multiple potential crates for `log`, but that should be followed
201 by a message that the build completed successfully.
202 </para>
203
204 <caution>
205 <para>
206 On AMD Ryzen processors (family 17h), the non-optimized version of libstd
207 which is compiled at the start of the tests contains one or more opcodes
208 which are not implemented on this CPU family. These will be logged in the
209 <phrase revision="sysv">system log</phrase>
210 <phrase revision="systemd">systemd journal</phrase>
211 and will be followed a few minutes later by segmentation faults. Despite
212 that, the tests continue to run, apparently normally. But the system may
213 reboot before the tests have completed. The normal optimized libraries
214 run without this problem.
215 </para>
216 <para>
217 A mitigation is to install gdb
218 <!-- systemd apparently handles this with systemd-coredump -->
219 <phrase revision="sysv">and to run the tests with 'ulimit -C disabled'</phrase>
220 but this does not always prevent the system rebooting.
221 </para>
222 </caution>
223
224 <para>
225 To run the tests issue
226 <command>./x.py test --verbose --no-fail-fast | tee rustc-testlog</command>:
227 as with the build, that will use all available CPUs. This runs many suites
228 of tests (in an apparently random order), several will fail in BLFS:
229 compile-fail/issue-37131.rs require a thumbv6m-none-eabi compiler but the
230 BLFS build does not cater for
231 that, ui/issue-49851/compiler-builtins-error.rs and ui/issue-50993.rs (both
232 run twice) require a thumbv7em-none-eabihf compiler, and seven tests in
233 debuginfo-gdb will fail because gdb-8.1 changed the output format. If
234 <application>gdb</application> has not been installed, most of the gdb tests
235 will fail.
236 </para>
237
238 <para>
239 If you wish to look at the numbers for the results, you can find the total
240 number of tests which were considered by running:
241 </para>
242
243<screen><command>grep 'running .* tests' rustc-testlog | awk '{ sum += $2 } END { print sum }'</command></screen>
244
245 <para>
246 That should report 17101 tests. Similarly, the total tests which failed can
247 be found by running:
248 </para>
249
250<screen><command>grep '^test result:' rustc-testlog | awk '{ sum += $6 } END { print sum }'</command></screen>
251
252 <para>
253 And similarly for the tests which passed use $4, for those which were ignored
254 (i.e. skipped) use $8 (and $10 for 'measured', $12 for 'filtered out' but both
255 are probably zero). The breakdown does not match the overall total.
256 </para>
257
258 <para>
259 Still as your normal user, do a DESTDIR install:
260 </para>
261
262<screen><userinput>export LIBSSH2_SYS_USE_PKG_CONFIG=1 &amp;&amp;
263DESTDIR=${PWD}/install ./x.py install &amp;&amp;
264unset LIBSSH2_SYS_USE_PKG_CONFIG</userinput></screen>
265
266 <para>
267 Now, as the <systemitem class="username">root</systemitem> user
268 install the files from the DESTDIR:
269 </para>
270
271<screen role="root"><userinput>chown -R root:root install &amp;&amp;
272cp -a install/* /</userinput></screen>
273
274 </sect2>
275
276 <sect2 role="commands">
277 <title>Command Explanations</title>
278
279 <para>
280 <command>targets = "X86"</command>: this avoids building all the available
281 linux cross-compilers (Aarch64, MIPS, PowerPC, SystemZ, etc). Unfortunately,
282 rust insists on installing source files for these below
283 <filename class="directory">/usr/lib/rustlib/src</filename>.
284 </para>
285
286 <para>
287 <command>extended = true</command>: this installs Cargo alongside Rust.
288 </para>
289
290 <para>
291 <command>channel = "stable"</command>: this ensures only stable features
292 can be used, the default in <filename>config.toml</filename> is to use
293 development features, which is not appropriate for a released version.
294 </para>
295
296 <para>
297 <command>rpath = false</command>: by default, <command>rust</command> can
298 be run from where it was built, without being installed. That adds DT_RPATH
299 entries to all of the ELF files, which produces very messy output from
300 <command>ldd</command>, showing the libraries in the place they were built,
301 even if they have been deleted from there after the install.
302 </para>
303
304 <para>
305 <command>[target.x86_64-unknown-linux-gnu]</command>: the syntax of
306 <filename>config.toml</filename> requires an <literal>llvm-config</literal>
307 entry for each target for which system-llvm is to be used. Change the target
308 to <literal>[target.i686-unknown-linux-gnu]</literal> if you are building
309 on 32-bit x86. This whole section may be omitted if you wish to build
310 against the shipped llvm, or do not have clang, but the resulting build will
311 be larger and take longer.
312 </para>
313
314 <para>
315 <command>export RUSTFLAGS="$RUSTFLAGS -C link-args=-lffi"</command>:
316 This adds a link to libffi to any RUSTFLAGS you may already be passing
317 to the build. On some systems, linking fails to include libffi unless
318 this is used. The reason why this is needed is not clear.
319 </para>
320
321 <para>
322 <command>--verbose</command>: this switch can sometimes provide more
323 information about a test which fails.
324 </para>
325
326 <para>
327 <command>--no-fail-fast</command>: this switch ensures that the testsuite
328 will not stop at the first error.
329 </para>
330
331 <para>
332 <command>export LIBSSH2_SYS_USE_PKG_CONFIG=1</command>: On some systems,
333 cairo fails to link during the install because it cannot find libssh2.
334 This seems to fix it, but again the reason why the problem occurs is not
335 understood.
336 </para>
337
338 <para>
339 <command>DESTDIR=${PWD}/install ./x.py install</command>: This effects a
340 DESTDIR-style install in the source tree,creating an <filename
341 class="directory">install</filename> directory. Note that DESTDIR installs
342 need an absolute path, passing 'install' will not work.
343 </para>
344
345 <para>
346 <command>chown -R root:root install</command>: the DESTDIR install
347 was run by a regular user, who owns the files. For security, change their
348 owner before doing a simple copy to install them.
349 </para>
350
351 </sect2>
352
353 <sect2 role="content">
354 <title>Contents</title>
355
356 <segmentedlist>
357 <segtitle>Installed Programs</segtitle>
358 <segtitle>Installed Libraries</segtitle>
359 <segtitle>Installed Directories</segtitle>
360
361 <seglistitem>
362 <seg>
363 cargo-clippy, cargo-fmt, cargo, clippy-driver, rls, rust-gdb, rust-lldb, rustc, rustdoc, rustfmt.
364 </seg>
365 <seg>
366 Many lib*&lt;16-byte-hash&gt;.so libraries.
367 </seg>
368 <seg>
369 ~/.cargo,
370 /usr/lib/rustlib,
371 /usr/share/doc/rustc-&rust-version;, and
372 /usr/share/zsh/site-functions/
373 </seg>
374 </seglistitem>
375 </segmentedlist>
376
377 <variablelist>
378 <bridgehead renderas="sect3">Short Descriptions</bridgehead>
379 <?dbfo list-presentation="list"?>
380 <?dbhtml list-presentation="table"?>
381
382 <varlistentry id="cargo-clippy">
383 <term><command>cargo-clippy</command></term>
384 <listitem>
385 <para>
386 provides lint checks for a cargo package.
387 </para>
388 <indexterm zone="rust cargo-clippy">
389 <primary sortas="b-cargo-clippy">cargo-clippy</primary>
390 </indexterm>
391 </listitem>
392 </varlistentry>
393
394 <varlistentry id="cargo-fmt">
395 <term><command>cargo-fmt</command></term>
396 <listitem>
397 <para>
398 formats all bin and lib files of the current crate using
399 rustfmt.
400 </para>
401 <indexterm zone="rust cargo-fmt">
402 <primary sortas="b-cargo-fmt">cargo-fmt</primary>
403 </indexterm>
404 </listitem>
405 </varlistentry>
406
407 <varlistentry id="cargo">
408 <term><command>cargo</command></term>
409 <listitem>
410 <para>
411 is the Package Manager for Rust.
412 </para>
413 <indexterm zone="rust cargo">
414 <primary sortas="b-cargo">cargo</primary>
415 </indexterm>
416 </listitem>
417 </varlistentry>
418
419 <varlistentry id="clippy-driver">
420 <term><command>clippy-driver</command></term>
421 <listitem>
422 <para>
423 provides lint checks for Rust.
424 </para>
425 <indexterm zone="rust clippy-driver">
426 <primary sortas="b-clippy-driver">clippy-driver</primary>
427 </indexterm>
428 </listitem>
429 </varlistentry>
430
431 <varlistentry id="rls">
432 <term><command>rls</command></term>
433 <listitem>
434 <para>
435 is the Rust Language Server. This can run in the background to
436 provide IDEs, editors, and other tools with information about Rust
437 programs.
438 </para>
439 <indexterm zone="rust rls">
440 <primary sortas="b-rls">rls</primary>
441 </indexterm>
442 </listitem>
443 </varlistentry>
444
445 <varlistentry id="rust-gdb">
446 <term><command>rust-gdb</command></term>
447 <listitem>
448 <para>
449 is a wrapper script for gdb, pulling in Python
450 pretty-printing modules installed in <filename
451 class="directory">/usr/lib/rustlib/etc</filename>.
452 </para>
453 <indexterm zone="rust rust-gdb">
454 <primary sortas="b-rust-gdb">rust-gdb</primary>
455 </indexterm>
456 </listitem>
457 </varlistentry>
458
459 <varlistentry id="rust-lldb">
460 <term><command>rust-lldb</command></term>
461 <listitem>
462 <para>
463 is a wrapper script for LLDB (the LLVM debugger)
464 pulling in the Python pretty-printing modules.
465 </para>
466 <indexterm zone="rust rust-lldb">
467 <primary sortas="b-rust-lldb">rust=lldb</primary>
468 </indexterm>
469 </listitem>
470 </varlistentry>
471
472 <varlistentry id="rustc">
473 <term><command>rustc</command></term>
474 <listitem>
475 <para>
476 is the rust compiler.
477 </para>
478 <indexterm zone="rust rustc">
479 <primary sortas="b-rustc">rustc</primary>
480 </indexterm>
481 </listitem>
482 </varlistentry>
483
484 <varlistentry id="rustdoc">
485 <term><command>rustdoc</command></term>
486 <listitem>
487 <para>
488 generates documentation from rust source code.
489 </para>
490 <indexterm zone="rust rustdoc">
491 <primary sortas="b-rustdoc">rustdoc</primary>
492 </indexterm>
493 </listitem>
494 </varlistentry>
495
496 <varlistentry id="rustfmt">
497 <term><command>rustfmt</command></term>
498 <listitem>
499 <para>
500 formats rust code.
501 </para>
502 <indexterm zone="rust rustfmt">
503 <primary sortas="b-rustfmt">rustfmt</primary>
504 </indexterm>
505 </listitem>
506 </varlistentry>
507
508 <varlistentry id="libstd">
509 <term><filename class="libraryfile">libstd-&lt;16-byte-hash&gt;.so</filename></term>
510 <listitem>
511 <para>
512 is the Rust Standard Library, the foundation of portable Rust software.
513 </para>
514 <indexterm zone="rust libstd">
515 <primary sortas="c-libstd">libstd-&lt;16-byte-hash&gt;.so</primary>
516 </indexterm>
517 </listitem>
518 </varlistentry>
519 </variablelist>
520 </sect2>
521</sect1>
Note: See TracBrowser for help on using the repository browser.