generalinstructions: Remove a false statement about "cp -R destroys symlink"
[lfs.git] / chapter02 / hostreqs.xml
blob7375ca327360514c682e7cdb6325862f4a065261
1 <?xml version="1.0" encoding="UTF-8"?>
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 ]>
8 <sect1 id="ch-partitioning-hostreqs" xreflabel="Host System Requirements">
9   <?dbhtml filename="hostreqs.html"?>
11   <title>Host System Requirements</title>
13   <sect2>
14      <title>Hardware</title>
16      <para>The LFS editors recommend that the system CPU have at least
17      four cores and that the system have at least 8 GB of memory. 
18      Older systems that do not meet these requirements will still work,
19      but the time to build packages will be significantly longer
20      than documented.
21   </para>
23   </sect2>
25   <sect2>
26      <title>Software</title>
28     <para>Your host system should have the following software with the
29     minimum versions indicated. This should not be an issue for most
30     modern Linux distributions. Also note that many distributions will
31     place software headers into separate packages, often in the form of
32     <literal><replaceable>&lt;package-name&gt;</replaceable>-devel</literal>
33     or
34     <literal><replaceable>&lt;package-name&gt;</replaceable>-dev</literal>.
35     Be sure to install those if your distribution provides them.</para>
37    <para>Earlier versions of the listed software packages may work, but have
38    not been tested.</para>
40   <itemizedlist spacing="compact">
42     <listitem>
43       <para><emphasis role="strong">Bash-3.2</emphasis> (/bin/sh
44       should be a symbolic or hard link to bash)</para>
45     </listitem>
47     <listitem>
48       <para><emphasis role="strong">Binutils-2.13.1</emphasis> (Versions
49       greater than &binutils-version; are not recommended as they have
50       not been tested)</para>
51     </listitem>
53     <listitem>
54       <para><emphasis role="strong">Bison-2.7</emphasis> (/usr/bin/yacc
55       should be a link to bison or a small script that executes bison)</para>
56     </listitem>
58     <!-- In Coreutils-8.1 the nproc program is added.  -->
59     <listitem>
60       <para><emphasis role="strong">Coreutils-8.1</emphasis></para>
61     </listitem>
63     <listitem>
64       <para><emphasis role="strong">Diffutils-2.8.1</emphasis></para>
65     </listitem>
67     <listitem>
68       <para><emphasis role="strong">Findutils-4.2.31</emphasis></para>
69     </listitem>
71     <listitem>
72       <para><emphasis role="strong">Gawk-4.0.1</emphasis> (/usr/bin/awk
73       should be a link to gawk)</para>
74     </listitem>
76     <listitem>
77       <!-- Pass 1 GCC FTBFS with GCC-5.1 because of
78            https://gcc.gnu.org/PR65801. -->
79       <para><emphasis role="strong">GCC-5.2</emphasis> including the C++
80       compiler, <command>g++</command> (Versions greater than &gcc-version; are
81       not recommended as they have not been tested). C and C++ standard
82       libraries (with headers) must also be present so the C++ compiler can
83       build hosted programs</para>
84     </listitem>
86     <listitem>
87       <para><emphasis role="strong">Grep-2.5.1a</emphasis></para>
88     </listitem>
90     <listitem>
91       <para><emphasis role="strong">Gzip-1.3.12</emphasis></para>
92     </listitem>
94     <listitem>
95       <para><emphasis role="strong">Linux Kernel-&min-kernel;</emphasis></para>
97       <para>The reason for the kernel version requirement is that we specify
98       that version when building <application>glibc</application> in
99       <xref linkend="chapter-cross-tools"/> and
100       <xref linkend="chapter-building-system"/>, so the workarounds for
101       older kernels are not enabled and the compiled
102       <application>glibc</application> is slightly faster and smaller.
103       As at Feb 2024, &min-kernel; is the oldest kernel release still
104       supported by the kernel developers.  Some kernel releases older than
105       &min-kernel; may be still supported by third-party teams, but they
106       are not considered official upstream kernel releases; read
107       <ulink url='https://kernel.org/category/releases.html'/> for the
108       details.</para>
110       <para>If the host kernel is earlier than &min-kernel; you will need to replace
111       the kernel with a more up-to-date version. There are two ways
112       you can go about this. First, see if your Linux vendor provides a &min-kernel;
113       or later kernel package. If so, you may wish to install it. If your
114       vendor doesn't offer an acceptable kernel package, or you would prefer not to
115       install it, you can compile a kernel yourself. Instructions for
116       compiling the kernel and configuring the boot loader (assuming the host
117       uses GRUB) are located in <xref linkend="chapter-bootable"/>.</para>
119       <para>We require the host kernel to support UNIX 98 pseudo terminal
120       (PTY).  It should be enabled on all desktop or server distros shipping
121       Linux &min-kernel; or a newer kernel. If you are building a custom
122       host kernel, ensure <option>CONFIG_UNIX98_PTYS</option> is set to
123       <literal>y</literal> in the kernel configuration.</para>
125     </listitem>
127     <listitem>
128       <para><emphasis role="strong">M4-1.4.10</emphasis></para>
129     </listitem>
131     <listitem>
132       <para><emphasis role="strong">Make-4.0</emphasis></para>
133     </listitem>
135     <listitem>
136       <para><emphasis role="strong">Patch-2.5.4</emphasis></para>
137     </listitem>
139     <listitem>
140       <para><emphasis role="strong">Perl-5.8.8</emphasis></para>
141     </listitem>
143     <listitem>
144       <para><emphasis role="strong">Python-3.4</emphasis></para>
145     </listitem>
147     <listitem>
148       <para><emphasis role="strong">Sed-4.1.5</emphasis></para>
149     </listitem>
151     <listitem>
152       <para><emphasis role="strong">Tar-1.22</emphasis></para>
153     </listitem>
155     <listitem>
156       <para><emphasis role="strong">Texinfo-5.0</emphasis></para>
157     </listitem>
159     <listitem>
160       <para><emphasis role="strong">Xz-5.0.0</emphasis></para>
161     </listitem>
163   </itemizedlist>
165   <important>
166     <para>Note that the symlinks mentioned above are required to build an LFS
167     system using the instructions contained within this book. Symlinks that
168     point to other software (such as dash, mawk, etc.) may work, but are not
169     tested or supported by the LFS development team, and may require either
170     deviation from the instructions or additional patches to some
171     packages.</para>
172   </important>
174   <!-- Use an empty sect2 element to prevent a pdf warning.  -->
175   <bridgehead renderas="sect2"
176               id="version-check"
177               xreflabel="Host System Requirements">
178   </bridgehead>
179   <!--<title> </title>-->
181   <para >To see whether your host system has all the appropriate versions, and
182   the ability to compile programs, run the following commands:</para>
184 <screen role="nodump"><?dbfo keep-together="auto"?><userinput>cat &gt; version-check.sh &lt;&lt; "EOF"
185 <literal>#!/bin/bash
186 # A script to list version numbers of critical development tools
188 # If you have tools installed in other directories, adjust PATH here AND
189 # in ~lfs/.bashrc (section 4.4) as well.
191 LC_ALL=C 
192 PATH=/usr/bin:/bin
194 bail() { echo "FATAL: $1"; exit 1; }
195 grep --version > /dev/null 2> /dev/null || bail "grep does not work"
196 sed '' /dev/null || bail "sed does not work"
197 sort   /dev/null || bail "sort does not work"
199 ver_check()
201    if ! type -p $2 &amp;>/dev/null
202    then 
203      echo "ERROR: Cannot find $2 ($1)"; return 1; 
204    fi
205    v=$($2 --version 2>&amp;1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
206    if printf '%s\n' $3 $v | sort --version-sort --check &amp;>/dev/null
207    then 
208      printf "OK:    %-9s %-6s >= $3\n" "$1" "$v"; return 0;
209    else 
210      printf "ERROR: %-9s is TOO OLD ($3 or later required)\n" "$1"; 
211      return 1; 
212    fi
215 ver_kernel()
217    kver=$(uname -r | grep -E -o '^[0-9\.]+')
218    if printf '%s\n' $1 $kver | sort --version-sort --check &amp;>/dev/null
219    then 
220      printf "OK:    Linux Kernel $kver >= $1\n"; return 0;
221    else 
222      printf "ERROR: Linux Kernel ($kver) is TOO OLD ($1 or later required)\n" "$kver"; 
223      return 1; 
224    fi
227 # Coreutils first because --version-sort needs Coreutils >= 7.0
228 ver_check Coreutils      sort     8.1 || bail "Coreutils too old, stop"
229 ver_check Bash           bash     3.2
230 ver_check Binutils       ld       2.13.1
231 ver_check Bison          bison    2.7
232 ver_check Diffutils      diff     2.8.1
233 ver_check Findutils      find     4.2.31
234 ver_check Gawk           gawk     4.0.1
235 ver_check GCC            gcc      5.2
236 ver_check "GCC (C++)"    g++      5.2
237 ver_check Grep           grep     2.5.1a
238 ver_check Gzip           gzip     1.3.12
239 ver_check M4             m4       1.4.10
240 ver_check Make           make     4.0
241 ver_check Patch          patch    2.5.4
242 ver_check Perl           perl     5.8.8
243 ver_check Python         python3  3.4
244 ver_check Sed            sed      4.1.5
245 ver_check Tar            tar      1.22
246 ver_check Texinfo        texi2any 5.0
247 ver_check Xz             xz       5.0.0
248 ver_kernel &min-kernel;
250 if mount | grep -q 'devpts on /dev/pts' &amp;&amp; [ -e /dev/ptmx ]
251 then echo "OK:    Linux Kernel supports UNIX 98 PTY";
252 else echo "ERROR: Linux Kernel does NOT support UNIX 98 PTY"; fi
254 alias_check() {
255    if $1 --version 2>&amp;1 | grep -qi $2
256    then printf "OK:    %-4s is $2\n" "$1";
257    else printf "ERROR: %-4s is NOT $2\n" "$1"; fi
259 echo "Aliases:"
260 alias_check awk GNU
261 alias_check yacc Bison
262 alias_check sh Bash
264 echo "Compiler check:"
265 if printf "int main(){}" | g++ -x c++ -
266 then echo "OK:    g++ works";
267 else echo "ERROR: g++ does NOT work"; fi
268 rm -f a.out
270 if [ "$(nproc)" = "" ]; then
271    echo "ERROR: nproc is not available or it produces empty output"
272 else
273    echo "OK: nproc reports $(nproc) logical cores are available"
274 fi</literal>
277 bash version-check.sh</userinput></screen>
279  </sect2>
280 </sect1>