Ignore:
Timestamp:
10/28/2022 06:46:11 PM (18 months ago)
Author:
David Bryant <davidbryant@…>
Branches:
11.3, 11.3-rc1, 12.0, 12.0-rc1, 12.1, 12.1-rc1, bdubbs/gcc13, multilib, renodr/libudev-from-systemd, trunk, xry111/arm64, xry111/arm64-12.0, xry111/clfs-ng, xry111/loongarch, xry111/loongarch-12.0, xry111/loongarch-12.1, xry111/mips64el, xry111/pip3, xry111/update-glibc
Children:
019499e, 981e0c4
Parents:
4e26453
Message:

Orthography: spell cross-compile and its derived forms consistently.
Add some paragraph breaks to enhance readability. Correct English idiom
here and there. Capitalize titles consistently, fix punctuation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • part3intro/toolchaintechnotes.xml

    r4e26453 rc389124  
    4141      <para>
    4242        The LFS book is not (and does not contain) a general tutorial to
    43         build a cross (or native) toolchain. Don't use the commands in the
    44         book for a cross toolchain for some purpose other
     43        build a cross- (or native) toolchain. Don't use the commands in the
     44        book for a cross-toolchain for some purpose other
    4545        than building LFS, unless you really understand what you are doing.
    4646      </para>
     
    7575
    7676    <para>As an example, let us imagine the following scenario (sometimes
    77     referred to as <quote>Canadian Cross</quote>): we have a
     77    referred to as <quote>Canadian Cross</quote>). We have a
    7878    compiler on a slow machine only, let's call it machine A, and the compiler
    7979    ccA. We also have a fast machine (B), but no compiler for (B), and we
     
    146146
    147147    <note>
    148       <para>All packages involved with cross compilation in the book use an
     148      <para>All the packages involved with cross-compilation use an
    149149      autoconf-based building system.  The autoconf-based building system
    150150      accepts system types in the form cpu-vendor-kernel-os,
    151       referred to as the system triplet.  Since the vendor field is mostly
    152       irrelevant, autoconf allows to omit it. An astute reader may wonder
     151      referred to as the system triplet.  Since the vendor field is often
     152      irrelevant, autoconf lets you omit it.</para>
     153     
     154      <para>An astute reader may wonder
    153155      why a <quote>triplet</quote> refers to a four component name. The
    154       reason is the kernel field and the os field originated from one
     156      kernel field and the os field began as a single
    155157      <quote>system</quote> field.  Such a three-field form is still valid
    156       today for some systems, for example
    157       <literal>x86_64-unknown-freebsd</literal>.  But for other systems,
    158       two systems can share the same kernel but still be too different to
    159       use a same triplet for them.  For example, an Android running on a
     158      today for some systems, for example,
     159      <literal>x86_64-unknown-freebsd</literal>.  But
     160      two systems can share the same kernel and still be too different to
     161      use the same triplet to describe them.  For example, Android running on a
    160162      mobile phone is completely different from Ubuntu running on an ARM64
    161       server, despite they are running on the same type of CPU (ARM64) and
    162       using the same kernel (Linux).
    163       Without an emulation layer, you cannot run an
    164       executable for the server on the mobile phone or vice versa.  So the
    165       <quote>system</quote> field is separated into kernel and os fields to
    166       designate these systems unambiguously.  For our example, the Android
     163      server, even though they are both running on the same type of CPU (ARM64) and
     164      using the same kernel (Linux).</para>
     165     
     166      <para>Without an emulation layer, you cannot run an
     167      executable for a server on a mobile phone or vice versa.  So the
     168      <quote>system</quote> field has been divided into kernel and os fields, to
     169      designate these systems unambiguously.  In our example, the Android
    167170      system is designated <literal>aarch64-unknown-linux-android</literal>,
    168171      and the Ubuntu system is designated
    169       <literal>aarch64-unknown-linux-gnu</literal>.  The word
    170       <quote>triplet</quote> remained. A simple way to determine your
     172      <literal>aarch64-unknown-linux-gnu</literal>.</para>
     173     
     174      <para>The word <quote>triplet</quote> remains embedded in the lexicon. A simple way to determine your
    171175      system triplet is to run the <command>config.guess</command>
    172176      script that comes with the source for many packages. Unpack the binutils
    173       sources and run the script: <userinput>./config.guess</userinput> and note
     177      sources, run the script <userinput>./config.guess</userinput>, and note
    174178      the output. For example, for a 32-bit Intel processor the
    175179      output will be <emphasis>i686-pc-linux-gnu</emphasis>. On a 64-bit
     
    194198    </note>
    195199
    196     <para>In order to fake a cross compilation in LFS, the name of the host triplet
     200    <para>In order to fake a cross-compilation in LFS, the name of the host triplet
    197201    is slightly adjusted by changing the &quot;vendor&quot; field in the
    198202    <envar>LFS_TGT</envar> variable so it says &quot;lfs&quot;. We also use the
    199     <parameter>--with-sysroot</parameter> option when building the cross linker and
    200     cross compiler to tell them where to find the needed host files. This
     203    <parameter>--with-sysroot</parameter> option when building the cross-linker and
     204    cross-compiler to tell them where to find the needed host files. This
    201205    ensures that none of the other programs built in <xref
    202206    linkend="chapter-temporary-tools"/> can link to libraries on the build
     
    238242    just a compiler, but also defines a standard library. In this book, the
    239243    GNU C library, named glibc, is used (there is an alternative, &quot;musl&quot;). This library must
    240     be compiled for the LFS machine; that is, using the cross compiler cc1.
    241     But the compiler itself uses an internal library implementing complex
     244    be compiled for the LFS machine; that is, using the cross-compiler cc1.
     245    But the compiler itself uses an internal library providing complex
    242246    subroutines for functions not available in the assembler instruction set. This
    243247    internal library is named libgcc, and it must be linked to the glibc
    244     library to be fully functional! Furthermore, the standard library for
     248    library to be fully functional. Furthermore, the standard library for
    245249    C++ (libstdc++) must also be linked with glibc. The solution to this
    246250    chicken and egg problem is first to build a degraded cc1-based libgcc,
     
    250254    functionality of libgcc.</para>
    251255
    252     <para>This is not the end of the story: the upshot of the preceding
     256    <para>The upshot of the preceding
    253257    paragraph is that cc1 is unable to build a fully functional libstdc++, but
    254258    this is the only compiler available for building the C/C++ libraries
    255     during stage 2! Of course, the compiler built during stage 2, cc-lfs,
     259    during stage 2. Of course, the compiler built by stage 2, cc-lfs,
    256260    would be able to build those libraries, but (1) the build system of
    257     gcc does not know that it is usable on pc, and (2) using it on pc
     261    gcc does not know cc-lfs can run on pc, and (2) using cc-lfs on pc
    258262    would create a risk of linking to the pc libraries, since cc-lfs is a native
    259263    compiler. So we have to re-build libstdc++ later as a part of
    260264    gcc stage 2.</para>
    261265
    262     <para>In &ch-final; (or <quote>stage 3</quote>), all packages needed for
    263     the LFS system are built. Even if a package is already installed into
    264     the LFS system in a previous chapter, we still rebuild the package
    265     unless we are completely sure it's unnecessary.  The main reason for
    266     rebuilding these packages is to settle them down: if we reinstall a LFS
     266    <para>In &ch-final; (or <quote>stage 3</quote>), all the packages needed for
     267    the LFS system are built. Even if a package has already been installed into
     268    the LFS system in a previous chapter, we still rebuild the package.  The main reason for
     269    rebuilding these packages is to make them stable: if we reinstall a LFS
    267270    package on a complete LFS system, the installed content of the package
    268     should be same as the content of the same package installed in
     271    should be the same as the content of the same package when installed in
    269272    &ch-final;.  The temporary packages installed in &ch-tmp-cross; or
    270     &ch-tmp-chroot; cannot satisfy this expectation because some of them
    271     are built without optional dependencies installed, and autoconf cannot
    272     perform some feature checks in &ch-tmp-cross; because of cross
    273     compilation, causing the temporary packages to lack optional features
     273    &ch-tmp-chroot; cannot satisfy this requirement, because some of them
     274    are built without optional dependencies, and autoconf cannot
     275    perform some feature checks in &ch-tmp-cross; because of cross-compilation,
     276    causing the temporary packages to lack optional features,
    274277    or use suboptimal code routines. Additionally, a minor reason for
    275     rebuilding the packages is allowing to run the testsuite.</para>
     278    rebuilding the packages is to run the test suites.</para>
    276279
    277280  </sect2>
     
    279282  <sect2 id="other-details">
    280283
    281     <title>Other procedural details</title>
     284    <title>Other Procedural Details</title>
    282285
    283286    <para>The cross-compiler will be installed in a separate <filename
     
    301304    <command>ld</command> by passing it the <parameter>--verbose</parameter>
    302305    flag. For example, <command>$LFS_TGT-ld --verbose | grep SEARCH</command>
    303     will illustrate the current search paths and their order. Note that this
    304     example can be run as shown only while being user
     306    will illustrate the current search paths and their order. (Note that this
     307    example can be run as shown only while logged in as user
    305308    <systemitem class="username">lfs</systemitem>. If you come back to this
    306     page later, replace <command>$LFS_TGT-ld</command> with just
    307     <command>ld</command>.</para>
     309    page later, replace <command>$LFS_TGT-ld</command> with
     310    <command>ld</command>).</para>
    308311
    309312    <para>The next package installed is gcc. An example of what can be
     
    318321    operation of <command>gcc</command> itself, the same search paths are not
    319322    necessarily used. To find out which standard linker <command>gcc</command>
    320     will use, run: <command>$LFS_TGT-gcc -print-prog-name=ld</command>. Again,
    321     remove the <command>$LFS_TGT-</command> part if coming back to this
    322     later.</para>
     323    will use, run: <command>$LFS_TGT-gcc -print-prog-name=ld</command>. (Again,
     324    remove the <command>$LFS_TGT-</command> prefix if coming back to this
     325    later.)</para>
    323326
    324327    <para>Detailed information can be obtained from <command>gcc</command> by
     
    326329    a program. For example, <command>$LFS_TGT-gcc -v
    327330    <replaceable>example.c</replaceable></command> (or without <command>
    328     $LFS_TGT-</command> if coming back later to this) will show
     331    $LFS_TGT-</command> if coming back later) will show
    329332    detailed information about the preprocessor, compilation, and assembly
    330333    stages, including <command>gcc</command>'s search paths for included
    331334    headers and their order.</para>
    332335
    333     <para>Next installed are sanitized Linux API headers. These allow the
     336    <para>Next up: sanitized Linux API headers. These allow the
    334337    standard C library (glibc) to interface with features that the Linux
    335338    kernel will provide.</para>
    336339
    337     <para>The next package installed is glibc. The most important
     340    <para>Next comes glibc. The most important
    338341    considerations for building glibc are the compiler, binary tools, and
    339342    kernel headers. The compiler is generally not an issue since glibc will
    340343    always use the compiler relating to the <parameter>--host</parameter>
    341     parameter passed to its configure script; e.g. in our case, the compiler
     344    parameter passed to its configure script; e.g., in our case, the compiler
    342345    will be <command>$LFS_TGT-gcc</command>. The binary tools and kernel
    343346    headers can be a bit more complicated. Therefore, we take no risks and use
     
    351354    <parameter>-isystem</parameter> flags to control the compiler's include
    352355    search path. These items highlight an important aspect of the glibc
    353     package&mdash;it is very self-sufficient in terms of its build machinery
     356    package&mdash;it is very self-sufficient in terms of its build machinery,
    354357    and generally does not rely on toolchain defaults.</para>
    355358
    356359    <para>As mentioned above, the standard C++ library is compiled next, followed in
    357     <xref linkend="chapter-temporary-tools"/> by other programs that need
    358     to be cross compiled for breaking circular dependencies at build time.
     360    <xref linkend="chapter-temporary-tools"/> by other programs that must
     361    be cross-compiled to break circular dependencies at build time.
    359362    The install step of all those packages uses the
    360363    <envar>DESTDIR</envar> variable to force installation
     
    378381    core toolchain is self-contained and self-hosted. In
    379382    <xref linkend="chapter-building-system"/>, final versions of all the
    380     packages needed for a fully functional system are built, tested and
     383    packages needed for a fully functional system are built, tested, and
    381384    installed.</para>
    382385
Note: See TracChangeset for help on using the changeset viewer.