From 2ba5a6520482cefbf53ab24fc8568c8a4fa3bd1c Mon Sep 17 00:00:00 2001 From: Jason Self Date: Thu, 14 Oct 2021 21:39:52 -0700 Subject: [PATCH] Import GNU/Linux-libre from source code from https://cjarry.org/gnu-linux/gllfsc/ --- fdl.txt | 451 ++++ gllfsc-loongson2f-1.0.texi | 4793 +++++++++++++++++++++++++++++++++ gllfsc-loongson3a-1.0.texi | 4299 +++++++++++++++++++++++++++++ gllfsc-pentium4-1.7.texi | 5233 ++++++++++++++++++++++++++++++++++++ gpl.txt | 674 +++++ 5 files changed, 15450 insertions(+) create mode 100644 fdl.txt create mode 100644 gllfsc-loongson2f-1.0.texi create mode 100644 gllfsc-loongson3a-1.0.texi create mode 100644 gllfsc-pentium4-1.7.texi create mode 100644 gpl.txt diff --git a/fdl.txt b/fdl.txt new file mode 100644 index 0000000..bf128be --- /dev/null +++ b/fdl.txt @@ -0,0 +1,451 @@ + + GNU Free Documentation License + Version 1.3, 3 November 2008 + + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The "publisher" means any person or entity that distributes copies of +the Document to the public. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +https://www.gnu.org/licenses/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +11. RELICENSING + +"Massive Multiauthor Collaboration Site" (or "MMC Site") means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +"Massive Multiauthor Collaboration" (or "MMC") contained in the site +means any set of copyrightable works thus published on the MMC site. + +"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +"Incorporate" means to publish or republish a Document, in whole or in +part, as part of another Document. + +An MMC is "eligible for relicensing" if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/gllfsc-loongson2f-1.0.texi b/gllfsc-loongson2f-1.0.texi new file mode 100644 index 0000000..05229ed --- /dev/null +++ b/gllfsc-loongson2f-1.0.texi @@ -0,0 +1,4793 @@ +\input texinfo +@c -*-texinfo-*- +@c %**start of header +@setfilename gllfsc-loongson2f-1.0.info +@settitle GNU/Linux-libre from source code +@c Comment the following if you want Letter format instead of A4 for +@c PDF output +@afourpaper +@c %**end of header +@c Book headers for PDF version +@setchapternewpage odd +@c To support Haiyong Sun's ideograms +@documentencoding UTF-8 + +@copying +This is edition 1.0 (last updated 14 October 2012) of +@cite{GNU/Linux-libre from source code for Loongson 2F}. + +Copyright @copyright{} 2012 Christophe Jarry. + +This document is based on the Chinese page +@url{http://zdbr.net.cn/download/Loongson64-@/2.0.htm}, which is +copyright @copyright{} 2009 +@c Because TeX does not handle Chinese fonts automatically, we need to +@c do the following: +@ifnottex +Haiyong Sun (孙海勇). +@end ifnottex +@iftex +Haiyong Sun. +@end iftex +His blog is on @url{http://youbest.cublog.cn}. + +Various formats of this manual as well as its texinfo source are +available on +@uref{http://cjarry.org/gnu-linux/gllfsc/}. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +Texts. A copy of the license is included in the section entitled ``GNU +Free Documentation License''. +@end quotation + +@quotation +Computer instructions in this manual are free software: you can +redistribute them and/or modify them under the terms of the GNU +General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later +version. + +Those instructions are distributed in the hope that they will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this manual. If not, see . +@end quotation + +@end copying + +@c @setchapternewpage odd + +@titlepage +@title GNU/Linux-libre from source code +@subtitle for Loongson 2F +@c @subtitle SUBTITLE-IF-ANY +@c @subtitle SECOND-SUBTITLE +@author Christophe Jarry +@c @author Haiyong Sun (original author) + +@c The following two commands +@c start the copyright page. +@page +@vskip 0pt plus 1filll +@insertcopying + +@c Published by ... +@end titlepage + +@c Short table of contents +@shortcontents + +@c So the toc is printed at the start. +@contents + +@ifnottex +@node Top +@top GNU/Linux-libre from source code for Loongson 2F + +This manual describes how to build a GNU/Linux-libre system from +source for Loongson 2F processor. + +@insertcopying +@end ifnottex + +@menu +* Introduction:: What this document is all about. +* Prerequisites:: Useful knowledge before proceeding. +* Preliminary Work:: Preparing the build. +* Building the Cross-Compilation Toolchain:: Building the cross- + compilation Toolchain. +* Building Cross-Compilation Tools:: Building the cross-compilation + Tools. +* Building the Target System:: How to build the target system. +* Configuration Files:: Creating configuration files + needed by the new system. +* End:: Final things to do. +* Further Readings:: Websites useful to know more. +* GNU Free Documentation License:: Your rights and freedoms with the + text. +* GNU General Public License:: Your rights and freedoms with the + commands. +@end menu + + +@node Introduction +@chapter Introduction + +@menu +* GNU/Linux History:: A brief history of GNU/Linux. +* Purpose of this Document:: What this document is all about. +@end menu + + +@node GNU/Linux History +@section GNU/Linux History + +@menu +* GNU:: Presentation of the GNU project +* HURD:: Presentation of the HURD +* Linux:: Presentation of the kernel Linux +* Linux-libre:: Presentation of the kernel Linux-libre +* References:: Where to get more information +@end menu + +@node GNU +@subsection GNU + +@acronym{GNU} (GNU's Not Unix) is a project launched by Richard +Stallman in 1984 with the goal of building an entirely free operating +system compatible with Unix@footnote{See +@uref{http://en.wikipedia.org/wiki/Unix}}. ``Free'' here means ``free +as in freedom''. In this context, a free operating system is an +operating system you can use and share in freedom. A core part of his +motivation is given in the GNU +Manifesto@footnote{@uref{http://www.gnu.org/gnu/manifesto.html}}: + +@quotation +I consider that the Golden Rule requires that if I like a program I +must share it with other people who like it. Software sellers want to +divide the users and conquer them, making each user agree not to share +with others. I refuse to break solidarity with other users in this +way. I cannot in good conscience sign a nondisclosure agreement or a +software license agreement. For years I worked within the Artificial +Intelligence Lab to resist such tendencies and other inhospitalities, +but eventually they had gone too far: I could not remain in an +institution where such things are done for me against my will. + +So that I can continue to use computers without dishonor, I have +decided to put together a sufficient body of free software so that I +will be able to get along without any software that is not free. I +have resigned from the AI Lab to deny MIT any legal excuse to prevent +me from giving GNU away. +@end quotation + +A program is free software if the program's user has the four +essential freedoms: + +@itemize +@item +The freedom to run the program, for any purpose (freedom 0). + +@item +The freedom to study how the program works, and change it so it does +her computing as she wishes (freedom 1). Access to the source code is +a precondition for this. + +@item +The freedom to redistribute copies so she can help her neighbor +(freedom 2). + +@item +The freedom to distribute copies of her modified versions to others +(freedom 3). By doing this she can give the whole community a chance +to benefit from her changes. Access to the source code is a +precondition for this. +@end itemize + +One of the most popular free software license is the GNU General +Public License (GNU +GPL@footnote{@uref{http://www.gnu.org/licenses/gpl.html}}). + +The free software movement is supported by the Free Software +Foundation (FSF@footnote{@uref{http://www.fsf.org}}). + + +@node HURD +@subsection HURD + +The @acronym{HURD} is an acronym for @acronym{HIRD} (HURD of +interfaces representing depth) of Unix-replacing daemons. It is the +GNU project's replacement for the Unix kernel. It is a collection of +servers that run on the Mach microkernel to implement file systems, +network protocols, file access control, and other features that are +implemented by the Unix kernel or similar kernels (such as Linux). + +The purpose of the GNU HURD is to improve the user's freedom on her +operating system by allowing her to either add or remove a feature of +the kernel on the fly. + +From early on, the HURD was developed to use GNU Mach as the +microkernel. This was a technical decision made by Richard Stallman, +who thought it would speed up the work by saving a large part of +it. He has admitted that he was wrong about that. + +Nevertheless, development of the HURD is increasingly attracting +developers and GNU/HURD systems exist and are usable. + + +@node Linux +@subsection Linux + +Linux is a monolithic kernel created by Linus Torvalds in 1991. Linus +Torvalds initially wrote a terminal emulator, which he used to access +the large UNIX servers of his university. He wrote the program +specifically for the hardware he was using and independent of an +operating system because he wanted to use the functions of his new PC +with an 80386 processor. This later became the kernel Linux. + +Initially, Torvalds first published the kernel Linux under its own +licence, which had a restriction on commercial activity. + +In the notes for the first release of the kernel Linux, Torvalds lists +the GNU software that is required to run Linux: + +@quotation +Sadly, a kernel by itself gets you nowhere. To get a working system +you need a shell, compilers, a library etc. [...] Most of the tools +used with linux are GNU software and are under the GNU copyleft. +@end quotation + +In 1992, he suggested releasing the kernel under the GNU General +Public License. He first announced this decision in the release notes +of version 0.12. In the middle of December 1992 he published version +0.99 using the GNU GPL. + +The kernel Linux is now a contribution of many professionals and +volonteers around the world. + + +@node Linux-libre +@subsection Linux-libre + +Linux, the kernel developed and distributed by Linus Torvalds et al, +contains non-Free Software@footnote{For more information about the +presence of proprietary firmware in the kernel Linux, read +@uref{http://www.fsfla.org/svnwiki/anuncio/2010-03-Linux-2.6.33-libre.en} +and +@uref{http://www.gnu.org/@/distros/free-system-distribution-guidelines.html#nonfree-firmware}.}, +i.e., software that does not respect your essential freedoms, and it +induces you to install additional non-Free Software that it doesn't +contain. + +GNU +Linux-libre@footnote{@uref{http://www.fsfla.org/svnwiki/selibre/linux-libre/index.en.html}} +is a project to maintain and publish 100% Free distributions of Linux, +suitable for use in Free System Distributions@footnote{For a full list +of free as in freedom GNU/Linux distributions, see +@uref{http://www.gnu.org/distros}.}, removing software that is +included without source code, with obfuscated or obscured source code, +under non-Free Software licenses, that do not permit you to change the +software so that it does what you wish, and that induces or requires +you to install additional pieces of non-Free Software. + + +@node References +@subsection References + +For more information on the GNU project and its relation with the +kernel Linux, you can read @uref{http://www.gnu.org/gnu/thegnuproject.html} +and @uref{http://www.gnu.org/gnu/gnu-linux-faq.html}. + +For more information on the history of the HURD, I recommend you to +read @uref{http://www.h-online.com/open/features/GNU-HURD-Altered-visions-and-lost-promise@/-1030942.html}. + +For more information on the HURD, read @uref{http://www.gnu.org/software/hurd}. + + +@node Purpose of this Document +@section Purpose of this Document + +I bought a Lemote Yeeloong 8101 in 2010 and used +gNewSense@footnote{@uref{http://www.gnewsense.org}} on it. After a +while, I wanted to use a faster and simpler operating system, but the +number of available GNU/Linux@footnote{Note: in this document, we use +the term ``GNU/Linux'' to name the entire system and ``Linux'' to name +the kernel. For more information, read +@uref{http://www.gnu.org/gnu/why-gnu-linux.html}.} distributions that +supported the mipsel architecture (Loongson 2F) were limited: only a +handful, from which only gNewSense committed to give its users full +freedom. Since then, another distribution called +Parabola@footnote{@uref{https://parabolagnulinux.org}} has been +developed: it is free as in freedom and supports the mips64el +architecture. + +I decided to build a GNU/Linux system from source code by +myself. Hopefully, I found a document in Chinese describing the +process of building a GNU/Linux system for Loongson processor: +@uref{http://zdbr.net.cn/download/Loongson64-2.0.htm}@footnote{At the +time of writing (september 2012), the site @uref{http://zdbr.net.cn/} +does not exist anymore. The author of this document was +@ifnottex +Haiyong Sun (孙海勇), +@end ifnottex +@iftex +Haiyong Sun, +@end iftex +and his (interesting) blog is on @uref{http://youbest.cublog.cn}.}. +The document was old (2009) but I updated succesfully most packages +from it, replaced Linux with Linux-libre and added some information I +felt was useful and it gave the document you are reading. + + +@node Prerequisites +@chapter Prerequisites + +@menu +* Definitions:: Definitions of important notions used to build the + system +* Commands:: Help on commands +@end menu + + +@node Definitions +@section Definitions + +@menu +* sysroot:: @option{sysroot} +* Toolchain:: What a Toolchain is. +* build host target:: Understanding the meaning of the + @option{build}-@option{host}-@option{target} + triplet. +* FHS:: The Filesystem Hierarchy Standard. +@end menu + + +@node sysroot +@subsection @option{sysroot} + +The traditional way of building a GNU/Linux operating system consists +on building a (cross-) compilation toolchain to build a temporary +operating system which in turn will be used to build the target +system@footnote{@xref{Further Readings} section for more +details}. This requires almost as much time to complete the temporary +system as to build the target one. Using sysroot resolves this +problem. + +From GCC installation manual, under Cross-Compiler-Specific Options: + +@table @code +@item --with-sysroot +@itemx --with-sysroot=@var{dir} +Tells GCC to consider @var{dir} as the root of a tree that contains (a +subset of) the root filesystem of the target operating system. Target +system headers, libraries and run-time object files will be searched +in there. More specifically, this acts as if +@option{--sysroot=@var{dir}} was added to the default options of the +built compiler. The specified directory is not copied into the +install tree, unlike the options @option{--with-headers} and +@option{--with-libs} that this option obsoletes. The default value, +in case @option{--with-sysroot} is not given an argument, is +@option{$@{gcc_tooldir@}/sys-root}. If the specified directory is a +subdirectory of @option{$@{exec_prefix@}}, then it will be found +relative to the GCC binaries if the installation tree is moved. + +This option affects the system root for the compiler used to build +target libraries (which runs on the build system) and the compiler +newly installed with @code{make install}; it does not affect the +compiler which is used to build GCC itself. +@end table + + +@node Toolchain +@subsection Toolchain + +According to +Wikipedia@footnote{@uref{http://www.wikipedia.org/wiki/Toolchain}}: + +@quotation +In software, a toolchain is the set of programming tools that are used +to create a product (typically another computer program or system of +programs). The tools may be used in a chain, so that the output of +each tool becomes the input for the next, but the term is used widely +to refer to any set of linked development tools. + +A simple software development toolchain consists of a text editor for +editing source code, a compiler and linker to transform the source +code into an executable program, libraries to provide interfaces to +the operating system, and a debugger. +@end quotation + + +@node build host target +@subsection @option{build}, @option{host} and @option{target} + +During a cross-compilation, @option{build} @option{host} and +@option{target} are among the most used options: understanding the +precise meaning of those parameters is very important. We could define +them thus: + +@itemize +@item @option{--build=@var{platform on which the program is +compiled}}, +@item @option{--host=@var{platform on which the program will run}}, +@item @option{--target=@var{platform for which the program will create +output}}. +@end itemize + +Let's use GCC as an example to explain the role of those three +parameters. + +During GCC compilation, we use: + +@samp{./configure --build=@var{build-platform} +--host=@var{host-platform} --target=@var{target-platform} [various +compilation parameters]} + +So in those configuration parameters: + +@itemize +@item +@option{--build} provides the name of the platform currently running. +If we were using an Intel Pentium processor to compile the system, our +@var{build-platform} would be something like @samp{i686-pc-linux-gnu}. + +If this parameter is not specified, it will be guessed automatically. + +@item +@option{--host} represents the type of machine we are going to run GCC +on after the compilation succeeds. During a cross-compilation this has +to be specified, because the current machine can not know which +architecture we wish to target. We want to produce executables to run +on @emph{Loongson}, but there is currently no way we can specify +@samp{Loongson} directly; because of this we specify +@samp{mips64el-unknown-linux-gnu}. + +@option{--host} can also be left unspecified, in that case, +@var{host-platform} would automatically define itself as +@var{build-platform}, but this is not cross-compilation anymore. + +@quotation Note +when @option{--build} and @option{--host} are different, configuration +files will maintain the cross-compilation mode. +@end quotation + +@item +@option{--target} defines the system for which compiler tools will +create output. + +@var{target-platform} parameter is useful only for a limited number of +programs. Although this parameter is often present when issuing +@samp{./configure --help}, hardly any packages will need it. + +This parameter is only useful for performing tasks with different +platforms; for instance, executable files compiled for different +platforms can have a totally different code. +@end itemize + +If we summarize, we have: + +@itemize +@item @var{build-platform}: automatically guessed from platform in +use; has to be specified if not guessed. + +@item @var{host-platform}: if unspecified, automatically equals +@var{build-platform}. When @var{build-platform} and +@var{host-platform} values are identical, it is a local compilation; +otherwise it is a cross-compilation. + +@item @var{target-platform}: defines the system for which compiler +tools will create output; it equals @var{host-platform} if +unspecified. GCC, binutils, and programs related to the platform's +instructions have this parameter; most programs do not use this +parameter. +@end itemize + + +@node FHS +@subsection FHS + +The Filesystem Hierarchy Standard (FHS) has been created to specify +the location and use of main directories on a GNU/Linux operating +system. Common commands, user data, libraries have to be put inside a +specific directory given in the standard. During the build process, +some commands are used to comply with FHS. + + +@node Commands +@section Commands + +In this document, because most commands are common for a regular Unix +user, only uncommon commands are explained in this document. If you do +not understand a command that is not explained, you can use the +documentation available on your computer; in a terminal, typing +@samp{man @var{command}} should give you enough information. For GNU +software, @samp{info @var{package}} can also give additional +information. + + +@node Preliminary Work +@chapter Preliminary Work + +@quotation Important +In order to complete the first steps of this chapter, you will need to +have root permissions. +@end quotation + +@menu +* Build Partition Creation:: Creating a partition for the build. +* Build User Creation:: Creating a user account dedicated to + the build. +* Work Directory Creation:: Creating the parent directory for the + build. +* Partition Mount:: Mounting the partition dedicated to the + build. +* Useful Directories Creation:: Creating the directories for downloads + and compilations. +* User Switch:: Switching to the user dedicated to the + build. +* Environment Variables Setup:: Setting up the environment variables + of the target system. +* Downloads:: Downloading needed packages and + patches. +* Final Preparations:: Preparing the system for the build. +@end menu + + +@node Build Partition Creation +@section Build Partition Creation + +To dedicate the partition @file{/dev/sda4} to the system build, and to +define the filesystem to be used for it as @samp{ext3}: + +@verbatim +mke2fs -t ext3 /dev/sda4 +@end verbatim + +Option @option{-t} is followed by the type of filesystem to be +used. The filesystem @samp{ext3} is used as it is one of the most +common filesystem used with the kernel Linux. + + +@node Build User Creation +@section Build User Creation + +To create the builder group, user and password: + +@verbatim +groupadd gllfsc +useradd -s /bin/bash -g gllfsc -m -k /dev/null gllfsc +passwd gllfsc +@end verbatim + +@itemize +@item +Option @option{-s} (or @option{--shell}) is used to define the created +user's default shell, here @file{/bin/bash}. + +@item +Option @option{-g} (or @option{--gid}) is used to define the group +name or number of the created user's initial login group, here +@samp{gllfsc}. + +@item +Option @option{-m} (or @option{--create-home}) does create the user's +home directory if it does not exist (@file{/home/@var{username}}). + +@item +Option @option{-k} (or @option{--skel}) is used to define the skeleton +directory to be copied in the user's home directory, here +@file{/dev/null}. @file{/dev/null} is a special file which, in this +case, will give no skeleton at all to @command{useradd}. +@end itemize + + +@node Work Directory Creation +@section Work Directory Creation + +To create the directory @file{/gllfsc} in which the system will be +built: + +@verbatim +export TARGET_DIR="/gllfsc" +mkdir -pv ${TARGET_DIR} +@end verbatim + +@samp{export TARGET_DIR="/gllfsc"} sets the value of the variable +@env{TARGET_DIR} to @file{/gllfsc}, the directory in which the system +will be built. + + +@node Partition Mount +@section Mounting Partition + +To mount the hard drive partition, for instance @file{/dev/sda4}, used +to build the system: + +@verbatim +mount /dev/sda4 ${TARGET_DIR} +@end verbatim + + +@node Useful Directories Creation +@section Creating Compilation and Download Directories + +@verbatim +mkdir -pv ${TARGET_DIR}/{build,download} +chown -Rv gllfsc ${TARGET_DIR} +@end verbatim + + +@node User Switch +@section Switching to the Build User + +To login as the user that will build the system: + +@verbatim +su - gllfsc +@end verbatim + +With the command @command{su}, it is possible to change the user +ID. The option @option{-} provides an environment similar to what the +user would expect had the user logged in directly. + + +@node Environment Variables Setup +@section Setting up Required Environment Variables + +@file{~/.bash_profile} is a personal initialization file that is read +when Bash is invoked as an interactive login shell (@file{~} is the +location of the user's home directory). To write the content of the +file @file{~/.bash_profile}: + +@verbatim +cat > ~/.bash_profile << "EOF" +exec env -i HOME=${HOME} TERM=${TERM} PS1=${PS1} /bin/bash +EOF +@end verbatim + +The first line creates the file @file{~/.bash_profile} and opens it +for writing until @samp{@acronym{EOF}} (End Of File) is written in it. + +The second line tells Bash to execute @file{/bin/bash} with the option +@option{-i} (or @option{--ignore-environment}) which will make Bash +start with an empty environment. Variables @env{HOME}, @env{TERM} and +@env{PS1} define respectively the home directory of the current user, +the terminal used and the primary prompt string displayed. + +@file{~/.bashrc} is a personal initialization file that is read when +Bash is invoked as an interactive shell but not a login one. To write +the content of the file @file{~/.bashrc}: + +@verbatim +cat > ~/.bashrc << "EOF" +set +h +umask 022 +export PS1='\[\e[32m\]\A-\W\[\e[00m\]\$ ' +export TARGET_DIR=/gllfsc +export LC_ALL=POSIX +export BUILD_DIR="${TARGET_DIR}/build" +export DOWNLOAD_DIR="${TARGET_DIR}/download" +export CROSS_HOST="$(echo $MACHTYPE |\ + sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")" +export CROSS_TARGET="mips64el-unknown-linux-gnu" +#export MABI="n32" +export MABI="64" +#export MARCH="loongson2e" +export MARCH="loongson2f" +export PATH=${TARGET_DIR}/cross-tools/bin:/bin:/usr/bin +unset CFLAGS +unset CXXFLAGS +EOF +source ~/.bash_profile +@end verbatim + +@samp{set +h} tells Bash to not locate nor remember commands (hash) as +they are looked up for execution. + +@samp{umask 022} sets Bash process' file creation mask to +@samp{022}. This results in permissions of `755' for those files. + +@samp{export PS1='\[\e[32m\]\A-\W\[\e[00m\]\$ '} sets the primary +prompt strings. The primary prompt strings are the strings you see +before the commands you type in the terminal. The part @samp{\A-\W} +means that the time, in 24-hour HH:MM format and the basename of +@env{$PWD} will be displayed separated by a `-', as in +@samp{19:33-bin}. The part @samp{\$} adds a dollar sign at the end, +@samp{\[\e[32m\]} colors the strings in green and @samp{\[\e[00m\]} +gets the original color back. For other colors, you can browse +@uref{http://en.wikipedia.org/wiki/ANSI_escape_code}. + +@env{LC_ALL} is a macro used to define a single locale to overwrite +other @env{LC_*} and @env{LANG} environment variables so that +language, numeric values, time and other locale-dependant values have +all the same value. It is set to the standard POSIX locale. + +@samp{export BUILD_DIR="$@{TARGET_DIR@}/build"} sets the environment +variable @env{BUILD_DIR} to the value of @samp{$@{TARGET_DIR@}/build} +which is @samp{/gllfsc/build} in this document. + +The value of variable @env{CROSS_HOST} equals the value of variable +@env{MACHTYPE} of the current machine (for instance +@samp{i686-pc-linux-gnu}) modulo the second word, which is replaced by +@samp{cross} (i.e. @samp{i686-cross-linux-gnu}). + +The value of variable @env{CROSS_TARGET} equals the value of variable +@env{MACHTYPE} of the machine for which the system is built (i.e. +@samp{mips64el-unknown-linux-gnu}). + +The variable @env{MABI} defines the @acronym{ABI} (Application Binary +Interface) for which the system will be built. @option{-mabi} is an +option of GCC. n32/64 are for 64-bit CPUs only. 64 has 64-bit pointers +and long integers, whereas n32 has 32-bit pointers and long integers. + +The variable @env{MARCH} defines the architecture for which the system +will be built. @option{-march} is an option of @acronym{GCC} (GNU +Compiler Collection). + +The variable @env{PATH} contains a colon-separated list of directories +in which the shell looks for commands. The shell will first look for +commands in @file{$@{TARGET_DIR@}/cross-tools/bin}, then, if the +command was not found, in @file{/bin} and finally in @file{/usr/bin}. + +@command{unset} command removes the variable associated, here +@env{CFLAGS} and @env{CXXFLAGS}. Those variables are used by GCC as +extra flags given to the C compiler and the C++ compiler +respectively. + +Finally @samp{source ~/.bash_profile} reads and executes the content +of the file @file{~/.bash_profile}. + + +@node Downloads +@section Downloads + +@menu +* Packages Download:: List of packages to be downloaded. +* Patches Download:: List of patches to be downloaded. +@end menu + + +@node Packages Download +@subsection Downloading Packages + +The packages listed below are those used in this document. You can try +other versions but you will need a recent version of Binutils and the +kernel Linux in order to use the two options +@option{-mfix-loongson2f-nop} and +@option{-mfix-loongson2f-jump}. Those work around a problem related to +the Loongson2F architecture@footnote{For more information about the +issue, see +@uref{http://groups.google.com/group/loongson-dev/browse_thread/thread/d9103283141c00fb/e9a8830b01cc1913?hide_quotes=no#msg_d44adf83639fb0bd} +and @uref{http://sourceware.org/ml/binutils/2009-11/msg00387.html}.}. + +Download those files under @env{$@{DOWNLOAD_DIR@}} (which is +@file{/gllfsc/download} in this document). + + +@itemize +@item +Autoconf: @uref{http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz}. + +@item +Automake: @uref{http://ftpmirror.gnu.org/automake/automake-1.12.4.tar.gz}. + +@item +Bash: @uref{http://ftpmirror.gnu.org/bash/bash-4.2.tar.gz}. + +@item +Binutils: @uref{http://ftpmirror.gnu.org/binutils/binutils-2.22.tar.bz2}. + +@item +Bison: @uref{http://ftpmirror.gnu.org/bison/bison-2.5.tar.bz2}. + +@item +Bootscripts: @uref{http://ftp.cross-lfs.org/pub/clfs/conglomeration/bootscripts-@/cross-lfs/bootscripts-cross-lfs-1.2-pre11.tar.bz2}. +@c @uref{http://ftp.cross-lfs.org/pub/clfs/conglomeration/bootscripts@/-cross-lfs/bootscripts-cross-lfs-2.0-pre2.tar.xz}. + +@item +Bzip2: @uref{http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz}. + +@item +Coreutils: @uref{http://ftpmirror.gnu.org/coreutils/coreutils-8.19.tar.xz}. + +@item +DHCPCD: @uref{http://roy.marples.name/downloads/dhcpcd/dhcpcd-5.6.2.tar@/.bz2}. + +@item +Diffutils: @uref{http://ftpmirror.gnu.org/diffutils/diffutils-3.2.tar.gz}. + +@item +E2fsprogs: @uref{http://downloads.sourceforge.net/e2fsprogs/e2fsprogs-1.42.6.tar@/.gz}. + +@item +File: @uref{ftp://ftp.astron.com/pub/file/file-5.11.tar.gz}. + +@item +Findutils: @uref{http://ftpmirror.gnu.org/findutils/findutils-4.4.2.tar.gz}. + +@item +Flex: @uref{http://downloads.sourceforge.net/flex/flex-2.5.37.tar.bz2}. + +@item +Gawk: @uref{http://ftpmirror.gnu.org/gawk/gawk-4.0.1.tar.gz}. + +@item +GCC: @uref{http://ftpmirror.gnu.org/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2}. + +@item +Gettext: @uref{http://ftpmirror.gnu.org/gettext/gettext-0.18.1.1.tar.gz}. + +@item +Glibc: @uref{http://ftpmirror.gnu.org/glibc/glibc-2.13.tar.bz2}. +@c @uref{http://ftpmirror.gnu.org/glibc/glibc-2.16.0.tar.bz2}. +@c fails to generate localedef + +@item +Glibc-Ports: @uref{http://ftpmirror.gnu.org/glibc/glibc-ports-2.13.tar.bz2}. + +@item +Gmp: @uref{http://ftpmirror.gnu.org/gmp/gmp-5.0.5.tar.bz2}. + +@item +Grep: @uref{http://ftpmirror.gnu.org/grep/grep-2.14.tar.xz}. + +@item +Groff: @uref{http://ftpmirror.gnu.org/groff/groff-1.21.tar.gz}. + +@item +Gzip: @uref{http://ftpmirror.gnu.org/gzip/gzip-1.5.tar.gz}. + +@item +Iana-Etc: @uref{http://sethwklein.net/iana-etc-2.30.tar.bz2}. + +@item +Iputils: @uref{http://www.skbuff.net/iputils/iputils-s20071127.tar.bz2}. +@c @uref{http://www.skbuff.net/iputils/iputils-s20101006.tar.bz2}. +@c depends on sysfs headers. + +@item +Iproute2: @uref{http://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-3.5.1@/.tar.bz2} + +@item +Kbd: @uref{http://ftp.altlinux.org/pub/people/legion/kbd/kbd-1.15.3.tar.gz}. + +@item +Kmod: @uref{http://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-10.tar.gz}. + +@item +Less: @uref{http://www.greenwoodsoftware.com/less/less-451.tar.gz}. + +@item +Libtool: @uref{http://ftpmirror.gnu.org/libtool/libtool-2.4.tar.gz}. + +@item +Linux-Libre @footnote{The kernel Linux is shipped with proprietary +firmware. The version called Linux-Libre exists without them, it is +available for download at +@uref{http://www.fsfla.org/svnwiki/selibre/linux-libre/}.}: +@uref{http://linux-libre.fsfla.org/pub/linux-libre/releases/3.5.4-gnu@//linux-libre-3.5.4-gnu.tar.bz2}. + +@item +M4: @uref{http://ftpmirror.gnu.org/m4/m4-1.4.16.tar.bz2}. + +@item +Make: @uref{http://ftpmirror.gnu.org/make/make-3.82.tar.bz2}. + +@item +Man-Pages: @uref{http://www.kernel.org/pub/linux/docs/man-pages/Archive/man-pages-@/3.32.tar.bz2}. + +@item +Man: @uref{http://primates.ximian.com/~flucifredi/man/man-1.6g.tar.gz}. + +@item +Mpc: @uref{http://www.multiprecision.org/mpc/download/mpc-1.0.1.tar.gz}. + +@item +Mpfr: @uref{http://www.mpfr.org/mpfr-3.1.1/mpfr-3.1.1.tar.bz2}. + +@item +Nano: @uref{http://ftpmirror.gnu.org/nano/nano-2.3.1.tar.gz} + +@item +Ncurses: @uref{ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz}. + +@item +Patch: @uref{http://ftpmirror.gnu.org/patch/patch-2.7.1.tar.bz2}. + +@item +Procps: @uref{http://procps.sourceforge.net/procps-3.2.8.tar.gz}. + +@item +Psmisc: @uref{http://sourceforge.net/projects/psmisc/files/psmisc/psmisc-22.20.tar@/.gz/download}. + +@item +Readline: @uref{http://ftpmirror.gnu.org/readline/readline-6.2.tar.gz}. + +@item +Rsyslog: @uref{http://rsyslog.com/files/download/rsyslog/rsyslog-5.8.6.tar.gz}. + +@item +Sed: @uref{http://ftpmirror.gnu.org/sed/sed-4.2.1.tar.bz2}. + +@item +Shadow: @uref{http://pkg-shadow.alioth.debian.org/releases/shadow-4.1.4.3.tar.bz2}. +@c @uref{http://pkg-shadow.alioth.debian.org/releases/shadow-4.1.5.1.tar@/.bz2}. + +@item +Sysvinit: @uref{http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf@/.tar.bz2}. + +@item +Tar: @uref{http://ftpmirror.gnu.org/tar/tar-1.26.tar.bz2}. + +@item +Texinfo: @uref{http://ftpmirror.gnu.org/texinfo/texinfo-4.13a.tar.gz}. + +@item +Udev: @uref{ftp://ftp.kernel.org/pub/linux/utils/kernel/hotplug/udev-175.tar.gz}. +@c @uref{http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-182.tar.bz2}. +@c troubles with blkid + +@item +Util-Linux: @uref{http://www.kernel.org/pub/linux/utils/util-linux/v2.19/util-@/linux-2.19.1.tar.bz2}. +@c @uref{http://www.kernel.org/pub/linux/utils/util-linux/v2.22/util-linux-2.22.tar.bz2}. +@c requires PAM headers + +@item +XZ-Utils: @uref{http://tukaani.org/xz/xz-5.0.4.tar.bz2}. + +@item +Zlib: @uref{http://sourceforge.net/projects/libpng/files/zlib/1.2.7/zlib-1.2.7.tar@/.bz2/download}. +@end itemize + + +@node Patches Download +@subsection Downloading Patches + +Patches and configuration files location: + +@itemize +@item +@uref{http://cjarry.org/gnu-linux/gllfsc/gllfsc-loongson2f-1.0-@/patches.tar.gz}. After +having downloaded this file under @env{$@{DOWNLOAD_DIR@}}, execute +the following commands to extract its content: + +@verbatim +pushd ${DOWNLOAD_DIR} +tar xvf gllfsc-loongson2f-1.0-patches.tar.gz +popd +@end verbatim + + +@item +The page +@uref{http://microcai.gsalex.net/old/archives/2011/01/fbcon_UNICODE_font_support.html} +is useful for users who want support for @acronym{CJK} (Chinese +Japanese Korean) characters under the (non-graphical) terminal. It +gives access to a git@footnote{@uref{http://git-scm.com/}} repository +with kernel patches@footnote{The patches to use with version 3.5 of +the kernel are the first four on +@uref{http://repo.or.cz/w/linux-2.6/cjktty.git/shortlog/refs/heads/3.5-utf8}.} +that permit direct rendering of UTF-8 characters under the framebuffer +environment. Be aware though that applying those CJK patches to the +kernel may make characters that are both non-CJK and non-ASCII +unreadable (accented letters, cyrillic, etc.). + +@item +@uref{http://www.fsfla.org/svn/fsfla/software/linux-libre/lemote/gnewsense/tags/@/3.5.4-gnu_0loongsonlibre/100gnu+freedo.patch} +this patch adds a picture of a GNU beside Freedo, Freedo being the +mascot of Linux-Libre. The image can be seen on +@uref{http://www.fsfla.org/svnwiki/selibre/linux-libre/100gnu+freedo}. +@end itemize + + +@node Final Preparations +@section Final Preparations + +@menu +* Target Filesystem Hierarchy Creation:: Creating the directories of + the target system. +* Needed Files Creation:: Creating files for needed + user, groups and log. +@end menu + + +@node Target Filesystem Hierarchy Creation +@subsection Target Filesystem Hierarchy Creation + +@verbatim +pushd ${TARGET_DIR} +mkdir -pv bin boot dev {etc/,}opt home lib mnt +mkdir -pv proc media/{floppy,cdrom} sbin srv sys +mkdir -pv var/{lock,log,mail,run,spool} +mkdir -pv var/{opt,cache,lib/{misc,locate},local} +install -dv -m 0750 root +install -dv -m 1777 {var/,}tmp +mkdir -pv usr/{,local/}{bin,include,lib,sbin,src} +mkdir -pv usr/{,local/}share/{doc,info,locale,man} +mkdir -pv usr/{,local/}share/{misc,terminfo,zoneinfo} +mkdir -pv usr/{,local/}share/man/man{1..8} +for dir in usr{,/local}; do + ln -sv share/{man,doc,info} $dir +done +ln -svf lib lib64 +ln -svf lib lib32 +ln -svf lib usr/lib64 +ln -svf lib usr/lib32 +cd boot +ln -svf . boot +popd +@end verbatim + +The command @samp{install -dv -m 1777 @{var/,@}tmp} creates the +directories @file{var/tmp} and @file{tmp} with the permissions to +read, write and execute for everyone. The '1' in @samp{1777} is the +sticky bit which allows deletion of the file or directory having this +attribute only for the owner of the file or directory. + +The command @samp{ln -svf lib lib64} creates a symbolic link (option +@option{-s}) with the name @file{lib64} which will point to +@file{lib}. + + +@node Needed Files Creation +@subsection Creating needed user, groups and log files + +@verbatim +cat > ${TARGET_DIR}/etc/passwd << "EOF" +root::0:0:root:/root:/bin/bash +EOF +@end verbatim + +The file @file{/etc/passwd} contains one line for each user account, +with seven fields delimited by colons. These fields are: + +@itemize +@item +login name; + +@item +optional encrypted password; + +@item +numerical user ID; + +@item +numerical group ID; + +@item +user name or comment field; + +@item +user home directory; + +@item +optional user command interpreter. +@end itemize + + +@verbatim +cat > ${TARGET_DIR}/etc/group << "EOF" +root:x:0: +bin:x:1: +sys:x:2: +kmem:x:3: +tty:x:4: +tape:x:5: +daemon:x:6: +floppy:x:7: +disk:x:8: +lp:x:9: +dialout:x:10: +audio:x:11: +video:x:12: +utmp:x:13: +usb:x:14: +cdrom:x:15: +EOF +@end verbatim + +The file @file{/etc/group} is a text file which defines the groups on +the system. There is one entry per line, with the following format: +@samp{group_name:password:GID:user_list}. + + +@verbatim +touch ${TARGET_DIR}/var/run/utmp \ + ${TARGET_DIR}/var/log/{btmp,lastlog,wtmp} +chmod -v 664 ${TARGET_DIR}/var/run/utmp \ + ${TARGET_DIR}/var/log/lastlog +@end verbatim + + +@node Building the Cross-Compilation Toolchain +@chapter Building the Cross-Compilation Toolchain + +In this chapter, the cross-compilation toolchain is built as well as +core components of the target system. Those will then be used to build +the target system. + +@menu +* Target Linux-Header:: Linux-Header for target system. +* Cross Binutils:: Binutils for cross-compilation. +* Cross GCC:: GCC for cross-compilation (C support only). +* Target glibc:: glibc for target system. +* Cross GCC CXX:: GCC for cross-compilation (C and C++ support). +@end menu + + +@node Target Linux-Header +@section Target Linux-Header + +To build a GNU/Linux distribution for Loongson 2F without patch, you +need at least version 2.6.33 of the kernel Linux (-libre) as it +includes: basic CS5536 VSM support, CS5536 MFGPT timer support, CPU +frequency scaling support, suspend support framework, basic Loongson +2F support, support for GZIP / BZIP2 / LZMA compressed kernel images +@footnote{See @uref{http://kernelnewbies.org/Linux_2_6_33} for more +information.}. Moreover, version 2.6.35 and above include fixes for +Loongson2F processor @footnote{See +@uref{http://lwn.net/Articles/386986/} for more information.}. + +I chose version stable 3.5.4-gnu because it is from the stable branch, +it has been deblobed with the latest version of the deblob +script@footnote{@uref{http://linux-libre.fsfla.org/pub/linux-libre/releases/3.5.4-gnu/deblob-main}} +and because it is recent and as such it should include the most +complete support for Loongson 2F. + + +@verbatim +# 6 minutes +tar xf ${DOWNLOAD_DIR}/linux-libre-3.5.4-gnu.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/linux-3.5.4 +make mrproper +make ARCH=mips headers_check +make ARCH=mips INSTALL_HDR_PATH=dest headers_install +cp -rv dest/include/* ${TARGET_DIR}/usr/include +cd .. +rm -rf linux-3.5.4 +popd +@end verbatim + +@samp{6 minutes} is the time it takes to build the package on Lemote +Yeeloong with a Loongson 2F processor. + +The command @samp{make mrproper} cleans the sources. + +We need to specify @samp{ARCH=mips} as we are cross-compiling. + + +@node Cross Binutils +@section Cross Binutils + +GNU Binutils (GNU binary utilities) is a collection of programs for +manipulating binaries. + + +@verbatim +# 35 minutes +tar xf ${DOWNLOAD_DIR}/binutils-2.22.tar.bz2 -C ${BUILD_DIR} +pushd $BUILD_DIR/binutils-2.22 +mkdir -pv ../binutils-build +cd ../binutils-build +CC="gcc" AR="ar" \ + ../binutils-2.22/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --enable-64-bit-bfd \ + --with-sysroot=${TARGET_DIR} \ + --disable-nls \ + --enable-shared +make configure-host +make +make install +cp -v ../binutils-2.22/include/libiberty.h \ + ${TARGET_DIR}/usr/include +cd .. +rm -rf binutils-build +rm -rf binutils-2.22 +popd +@end verbatim + +@samp{CC="gcc"} and @samp{AR="ar"} are flags that tell the +@file{configure} script to use the local commands @command{gcc} as the +C compiler and @command{ar} as the program that handles archives. + +@option{--prefix=$@{TARGET_DIR@}/cross-tools} tells the configure +script to install architecture-independant files in +@file{$@{TARGET_DIR@}/cross-tools}. + +The option @option{--enable-64-bit-bfd} enables 64 bit for +@acronym{BFD} (the Binary File Descriptor). + +@option{--with-sysroot=@env{$@{TARGET_DIR@}}} tells Binutils to +consider @env{$@{TARGET_DIR@}} as the root of a tree that contains (a +subset of) the root filesystem of the target operating system. Target +system headers, libraries and run-time object files will be searched +in there. + +The @option{--enable-nls} option enables Native Language Support +(NLS), which lets Binutils output diagnostics in languages other than +American English. Native Language Support is enabled by default if not +doing a canadian cross build. The @option{--disable-nls} option +disables NLS. + +The option @option{--enable-shared} is used to build shared versions +of libraries, if shared libraries are supported on the target +platform. Use @option{--disable-shared} to build only static +libraries. + +@c cp -v ../binutils-2.22/include/libiberty.h \ +@c ${TARGET_DIR}/usr/include + + +@node Cross GCC +@section Cross GCC (C support only) + +GCC is the GNU compiler collection. It can compile many languages, of +which only C and C++ will be enabled in this document. + +In this section, we build a minimal GCC in order to build glibc. + +@quotation Warning +to build GMP (a GCC dependency), you need a version of GCC different +from 4.3.2 on you system@footnote{@uref{http://gmplib.org/#STATUS}}: +@end quotation + +@quotation +GCC 4.3.2 miscompiles GMP on 64-bit machines; please use a different +gcc version (e.g., gcc 4.3.1 and gcc 4.3.3 both work properly). We +have not been able to find any workaround for this gcc bug. +Unfortunately, Debian 5.0 has decided to stay with this trouble gcc +version, resulting in that many users strike this bug. +@end quotation + +I recommend installing @samp{gcc-4.4} on gNewSense Parkes to avoid +this issue. + +@verbatim +# 2 hours +tar xf ${DOWNLOAD_DIR}/gcc-4.7.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gcc-4.7.2 +tar xf ${DOWNLOAD_DIR}/gmp-5.0.5.tar.bz2 +mv gmp-5.0.5 gmp +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz +mv mpc-1.0.1 mpc +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.1.tar.bz2 +mv mpfr-3.1.1 mpfr +mkdir -pv ../gcc-build +cd ../gcc-build +../gcc-4.7.2/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --with-sysroot=${TARGET_DIR} \ + --disable-multilib \ + --with-newlib \ + --disable-nls \ + --disable-shared \ + --disable-threads \ + --enable-languages=c \ + --with-abi=${MABI} +make all-gcc +make all-target-libgcc +make install-gcc +make install-target-libgcc +cd .. +rm -r gcc-build +rm -r gcc-4.7.2 +popd +@end verbatim + +@option{--disable-multilib} specifies that multiple target libraries +to support different target variants@footnote{Such as different ABI, +for instance n32 and 64.}, calling conventions, etc@:. should not be +built. The default is to build a predefined set of them. + +@option{--with-newlib} specifies that @samp{newlib} is being used as +the target C library. + +@option{--disable-threads} specifies that threading support should be +disabled. + +@option{--enable-languages=c} specifies that only the C compiler and +its runtime libraries should be built. + +@c --with-abi=${MABI} + +GCC provides a low-level runtime library, @file{libgcc.a} or +@file{libgcc_s.so.1} on some platforms. GCC generates calls to +routines in this library automatically, whenever it needs to perform +some operation that is too complicated to emit inline code for. This +is built with @samp{make all-target-libgcc} and installed with +@samp{make install-target-libgcc} + + +@node Target glibc +@section Target glibc + +Glibc is the GNU C library. It provides macros, type definitions, and +functions for tasks like string handling, mathematical computations, +input/output processing, memory allocation and several other operating +system services. + +@verbatim +# 4 hours +tar xf ${DOWNLOAD_DIR}/glibc-2.13.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/glibc-2.13 +tar xf ${DOWNLOAD_DIR}/glibc-ports-2.13.tar.bz2 +mv -v glibc-ports-2.13 ports +#sed -i.orig "s/\ -lgcc_eh\|\ -lgcc_s//g" Makeconfig +patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.13-libgcc_eh.patch +patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.13-ldd-rewrite-script.patch +patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.13-localedef_segfault-1.patch +patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.13-cross_hacks-2.patch +echo "" > ports/sysdeps/mips/mips64/n64/Makefile +echo "" > ports/sysdeps/mips/mips64/n32/Makefile +echo "" > ports/sysdeps/mips/mips32/Makefile +sed -i "/default) machine=/s/n32/${MABI}/g" \ + ports/sysdeps/mips/preconfigure +mkdir -pv ../glibc-build +cd ../glibc-build + +cat > config.cache << EOF +libc_cv_c_cleanup=yes +libc_cv_slibdir=/lib +EOF + +cat > configparms << EOF +install_root=${TARGET_DIR} +libdir=/usr/lib +EOF + +BUILD_CC="gcc" \ + CC="${CROSS_TARGET}-gcc -march=${MARCH} -mabi=${MABI}" \ + AR="${CROSS_TARGET}-ar" \ + RANLIB="${CROSS_TARGET}-ranlib" \ + ../glibc-2.13/configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/glibc \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --disable-profile \ + --enable-add-ons \ + --with-tls \ + --enable-kernel=3.5.4 \ + --with-__thread \ + --with-binutils=${TARGET_DIR}/cross-tools/bin \ + --with-headers=${TARGET_DIR}/usr/include \ + --cache-file=config.cache +make +make install +make localedata/install-locales +cd .. +rm -rf glibc-build +rm -rf glibc-2.13 +popd + +cat > ${TARGET_DIR}/etc/nsswitch.conf << "EOF" +# Begin /etc/nsswitch.conf + +passwd: files +group: files +shadow: files + +hosts: files dns +networks: files + +protocols: files +services: files +ethers: files +rpc: files + +# End /etc/nsswitch.conf +EOF + +cp -v --remove-destination \ + ${TARGET_DIR}/usr/share/zoneinfo/Europe/Paris \ + ${TARGET_DIR}/etc/localtime + +cat > ${TARGET_DIR}/etc/ld.so.conf << "EOF" +# Begin /etc/ld.so.conf + +/usr/local/lib +/opt/lib + +# End /etc/ld.so.conf +EOF +@end verbatim + +@c @samp{sed -i.orig "s/\ -lgcc_eh\|\ -lgcc_s//g" Makeconfig} + +The patch @file{glibc-2.13-libgcc_eh.patch} is used in order not to +use library @samp{gcc_eh} to build @samp{libgcc_eh} and +@samp{static-gnulib} if current compiler does not have +@samp{libgcc_eh}. + +The patch @file{glibc-2.13-ldd-rewrite-script.patch} is used to fix a +bug in glibc when the configure script is called from a relative path. + +The patch @file{glibc-2.13-localedef_segfault-1.patch} is used to +overcome a segfault you may have when generating locales if you use +PaX. PaX is a patch for the kernel Linux that implements least +privilege protections for memory pages. + +The patch @file{glibc-2.13-cross_hacks-2.patch} is used specially to +build locales by cross-compilation. + +Glibc uses @samp{n32} ABI by default with MIPS. To use @env{MABI} +instead, we do the following: + +@verbatim +echo "" > ports/sysdeps/mips/mips64/n64/Makefile +echo "" > ports/sysdeps/mips/mips64/n32/Makefile +echo "" > ports/sysdeps/mips/mips32/Makefile +sed -i "/default) machine=/s/n32/${MABI}/g" \ + ports/sysdeps/mips/preconfigure +@end verbatim + +@ignore +Contents of the files above. + +cat mips64/n64/Makefile +# `long double' is a distinct type we support. +long-double-fcts = yes + +ifeq ($(filter -mabi=64,$(CC)),) +CC += -mabi=64 +endif + +cat mips64/n32/Makefile +# `long double' is a distinct type we support. +long-double-fcts = yes + +ifeq ($(filter -mabi=n32,$(CC)),) +CC += -mabi=n32 +endif + +cat mips32/Makefile +ifeq ($(filter -mabi=32,$(CC)),) +CC += -mabi=32 +endif + +grep 'default)' preconfigure + + default) machine=mips/mips64/n32 mips_config_abi=n32 ;; + +@end ignore + +The file @file{config.cache} is used to attribute values to variables +of the configure script. + +@samp{libc_cv_forced_unwind=yes} is used to avoid the error message +@samp{error: forced unwind support is required}. + +@samp{libc_cv_c_cleanup=yes} is used to avoid the error message +@samp{error: the compiler must support C cleanup handling}. + +@samp{libc_cv_slibdir=/lib} defines @file{/lib} as the directory in +which the C library of the target system will be installed, instead of +@file{/lib64} or @file{/lib32}. + +You can install glibc somewhere other than where you configured it to +go by setting the @code{install_root} variable on the command line for +@samp{make install}. The value of this variable is prepended to all +the paths for installation. This is useful when setting up a chroot +environment or preparing a binary distribution. The directory should +be specified with an absolute file name. + +Files listed in @samp{install-lib} are installed in the directory +specified by @samp{libdir} in @file{configparms} or @file{Makeconfig}. + +@verbatim +BUILD_CC="gcc" \ + CC="${CROSS_TARGET}-gcc -march=${MARCH} -mabi=${MABI}" \ + AR="${CROSS_TARGET}-ar" \ + RANLIB="${CROSS_TARGET}-ranlib" +@end verbatim + +@samp{CC="$@{CROSS_TARGET@}-gcc -march=$@{MARCH@} -mabi=$@{MABI@}"} +sets @code{CC} to the cross-compiler for the target's architecture, +processor and ABI we configured the library for. @code{AR} and +@code{RANLIB} are set to cross-compiling versions of @code{ar} and +@code{ranlib} as the native tools are not configured to work with +object files for the target we configured for. + +@option{--prefix=/usr} tells the @file{configure} script to install +glibc in the @file{/usr} directory of the target system. + +@c @option{--libexecdir=/usr/lib/glibc} tells the configure script to +@c install glibc executables inside @file{/usr/lib/glibc}. + +Unlike previous builds, @option{--host} now equals +@env{$@{CROSS_TARGET@}} instead of @env{$@{CROSS_HOST@}}. This is +because we are building the glibc version that the target system will +use. We won't have to build it later. + +Profiling can be of help to optimize a program by analysing memory +use, the usage of particular instructions, etc. Option +@option{--disable-profile} is used to disable this. + +Option @option{--enable-add-ons} is used to enable all the add-on +packages in the main source directory, which includes the glibc-ports +used to support the MIPS architecture. + +The option @option{--with-tls} tells the configure script to use +@acronym{TLS} (thread-local storage). Thread-local storage is a +computer programming method that uses memory local to a thread. + +The @samp{3.5.4} parameter given to option @option{--enable-kernel} +describes the smallest version of the Linux kernel the generated +library is expected to support. The higher the version number is, the +less compatibility code is added, and the faster the code gets. + +Option @option{--with-__thread} enables threads in glibc. + +The option @option{--with-binutils=$@{TARGET_DIR@}/cross-tools/bin} +tells the @file{configure} script to use the binutils (assembler and +linker) built in the cross-compilation toolchain process. + +@option{--with-headers=$@{TARGET_DIR@}/usr/include} indicates the +location of the kernel Linux' headers. + +@option{--cache-file=config.cache} specifies the file in which cache +variables are listed for @file{configure}. + +@samp{make localedata/install-locales} configures all locales that are +supported by glibc. + +The file @file{$@{TARGET_DIR@}/etc/nsswitch.conf} contains the +configuration of @acronym{NSS} (Name Service Switch). NSS is a facility +in Unix-like operating systems that provides a variety of sources for +common configuration databases and name resolution mechanisms. These +sources include local operating system files (such as +@file{/etc/passwd}, @file{/etc/group}, and @file{/etc/hosts}), the +Domain Name System (DNS), the Network Information Service (NIS), and +LDAP. + +The timezone is defined for `Paris'. + +@c Purpose of the file @file{$@{TARGET_DIR@}/etc/ld.so.conf} + + +@node Cross GCC CXX +@section Cross GCC (C and C++ support) + +In this section, we build a complete cross-compiler with support for C +and C++ languages. + +@verbatim +# 3 hours and 30 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gcc-4.7.2 +tar xf ${DOWNLOAD_DIR}/gmp-5.0.5.tar.bz2 +mv gmp-5.0.5 gmp +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz +mv mpc-1.0.1 mpc +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.1.tar.bz2 +mv mpfr-3.1.1 mpfr +mkdir -v ../gcc-build +cd ../gcc-build +../gcc-4.7.2/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --with-sysroot=${TARGET_DIR} \ + --disable-nls \ + --enable-shared \ + --enable-__cxa_atexit \ + --disable-multilib \ + --with-abi=${MABI} \ + --enable-c99 \ + --enable-long-long \ + --enable-threads=posix \ + --enable-languages=c,c++ +make +make install +cd .. +rm -rf gcc-build +rm -rf gcc-4.7.2 +popd +@end verbatim + +@option{--enable-__cxa_atexit} enables @code{__cxa_atexit}, rather +than @code{atexit}, to register C++ destructors for local statics and +global objects. This is essential for fully standards-compliant +handling of destructors, but requires @code{__cxa_atexit} in libc. + +@option{--enable-c99} enables support for the C99 standard. + +@option{--enable-long-long} enables support for @code{long long int} +types. + +@c @option{--enable-threads=posix} + + +@node Building Cross-Compilation Tools +@chapter Building the Cross-Compilation Tools + +@menu +* Cross File:: File for cross-compilation. +* Cross Groff:: Groff for cross-compilation. +* Cross Shadow:: Shadow for cross-compilation. +* Cross M4:: M4 for cross-compilation. +* Cross Ncurses:: Ncurses for cross-compilation. +* Cross Cleaning:: Cleaning up the cross-compilation toolchain. +@end menu + + +@node Cross File +@section File + +The command @command{file} is used to determine the type of a file: +text, executable or data. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/file-5.11.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/file-5.11 +./configure \ + --prefix=${TARGET_DIR}/cross-tools +make +make install +cd .. +rm -rf file-5.11 +popd +@end verbatim + + +@node Cross Groff +@section Groff + +Groff is the GNU version of the roff document formatting system which +is used to produce man pages. + +You need G++ on your system to compile this program from source. Under +gNewSense Parkes, try @samp{sudo apt-get install g++-4.4}. + +@ignore +@quotation Note +psselect (part of psutils) is needed for documentation in HTML (see +@uref{http://cblfs.cross-lfs.org/index.php/PSUtils}). +@end quotation +@end ignore + + +@verbatim +# 15 minutes +tar xf ${DOWNLOAD_DIR}/groff-1.21.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/groff-1.21 +PAGE=A4 \ + ./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --without-x +make +make install +cd .. +rm -rf groff-1.21 +popd +@end verbatim + +@samp{PAGE=A4} defines the default format of pages for printed output. + +@option{--without-x} disables the dependancy on the X window system. + + +@node Cross Shadow +@section Shadow + +The package contains programs to handle users, groups and passwords in +a secure way: passwords are encrypted. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/shadow-4.1.4.3.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/shadow-4.1.4.3 +patch -Np1 -i ${DOWNLOAD_DIR}/shadow-4.1.4.3-sysroot_hacks-1.patch +sed -i.orig \ + 's/bindir)\/\$\$i/bindir)\/mips64el-unknown-linux-gnu-\$\$i/' \ + src/Makefile.am +automake-1.11 +echo "shadow_cv_passwd_dir=${TARGET_DIR}/bin" > config.cache +echo "ac_cv_func_lckpwdf=no" >> config.cache +./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --sbindir=${TARGET_DIR}/cross-tools/bin \ + --sysconfdir=${TARGET_DIR}/etc \ + --disable-shared \ + --without-audit \ + --without-libpam \ + --without-selinux \ + --program-prefix=${CROSS_TARGET}- \ + --cache-file=config.cache +sed -i.orig "/PASSWD_PROGRAM/s/passwd/${CROSS_TARGET}-&/" config.h +make +make install +cd .. +rm -rf shadow-4.1.4.3 +popd +@end verbatim + +@c @samp{shadow_cv_passwd_dir=$@{TARGET_DIR@}/bin} +@c @samp{ac_cv_func_lckpwdf=no} + +The patch @file{shadow-4.1.4.3-sysroot_hacks-1.patch} is used so that +shadow can be built with the sysroot method. Because we use this +patch, @samp{shadow_cv_passwd_dir=$@{TARGET_DIR@}/bin} and +@samp{ac_cv_func_lckpwdf=no} have to be added in @file{config.cache} +in order for the @file{configure} script not to test the +functionalities associated. + +@c @option{--sbindir=$@{TARGET_DIR@}/cross-tools/bin} + +@c @option{--sysconfdir=$@{TARGET_DIR@}/etc} + +@option{--without-audit}, @option{--without-libpam} and +@option{--without-selinux} disable support for auditing, @acronym{PAM} +(Pluggable authentication modules) and @acronym{SELinux} +(Security-Enhanced Linux). We do not need those extra features. + +@option{--program-prefix=$@{CROSS_TARGET@}-} prepends the value of +@env{CROSS_TARGET} (that is @samp{mips64el-unknown-linux-gnu} in this +document) to installed program names for cross-compilation. + +@c @samp{sed -i.orig "/PASSWD_PROGRAM/s/passwd/$@{CROSS_TARGET@}-&/" +@c config.h} is used to avoid the error message + + +@node Cross M4 +@section Cross M4 + +Bison 2.5 requires M4 to be built. + +GNU M4 is a package containing an implementation of the m4 macro +language. GNU M4 is used in GNU Autoconf' @file{configure} files. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/m4-1.4.16.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/m4-1.4.16 +./configure \ + --prefix=${TARGET_DIR}/cross-tools +make +make install +cd .. +rm -rf m4-1.4.16 +popd +@end verbatim + + +@node Cross Ncurses +@section Ncurses + +GNU ncurses contains a library used to write text-based user +interfaces in a terminal-independent manner. + +@verbatim +# 15 minutes +tar xf ${DOWNLOAD_DIR}/ncurses-5.9.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/ncurses-5.9 +./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --without-shared +make -C include +make -C progs tic +install -m755 progs/tic ${TARGET_DIR}/cross-tools/bin +cd .. +rm -rf ncurses-5.9 +popd +@end verbatim + +@option{--without-shared} is used to avoid building the whole library +as only @command{tic} is installed. + + +@node Cross Cleaning +@section Cleaning up Cross-Compilation Toolchain + +In order to save some space, binaries and libraries of +cross-compilation tools can be stripped out. + +@quotation Warning +incorrect cleaning arguments used against library files can lead to +library files breaking. For this reason, be careful of the command +arguments. If you are not comfortable with this, you can skip this +section as it will have no effect on the process of building the +target system. +@end quotation + + +@verbatim +pushd ${TARGET_DIR}/cross-tools +strip --strip-all bin/* +strip --strip-debug lib/* +popd +@end verbatim + +@option{--strip-all} removes all symbols. This command reduces the +size of the @file{bin} directory's content from 29 MB to 12 MB. + +@option{--strip-debug} removes debugging symbols only. This command +reduces the size of the @file{lib} directory's content from 21 MB to +20 MB. + + +@node Building the Target System +@chapter Building the Target System + +After having set up the cross-compilation toolchain and tools, the +operating system for the target machine is built in this chapter. + +@menu +* Environment Setup:: Setting up the environment. +* Man Pages:: Building Man Pages. +* Zlib:: Building Zlib. +* Binutils:: Building Binutils. +* GMP:: Building GMP. +* MPFR:: Building MPFR. +* MPC:: Building MPC. +* GCC:: Building GCC. +* Sed:: Building Sed. +* E2fsprogs:: Building E2fsprogs. +* Coreutils:: Building Coreutils. +* iana-etc:: Building iana-etc. +* M4:: Building M4. +* Bison:: Building Bison. +* Ncurses:: Building Ncurses. +* Procps:: Building Procps. +* Libtool:: Building Libtool. +* Readline:: Building Readline. +* Autoconf:: Building Autoconf. +* Automake:: Building Automake. +* Bash:: Building Bash. +* Bzip2:: Building Bzip2. +* DHCPCD:: Building DHCPCD. +* Diffutils:: Building Diffutils. +* File:: Building File. +* Findutils:: Building Findutils. +* Flex:: Building Flex. +* Gawk:: Building Gawk. +* Gettext:: Building Gettext. +* Grep:: Building Grep. +* Groff:: Building Groff. +* Gzip:: Building Gzip. +@c * Sysfsutils:: Building Sysfsutils. +* IPutils:: Building IPutils. +* Iproute2:: Building Iproute2. +* Kbd:: Building Kbd. +* Kmod:: Building Kmod. +* Less:: Building Less. +* Make:: Building Make. +* Man:: Building Man. +* Nano:: Building Nano. +* Patch:: Building Patch. +* Psmisc:: Building Psmisc. +* Rsyslog:: Building Rsyslog. +* Shadow:: Building Shadow. +* Sysvinit:: Building Sysvinit. +* Tar:: Building Tar. +* Texinfo:: Building Texinfo. +* Udev:: Building Udev. +* Util-Linux:: Building Util-Linux. +@c * Emacs:: Building Emacs. +* XZ-Utils:: Building XZ-Utils. +* Bootscripts:: Building Bootscripts. +* Kernel:: Building the Kernel. +@end menu + + +@node Environment Setup +@section Setting up the Environment + +Because this chapter is about the build of the target system and not +the build of the cross-compilation toolchain and tools anymore, we +need to update some environment variables. + +For more convenience, we can set environment variables up in the +@file{~/.bashrc} file, so that this setup is preserved when logging +in: + + +@verbatim +cat >> ~/.bashrc << EOF +export CFLAGS="-Wa,-mfix-loongson2f-nop" +export CC="${CROSS_TARGET}-gcc -march=${MARCH} -mabi=${MABI}" +export CXX="${CROSS_TARGET}-g++ -march=${MARCH} -mabi=${MABI}" +export AR="${CROSS_TARGET}-ar" +export AS="${CROSS_TARGET}-as" +export RANLIB="${CROSS_TARGET}-ranlib" +export LD="${CROSS_TARGET}-ld" +export STRIP="${CROSS_TARGET}-strip" +EOF +source ~/.bash_profile +@end verbatim + +The variable @env{CFLAGS} is set to @option{-Wa,-mfix-loongson2f-nop} +in which @option{-Wa} is a GCC option used to pass +@option{-mfix-loongson2f-nop} to the assembler. This option replaces +@code{NOP}@footnote{See @uref{http://en.wikipedia.org/wiki/NOP} for +more information} by @code{or at,at,zero} to work around the +Loongson2F @code{NOP} errata. Without it, under extreme cases, CPU +might deadlock@footnote{For more information about the issue, see +@uref{http://groups.google.com/group/loongson-dev/browse_thread/thread/d9103283141c00fb/e9a8830b01cc1913?hide_quotes=no#msg_d44adf83639fb0bd} +and +@uref{http://sourceware.org/ml/binutils/2009-11/msg00387.html}.}. + +@env{CC} is the flag that indicates the C compiler to be used, +@env{CXX} the C++ compiler, @env{AR} the archiver, @env{AS} the +assembler, @env{RANLIB} the archives' index generator, @env{LD} the +linker and @env{STRIP} the program for stripping. + +All the programs to be used are prefixed with +@samp{$@{CROSS_TARGET@}-} in order to use the cross-compilation +toolchain instead of the toolchain of the host. + + +@node Man Pages +@section Man Pages + +The man-pages package documents the kernel Linux and C library's +interfaces that are used by user-space programs. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/man-pages-3.32.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/man-pages-3.32 +make prefix=${TARGET_DIR}/usr install +cd .. +rm -rf man-pages-3.32 +popd +@end verbatim + +The option @option{prefix=$@{TARGET_DIR@}/usr} is used to install the +man pages on the target partition's @env{TARGET_DIR} instead of the +@file{/usr} directory of the host. + + +@node Zlib +@section Zlib + +Zlib is a compression/decompression library. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/zlib-1.2.7.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/zlib-1.2.7 +./configure \ + --prefix=/usr +make AR="${AR}" +make prefix=${TARGET_DIR}/usr install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/lib/libz.so.* ${TARGET_DIR}/lib +#ln -svf ../../lib/libz.so.1 ${TARGET_DIR}/usr/lib/libz.so +cd .. +rm -rf zlib-1.2.7 +popd +@end verbatim + +In order to build zlib by cross-compilation, the flag @env{AR} has to +be equal to @samp{$@{AR@}}. + +@ignore +@samp{mv -v $@{TARGET_DIR@}/usr/lib/libz.so.* $@{TARGET_DIR@}/lib} and +@samp{ln -svf ../../lib/libz.so.1 $@{TARGET_DIR@}/usr/lib/libz.so} are +used to comply with the @acronym{FHS} (filesystem hierarchy standard). +@end ignore + + +@node Binutils +@section Binutils + +@verbatim +# 30 minutes +tar xf ${DOWNLOAD_DIR}/binutils-2.22.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/binutils-2.22 +mkdir -pv ../binutils-build +cd ../binutils-build +../binutils-2.22/configure \ + --prefix=/usr \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --target=${CROSS_TARGET} \ + --enable-64-bit-bfd \ + --enable-shared +make configure-host +make tooldir=/usr +make DESTDIR=${TARGET_DIR} tooldir=/usr install +cp -v ../binutils-2.22/include/libiberty.h ${TARGET_DIR}/usr/include +cd .. +rm -rf binutils-build +rm -rf binutils-2.22 +popd +@end verbatim + +The option @option{--host} is now set to @env{CROSS_TARGET} because +the host that will run this build will be the target system. + +@c @samp{make tooldir=/usr} +@c @samp{make DESTDIR=$@{TARGET_DIR@} tooldir=/usr install} + + +@node GMP +@section GMP + +@acronym{GMP} (GNU multiple precision arithmetic library) is required +to build GCC. + +@verbatim +# 20 minutes +tar xf ${DOWNLOAD_DIR}/gmp-5.0.5.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gmp-5.0.5 +./configure \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --enable-cxx \ + --enable-mpbsd +make +make DESTDIR=${TARGET_DIR} install +rm -v ${TARGET_DIR}/usr/lib/lib{gmp,gmpxx,mp}.la +cd .. +rm -rf gmp-5.0.5 +popd +@end verbatim + +The option @option{--enable-cxx} enables support for the C++ language. + +The Berkeley MP compatibility library (libmp) and header file +(@file{mp.h}) are built and installed if the option +@option{--enable-mpbsd} is used. + +The files @file{$@{TARGET_DIR@}/usr/lib/lib@{gmp,gmpxx,mp@}.la} are +removed to avoid the following error when building MPFR: +@samp{/usr/lib/libgmp.so: could not read symbols: File in wrong +format}. + + +@node MPFR +@section MPFR + +GNU @acronym{MPFR} (Multiple Precision Floating-Point Reliably) is a +portable C library for arbitrary-precision binary floating-point +computation with correct rounding. + +@verbatim +# 7 minutes +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.1.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/mpfr-3.1.1 +./configure \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +rm -v ${TARGET_DIR}/usr/lib/libmpfr.la +cd .. +rm -rf mpfr-3.1.1 +popd +@end verbatim + +The file @file{$@{TARGET_DIR@}/usr/lib/libmpfr.la} is removed to +avoid the following error when building MPC: +@samp{/usr/lib/libmpfr.so: could not read symbols: File in wrong +format}. + + +@node MPC +@section MPC + +GNU @acronym{MPC} (Multiple Precision Complex Library) is a C library +for the arithmetic of complex numbers with arbitrarily high precision +and correct rounding of the result. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/mpc-1.0.1 +./configure \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf mpc-1.0.1 +popd +@end verbatim + + +@node GCC +@section GCC + +@verbatim +# 3 hours and 30 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gcc-4.7.2 +sed -i.orig 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in +sed -i.orig 's@\./fixinc\.sh@-c true@' gcc/Makefile.in +mkdir -v ../gcc-build +cd ../gcc-build +../gcc-4.7.2/configure \ + --prefix=/usr \ + --libexecdir=/usr/lib \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --target=${CROSS_TARGET} \ + --enable-shared \ + --enable-threads=posix \ + --enable-__cxa_atexit \ + --enable-c99 \ + --enable-long-long \ + --disable-multilib \ + --with-abi=${MABI} \ + --enable-clocale=gnu \ + --enable-languages=c,c++ \ + --disable-libstdcxx-pch +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#ln -sv ../usr/bin/cpp ${TARGET_DIR}/lib +ln -sv gcc ${TARGET_DIR}/usr/bin/cc +cd .. +rm -rf gcc-build +rm -rf gcc-4.7.2 +popd +@end verbatim + +@ignore +# The following patch seems needless to me as it only replaces +# {usr,}/lib32 with {usr,}/lib64 and we already have: +# {usr,}/lib32 -> {usr,}/lib +# {usr,}/lib64 -> {usr,}/lib +#patch -Np1 -i ${DOWNLOAD_DIR}/gcc-4.6.0-pure64-1.patch +@end ignore + +@samp{sed -i.orig 's/install_to_$(INSTALL_DEST) //' +libiberty/Makefile.in} is used as we already installed the library +@file{libiberty.a} with Binutils. + +@c We use @samp{sed -i.orig 's@@\./fixinc\.sh@@-c true@@' +@c gcc/Makefile.in} to avoid using fixincludes that may output errors if +@c headers have been modified. + +Using @option{--enable-clocale=gnu} option ensures that the correct +locale will automatically be chosen. + +Option @option{--disable-libstdcxx-pch} disables support for +precompiled headers (PCH). + +@c ln -sv ../usr/bin/cpp ${TARGET_DIR}/lib FHS? + +The line @samp{ln -sv gcc $@{TARGET_DIR@}/usr/bin/cc} creates a +symbolic link @file{cc} that points on @file{gcc}. + + +@node Sed +@section Sed + +GNU sed is a stream editor: it is used to perform basic text +transformations on an input stream (a file or input from a pipeline). + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/sed-4.2.1.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/sed-4.2.1 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf sed-4.2.1 +popd +@end verbatim + +@c @option{--bindir=/bin} FHS? + + +@node E2fsprogs +@section E2fsprogs + +E2fsprogs is a package that contains tools to handle the ext2, ext3 +and ext4 filesystems. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/e2fsprogs-1.42.6.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/e2fsprogs-1.42.6 +mkdir -v build +cd build +../configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --with-root-prefix="" \ + --enable-elf-shlibs +make +make DESTDIR=${TARGET_DIR} install +make DESTDIR=${TARGET_DIR} install-libs +rm -v ${TARGET_DIR}/usr/lib/lib{blkid,com_err,e2p,ext2fs,ss,uuid}.so +ln -sv ../../lib/libblkid.so.1 ${TARGET_DIR}/usr/lib/libblkid.so +ln -sv ../../lib/libcom_err.so.2 ${TARGET_DIR}/usr/lib/libcom_err.so +ln -sv ../../lib/libe2p.so.2 ${TARGET_DIR}/usr/lib/libe2p.so +ln -sv ../../lib/libext2fs.so.2 ${TARGET_DIR}/usr/lib/libext2fs.so +ln -sv ../../lib/libss.so.2 ${TARGET_DIR}/usr/lib/libss.so +ln -sv ../../lib/libuuid.so.1 ${TARGET_DIR}/usr/lib/libuuid.so +cd ../.. +rm -rf e2fsprogs-1.42.6 +popd +@end verbatim + +@option{--with-root-prefix=""} is used to put e2fsprogs binaries +inside @file{/sbin} instead of @file{@var{PREFIX}/sbin} which would be +@file{/usr/sbin}. + +Option @option{--enable-elf-shlibs} enables e2fsprogs shared +libraries. + +@samp{make DESTDIR=$@{TARGET_DIR@} install-libs} is used to install +libraries, those are not installed with @samp{make +DESTDIR=$@{TARGET_DIR@} install}. + +The sequence of commands that follows first removes symbolic links +@file{$@{TARGET_DIR@}/usr/lib/lib@{@/blkid,com_err,e2p,ext2fs,ss,uuid@}.so} +which point on abolute paths +@file{/lib/lib@{blkid,com_err,e2p,ext2fs,ss,uuid@}.so}. In order to +use the libraries of the target operating system, we need to symlink +@file{$@{TARGET_DIR@}/usr/lib/lib@{blkid,com_err,e2p,ext2fs,ss,uuid@}.so} +to their relative paths files. + + +@node Coreutils +@section Coreutils + +GNU coreutils (core utilities) includes the standard programs for text +and file manipulation. + +On gNewSense Parkes, you need to install @file{xz-utils} to extract +the package. + +@verbatim +# 30 minutes +tar xf ${DOWNLOAD_DIR}/coreutils-8.19.tar.xz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/coreutils-8.19 +sed -i.orig '/strftime/s/\ LC_ALL//' man/help2man +cat > config.cache << EOF +fu_cv_sys_stat_statfs2_bsize=yes +gl_cv_func_mbrtowc_incomplete_state=yes +gl_cv_func_mbrtowc_nul_retval=yes +gl_cv_func_mbrtowc_null_arg=yes +gl_cv_func_mbrtowc_retval=yes +gl_cv_func_btowc_eof=yes +gl_cv_func_wcrtomb_retval=yes +gl_cv_func_wctob_works=yes +gl_cv_func_fstatat_zero_flag=yes +# From C[G]LFS: +#fu_cv_sys_stat_statfs2_bsize=yes +#gl_cv_func_working_mkstemp=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --enable-install-program=hostname \ + --enable-no-install-program=kill,uptime \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/{cat,chgrp,chmod,chown,cp,date} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/{dd,df,echo,false,hostname,ls,mkdir} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/{mv,pwd,rm,rmdir,stty,true,ln,uname} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/chroot ${TARGET_DIR}/usr/sbin +#mv -v ${TARGET_DIR}/usr/bin/{[,basename,head,install,nice} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/{readlink,sleep,sync,test,touch} \ +# ${TARGET_DIR}/bin +#ln -svf ../../bin/install ${TARGET_DIR}/usr/bin +cd .. +rm -rf coreutils-8.19 +popd +@end verbatim + +@c @samp{sed -i.orig '/strftime/s/\ LC_ALL//' man/help2man} + +The variables listed in the file @file{config.cache} are used in order +to avoid that the @file{configure} script evaluate their values: +otherwise the build may fail when cross-compiling. + +We use @option{--enable-install-program=hostname} to install the +command @command{hostname} which is not built by default. + +We use @option{--enable-no-install-program=kill,uptime} in order not +to install commands @command{kill} and @command{uptime}. Those +commands will be installed by the package procps. + +@ignore +@verbatim +mv -v ${TARGET_DIR}/usr/bin/{cat,chgrp,chmod,chown,cp,date} \ + ${TARGET_DIR}/bin +mv -v ${TARGET_DIR}/usr/bin/{dd,df,echo,false,hostname,ls,mkdir} \ + ${TARGET_DIR}/bin +mv -v ${TARGET_DIR}/usr/bin/{mv,pwd,rm,rmdir,stty,true,ln,uname} \ + ${TARGET_DIR}/bin +mv -v ${TARGET_DIR}/usr/bin/chroot ${TARGET_DIR}/usr/sbin +mv -v ${TARGET_DIR}/usr/bin/{[,basename,head,install,nice} \ + ${TARGET_DIR}/bin +mv -v ${TARGET_DIR}/usr/bin/{readlink,sleep,sync,test,touch} \ + ${TARGET_DIR}/bin +@end verbatim + +All programs of coreutils are moved from target system's +@file{/usr/bin} to @file{/bin} for consistency. +@end ignore + +@ignore +Because some programs use the target system's location @file{/usr/bin} +and others the location @file{/bin} to call the command +@command{install}, we symlink using @samp{ln -svf ../../bin/install +$@{TARGET_DIR@}/usr/bin}. +@end ignore + + +@node iana-etc +@section iana-etc + +The iana-etc package installs services and protocols using data from +the Internet Assigned Numbers Authority (IANA). + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/iana-etc-2.30.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/iana-etc-2.30 +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf iana-etc-2.30 +popd +@end verbatim + + +@node M4 +@section M4 + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/m4-1.4.16.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/m4-1.4.16 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf m4-1.4.16 +popd +@end verbatim + + +@node Bison +@section Bison + +GNU bison parser generator. + +@verbatim +# 7 minutes +tar xf ${DOWNLOAD_DIR}/bison-2.5.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bison-2.5 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +echo '#define YYENABLE_NLS 1' >> config.h +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf bison-2.5 +popd +@end verbatim + +@samp{echo '#define YYENABLE_NLS 1' >> config.h} is used to build +@acronym{NLS} (native language support) inside bison. + + +@node Ncurses +@section Ncurses + +@verbatim +# 15 minutes +tar xf ${DOWNLOAD_DIR}/ncurses-5.9.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/ncurses-5.9 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --with-shared \ + --enable-widec \ + --without-debug \ + --without-ada \ + --with-build-cc="gcc -D_GNU_SOURCE" \ + --libdir=/lib +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/lib/lib{panel,menu,form,ncurses,ncurses++}w.a \ +# ${TARGET_DIR}/usr/lib +#rm -v ${TARGET_DIR}/lib/lib{ncurses,menu,panel,form}w.so +#ln -svf ../../lib/libncursesw.so.5 \ +# ${TARGET_DIR}/usr/lib/libncursesw.so +#ln -svf ../../lib/libmenuw.so.5 ${TARGET_DIR}/usr/lib/libmenuw.so +#ln -svf ../../lib/libpanelw.so.5 ${TARGET_DIR}/usr/lib/libpanelw.so +#ln -svf ../../lib/libformw.so.5 ${TARGET_DIR}/usr/lib/libformw.so +#for lib in curses ncurses form panel menu ; do +# echo "INPUT(-l${lib}w)" > ${TARGET_DIR}/usr/lib/lib${lib}.so +# ln -sfv lib${lib}w.a ${TARGET_DIR}/usr/lib/lib${lib}.a +# done +ln -sfv libncursesw.so ${TARGET_DIR}/lib/libncurses.so +#ln -sfv libncursesw.so ${TARGET_DIR}/usr/lib/libcursesw.so +#ln -sfv libncursesw.a ${TARGET_DIR}/usr/lib/libcursesw.a +#ln -sfv libncurses++w.a ${TARGET_DIR}/usr/lib/libncurses++.a +#ln -sfv ncursesw5-config ${TARGET_DIR}/usr/bin/ncurses5-config +#ln -sfv ../../usr/share/terminfo ${TARGET_DIR}/usr/lib/terminfo +cd .. +rm -rf ncurses-5.9 +popd +@end verbatim + +Option @option{--enable-widec} enables wide characters support in +ncurses. + +@c Option @option{--without-debug} + +Option @option{--without-ada} disables support for the Ada programming +language inside ncurses. + +@c Option @option{--with-build-cc="gcc -D_GNU_SOURCE"} + +@c Option @option{--libdir=/lib} + +@ignore +@verbatim +mv -v ${TARGET_DIR}/lib/lib{panel,menu,form,ncurses,ncurses++}w.a \ + ${TARGET_DIR}/usr/lib +rm -v ${TARGET_DIR}/lib/lib{ncurses,menu,panel,form}w.so +ln -svf ../../lib/libncursesw.so.5 \ + ${TARGET_DIR}/usr/lib/libncursesw.so +ln -svf ../../lib/libmenuw.so.5 ${TARGET_DIR}/usr/lib/libmenuw.so +ln -svf ../../lib/libpanelw.so.5 ${TARGET_DIR}/usr/lib/libpanelw.so +ln -svf ../../lib/libformw.so.5 ${TARGET_DIR}/usr/lib/libformw.so +@end verbatim + +According to the filesystem hierarchy standard (FHS), ncurses +libraries should be inside @file{/usr/lib} instead of @file{/lib}. + +@verbatim +for lib in curses ncurses form panel menu ; do + echo "INPUT(-l${lib}w)" > ${TARGET_DIR}/usr/lib/lib${lib}.so + ln -sfv lib${lib}w.a ${TARGET_DIR}/usr/lib/lib${lib}.a + done +ln -sfv libncursesw.so ${TARGET_DIR}/usr/lib/libcursesw.so +ln -sfv libncursesw.a ${TARGET_DIR}/usr/lib/libcursesw.a +ln -sfv libncurses++w.a ${TARGET_DIR}/usr/lib/libncurses++.a +ln -sfv ncursesw5-config ${TARGET_DIR}/usr/bin/ncurses5-config +@end verbatim + +The commands above create symlinks from libraries without support for +wide characters to libraries with support for them. +@end ignore + +@c PROCPS issue: +The command @samp{ln -sfv libncursesw.so $@{TARGET_DIR@}/lib/libncurses.so} +creates the symlink @file{libcurses.so} so that programs that do not +know @file{libncursesw.so} can be linked against it. + +@c ln -sfv ../../usr/share/terminfo ${TARGET_DIR}/usr/lib/terminfo + + +@node Procps +@section Procps + +The procps package contains utilities that give information about +processes using the @file{/proc} filesystem. The package includes the +commands @command{ps}, @command{top}, @command{vmstat}, @command{w}, +@command{kill}, @command{free}, @command{slabtop}, and +@command{skill}. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/procps-3.2.8.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/procps-3.2.8 +make \ + CPPFLAGS= \ + lib64=lib +make \ + DESTDIR=${TARGET_DIR} \ + lib64=lib \ + ldconfig= \ + install="install -D" \ + install +cd .. +rm -rf procps-3.2.8 +popd +@end verbatim + +Option @option{CPPFLAGS= } is used so that the target system's ncurses +library will be used, default value would have been +@option{-I/usr/include/ncurses}. + +Option @option{lib64=lib} makes the directory @file{/lib} the one +where to put 64 bit libraries, default would be @file{/lib64}. + +Option @option{ldconfig= } is used in order not to use current host's +@command{ldconfig}. + +Option @option{install="install -D"} is used so that all the files +installed are owned by the current user. By default, all installed +files are owned by root. + + +@node Libtool +@section Libtool + +GNU libtool is a generic library support script. It hides the +complexity of using shared libraries behind a consistent, portable +interface. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/libtool-2.4.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/libtool-2.4 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf libtool-2.4 +popd +@end verbatim + + +@node Readline +@section Readline + +The GNU Readline library provides a set of functions for use by +applications that allow users to edit command lines as they are typed +in. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/readline-6.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/readline-6.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --libdir=/lib +make +make DESTDIR=${TARGET_DIR} install +make DESTDIR=${TARGET_DIR} install-doc +# For FHS compatibility: +#mv -v ${TARGET_DIR}/lib/lib{readline,history}.a ${TARGET_DIR}/usr/lib +#rm -v ${TARGET_DIR}/lib/lib{readline,history}.so +#ln -svf ../../lib/libreadline.so.6 \ +# ${TARGET_DIR}/usr/lib/libreadline.so +#ln -svf ../../lib/libhistory.so.6 ${TARGET_DIR}/usr/lib/libhistory.so +cd .. +rm -rf readline-6.2 +popd +@end verbatim + +@c sed -i 's:^SHLIB_LIBS=:SHLIB_LIBS=-lncursesw:' support/shobj-conf + +@ignore +mv -v ${TARGET_DIR}/lib/lib{readline,history}.a ${TARGET_DIR}/usr/lib +rm -v ${TARGET_DIR}/lib/lib{readline,history}.so +ln -svf ../../lib/libreadline.so.6 \ + ${TARGET_DIR}/usr/lib/libreadline.so +ln -svf ../../lib/libhistory.so.6 ${TARGET_DIR}/usr/lib/libhistory.so +@end ignore + + +@node Autoconf +@section Autoconf + +GNU autoconf is an extensible package of M4 macros that produce shell +scripts to automatically configure software source code +packages. These scripts can adapt the packages to many kinds of +UNIX-like systems without manual user intervention. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/autoconf-2.69.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/autoconf-2.69 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf autoconf-2.69 +popd +@end verbatim + + +@node Automake +@section Automake + +GNU automake is a tool for automatically generating @file{Makefile.in} +files compliant with the GNU Coding +Standards@footnote{@uref{http://www.gnu.org/prep/standards/}}. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/automake-1.12.4.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/automake-1.12.4 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf automake-1.12.4 +popd +@end verbatim + + +@node Bash +@section Bash + +GNU @acronym{Bash} (Bourne again shell) is an sh-compatible shell that +incorporates useful features from the Korn shell (ksh) and C shell +(csh). + +@verbatim +# 15 minutes +tar xf ${DOWNLOAD_DIR}/bash-4.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bash-4.2 +cat > config.cache << "EOF" +ac_cv_func_mmap_fixed_mapped=yes +ac_cv_func_strcoll_works=yes +ac_cv_func_working_mktime=yes +bash_cv_func_sigsetjmp=present +bash_cv_getcwd_malloc=yes +bash_cv_job_control_missing=present +bash_cv_printf_a_format=yes +bash_cv_sys_named_pipes=present +bash_cv_ulimit_maxfds=yes +bash_cv_under_sys_siglist=yes +bash_cv_unusable_rtsigs=no +gt_cv_int_divbyzero_sigfpe=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --cache-file=config.cache \ + --without-bash-malloc \ + --with-installed-readline +make +make \ + DESTDIR=${TARGET_DIR} \ + htmldir=/usr/share/doc/bash-4.2 \ + install +ln -sv bash ${TARGET_DIR}/bin/sh +cd .. +rm -rf bash-4.2 +popd +@end verbatim + +The variables listed in the file @file{config.cache} are used in order +to avoid that the @file{configure} script evaluate their values: +otherwise the build may fail when cross-compiling. + +@c --bindir=/bin instead of /usr/bin, FHS? + +Option @option{--without-bash-malloc} tells the @file{configure} +script not to use the @code{malloc} function shipped with +Bash. Glibc's version will be used instead. + +Option @option{--with-installed-readline} tells the configure script +to use the installed readline library instead of the one shipped with +Bash. + +@c htmldir=/usr/share/doc/bash-4.2 + +@samp{ln -sv bash $@{TARGET_DIR@}/bin/sh} creates a symlink @file{sh} +to @file{bash}. + + +@node Bzip2 +@section Bzip2 + +Bzip2 is a package that contains utilities to compress and decompress +files with a better original size/compressed size ratio than gzip. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/bzip2-1.0.6.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bzip2-1.0.6 +sed -i.orig -e "/^all:/s/ test//" Makefile +sed -i -e 's:ln -s -f $(PREFIX)/bin/:ln -s :' Makefile +make \ + -f Makefile-libbz2_so \ + CC="${CC}" \ + AR="${AR}" \ + RANLIB="${RANLIB}" +make clean +make \ + CC="${CC}" \ + AR="${AR}" \ + RANLIB="${RANLIB}" +make \ + PREFIX=${TARGET_DIR}/usr \ + install +cp -v bzip2-shared ${TARGET_DIR}/bin/bzip2 +cp -av libbz2.so* ${TARGET_DIR}/lib +ln -sv ../../lib/libbz2.so.1.0 ${TARGET_DIR}/usr/lib/libbz2.so +rm -v ${TARGET_DIR}/usr/bin/{bunzip2,bzcat,bzip2} +ln -sv bzip2 ${TARGET_DIR}/bin/bunzip2 +ln -sv bzip2 ${TARGET_DIR}/bin/bzcat +cd .. +rm -rf bzip2-1.0.6 +popd +@end verbatim + +@samp{sed -i.orig -e "/^all:/s/ test//" Makefile} is used to skip +tests when building. + +@samp{sed -i -e 's:ln -s -f $(PREFIX)/bin/:ln -s :' Makefile} is used +in order to have relative path symlinks instead of absolute ones. + +Option @option{-f Makefile-libbz2_so} is used to build shared +libraries. + +Flags @env{CC}, @env{AR} and @env{RANLIB} are used so that bzip2 is +built using cross-compilation tools instead of the host's ones. + +@samp{make clean} is used to clean up temporary files. + +The second build commands are used to build static libraries. + +@ignore +cp -v bzip2-shared ${TARGET_DIR}/bin/bzip2 +cp -av libbz2.so* ${TARGET_DIR}/lib +ln -sv ../../lib/libbz2.so.1.0 ${TARGET_DIR}/usr/lib/libbz2.so +rm -v ${TARGET_DIR}/usr/bin/{bunzip2,bzcat,bzip2} +ln -sv bzip2 ${TARGET_DIR}/bin/bunzip2 +ln -sv bzip2 ${TARGET_DIR}/bin/bzcat +@end ignore + + +@node DHCPCD +@section DHCPCD + +DHCPCD is a wrapper for the @acronym{DHCP} (Dynamic Host Configuration +Protocol) client daemon. + +@verbatim +# 3 minutes +tar xf ${DOWNLOAD_DIR}/dhcpcd-5.6.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/dhcpcd-5.6.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/sbin \ + --sysconfdir=/etc \ + --dbdir=/var/lib/dhcpcd \ + --libexecdir=/usr/lib/dhcpcd +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf dhcpcd-5.6.2 +popd +@end verbatim + +@c Option @option{--bindir=/sbin} is used to comply with FHS? +@c @option{--sysconfdir=/etc} @file{/etc} instead of ? +@c @option{--dbdir=/var/lib/dhcpcd} @file{/var/lib/dhcpcd} instead of? +@c @option{--libexecdir=/usr/lib/dhcpcd} @file{/usr/lib/dhcpcd} instead of ? + + +@node Diffutils +@section Diffutils + +GNU Diffutils is a package of several programs related to finding +differences between files. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/diffutils-3.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/diffutils-3.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf diffutils-3.2 +popd +@end verbatim + +@c patch -Np1 -i ${DOWNLOAD_DIR}/diffutils-3.0-i18n-1.patch + +@c touch man/*.1 + + +@node File +@section File + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/file-5.11.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/file-5.11 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf file-5.11 +popd +@end verbatim + + +@node Findutils +@section Findutils + +The GNU Find Utilities are typically used to provide directory search +and file locating capabilities. + +@verbatim +# 7 minutes +tar xf ${DOWNLOAD_DIR}/findutils-4.4.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/findutils-4.4.2 +cat > config.cache << EOF +gl_cv_func_wcwidth_works=yes +gl_cv_header_working_fcntl_h=yes +ac_cv_func_fnmatch_gnu=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --libexecdir=/usr/lib/locate \ + --localstatedir=/var/lib/locate \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +#mv -v ${TARGET_DIR}/usr/bin/find ${TARGET_DIR}/bin +#sed -i.orig 's@find:=${BINDIR}@find:=/bin@' \ +# ${TARGET_DIR}/usr/bin/updatedb +cd .. +rm -rf findutils-4.4.2 +popd +@end verbatim + +@c --libexecdir=/usr/lib/locate +@c --localstatedir=/var/lib/locate + +@ignore +File @file{find} is moved from target's system @file{/usr/bin} to +@file{/bin} in order to comply with the FHS. + +Because we changed the location of @file{find}, we need to update its +location in @file{/usr/bin/updatedb}. +@end ignore + + +@node Flex +@section Flex + +Flex is a tool for generating scanners. A scanner, sometimes called a +tokenizer, is a program which recognizes lexical patterns in text. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/flex-2.5.37.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/flex-2.5.37 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +ln -sv libfl.a ${TARGET_DIR}/usr/lib/libl.a +cd .. +rm -r flex-2.5.37 +popd + +cat > ${TARGET_DIR}/usr/bin/lex << "EOF" +#!/bin/sh +exec /usr/bin/flex -l "$@" +EOF +chmod -v 755 ${TARGET_DIR}/usr/bin/lex +@end verbatim + +For compatibility issues, we create the symlink @file{libl.a}. + +We then create target system's @file{/usr/bin/lex} that will execute +@command{flex} with option @option{-l} in order to behave with maximal +compatibility like @command{lex}. + +@ignore +@samp{sed -i.orig "s/-I@@includedir@@//g" Makefile.in} is used in +order not to use host's headers in @file{/usr/include} during +cross-compilation. +@end ignore + +@c Variables @samp{ac_cv_func_malloc_0_nonnull=yes} and +@c @samp{ac_cv_func_realloc_0_nonnull=yes} are used to get rid of +@c error message: @samp{}. + +@c We use option @option{-fPIC} passed to the cross-compiler in order to +@c generate position-independent code (PIC). + + +@node Gawk +@section Gawk + +GNU awk (Gawk) is a program used to select particular records in a +file and perform operations upon them. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/gawk-4.0.1.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gawk-4.0.1 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --libexecdir=/usr/lib +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -r gawk-4.0.1 +popd +@end verbatim + + +@node Gettext +@section Gettext + +GNU gettext utilities are a set of tools that provides a framework to +help packages produce multi-lingual messages. + +@verbatim +# 1 hour +tar xf ${DOWNLOAD_DIR}/gettext-0.18.1.1.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gettext-0.18.1.1 +cat > config.cache << EOF +am_cv_func_iconv_works=yes +gl_cv_func_wcwidth_works=yes +gt_cv_func_printf_posix=yes +gt_cv_int_divbyzero_sigfpe=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache +make +#cp gettext-tools/gnulib-lib/.libs/libgettextlib.la{,i} +#cp gettext-tools/src/.libs/libgettextsrc.la{,i} +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf gettext-0.18.1.1 +popd +@end verbatim + +@c The following patch may be skipped +@c patch -Np1 -i ${DOWNLOAD_DIR}/gettext-0.18.1.1-rpath-1.patch + +@c cp gettext-tools/gnulib-lib/.libs/libgettextlib.la{,i} ? +@c cp gettext-tools/src/.libs/libgettextsrc.la{,i} ? + + +@node Grep +@section Grep + +GNU @command{grep} command searches one or more input files for lines +containing a match to a specified pattern. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/grep-2.14.tar.xz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/grep-2.14 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --disable-perl-regexp +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf grep-2.14 +popd +@end verbatim + +Option @option{--disable-perl-regexp} disables support of Perl-style +regular expressions (regexp). + + +@node Groff +@section Groff + +@verbatim +# 15 minutes +tar xf ${DOWNLOAD_DIR}/groff-1.21.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/groff-1.21 +patch -Np1 -i ${DOWNLOAD_DIR}/groff-1.21-cross-compilation.patch +PAGE=A4 \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make \ + TROFFBIN=troff \ + GROFFBIN=groff \ + GROFF_BIN_PATH= +make prefix=${TARGET_DIR}/usr install +ln -sv soelim ${TARGET_DIR}/usr/bin/zsoelim +ln -sv eqn ${TARGET_DIR}/usr/bin/geqn +ln -sv tbl ${TARGET_DIR}/usr/bin/gtbl +cd .. +rm -rf groff-1.21 +popd +@end verbatim + +The patch @file{groff-1.21-cross-compilation.patch} fixes a bug in +groff' @file{Makefile.in} that prevents the cross-compilation build. + +The variables @env{TROFFBIN=troff} and @env{GROFFBIN=groff} tell +@command{make} to use @command{troff} and @command{groff} commands +installed in the @ref{Building Cross-Compilation Tools} to build +documentation. + +The variable @env{GROFF_BIN_PATH} before @env{PATH} is checked for +programs @command{groff} is calling (preprocessors, troff, and output +devices). If not set, it defaults to the directory where the +@file{groff} binary is located. + +The symlinks are used for compatibility. + + +@node Gzip +@section Gzip + +GNU Gzip is a data compression program. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/gzip-1.5.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gzip-1.5 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/bin/z{egrep,cmp,diff,fgrep,force,grep,less,more} \ +# ${TARGET_DIR}/usr/bin +#mv -v ${TARGET_DIR}/bin/znew \ +# ${TARGET_DIR}/usr/bin +cd .. +rm -rf gzip-1.5 +popd +@end verbatim + + +@node IPutils +@section IPutils + +The iputils package is a set of small utilities for networking. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/iputils-s20071127.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/iputils-s20071127 +patch -Np1 -i ${DOWNLOAD_DIR}/iputils-s20071127-fixes-2.patch +make CC="${CC}" +install -v -m755 ping{,6} ${TARGET_DIR}/bin +install -v -m755 arping ${TARGET_DIR}/usr/bin +install -v -m755 clockdiff ${TARGET_DIR}/usr/bin +install -v -m755 rdisc ${TARGET_DIR}/usr/bin +install -v -m755 tracepath ${TARGET_DIR}/usr/bin +install -v -m755 trace{path,route}6 ${TARGET_DIR}/usr/bin +cd .. +rm -rf iputils-s20071127 +popd +@end verbatim + +@c patch -Np1 -i ${DOWNLOAD_DIR}/iputils-s20071127-manpages-2.patch + + +@node Iproute2 +@section Iproute2 + +Iproute2 is a collection of utilities for controlling TCP and UDP IP +networking and traffic. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/iproute2-3.5.1.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/iproute2-3.5.1 +sed -i.orig '/^TARGETS/s@arpd@@g' misc/Makefile +make \ + DESTDIR=${TARGET_DIR} \ + CC="${CC}" \ + DOCDIR=/usr/share/doc/iproute2 \ + MANDIR=/usr/share/man +make \ + DESTDIR=${TARGET_DIR} \ + DOCDIR=/usr/share/doc/iproute2 \ + MANDIR=/usr/share/man \ + install +cd .. +rm -rf iproute2-3.5.1 +popd +@end verbatim + +@samp{sed -i.orig '/^TARGETS/s@@arpd@@@@g' misc/Makefile} is used to +disable the build of @command{arpd} as it requires Berkeley DB to be +installed. + +@env{DOCDIR} and @env{MANDIR} indicate the location in which the +documentation and the manual pages will be installed, +respectively. Those are no absolute paths but use the value of +@env{DESTDIR} as a prefix. + + +@node Kbd +@section Kbd + +Kbd contains keytable files and keyboard utilities. + +@verbatim +# 3 minutes +tar xf ${DOWNLOAD_DIR}/kbd-1.15.3.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/kbd-1.15.3 +patch -Np1 -i ${DOWNLOAD_DIR}/kbd-1.15.3-es.po-fix-1.patch +cat > config.cache << EOF +ac_cv_func_setpgrp_void=yes +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility +#mv -v ${TARGET_DIR}/usr/bin/{kbd_mode,dumpkeys,loadkeys,openvt} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/setfont \ +# ${TARGET_DIR}/bin +cd .. +rm -rf kbd-1.15.3 +popd +@end verbatim + +The patch @file{kbd-1.15.3-es.po-fix-1.patch} fixes a bug in +@file{po/es.po}. + + +@node Kmod +@section Kmod + +Kmod (previously known as module-init-tools) provide userspace-side +assistance in loading kernel modules and their dependencies. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/kmod-10.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/kmod-10 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --sbindir=/sbin \ + --with-zlib +make +make \ + DESTDIR=${TARGET_DIR} \ + INSTALL=install \ + install +cd .. +rm -rf kmod-10 +popd +@end verbatim + +@option{--with-zlib} enables support for modules compressed with +zlib. + +By default, installation uses @env{INSTALL=install-with-care} which +checks if old utilities have not been destroyed. To avoid this check, +we use @env{INSTALL=install}. + + +@node Less +@section Less + +Less is a file pager. A file pager is used to view the content of a +text file. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/less-451.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/less-451 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --sysconfdir=/etc +make +make prefix=${TARGET_DIR}/usr install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/less ${TARGET_DIR}/bin +cd .. +rm -rf less-451 +popd +@end verbatim + + +@node Make +@section Make + +GNU @command{make} utility determines automatically which pieces of a +large program need to be recompiled, and issues the commands to +recompile them. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/make-3.82.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/make-3.82 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf make-3.82 +popd +@end verbatim + + +@node Man +@section Man + +Man is an interface to the on-line reference manuals. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/man-1.6g.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/man-1.6g +sed -i.orig -e "/PREPATH=/s@=.*@=\"$(eval echo \ + ${TARGET_DIR}/{,usr/}{sbin,bin})\"@g" -e 's@-is@&Rc@g' configure +sed -i.orig -e 's@MANPATH./usr/man@#&@g' \ + -e 's@MANPATH./usr/local/man@#&@g' src/man.conf.in +./configure \ + -confdir=/etc +sed -i.orig "s@${TARGET_DIR}@@" conf_script +gcc src/makemsg.c -o src/makemsg +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf man-1.6g +popd +@end verbatim + +@c The patch below is needed to have full utf8 +@c patch -Np1 -i ${DOWNLOAD_DIR}/man-1.6g-i18n-1.patch +@c patch -Np1 -i ${DOWNLOAD_DIR}/man-1.6g-new_compressors-1.patch + +In the first use of @command{sed}, the first part replaces +@env{PREPATH} default value +@samp{/bin:/usr/bin:/usr/ucb:/usr/local/@/bin:$PATH} with +@samp{$@{TARGET_DIR@}/@{,usr/@}@{sbin,bin@}}. The variable +@env{TARGET_DIR} is used to avoid errors when running the +@file{configure} script. + +The second part is used to replace default options of the man pager +@option{-is} with @option{-isRc}. Option @option{-c} will cause +@command{less} to display man pages faster as this option disables +scrolling. + +@c What about -R? + +The second call of @command{sed} tells @command{man} where the cat +pages corresponding to given man pages should not be stored: +@file{/usr/man} and @file{/usr/local/man}. + +Option @option{-confdir} is used to define configuration files +location to target system's @file{/etc}. + +The third call of @command{sed} is used in order to remove the +presence of @env{TARGET_DIR} on the target system's programs. + +@command{makemsg} will be used during the build, but because using the +cross-compiler may make its build fail, we use the host's compiler. + + +@node Nano +@section Nano + +GNU nano is a lightweight text editor. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/nano-2.3.1.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/nano-2.3.1 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf nano-2.3.1 +popd +@end verbatim + +@quotation Note +commands in nano are displayed as in `^X'. The `^' character means +@key{CTRL} key, so `^X' means @kbd{CTRL-X}. +@end quotation + + +@node Patch +@section Patch + +GNU patch takes a patch file containing a difference listing produced +by the @command{diff} program and applies those differences to one or +more original files, producing patched versions. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/patch-2.7.1.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/patch-2.7.1 +cat > config.cache << EOF +ac_cv_path_ed_PROGRAM=ed +ac_cv_func_strnlen_working=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache +make +make prefix=${TARGET_DIR}/usr install +cd .. +rm -rf patch-2.7.1 +popd +@end verbatim + + +@node Psmisc +@section Psmisc + +This package contains utilities that use the proc filesystem. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/psmisc-22.20.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/psmisc-22.20 +cat > config.cache << EOF +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --exec-prefix="" \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/bin/pstree* ${TARGET_DIR}/usr/bin +#ln -sv killall ${TARGET_DIR}/bin/pidof +cd .. +rm -rf psmisc-22.20 +popd +@end verbatim + + +@node Rsyslog +@section Rsyslog + +Rsyslog is an utility creating log messages. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/rsyslog-5.8.6.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/rsyslog-5.8.6 +cat > config.cache << EOF +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +EOF +PKG_CONFIG_PATH="${TARGET_DIR}/usr/lib/pkgconfig" \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --sbindir=/sbin \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +install -dv ${TARGET_DIR}/etc/rsyslog.d +cd .. +rm -rf rsyslog-5.8.6 +popd + +cat > ${TARGET_DIR}/etc/rsyslog.conf << "EOF" +$ModLoad imuxsock.so +$ModLoad imklog.so + +$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +$FileOwner root +$FileGroup root +$FileCreateMode 0640 +$DirCreateMode 0755 + +$ModLoad imudp +$UDPServerRun 514 + +$RepeatedMsgReduction on + +$IncludeConfig /etc/rsyslog.d/*.conf + +auth,authpriv.* /var/log/auth.log +*.*;auth,authpriv.none -/var/log/syslog +daemon.* -/var/log/daemon.log +kern.* -/var/log/kern.log +lpr.* -/var/log/lpr.log +mail.* -/var/log/mail.log +user.* -/var/log/user.log + +# Catch All Logs +*.=debug;\ + auth,authpriv.none;\ + news.none;mail.none -/var/log/debug +*.=info;*.=notice;*.=warn;\ + auth,authpriv.none;\ + cron,daemon.none;\ + mail,news.none -/var/log/messages + +# Emergency are shown to everyone +*.emerg * +EOF +@end verbatim + +@samp{install -dv $@{TARGET_DIR@}/etc/rsyslog.d} is used to create +target system's @file{/etc/rsyslog.d} directory. Rsyslog looks for +user-defined configuration files in this directory. The line +@samp{$IncludeConfig /etc/rsyslog.d/*.conf} in the target system's +configuration file @file{/etc/rsyslog.conf} has this purpose. + +We then create the target system's configuration file +@file{/etc/rsyslog.conf}. + + +@node Shadow +@section Shadow + +@verbatim +# 7 minutes +tar xf ${DOWNLOAD_DIR}/shadow-4.1.4.3.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/shadow-4.1.4.3 +patch -Np1 -i ${DOWNLOAD_DIR}/shadow-4.1.4.3-man-ru.patch +automake-1.11 +echo "ac_cv_func_setpgrp_void=yes" > config.cache +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --libdir=/lib \ + --sysconfdir=/etc \ + --enable-shared \ + --without-audit \ + --without-libpam \ + --without-selinux \ + --cache-file=config.cache \ + --enable-man +sed -i.orig 's/groups$(EXEEXT) //' src/Makefile +for mkf in $(find man -name Makefile) + do + sed -i.orig -e '/groups.1.xml/d' -e 's/groups.1 //' ${mkf} + done +make +make DESTDIR=${TARGET_DIR} install +sed -i.orig -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \ + -e 's@/var/spool/mail@/var/mail@' \ + ${TARGET_DIR}/etc/login.defs +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/passwd ${TARGET_DIR}/bin +${CROSS_TARGET}-pwconv +${CROSS_TARGET}-grpconv +${CROSS_TARGET}-passwd root +cd .. +rm -rf shadow-4.1.4.3 +popd +@end verbatim + +@ignore +Problem with those three commands with 4.1.5.1: + +${CROSS_TARGET}-pwconv +mips64el-unknown-linux-gnu-pwconv: failure while writing changes to /gllfsc/etc/shadow +${CROSS_TARGET}-grpconv +mips64el-unknown-linux-gnu-grpconv: failure while writing changes to /gllfsc/etc/gshadow +${CROSS_TARGET}-passwd root +mips64el-unknown-linux-gnu-passwd: Permission denied. +@end ignore + +@ignore + ${CROSS_TARGET}-passwd root +gives the following message: + Cannot change ID to root. +@end ignore + +The patch @file{shadow-4.1.4.3-man-ru.patch} contains a fix to +@file{man/ru/Makefile.am} preventing @samp{make install} to +complete. @command{automake-1.11} is then run to update the makefile +prototype @file{Makefile.in}. + +@c echo "ac_cv_func_setpgrp_void=yes" > config.cache + +The option @option{--enable-man} is used to generate man pages. + +The first call of @command{sed} disables the build of command +@command{groups}, as coreutils already installed it. + +The second call of @command{sed} enables support for MD5 encrypted +passwords and changes the mail default directory from +@file{/var/spool/mail} to @file{/var/mail}. + +The @command{pwconv} command creates @file{shadow} file from file +@file{passwd} and an optionally existing @file{shadow} file. + +The @command{grpconv} command creates @file{gshadow} file from file +@file{group} and an optionally existing @file{gshadow} file. + +The command @samp{passwd root} will create the password for the root +user, you will need it when logging in as root on your new system. + + +@node Sysvinit +@section Sysvinit + +Sysvinit is the system-V style init process. Init is the first process +started during booting. It is started by the kernel. Init continues +running as a daemon until the system is shut down. It is the direct or +indirect ancestor of all other processes and automatically adopts all +orphaned processes. + + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/sysvinit-2.88dsf.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/sysvinit-2.88dsf +sed -i.orig -e 's@/dev/initctl@$(ROOT)&@g' \ + -e 's@\(mknod \)-m \([0-9]* \)\(.* \)p@\1\3p; chmod \2\3@g' \ + -e '/^ifeq/s/$(ROOT)//' \ + -e 's@/usr/lib@$(ROOT)&@' \ + src/Makefile +make -C src clobber +make -C src ROOT=${TARGET_DIR} CC="${CC}" +make -C src ROOT=${TARGET_DIR} INSTALL="install" install +cd .. +rm -rf sysvinit-2.88dsf +popd + +cat > ${TARGET_DIR}/etc/inittab << "EOF" +# Begin /etc/inittab + +id:3:initdefault: + +si::sysinit:/etc/rc.d/init.d/rc sysinit + +l0:0:wait:/etc/rc.d/init.d/rc 0 +l1:S1:wait:/etc/rc.d/init.d/rc 1 +l2:2:wait:/etc/rc.d/init.d/rc 2 +l3:3:wait:/etc/rc.d/init.d/rc 3 +l4:4:wait:/etc/rc.d/init.d/rc 4 +l5:5:wait:/etc/rc.d/init.d/rc 5 +l6:6:wait:/etc/rc.d/init.d/rc 6 + +ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now + +su:S016:once:/sbin/sulogin + +1:2345:respawn:/sbin/agetty tty1 9600 +2:2345:respawn:/sbin/agetty tty2 9600 +3:2345:respawn:/sbin/agetty tty3 9600 +4:2345:respawn:/sbin/agetty tty4 9600 +5:2345:respawn:/sbin/agetty tty5 9600 +6:2345:respawn:/sbin/agetty tty6 9600 + +#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100 + +# End /etc/inittab +EOF +@end verbatim + +The first call of @command{sed} replaces @file{/dev/initctl} with +@file{$(ROOT)/dev/initctl}, and @file{/usr/lib} with +@file{$(ROOT)/usr/lib} among other things in order to install sysvinit +on the target system. + +@samp{make -C src clobber} is used to clean up the @file{src} +directory. + +Then, we create the @file{inittab} file that describes which processes +are started at bootup and during normal operation. + +The line @samp{#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100} is +commented out (with @code{#}) in order to avoid the message: +@samp{INIT: Id "c0" respawning too fast: disabled for 5 minutes} on +the target system. + +@c patch -Np1 -i ${DOWNLOAD_DIR}/sysvinit-2.88dsf-fixes-1.patch + + +@node Tar +@section Tar + +GNU tar is an archiving utility: it stores and extracts files from a +tape or disk archive. + +@verbatim +# 8 minutes +tar xf ${DOWNLOAD_DIR}/tar-1.26.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/tar-1.26 +cat > config.cache << EOF +gl_cv_func_btowc_eof=yes +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +gl_cv_func_mbrtowc_incomplete_state=yes +gl_cv_func_mbrtowc_nul_retval=yes +gl_cv_func_mbrtowc_null_arg=yes +gl_cv_func_mbrtowc_retval=yes +gl_cv_func_wcrtomb_retval=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --libexecdir=/usr/sbin \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf tar-1.26 +popd +@end verbatim + +@c patch -Np1 -i ${DOWNLOAD_DIR}/tar-1.26-man_page-1.patch +@c patch -Np1 -i ${DOWNLOAD_DIR}/tar-1.26-new_compressors-1.patch + + +@node Texinfo +@section Texinfo + +GNU Texinfo is a documentation system that can produce both online +information and a printed manual from a single source. + +@verbatim +# 15 minutes +tar xf ${DOWNLOAD_DIR}/texinfo-4.13a.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/texinfo-4.13 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make -C tools/gnulib/lib +make -C tools +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf texinfo-4.13 +popd + +pushd ${TARGET_DIR}/usr/share/info +rm dir +for f in * + do install-info $f dir 2>/dev/null +done +popd +@end verbatim + +@c patch -Np1 -i ${DOWNLOAD_DIR}/texinfo-4.13-new_compressors-1.patch + +The first three calls of @command{make} make it possible to build +Texinfo by cross-compilation. + +For Info to work, the @file{info} directory must contain a file that +serves as a top level directory for the Info system. By convention, +this file is called @file{dir}. We update this file for the target +system. + + +@node Udev +@section Udev + +Udev is the dynamic device management of the kernel Linux. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/udev-175.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/udev-175 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --sysconfdir=/etc \ + --sbindir=/sbin \ + --with-rootlibdir=/lib \ + --libexecdir=/lib/udev \ + --docdir=/usr/share/doc/udev-175 \ + --disable-introspection \ + --with-pci-ids-path=no \ + --with-usb-ids-path=no \ + --disable-gudev +make +make DESTDIR=${TARGET_DIR} install +install -dv ${TARGET_DIR}/lib/firmware +ln -sv ../lib/udev/udevd ${TARGET_DIR}/sbin/udevd +cd .. +rm -rf udev-175 +popd +@end verbatim + +@c The option @option{--disable-introspection} depends on +@c gobject-introspection which is not installed + +@ignore +Version 182 needs blkid headers given by e2fsprogs: +configure: error: Package requirements (blkid >= 2.20) were not met: + +No package 'blkid' found + +but + +BLKID_CFLAGS="-I${TARGET_DIR}/usr/include/blkid" \ + BLKID_LIBS="-L${TARGET_DIR}/lib -lblkid" \ + KMOD_CFLAGS="-I${TARGET_DIR}/usr/include" \ + KMOD_LIBS="-L${TARGET_DIR}/lib -lkmod" \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --sysconfdir=/etc \ + --sbindir=/sbin \ + --with-rootlibdir=/lib \ + --libexecdir=/lib/udev \ + --docdir=/usr/share/doc/udev-182 \ + --disable-introspection \ + --with-pci-ids-path=no \ + --with-usb-ids-path=no \ + --disable-gudev + +fails after `make` with: + +make --no-print-directory all-recursive +Making all in . + CC src/udevadm-udev-builtin-blkid.o +src/udev-builtin-blkid.c:84:30: error: unknown type name 'blkid_probe' +src/udev-builtin-blkid.c: In function 'builtin_blkid': +src/udev-builtin-blkid.c:122:9: error: unknown type name 'blkid_probe' +src/udev-builtin-blkid.c:160:17: error: 'BLKID_SUBLKS_LABEL' undeclared (first +use in this function) +src/udev-builtin-blkid.c:160:17: note: each undeclared identifier is reported +only once for each function it appears in +src/udev-builtin-blkid.c:160:38: error: 'BLKID_SUBLKS_UUID' undeclared (first +use in this function) +src/udev-builtin-blkid.c:161:17: error: 'BLKID_SUBLKS_TYPE' undeclared (first +use in this function) +src/udev-builtin-blkid.c:161:37: error: 'BLKID_SUBLKS_SECTYPE' undeclared +(first use in this function) +src/udev-builtin-blkid.c:162:17: error: 'BLKID_SUBLKS_USAGE' undeclared (first +use in this function) +src/udev-builtin-blkid.c:162:38: error: 'BLKID_SUBLKS_VERSION' undeclared +(first use in this function) +src/udev-builtin-blkid.c:165:58: error: 'BLKID_FLTR_NOTIN' undeclared (first +use in this function) src/udev-builtin-blkid.c:165:76: error: +'BLKID_USAGE_RAID' undeclared (first use in this function) make[2]: *** +[src/udevadm-udev-builtin-blkid.o] Error 1 +make[1]: *** [all-recursive] Error 1 +make: *** [all] Error 2 + +@end ignore + +@ignore +@verbatim +install -dv ${TARGET_DIR}/lib/firmware +@end verbatim + +is used to install target system's @file{/lib/firmware} which will +contain modules? +@end ignore + + +@node Util-Linux +@section Util-Linux + +util-linux is a random collection of utilities for use with the kernel +Linux. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/util-linux-2.19.1.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/util-linux-2.19.1 +sed -i.orig 's@etc/adjtime@var/lib/hwclock/adjtime@g' \ + hwclock/hwclock.c +mkdir -pv ${TARGET_DIR}/var/lib/hwclock +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --enable-arch \ + --enable-partx \ + --disable-wall \ + --enable-write \ + --disable-makeinstall-chown +make +make DESTDIR=${TARGET_DIR} install +mv -v ${TARGET_DIR}/usr/bin/logger ${TARGET_DIR}/bin +cd .. +rm -r util-linux-2.19.1 +popd +@end verbatim + +The @command{sed} command modifies the location of @file{adjtime} from +the target system's @file{/etc} directory to its +@file{/lib/hwclock/adjtime} to comply with FHS. + +@ignore +Error on configure for util-linux 2.22: +configure: error: login selected, but required PAM header file not available +@end ignore + +Option @option{--enable-arch} enables the build and installation of +the @command{arch} command. + +Option @option{--enable-partx} enables the build and installation of +the @command{addpart}, @command{delpart} and @command{partx} commands. + +Option @option{--disable-wall} disables the build of the +@command{wall} command which is already provided by sysvinit. + +Option @option{--enable-write} enables the build and installation of +the @command{write} command. + +Option @option{--disable-makeinstall-chown} disables the change of +owner to root for installed programs. + + +@node XZ-Utils +@section XZ-Utils + +XZ Utils is a general-purpose data compression software with high +compression ratio. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/xz-5.0.4.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/xz-5.0.4 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/{xz,lzma,lzcat,unlzma,unxz,xzcat} \ +# ${TARGET_DIR}/bin +cd .. +rm -rf xz-5.0.4 +popd +@end verbatim + + +@node Bootscripts +@section Bootscripts + +The bootscript archive contains scripts that manage services during +system's bootup and shutdown. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/bootscripts-cross-lfs-1.2-pre11.tar.bz2 \ + -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bootscripts-cross-lfs-1.2-pre11 +make DESTDIR=${TARGET_DIR} install-bootscripts +make DESTDIR=${TARGET_DIR} install-network +cd .. +rm -rf bootscripts-cross-lfs-1.2-pre11 +popd +@end verbatim + +This installs basic bootscripts required for bootup and shutdown, and +network-related bootscripts. + + +@node Kernel +@section The Kernel + +To avoid potential kernel lockup on Loongson 2F machines, we need to +add the option @option{-mfix-loongson2f-jump} to the environment +variable @env{CFLAGS}@footnote{For more information about the issue, +see +@uref{http://groups.google.com/group/loongson-dev/browse_thread/thread/d9103283141c00fb/e9a8830b01cc1913?hide_quotes=no#msg_d44adf83639fb0bd} +and +@uref{http://sourceware.org/ml/binutils/2009-11/msg00387.html}.}: + +@c commits on +@c @uref{http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commit;h=622844bf0b4cfa4f76d4a0ddc44266938385f5ab} +@c @uref{http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commit;h=54413b825ca502b9384edabf972c512c29d64010}.}. + +@verbatim +sed -i.orig \ + "/CFLAGS/s/-mfix-loongson2f-nop/& -Wa,-mfix-loongson2f-jump/" \ + ~/.bashrc +source ~/.bash_profile +@end verbatim + +Then: + +@verbatim +tar xf ${DOWNLOAD_DIR}/linux-libre-3.5.4-gnu.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/linux-3.5.4 +make mrproper +@end verbatim + +Then, if you are compiling the kernel for an Yeeloong @samp{2f} +netbook: + +@verbatim +cp arch/mips/configs/lemote2f_defconfig .config +patch -Np1 -i ${DOWNLOAD_DIR}/100gnu+freedo.patch +@end verbatim + +Then, if you want to change the configuration: + +@verbatim +#make ARCH=mips CROSS_COMPILE=${CROSS_TARGET}- config +make ARCH=mips CROSS_COMPILE=${CROSS_TARGET}- menuconfig +@end verbatim + +@menu +* CPU selection:: Selecting your CPU +* Optimizations:: Optimizing your kernel +* Compatibility of executables:: Configuring compatibility of + executables +* Power Management:: Configuring ower management +* Network card configuration:: Configuring your network card +* Flash media:: Configuring USB keys and SDcards +* File Systems:: Configuring the file systems +* Input devices:: Configuring keyboard and mouse +* Display:: Configuring the display +* Unicode support:: Supporting Unicode +* Kernel Compilation:: Kernel Compilation +@end menu + +@c ???Needed for some reason: +@c +@c Executable file formats +@c Kernel support for MISC binaries + + +@node CPU selection +@subsection CPU selection + +To know the CPU model you have on a given computer, type @samp{cat +/proc/cpuinfo} inside a terminal. + +@verbatim +Machine selection + System type + (X) Loongson family of machines + Machine type + (X) Lemote Loongson 2F family machines +@end verbatim + +As you will discover when you type @samp{lspci | grep CS5536} in a +terminal, AMD CS5536 is used for a variety of things on the Yeeloong: +ISA bridge, IDE interface, Multimedia audio controller and two USB +Controllers. In order to get the correct time, we need to enable the +following option: + +@c @emph{why does CS5536 need this?} + +@verbatim + [*] CS5536 MFGPT Timer +@end verbatim + +@quotation Note +@acronym{MFGPT} stands for Multi-Function General Purpose Timer. +@end quotation + +MIPS architecture exists in two flavours: big endian and little +endian. The difference resides in the order in which the Bytes are +stored in the hardware: little endian's first Byte is the least +significant one while big endian's first Byte is the most significant +one. In our case, we have a little endian architecture, so: + +@verbatim +Endianess selection + (X) Little endian + +CPU selection + CPU type + (X) Loongson 2F +@end verbatim + +If your version of Binutils is 2.20.2 or later, select the following +option: + +@verbatim +CPU selection + [*] Loongson 2F Workarounds +@end verbatim + +It fixes some issues with the Loongson 2F processors@footnote{For more +information about the issue, see +@uref{http://groups.google.com/group/loongson-dev/browse_thread/thread/d9103283141c00fb/e9a8830b01cc1913?hide_quotes=no#msg_d44adf83639fb0bd} +and +@uref{http://sourceware.org/ml/binutils/2009-11/msg00387.html}.}. + +Then, whatever your version of Binutils is: + +@verbatim +Kernel type + Kernel code model + (X) 64-bit kernel +@end verbatim + + +@node Optimizations +@subsection Optimizations + +If you want higher performance but with increased memory consumption, +select a @option{Kernel page size} of 16kB: + +@verbatim +Kernel type + Kernel page size + (X) 16kB +@end verbatim + +Then, if you want to reduce the size of your kernel (this may increase +decompression time at bootup though): + +@verbatim +General setup + Kernel compression mode + (X) Bzip2 +@end verbatim + +Then, whatever your choice: + +@verbatim +General setup + [*] Support for paging of anonymous memory (swap) +@end verbatim + +To be able to copy your kernel configuration through kernel versions, +you may want to select the following options: + +@verbatim +General setup + <*> Kernel .config support + [*] Enable access to .config through /proc/config.gz +@end verbatim + +If you want to optimize your kernel for size (but not necessarily for +speed), select the following option: + +@verbatim +General setup + [*] Optimize for size +@end verbatim + +Selecting this option will use option @option{-Os} of GCC instead of +the default @option{-O2}. + + +@node Compatibility of executables +@subsection Compatibility of executables + +@acronym{ELF} (Executable and Linkable Format) is a common standard +file format for executables, object code, shared libraries, and core +dumps. + +@verbatim +Executable file formats + [*] Kernel support for ELF binaries + [*] Kernel support for Linux/MIPS 32-bit binary compatibility + [*] Kernel support for o32 binaries + [*] Kernel support for n32 binaries +@end verbatim + + +@node Power Management +@subsection Power Management + +Power management is a feature that turns off the power or switches the +system to a low-power state when inactive. + +@verbatim +Power management options + [*] Power Management support + [*] Power Management Debug Support + [*] Verbose Power Management debugging + [*] Suspend to RAM and standby + [*] Hibernation (aka 'suspend to disk') +@end verbatim + +To be able to get information on your battery status, select the +following option: + +@verbatim +Device Drivers + <*> Power supply class support + [*] Power supply debug +@end verbatim + + +@node Network card configuration +@subsection Network card configuration + +The network card is the component of your computer that lets you +browse the internet and receive emails, among other things. This +section covers both wired and wireless network cards. + +@menu +* Ethernet card configuration:: Configuring your ethernet card +* Wireless card configuration:: Configuring your wireless card +@end menu + + +@node Ethernet card configuration +@subsubsection Ethernet card configuration + +To know which ethernet controller you have, type in a terminal: + +@verbatim +lspci | grep Ethernet +@end verbatim + +In order to build the driver for the RTL-8139 ethernet controller: + +@verbatim +Device Drivers + [*] Network device support + [*] Ethernet (10 or 100Mbit) + <*> Realtek RTL-8129/8130/8139 PCI Fast Ethernet Adapter + support +@end verbatim + +@c [*] Support for uncommon RTL-8139 rev. K (automatic +@c channel equalization) + + +@node Wireless card configuration +@subsubsection Wireless card configuration + +To know which wireless card is connected to your USB port, in a +terminal, type: + +@verbatim +lsusb | grep Wireless +@end verbatim + +To be able to build the option @option{cfg80211}, which is the current +wireless configuration API, @emph{not as a module} inside the kernel, +you will have to select the following option first: + +@verbatim +[*] Networking support + <*> RF Switch subsystem support +@end verbatim + +Then: + +@verbatim +[*] Networking support + -*- Wireless + <*> cfg80211 -wireless configuration API + [*] cfg80211 wireless extensions compatibility + <*> Wireless extensions sysfs files + <*> Common routines for IEEE802.11 drivers + [*] lib80211 debugging messages +@end verbatim + +mac80211 is a framework which driver developers can use to write +drivers for SoftMAC wireless devices@footnote{See +@uref{http://www.linuxwireless.org/en/developers/Documentation/mac80211/} +for more information.}. + +The following option needs to be built @emph{not as a module} in order +for the option @option{Realtek 8187 and 8187B USB support} to be +built inside the kernel @emph{not as a module}: + +@verbatim +[*] Networking support + -*- Wireless + <*> Generic IEEE 802.11 Networking stack (mac80211) +@end verbatim + +Enabling EEPROM 93CX6 is required in order to build option +@option{Realtek 8187 and 8187B USB support} inside the kernel: + +@verbatim +Device Drivers + [*] Misc devices + EEPROM support + -*- EEPROM 93CX6 support +@end verbatim + +If you want built-in support for Realtek 8187 and 8187B: + +@verbatim +Device Drivers + Network device support + [*] Wireless LAN + <*> Realtek 8187 and 8187B USB support +@end verbatim + +Then: + +@verbatim +Device Drivers + [*] USB support + {*} Enable Wireless USB extensions (EXPERIMENTAL) +@end verbatim + +@ignore + +@verbatim +Device Drivers + Generic Driver Options + - - Userspace firmware loading support + [ ] Include in-kernel firmware blobs in kernel binary +@end verbatim +@end ignore + + +@node Flash media +@subsection Flash media + +To know which driver to enable in the kernel, type @samp{lsusb | grep +multicard} in a terminal. + +If you want to enable support for USB keys and SDcard: + +@verbatim +Device Drivers + SCSI device support + <*> SCSI device support + <*> SCSI disk support + + [*] USB support + USB Mass Storage support + + <*> MMC/SD/SDIO card support + <*> USB SD Host Controller (USHC) support +@end verbatim + + +@node File Systems +@subsection File Systems + +By default, we recommend using Ext3 filesystem: + +@verbatim +File systems + <*> Ext3 journalling file system support +@end verbatim + +If you don't need support for RAID or LVM: + +@verbatim +Device Drivers + [ ] Multiple devices driver support (RAID and LVM) +@end verbatim + + +@node Input devices +@subsection Input devices + +To configure Keyboard: + +@verbatim +Device Drivers + Input device support + [*] Keyboards + <*> AT keyboard + [*] Mice + <*> PS/2 mouse + <*> Synaptics PS/2 mouse protocol extension +@end verbatim + + +@node Display +@subsection Display + +To know your @acronym{VGA} (Video Graphics Array) controller model +(@acronym{VGA} refers to display hardware), type @samp{lspci | grep +VGA} in a terminal. A @dfn{framebuffer} is a video output device +that drives a video display from a memory buffer containing a complete +frame of data@footnote{For more information, see +@uref{http://en.wikipedia.org/wiki/Framebuffer}.}. + +@verbatim +Device Drivers + Graphics support + <*> Support for frame buffer devices + Userspace VESA VGA graphics support + Console display driver support + <*> Framebuffer Console support + -*- VGA 8x16 font + + [*] Staging drivers + <*> Silicon Motion SM7XX Frame Buffer Support +@end verbatim + +@c [*] VESA VGA graphics support + + +@node Unicode support +@subsection Unicode support + +Unicode is a computing industry standard for the consistent encoding, +representation and handling of text expressed in most of the world's +writing systems@footnote{For more information, read +@uref{http://en.wikipedia.org/wiki/Unicode}.}. + +@verbatim +File systems + -*- Native language support + <*> NLS UTF-8 +@end verbatim + +@c Device Drivers +@c [*] Multifunction device drivers +@c <*> Support for CS5535 and CS5536 southbridge core functions + +@c In File systems, remove support for Btrfs filesystem, otherwise +@c compilation will fail. + + +@node Kernel Compilation +@subsection Kernel Compilation + +@verbatim +# 2 hours and 40 minutes +make \ + ARCH=mips \ + CROSS_COMPILE=${CROSS_TARGET}- +make \ + ARCH=mips \ + CROSS_COMPILE=${CROSS_TARGET}- \ + INSTALL_MOD_PATH=${TARGET_DIR} \ + modules_install +cp vmlinuz ${TARGET_DIR}/boot/vmlinuz +cp System.map ${TARGET_DIR}/boot/System.map +cp .config ${TARGET_DIR}/boot/config +cd .. +popd +@end verbatim + +@quotation Tip +because future compilation may need kernel sources, the compilation +directory of the kernel should be preserved. +@end quotation + + +@node Configuration Files +@chapter Creating Required Configuration Files for the New System + +@menu +* Time Setup File:: File for time setup. +* Bash Keyboard Setup:: Setting up keyboard function keys + for the Shell. +* Bash Startup Files:: Setting up Bash shell startup files. +* Localhost Setup:: Setting up localhost. +* hosts Setup:: Setting up @file{hosts} file. +* Network Address Setup:: Setting up network address. +* DNS Setup:: Setting up DNS. +* fstab File Creation:: Creating @file{fstab} file. +@end menu + + +@node Time Setup File +@section File for Time Setup + +@verbatim +cat > ${TARGET_DIR}/etc/sysconfig/clock << "EOF" +# Begin /etc/sysconfig/clock + +UTC=1 + +# End /etc/sysconfig/clock +EOF +@end verbatim + + +@node Bash Keyboard Setup +@section Setting up Keyboard Function keys for the Shell + +Readline default configuration file is set: + +@verbatim +cat > ${TARGET_DIR}/etc/inputrc << "EOF" +set bell-style none +set convert-meta Off +set horizontal-scroll-mode Off +set input-meta On +set output-meta On +"\eOd": backward-word +"\eOc": forward-word +"\e[1~": beginning-of-line +"\e[4~": end-of-line +"\e[5~": beginning-of-history +"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert +"\eOH": beginning-of-line +"\eOF": end-of-line +"\e[H": beginning-of-line +"\e[F": end-of-line +EOF +@end verbatim + +If @option{convert-meta} is set to @samp{on}, Readline will convert +characters with the eighth bit set to an @sc{ascii} key sequence by +stripping the eighth bit and prefixing an @key{ESC} character, +converting them to a meta-prefixed key sequence. + +@option{horizontal-scroll-mode} set to @samp{off} means that the text +of the lines being edited will be wrapped onto a new screen line when +they are longer than the width of the screen, instead of being +scrolled horizontally on a single screen line. + +@c set meta-flag On + +@option{input-meta} If set to @samp{on}, Readline will enable +eight-bit input (it will not clear the eighth bit in the characters it +reads), regardless of what the terminal claims it can support. + +If @option{output-meta} is set to @samp{on}, Readline will display +characters with the eighth bit set directly rather than as a +meta-prefixed escape sequence. + +@ignore +"\eOd": backward-word +"\eOc": forward-word +"\e[1~": beginning-of-line +"\e[4~": end-of-line +"\e[5~": beginning-of-history +"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert +"\eOH": beginning-of-line +"\eOF": end-of-line +"\e[H": beginning-of-line +"\e[F": end-of-line +@end ignore + + +@node Bash Startup Files +@section Setting up Bash Shell Startup Files + +@verbatim +cat > ${TARGET_DIR}/etc/profile << "EOF" +# Begin /etc/profile + +export LANG=en_US.UTF-8 +export INPUTRC=/etc/inputrc +export PS1='\[\e[31m\]\A-\W\[\e[00m\]\$ ' + +# End /etc/profile +EOF +@end verbatim + +The environement variable @env{LANG} defines the default language that +should be used on the system. @samp{en_US.UTF-8} means ``english'' +language, country ``US'' and @acronym{UTF-8} (UCS Transformation +Format—8-bit) encoding (Unicode). + +@c For a full list, see??? + +For explanations on @env{PS1}, @pxref{Environment Variables Setup}. + + +@node Localhost Setup +@section Localhost Setup + +@verbatim +echo "HOSTNAME=gllfsc" > ${TARGET_DIR}/etc/sysconfig/network +@end verbatim + + +@node hosts Setup +@section Setting up @file{hosts} File + +@verbatim +cat > ${TARGET_DIR}/etc/hosts << "EOF" +# Begin /etc/hosts + +127.0.0.1 gllfsc localhost + +# End /etc/hosts +EOF +@end verbatim + + +@node Network Address Setup +@section Setting up Network Address + +You can choose to have a network static or dynamic address. + +@menu +* Network Static Address Setup:: Setting up Network Static Address. +* Network Dynamic Address Setup:: Setting up Network Dynamic + Address. +@end menu + + +@node Network Static Address Setup +@subsection Setting up Network Static Address + +@verbatim +pushd ${TARGET_DIR}/etc/sysconfig/network-devices +mkdir -v ifconfig.eth0 +cat > ifconfig.eth0/ipv4 << "EOF" +ONBOOT=yes +SERVICE=ipv4-static +IP=192.168.1.1 +GATEWAY=192.168.1.2 +PREFIX=24 +BROADCAST=192.168.1.255 +EOF +popd +@end verbatim + +@quotation Warning +@code{IP}, @code{GATEWAY}, @code{BROADCAST} addresses are set up +according to one's situation. +@end quotation + + +@node Network Dynamic Address Setup +@subsection Setting up Network Dynamic Address + +@verbatim +pushd ${TARGET_DIR}/etc/sysconfig/network-devices +mkdir -v ifconfig.eth0 +cat > ifconfig.eth0/ip << "EOF" +ONBOOT=yes +SERVICE=dhcpcd +DHCP_START="-t10" +DHCP_STOP="-k" +EOF +popd +@end verbatim + + +@node DNS Setup +@section Setting up DNS + +@verbatim +cat > ${TARGET_DIR}/etc/resolv.conf << "EOF" +# Begin /etc/resolv.conf + +nameserver your-main-DNS-address +nameserver your-secondary-DNS-address + +# End /etc/resolv.conf +EOF +@end verbatim + + +@node fstab File Creation +@section @file{fstab} File Creation + +The file @file{/etc/fstab} is used at boot to mount partitions under +the requested directories. + +@verbatim +cat > ${TARGET_DIR}/etc/fstab << "EOF" +# Begin /etc/fstab + +# file system mount-point type options dump fsck order + +/dev/hda4 / ext3 defaults 1 1 +/dev/hda3 swap swap pri=1 0 0 +proc /proc proc defaults 0 0 +sysfs /sys sysfs defaults 0 0 +devpts /dev/pts devpts gid=4,mode=620 0 0 +shm /dev/shm tmpfs defaults 0 0 + +# End /etc/fstab +EOF +@end verbatim + +@quotation Warning +the name of the hard drive and the name of filesystem used here have +to be modified to reflect @emph{your} real situation. +@end quotation + + +@node End +@chapter The End + +@menu +* Archiving:: All the system archived in one + package. +* Recommendations:: Some tips. +@end menu + + +@node Archiving +@section Archiving the System + +After the system has been completed, we use the command @command{exit} +to logout as the @emph{gllfsc} user. + +Now, login as the @emph{root} user. + +Then fix the permissions on the new system: + +@verbatim +export TARGET_DIR=/gllfsc +pushd ${TARGET_DIR} +mknod -m 600 dev/console c 5 1 +mknod -m 666 dev/null c 1 3 +cp -a dev/{console,null} lib/udev/devices/ +chown -R root:root * +@end verbatim + +We archive the entire system by using the following command: + +@verbatim +# 20 minutes without kernel sources nor cross-tools +tar -cjf gllfsc-20121006.tar.bz2 bin boot dev etc home lib* media \ + mnt opt proc root sbin srv sys tmp usr var +# 60 minutes with kernel sources + cross-tools +#tar -cjf gllfsc-20121006.tar.bz2 * +@end verbatim + +It is then easy to copy the archive to the target machine and extract. + + +@node Recommendations +@section Some Recommendations + +We recommend extracting the system to an empty partition. Moreover, +the filesystem of the chosen partition has to be a filesystem +supported by the kernel you compiled. Finally, this partition has to +be consistent with the system description in the file +@file{/etc/fstab} you created during setup (@pxref{fstab File +Creation}). + +Then, you will have to edit the PMON BIOS configuration file of the +target machine: @file{/boot.cfg}. This file has to be put on the first +partition of the hard +drive@footnote{@uref{http://gnewsense.org/Projects/Lemote#Updating_of_the_PMON_configuration}}. A +minimal @file{/boot.cfg} could be: + +@verbatim +default 0 +timeout 2 +showmenu 1 + +title GLLFSC +kernel (wd0,3)/boot/vmlinuz +args console=tty no_auto_cmd root=/dev/hda4 rootdelay=8 machtype=8.9 +@end verbatim + + +@node Further Readings +@chapter Further Readings + +Haiyong Sun's website (in Chinese): +@uref{http://youbest.cublog.cn}. It includes documents on building a +GNU/Linux system for Loongson and a GNU/Hurd system for x86. + +Cross [GNU/]Linux from scratch: @uref{http://www.cross-lfs.org}. +Includes a lot of documentation to build a GNU/Linux system by +cross-compilation on a variety of hardware, no information (yet) for +cross-compiling with sysroot on MIPS though. There is also a +Community-driven Beyond [GNU/]Linux From Scratch on +@uref{http://cblfs.cross-lfs.org}. It documents the building of Xorg +and TeXLive among other things. + +@c Some patches from the above project are available for download on +@c @uref{http://svn.cross-lfs.org/svn/repos/patches/}. + +@uref{http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_@/man.txt} +documents an interesting way of managing packages. Quotation from the +file: + +@quotation +DESCRIPTION: +@itemize + +@item +You want to know which packages your files belong to? + +@item +You want to deinstall software that doesn't have make uninstall? + +@item +You are bothered by programs installed setuid root behind your back? + +@item +You don't like packages quietly overwriting files from other packages? + +@item +You don't like package managers like RPM? + +@item +YOU WANT TOTAL CONTROL USING ONLY UNIX BUILTINS? +@end itemize +@end quotation + +The suckless team@footnote{@uref{http://suckless.org}} is a group of +programmers that share the following +philosophy@footnote{@uref{http://suckless.org/philosophy}}: + +@quotation +Focus on simplicity, clarity and frugality. Our philosophy is about +keeping things simple, minimal and usable. We believe this should +become the mainstream philosophy in the IT sector. Unfortunately, the +tendency for complex, error-prone and slow software seems to be +prevalent in the present-day software industry. We intend to prove the +opposite with our software projects. +@end quotation + +The simple and lightweight programs released by this team are +interesting for machines based on Loongson 2F processor as performance +is limited compared to current x86 processors. + + +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include fdl-1.3.texi + + +@node GNU General Public License +@appendix GNU General Public License +@include gpl.texi + +@bye diff --git a/gllfsc-loongson3a-1.0.texi b/gllfsc-loongson3a-1.0.texi new file mode 100644 index 0000000..2797efa --- /dev/null +++ b/gllfsc-loongson3a-1.0.texi @@ -0,0 +1,4299 @@ +\input texinfo +@c -*-texinfo-*- +@c %**start of header +@setfilename gllfsc-loongson3a-1.0.info +@settitle GNU/Linux-libre from source code for Loongson 3A +@c Comment the following if you want Letter format instead of A4 for +@c PDF output +@afourpaper +@c %**end of header +@c Book headers for PDF version +@setchapternewpage odd +@documentencoding UTF-8 + +@copying +This is edition 1.0 (last updated 31 July 2013) of +@cite{GNU/Linux-libre from source code for Loongson 3A}. + +Copyright @copyright{} 2013 Christophe Jarry. + +This document is based on the Chinese page +@url{http://zdbr.net.cn/download/Loongson64-@/2.0.htm}, which is +copyright @copyright{} 2009 +@c Because TeX does not handle Chinese fonts automatically, we need to +@c do the following: +@ifnottex +Haiyong Sun (孙海勇). +@end ifnottex +@iftex +Haiyong Sun. +@end iftex +His blog is on @url{http://youbest.cublog.cn}. + +Various formats of this manual as well as its texinfo source are +available on +@uref{http://cjarry.org/gnu-linux/gllfsc/}. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +Texts. A copy of the license is included in the section entitled ``GNU +Free Documentation License''. +@end quotation + +@quotation +Computer instructions in this manual are free software: you can +redistribute them and/or modify them under the terms of the GNU +General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later +version. + +Those instructions are distributed in the hope that they will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this manual. If not, see . +@end quotation + +@end copying + +@c @setchapternewpage odd + +@titlepage +@title GNU/Linux-libre from source code +@subtitle for Loongson 3A +@c @subtitle SUBTITLE-IF-ANY +@c @subtitle SECOND-SUBTITLE +@author Christophe Jarry + +@c The following two commands +@c start the copyright page. +@page +@vskip 0pt plus 1filll +@insertcopying + +@c Published by ... +@end titlepage + +@c Short table of contents +@shortcontents + +@c So the toc is printed at the start. +@contents + +@ifnottex +@node Top +@top GNU/Linux-libre from source code for Loongson 3A + +This manual describes how to build a GNU/Linux-libre system from +source for Loongson 3A processor. + +@insertcopying +@end ifnottex + +@menu +* Introduction:: What this document is all about. +* Prerequisites:: Useful knowledge before proceeding. +* Preliminary Work:: Preparing the build. +* Building the Cross-Compilation Toolchain:: Building the cross- + compilation Toolchain. +* Building Cross-Compilation Tools:: Building the cross-compilation + Tools. +* Building the Target System:: How to build the target system. +* Configuration Files:: Creating configuration files + needed by the new system. +* End:: Final things to do. +* Further Readings:: Websites useful to know more. +* Thanks:: Thanks. +* GNU Free Documentation License:: Your rights and freedoms with the + text. +* GNU General Public License:: Your rights and freedoms with the + commands. +@end menu + + +@node Introduction +@chapter Introduction + +@menu +* GNU/Linux History:: A brief history of GNU/Linux. +* Purpose of this Document:: What this document is all about. +@end menu + + +@node GNU/Linux History +@section GNU/Linux History + +@menu +* GNU:: Presentation of the GNU project +* HURD:: Presentation of the HURD +* Linux:: Presentation of the kernel Linux +* Linux-libre:: Presentation of the kernel Linux-libre +* References:: Where to get more information +@end menu + +@node GNU +@subsection GNU + +@acronym{GNU} (GNU's Not Unix) is a project launched by Richard +Stallman in 1984 with the goal of building an entirely free operating +system compatible with Unix@footnote{See +@uref{http://en.wikipedia.org/wiki/Unix}}. ``Free'' here means ``free +as in freedom''. In this context, a free operating system is an +operating system you can use and share in freedom. A core part of his +motivation is given in the GNU +Manifesto@footnote{@uref{http://www.gnu.org/gnu/manifesto.html}}: + +@quotation +I consider that the Golden Rule requires that if I like a program I +must share it with other people who like it. Software sellers want to +divide the users and conquer them, making each user agree not to share +with others. I refuse to break solidarity with other users in this +way. I cannot in good conscience sign a nondisclosure agreement or a +software license agreement. For years I worked within the Artificial +Intelligence Lab to resist such tendencies and other inhospitalities, +but eventually they had gone too far: I could not remain in an +institution where such things are done for me against my will. + +So that I can continue to use computers without dishonor, I have +decided to put together a sufficient body of free software so that I +will be able to get along without any software that is not free. I +have resigned from the AI Lab to deny MIT any legal excuse to prevent +me from giving GNU away. +@end quotation + +A program is free software if the program's user has the four +essential freedoms: + +@itemize +@item +The freedom to run the program, for any purpose (freedom 0). + +@item +The freedom to study how the program works, and change it so it does +her computing as she wishes (freedom 1). Access to the source code is +a precondition for this. + +@item +The freedom to redistribute copies so she can help her neighbor +(freedom 2). + +@item +The freedom to distribute copies of her modified versions to others +(freedom 3). By doing this she can give the whole community a chance +to benefit from her changes. Access to the source code is a +precondition for this. +@end itemize + +One of the most popular free software license is the GNU General +Public License (GNU +GPL@footnote{@uref{http://www.gnu.org/licenses/gpl.html}}). + +The free software movement is supported by the Free Software +Foundation (FSF@footnote{@uref{http://www.fsf.org}}). + + +@node HURD +@subsection HURD + +The @acronym{HURD} is an acronym for @acronym{HIRD} (HURD of +interfaces representing depth) of Unix-replacing daemons. It is the +GNU project's replacement for the Unix kernel. It is a collection of +servers that run on the Mach microkernel to implement file systems, +network protocols, file access control, and other features that are +implemented by the Unix kernel or similar kernels (such as Linux). + +The purpose of the GNU HURD is to improve the user's freedom on her +operating system by allowing her to either add or remove a feature of +the kernel on the fly. + +From early on, the HURD was developed to use GNU Mach as the +microkernel. This was a technical decision made by Richard Stallman, +who thought it would speed up the work by saving a large part of +it. He has admitted that he was wrong about that. + +Nevertheless, development of the HURD is increasingly attracting +developers and GNU/HURD systems exist and are usable. + + +@node Linux +@subsection Linux + +Linux is a monolithic kernel created by Linus Torvalds in 1991. Linus +Torvalds initially wrote a terminal emulator, which he used to access +the large UNIX servers of his university. He wrote the program +specifically for the hardware he was using and independent of an +operating system because he wanted to use the functions of his new PC +with an 80386 processor. This later became the kernel Linux. + +Initially, Torvalds first published the kernel Linux under its own +licence, which had a restriction on commercial activity. + +In the notes for the first release of the kernel Linux, Torvalds lists +the GNU software that is required to run Linux: + +@quotation +Sadly, a kernel by itself gets you nowhere. To get a working system +you need a shell, compilers, a library etc. [...] Most of the tools +used with linux are GNU software and are under the GNU copyleft. +@end quotation + +In 1992, he suggested releasing the kernel under the GNU General +Public License. He first announced this decision in the release notes +of version 0.12. In the middle of December 1992 he published version +0.99 using the GNU GPL. + +The kernel Linux is now a contribution of many professionals and +volonteers around the world. + + +@node Linux-libre +@subsection Linux-libre + +Linux, the kernel developed and distributed by Linus Torvalds et al, +contains non-Free Software@footnote{For more information about the +presence of proprietary firmware in the kernel Linux, read +@uref{http://www.fsfla.org/svnwiki/anuncio/2010-03-Linux-2.6.33-libre.en} +and +@uref{http://www.gnu.org/@/distros/free-system-distribution-guidelines.html#nonfree-firmware}.}, +i.e., software that does not respect your essential freedoms, and it +induces you to install additional non-Free Software that it doesn't +contain. + +GNU +Linux-libre@footnote{@uref{http://www.fsfla.org/svnwiki/selibre/linux-libre/index.en.html}} +is a project to maintain and publish 100% Free distributions of Linux, +suitable for use in Free System Distributions@footnote{For a full list +of free as in freedom GNU/Linux distributions, see +@uref{http://www.gnu.org/distros}.}, removing software that is +included without source code, with obfuscated or obscured source code, +under non-Free Software licenses, that do not permit you to change the +software so that it does what you wish, and that induces or requires +you to install additional pieces of non-Free Software. + + +@node References +@subsection References + +For more information on the GNU project and its relation with the +kernel Linux, you can read @uref{http://www.gnu.org/gnu/thegnuproject.html} +and @uref{http://www.gnu.org/gnu/gnu-linux-faq.html}. + +For more information on the history of the HURD, I recommend you to +read @uref{http://www.h-online.com/open/features/GNU-HURD-Altered-visions-and-lost-promise@/-1030942.html}. + +For more information on the HURD, read @uref{http://www.gnu.org/software/hurd}. + + +@node Purpose of this Document +@section Purpose of this Document + +Lemote offered me a Yeeloong 8133 in late 2012. I wanted to adapt some +parts of gNewSense@footnote{@uref{http://www.gnewsense.org}} for MIPS +to this particular laptop. I also wanted to port the document I wrote +for Loongson 2F to Loongson 3A: GNU/Linux@footnote{Note: in this +document, we use the term ``GNU/Linux'' to name the entire system and +``Linux'' to name the kernel. For more information, read +@uref{http://www.gnu.org/gnu/why-gnu-linux.html}.} Libre from Source +Code for Loongson 3A was born. + + +@node Prerequisites +@chapter Prerequisites + +@menu +* Definitions:: Definitions of important notions used to build the + system +* Commands:: Help on commands +@end menu + + +@node Definitions +@section Definitions + +@menu +* sysroot:: @option{sysroot} +* Toolchain:: What a Toolchain is. +* build host target:: Understanding the meaning of the + @option{build}-@option{host}-@option{target} + triplet. +* FHS:: The Filesystem Hierarchy Standard. +@end menu + + +@node sysroot +@subsection @option{sysroot} + +The traditional way of building a GNU/Linux operating system consists +on building a (cross-) compilation toolchain to build a temporary +operating system which in turn will be used to build the target +system@footnote{@pxref{Further Readings} section for more +details}. This requires almost as much time to complete the temporary +system as to build the target one. Using sysroot resolves this +problem. + +From GCC installation manual, under Cross-Compiler-Specific Options: + +@table @code +@item --with-sysroot +@itemx --with-sysroot=@var{dir} +Tells GCC to consider @var{dir} as the root of a tree that contains (a +subset of) the root filesystem of the target operating system. Target +system headers, libraries and run-time object files will be searched +in there. More specifically, this acts as if +@option{--sysroot=@var{dir}} was added to the default options of the +built compiler. The specified directory is not copied into the +install tree, unlike the options @option{--with-headers} and +@option{--with-libs} that this option obsoletes. The default value, +in case @option{--with-sysroot} is not given an argument, is +@option{$@{gcc_tooldir@}/sys-root}. If the specified directory is a +subdirectory of @option{$@{exec_prefix@}}, then it will be found +relative to the GCC binaries if the installation tree is moved. + +This option affects the system root for the compiler used to build +target libraries (which runs on the build system) and the compiler +newly installed with @code{make install}; it does not affect the +compiler which is used to build GCC itself. +@end table + + +@node Toolchain +@subsection Toolchain + +According to +Wikipedia@footnote{@uref{http://www.wikipedia.org/wiki/Toolchain}}: + +@quotation +In software, a toolchain is the set of programming tools that are used +to create a product (typically another computer program or system of +programs). The tools may be used in a chain, so that the output of +each tool becomes the input for the next, but the term is used widely +to refer to any set of linked development tools. + +A simple software development toolchain consists of a text editor for +editing source code, a compiler and linker to transform the source +code into an executable program, libraries to provide interfaces to +the operating system, and a debugger. +@end quotation + + +@node build host target +@subsection @option{build}, @option{host} and @option{target} + +During a cross-compilation, @option{build} @option{host} and +@option{target} are among the most used options: understanding the +precise meaning of those parameters is very important. We could define +them thus: + +@itemize +@item @option{--build=@var{platform on which the program is +compiled}}, +@item @option{--host=@var{platform on which the program will run}}, +@item @option{--target=@var{platform for which the program will create +output}}. +@end itemize + +Let's use GCC as an example to explain the role of those three +parameters. + +During GCC compilation, we use: + +@samp{./configure --build=@var{build-platform} +--host=@var{host-platform} --target=@var{target-platform} [various +compilation parameters]} + +So in those configuration parameters: + +@itemize +@item +@option{--build} provides the name of the platform currently running. +If we were using an Intel Pentium processor to compile the system, our +@var{build-platform} would be something like @samp{i686-pc-linux-gnu}. + +If this parameter is not specified, it will be guessed automatically. + +@item +@option{--host} represents the type of machine we are going to run GCC +on after the compilation succeeds. During a cross-compilation this has +to be specified, because the current machine can not know which +architecture we wish to target. We want to produce executables to run +on @emph{Loongson}, but there is currently no way we can specify +@samp{Loongson} directly; because of this we specify +@samp{mips64el-unknown-linux-gnu}. + +@option{--host} can also be left unspecified, in that case, +@var{host-platform} would automatically define itself as +@var{build-platform}, but this is not cross-compilation anymore. + +@quotation Note +when @option{--build} and @option{--host} are different, configuration +files will maintain the cross-compilation mode. +@end quotation + +@item +@option{--target} defines the system for which compiler tools will +create output. + +@var{target-platform} parameter is useful only for a limited number of +programs. Although this parameter is often present when issuing +@samp{./configure --help}, hardly any packages will need it. + +This parameter is only useful for performing tasks with different +platforms; for instance, executable files compiled for different +platforms can have a totally different code. +@end itemize + +If we summarize, we have: + +@itemize +@item @var{build-platform}: automatically guessed from platform in +use; has to be specified if not guessed. + +@item @var{host-platform}: if unspecified, automatically equals +@var{build-platform}. When @var{build-platform} and +@var{host-platform} values are identical, it is a local compilation; +otherwise it is a cross-compilation. + +@item @var{target-platform}: defines the system for which compiler +tools will create output; it equals @var{host-platform} if +unspecified. GCC, binutils, and programs related to the platform's +instructions have this parameter; most programs do not use this +parameter. +@end itemize + + +@node FHS +@subsection FHS + +The Filesystem Hierarchy Standard (FHS) has been created to specify +the location and use of main directories on a GNU/Linux operating +system. Common commands, user data, libraries have to be put inside a +specific directory given in the standard. During the build process, +some commands are used to comply with FHS. + + +@node Commands +@section Commands + +Because most commands are common for a regular Unix user, only +uncommon commands are explained in this document. If you do not +understand a command that is not explained, you can use the +documentation available on your computer; in a terminal, typing +@samp{man @var{command}} should give you enough information. For GNU +software, @samp{info @var{package}} can also give additional +information. + +To know more about command line, I suggest you read "Introduction to +the Command Line" which is available on +@uref{http://flossmanuals.net/command-line/}. + + +@node Preliminary Work +@chapter Preliminary Work + +@quotation Important +In order to complete the first steps of this chapter, you will need to +have root permissions. +@end quotation + +@menu +* Build Partition Creation:: Creating a partition for the build. +* Build User Creation:: Creating a user account dedicated to + the build. +* Work Directory Creation:: Creating the parent directory for the + build. +* Partition Mount:: Mounting the partition dedicated to the + build. +* Useful Directories Creation:: Creating the directories for downloads + and compilations. +* User Switch:: Switching to the user dedicated to the + build. +* Environment Variables Setup:: Setting up the environment variables + of the target system. +* Downloads:: Downloading needed packages and + patches. +* Final Preparations:: Preparing the system for the build. +@end menu + + +@node Build Partition Creation +@section Build Partition Creation + +To dedicate the partition @file{/dev/sda8} to the system build, and to +define the filesystem to be used for it as @samp{ext3}: + +@verbatim +mke2fs -t ext3 /dev/sda8 +@end verbatim + +Option @option{-t} is followed by the type of filesystem to be +used. The filesystem @samp{ext3} is used as it is one of the most +common filesystem used with the kernel Linux. + + +@node Build User Creation +@section Build User Creation + +To create the builder group, user and password: + +@verbatim +groupadd gllfsc +useradd -s /bin/bash -g gllfsc -m -k /dev/null gllfsc +passwd gllfsc +@end verbatim + +@itemize +@item +Option @option{-s} (or @option{--shell}) is used to define the created +user's default shell, here @file{/bin/bash}. + +@item +Option @option{-g} (or @option{--gid}) is used to define the group +name or number of the created user's initial login group, here +@samp{gllfsc}. + +@item +Option @option{-m} (or @option{--create-home}) does create the user's +home directory if it does not exist (@file{/home/@var{username}}). + +@item +Option @option{-k} (or @option{--skel}) is used to define the skeleton +directory to be copied in the user's home directory, here +@file{/dev/null}. @file{/dev/null} is a special file which, in this +case, will give no skeleton at all to @command{useradd}. +@end itemize + + +@node Work Directory Creation +@section Work Directory Creation + +To create the directory @file{/gllfsc} in which the system will be +built: + +@verbatim +export TARGET_DIR="/gllfsc" +mkdir -pv ${TARGET_DIR} +@end verbatim + +@samp{export TARGET_DIR="/gllfsc"} sets the value of the variable +@env{TARGET_DIR} to @file{/gllfsc}, the directory in which the system +will be built. + + +@node Partition Mount +@section Mounting Partition + +To mount the hard drive partition, for instance @file{/dev/sda8}, used +to build the system: + +@verbatim +mount /dev/sda8 ${TARGET_DIR} +@end verbatim + + +@node Useful Directories Creation +@section Creating Compilation and Download Directories + +@verbatim +mkdir -pv ${TARGET_DIR}/{build,download} +chown -Rv gllfsc ${TARGET_DIR} +@end verbatim + + +@node User Switch +@section Switching to the Build User + +To login as the user that will build the system: + +@verbatim +su - gllfsc +@end verbatim + +With the command @command{su}, it is possible to change the user +ID. The option @option{-} provides an environment similar to what the +user would expect had the user logged in directly. + + +@node Environment Variables Setup +@section Setting up Required Environment Variables + +@file{~/.bash_profile} is a personal initialization file that is read +when Bash is invoked as an interactive login shell (@file{~} is the +location of the user's home directory). To write the content of the +file @file{~/.bash_profile}: + +@verbatim +cat > ~/.bash_profile << "EOF" +exec env -i HOME=${HOME} TERM=${TERM} PS1=${PS1} /bin/bash +EOF +@end verbatim + +The first line creates the file @file{~/.bash_profile} and opens it +for writing until @samp{@acronym{EOF}} (End Of File) is written in it. + +The second line tells Bash to execute @file{/bin/bash} with the option +@option{-i} (or @option{--ignore-environment}) which will make Bash +start with an empty environment. Variables @env{HOME}, @env{TERM} and +@env{PS1} define respectively the home directory of the current user, +the terminal used and the primary prompt string displayed. + +@file{~/.bashrc} is a personal initialization file that is read when +Bash is invoked as an interactive shell but not a login one. To write +the content of the file @file{~/.bashrc}: + +@verbatim +cat > ~/.bashrc << "EOF" +set +h +umask 022 +alias make='make -j4' +export PS1='\[\e[35m\]\A-\W\[\e[00m\]\$ ' +export TARGET_DIR=/gllfsc +export LC_ALL=POSIX +export BUILD_DIR="${TARGET_DIR}/build" +export DOWNLOAD_DIR="${TARGET_DIR}/download" +export CROSS_HOST="$(echo $MACHTYPE |\ + sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")" +export CROSS_TARGET="mips64el-unknown-linux-gnu" +export MABI="n32" +#export MABI="64" +export MARCH="loongson3a" +export PATH=${TARGET_DIR}/cross-tools/bin:/bin:/usr/bin +unset CFLAGS +unset CXXFLAGS +EOF +source ~/.bash_profile +@end verbatim + +@samp{set +h} tells Bash to not locate nor remember commands (hash) as +they are looked up for execution. + +@samp{umask 022} sets Bash process' file creation mask to +@samp{022}. This results in permissions of `755' for those files. + +@samp{alias make='make -j4'} tells Bash to replace every call of +@samp{make} by @samp{make -j4}. This makes full use of the four cores +available in the Loongson 3A to build packages by parallelizing tasks. + +@samp{export PS1='\[\e[35m\]\A-\W\[\e[00m\]\$ '} sets the primary +prompt strings. The primary prompt strings are the strings you see +before the commands you type in the terminal. The part @samp{\A-\W} +means that the time, in 24-hour HH:MM format and the basename of +@env{$PWD} will be displayed separated by a `-', as in +@samp{19:33-bin}. The part @samp{\$} adds a dollar sign at the end, +@samp{\[\e[35m\]} colors the strings in purple and @samp{\[\e[00m\]} +gets the original color back. For other colors, you can browse +@uref{http://en.wikipedia.org/wiki/ANSI_escape_code}. + +@env{LC_ALL} is a macro used to define a single locale to overwrite +other @env{LC_*} and @env{LANG} environment variables so that +language, numeric values, time and other locale-dependant values have +all the same value. It is set to the standard POSIX locale. + +@samp{export BUILD_DIR="$@{TARGET_DIR@}/build"} sets the environment +variable @env{BUILD_DIR} to the value of @samp{$@{TARGET_DIR@}/build} +which is @samp{/gllfsc/build} in this document. + +The value of variable @env{CROSS_HOST} equals the value of variable +@env{MACHTYPE} of the current machine (for instance +@samp{i686-pc-linux-gnu}) modulo the second word, which is replaced by +@samp{cross} (i.e. @samp{i686-cross-linux-gnu}). + +The value of variable @env{CROSS_TARGET} equals the value of variable +@env{MACHTYPE} of the machine for which the system is built (i.e. +@samp{mips64el-unknown-linux-gnu}). + +The variable @env{MABI} defines the @acronym{ABI} (Application Binary +Interface) for which the system will be built. @option{-mabi} is an +option of GCC. n32/64 are for 64-bit CPUs only. 64 has 64-bit pointers +and long integers, whereas n32 has 32-bit pointers and long integers. + +The variable @env{MARCH} defines the architecture for which the system +will be built. @option{-march} is an option of @acronym{GCC} (GNU +Compiler Collection). + +The variable @env{PATH} contains a colon-separated list of directories +in which the shell looks for commands. The shell will first look for +commands in @file{$@{TARGET_DIR@}/cross-tools/bin}, then, if the +command was not found, in @file{/bin} and finally in @file{/usr/bin}. + +@command{unset} command removes the variable associated, here +@env{CFLAGS} and @env{CXXFLAGS}. Those variables are used by GCC as +extra flags given to the C compiler and the C++ compiler +respectively. + +Finally @samp{source ~/.bash_profile} reads and executes the content +of the file @file{~/.bash_profile}. + + +@node Downloads +@section Downloads + +@menu +* Packages Download:: List of packages to be downloaded. +* Patches Download:: List of patches to be downloaded. +@end menu + + +@node Packages Download +@subsection Downloading Packages + +The packages listed below are those used in this document. You can try +other versions but you will need a recent version of Binutils, GCC and +the kernel Linux in order to build GLLFSC for Loongson 3A. + +Download those files under @env{$@{DOWNLOAD_DIR@}} (which is +@file{/gllfsc/download} in this document). + + +@itemize +@item +Autoconf: @uref{http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz}. + +@item +Automake: @uref{http://ftpmirror.gnu.org/automake/automake-1.14.tar.gz}. +@c @uref{http://ftpmirror.gnu.org/automake/automake-1.13.1.tar.gz}. + +@item +Bash: @uref{http://ftpmirror.gnu.org/bash/bash-4.2.tar.gz}. + +@item +Binutils: @uref{http://ftpmirror.gnu.org/binutils/binutils-2.23.2.tar.bz2}. +@c @uref{http://ftpmirror.gnu.org/binutils/binutils-2.23.1.tar.bz2}. + +@item +Bison: @uref{http://ftpmirror.gnu.org/bison/bison-2.7.tar.gz}. +@c @uref{http://ftpmirror.gnu.org/bison/bison-2.5.tar.bz2}. + +@item +Bootscripts: @uref{http://ftp.cross-lfs.org/pub/clfs/conglomeration/bootscripts@/-cross-lfs/bootscripts-cross-lfs-2.0.0.tar.xz}. +@c @uref{http://ftp.cross-lfs.org/pub/clfs/conglomeration/bootscripts-@/cross-lfs/bootscripts-cross-lfs-1.2-pre11.tar.bz2}. + +@item +Bzip2: @uref{http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz}. + +@item +Coreutils: @uref{http://ftpmirror.gnu.org/coreutils/coreutils-8.19.tar.xz}. +@c @uref{http://ftpmirror.gnu.org/coreutils/coreutils-8.21.tar.xz} fails. + +@item +DHCPCD: @uref{http://roy.marples.name/downloads/dhcpcd/dhcpcd-6.0.2.tar@/.bz2}. +@c @uref{http://roy.marples.name/downloads/dhcpcd/dhcpcd-5.99.3.tar@/.bz2}. + +@item +Diffutils: @uref{http://ftpmirror.gnu.org/diffutils/diffutils-3.2.tar.gz}. + +@item +E2fsprogs: @uref{http://downloads.sourceforge.net/e2fsprogs/e2fsprogs-1.42.8.tar@/.gz}. +@c @uref{http://downloads.sourceforge.net/e2fsprogs/e2fsprogs-1.42.7.tar@/.gz}. + +@item +File: @uref{ftp://ftp.astron.com/pub/file/file-5.14.tar.gz}. +@c @uref{ftp://ftp.astron.com/pub/file/file-5.12.tar.gz}. + +@item +Findutils: @uref{http://ftpmirror.gnu.org/findutils/findutils-4.4.2.tar.gz}. + +@item +Flex: @uref{http://downloads.sourceforge.net/flex/flex-2.5.37.tar.bz2}. + +@item +Gawk: @uref{http://ftpmirror.gnu.org/gawk/gawk-4.1.0.tar.gz}. +@c @uref{http://ftpmirror.gnu.org/gawk/gawk-4.0.2.tar.gz}. + +@item +GCC: @uref{http://ftpmirror.gnu.org/gcc/gcc-4.7.3/gcc-4.7.3.tar.bz2}. +@c 4.8.1 gives the following error message at `make`: +@c /usr/include/bits/resource.h:137: error: declaration does not declare anything +@c ../../gcc-4.8.1/gcc/system.h:448: error: new declaration 'char* strstr(const char*, const char*)' +@c @uref{http://ftpmirror.gnu.org/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2}. + +@item +Gettext: @uref{http://ftpmirror.gnu.org/gettext/gettext-0.18.3.tar.gz}. +@c @uref{http://ftpmirror.gnu.org/gettext/gettext-0.18.2.tar.gz}. + +@item +Glibc: @uref{http://ftpmirror.gnu.org/glibc/glibc-2.16.0.tar.bz2}. +@c fails to generate localedef, see +@c http://sourceware.org/bugzilla/show_bug.cgi?id=14624 +@c @uref{http://ftpmirror.gnu.org/glibc/glibc-2.13.tar.bz2}. + +@item +Glibc-Ports: @uref{http://ftpmirror.gnu.org/glibc/glibc-ports-2.16.0.tar.bz2}. +@c @uref{http://ftpmirror.gnu.org/glibc/glibc-ports-2.13.tar.bz2}. + +@item +Gmp: @uref{http://ftpmirror.gnu.org/gmp/gmp-5.1.2.tar.bz2}. +@c @uref{http://ftpmirror.gnu.org/gmp/gmp-5.0.5.tar.bz2}. + +@item +Grep: @uref{http://ftpmirror.gnu.org/grep/grep-2.14.tar.xz}. + +@item +Groff: @uref{http://ftpmirror.gnu.org/groff/groff-1.22.2.tar.gz}. +@c @uref{http://ftpmirror.gnu.org/groff/groff-1.22.1.tar.gz}. + +@item +Gzip: @uref{http://ftpmirror.gnu.org/gzip/gzip-1.6.tar.gz}. +@c @uref{http://ftpmirror.gnu.org/gzip/gzip-1.5.tar.gz}. + +@item +Iana-Etc: @uref{http://sethwklein.net/iana-etc-2.30.tar.bz2}. + +@item +Inetutils: @uref{http://ftpmirror.gnu.org/inetutils/inetutils-1.9.1.tar.gz} +@c Iputils: @uref{http://www.skbuff.net/iputils/iputils-s20071127.tar.bz2}. +@c @uref{http://www.skbuff.net/iputils/iputils-s20121221.tar.bz2}. +@c @uref{http://www.skbuff.net/iputils/iputils-s20101006.tar.bz2}. +@c depends on sysfs headers. + +@item +Iproute2: @uref{http://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-3.10.0@/.tar.bz2} +@c @uref{http://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-3.7.0@/.tar.bz2} + +@item +Kbd: @uref{http://ftp.altlinux.org/pub/people/legion/kbd/kbd-1.15.5.tar.gz}. +@c @uref{http://ftp.altlinux.org/pub/people/legion/kbd/kbd-1.15.3.tar.gz}. + +@item +Kmod: @uref{http://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-14.tar.gz}. +@c @uref{http://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-12.tar.gz}. + +@item +Less: @uref{http://www.greenwoodsoftware.com/less/less-458.tar.gz}. +@c @uref{http://www.greenwoodsoftware.com/less/less-451.tar.gz}. + +@item +Libtool: @uref{http://ftpmirror.gnu.org/libtool/libtool-2.4.tar.gz}. + +@item +Linux-Libre @footnote{The kernel Linux is shipped with proprietary +firmware. The version called Linux-Libre exists without them, it is +available for download at +@uref{http://www.fsfla.org/svnwiki/selibre/linux-libre/}.}. +@c @uref{http://linux-libre.fsfla.org/pub/linux-libre/releases/3.5.4-gnu@//linux-libre-3.5.4-gnu.tar.bz2}. + +@item +M4: @uref{http://ftpmirror.gnu.org/m4/m4-1.4.16.tar.bz2}. + +@item +Make: @uref{http://ftpmirror.gnu.org/make/make-3.82.tar.bz2}. + +@item +Man-Pages: @uref{http://www.kernel.org/pub/linux/docs/man-pages/Archive/man-pages-@/3.52.tar.bz2}. +@c @uref{http://www.kernel.org/pub/linux/docs/man-pages/Archive/man-pages-@/3.46.tar.bz2}. + +@item +Man: @uref{http://primates.ximian.com/~flucifredi/man/man-1.6g.tar.gz}. + +@item +Mpc: @uref{http://www.multiprecision.org/mpc/download/mpc-1.0.1.tar.gz}. + +@item +Mpfr: @uref{http://www.mpfr.org/mpfr-3.1.1/mpfr-3.1.2.tar.bz2}. +@c @uref{http://www.mpfr.org/mpfr-3.1.1/mpfr-3.1.1.tar.bz2}. + +@item +Nano: @uref{http://ftpmirror.gnu.org/nano/nano-2.3.2.tar.gz} +@c @uref{http://ftpmirror.gnu.org/nano/nano-2.3.1.tar.gz} + +@item +Ncurses: @uref{ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz}. + +@item +Patch: @uref{http://ftpmirror.gnu.org/patch/patch-2.7.1.tar.bz2}. + +@item +Procps: @uref{http://procps.sourceforge.net/procps-3.2.8.tar.gz}. + +@item +Psmisc: @uref{http://sourceforge.net/projects/psmisc/files/psmisc/psmisc-22.20.tar@/.gz/download}. + +@item +Readline: @uref{http://ftpmirror.gnu.org/readline/readline-6.2.tar.gz}. + +@item +Rsyslog: @uref{http://rsyslog.com/files/download/rsyslog/rsyslog-5.8.6.tar.gz}. +@c @uref{http://rsyslog.com/files/download/rsyslog/rsyslog-7.2.5.tar.gz}. +@c has too many dependencies + +@item +Sed: @uref{http://ftpmirror.gnu.org/sed/sed-4.2.2.tar.bz2}. +@c @uref{http://ftpmirror.gnu.org/sed/sed-4.2.1.tar.bz2}. + +@item +Shadow: @uref{http://pkg-shadow.alioth.debian.org/releases/shadow-4.1.4.3.tar.bz2}. +@c Requires automake 1.11.5 and autoconf 2.69: +@c @uref{http://pkg-shadow.alioth.debian.org/releases/shadow-4.1.5.1.tar@/.bz2}. + +@item +Sysvinit: @uref{http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf@/.tar.bz2}. + +@item +Tar: @uref{http://ftpmirror.gnu.org/tar/tar-1.26.tar.bz2}. + +@item +Texinfo: @uref{http://ftpmirror.gnu.org/texinfo/texinfo-5.1.tar.gz}. +@c @uref{http://ftpmirror.gnu.org/texinfo/texinfo-4.13a.tar.gz}. + +@item +Udev: @uref{ftp://ftp.kernel.org/pub/linux/utils/kernel/hotplug/udev-175.tar.gz}. +@c @uref{http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-182.tar.bz2}. +@c troubles with blkid + +@item +Util-Linux: @uref{http://www.kernel.org/pub/linux/utils/util-linux/v2.19/util-@/linux-2.19.1.tar.bz2}. +@c requires PAM headers +@c @uref{http://www.kernel.org/pub/linux/utils/util-linux/v2.22/util-linux-2.22.tar.bz2}. + +@item +XZ-Utils: @uref{http://tukaani.org/xz/xz-5.0.5.tar.bz2}. +@c @uref{http://tukaani.org/xz/xz-5.0.4.tar.bz2}. + +@item +Zlib: @uref{http://www.zlib.net/zlib-1.2.8.tar.gz}. +@c @uref{http://sourceforge.net/projects/libpng/files/zlib/1.2.7/zlib-1.2.7.tar@/.bz2/download}. +@end itemize + + +@node Patches Download +@subsection Downloading Patches + +Patches and configuration files location: + +@itemize +@item +@uref{http://cjarry.org/gnu-linux/gllfsc/gllfsc-loongson3a-1.0-@/patches.tar.gz}. After +having downloaded this file under @env{$@{DOWNLOAD_DIR@}}, execute +the following commands to extract its content: + +@verbatim +pushd ${DOWNLOAD_DIR} +tar xvf gllfsc-loongson3a-1.0-patches.tar.gz +popd +@end verbatim + +@item +The page +@uref{http://dev.lemote.com/cgit/linux-official.git/commit/?h=linux-3.6@/&id=94fe1f0a7d2e3042fa7fadfd15da71b9d0c11809} +describes the changes to be made to the kernel in order to add support +for Chinese fonts in console. The patch applies to Linux 3.6. +Be aware though that applying this patch to the kernel may make +characters that are both non-@acronym{CJK} (Chinese Japanese Korean) +and non-ASCII unreadable (accented letters, cyrillic, etc.). + +@item +The page +@uref{http://microcai.gsalex.net/old/archives/2011/01/fbcon_UNICODE_font_support.html} +is useful for users who want support for @acronym{CJK} (Chinese +Japanese Korean) characters under the (non-graphical) terminal. It +gives access to a git@footnote{@uref{http://git-scm.com/}} repository +with kernel patches@footnote{The patches to use with version 3.5 of +the kernel are the first four on +@uref{http://repo.or.cz/w/linux-2.6/cjktty.git/shortlog/refs/heads/3.5-utf8}.} +that permit direct rendering of UTF-8 characters under the framebuffer +environment. Be aware though that applying those CJK patches to the +kernel may make characters that are both non-CJK and non-ASCII +unreadable (accented letters, cyrillic, etc.). + +@item +@uref{http://www.fsfla.org/svn/fsfla/software/linux-libre/lemote/gnewsense/tags/@/3.9.0-gnu_0loongsonlibre/100gnu+freedo.patch} +@footnote{@uref{http://www.fsfla.org/svn/fsfla/software/linux-libre/lemote/gnewsense/tags/@/2.6.36-libre-lemote_0lxo/100gnu+freedo.patch} +if you choose version 2.6.36 of the kernel.} +this patch adds a picture of a GNU beside Freedo, Freedo being the +mascot of Linux-Libre. The image can be seen on +@uref{http://www.fsfla.org/svnwiki/selibre/linux-libre/100gnu+freedo}. +@end itemize + + +@node Final Preparations +@section Final Preparations + +@menu +* Target Filesystem Hierarchy Creation:: Creating the directories of + the target system. +* Needed Files Creation:: Creating files for needed + user, groups and log. +@end menu + + +@node Target Filesystem Hierarchy Creation +@subsection Target Filesystem Hierarchy Creation + +@verbatim +pushd ${TARGET_DIR} +mkdir -pv bin boot dev {etc/,}opt home lib mnt +mkdir -pv proc media/{floppy,cdrom} sbin srv sys +mkdir -pv var/{lock,log,mail,run,spool} +mkdir -pv var/{opt,cache,lib/{misc,locate},local} +install -dv -m 0750 root +install -dv -m 1777 {var/,}tmp +mkdir -pv usr/{,local/}{bin,include,lib,sbin,src} +mkdir -pv usr/{,local/}share/{doc,info,locale,man} +mkdir -pv usr/{,local/}share/{misc,terminfo,zoneinfo} +mkdir -pv usr/{,local/}share/man/man{1..8} +for dir in usr{,/local}; do + ln -sv share/{man,doc,info} $dir +done +ln -svf lib lib64 +ln -svf lib lib32 +ln -svf lib usr/lib64 +ln -svf lib usr/lib32 +cd boot +ln -svf . boot +popd +@end verbatim + +The command @samp{install -dv -m 1777 @{var/,@}tmp} creates the +directories @file{var/tmp} and @file{tmp} with the permissions to +read, write and execute for everyone. The '1' in @samp{1777} is the +sticky bit which allows deletion of the file or directory having this +attribute only for the owner of the file or directory. + +The command @samp{ln -svf lib lib64} creates a symbolic link (option +@option{-s}) with the name @file{lib64} which will point to +@file{lib}. + + +@node Needed Files Creation +@subsection Creating needed user, groups and log files + +@verbatim +cat > ${TARGET_DIR}/etc/passwd << "EOF" +root::0:0:root:/root:/bin/bash +EOF +@end verbatim + +The file @file{/etc/passwd} contains one line for each user account, +with seven fields delimited by colons. These fields are: + +@itemize +@item +login name; + +@item +optional encrypted password; + +@item +numerical user ID; + +@item +numerical group ID; + +@item +user name or comment field; + +@item +user home directory; + +@item +optional user command interpreter. +@end itemize + + +@verbatim +cat > ${TARGET_DIR}/etc/group << "EOF" +root:x:0: +bin:x:1: +sys:x:2: +kmem:x:3: +tty:x:4: +tape:x:5: +daemon:x:6: +floppy:x:7: +disk:x:8: +lp:x:9: +dialout:x:10: +audio:x:11: +video:x:12: +utmp:x:13: +usb:x:14: +cdrom:x:15: +EOF +@end verbatim + +The file @file{/etc/group} is a text file which defines the groups on +the system. There is one entry per line, with the following format: +@samp{group_name:password:GID:user_list}. + + +@verbatim +touch ${TARGET_DIR}/var/run/utmp \ + ${TARGET_DIR}/var/log/{btmp,lastlog,wtmp} +chmod -v 664 ${TARGET_DIR}/var/run/utmp \ + ${TARGET_DIR}/var/log/lastlog +@end verbatim + + +@node Building the Cross-Compilation Toolchain +@chapter Building the Cross-Compilation Toolchain + +In this chapter, the cross-compilation toolchain is built as well as +core components of the target system. Those will then be used to build +the target system. + +@menu +* Target Linux-Header:: Linux-Header for target system. +* Cross Binutils:: Binutils for cross-compilation. +* Cross GCC:: GCC for cross-compilation (C support only). +* Target glibc:: glibc for target system. +* Cross GCC CXX:: GCC for cross-compilation (C and C++ support). +@end menu + + +@node Target Linux-Header +@section Target Linux-Header + +In this document, the kernel used is the one modified by Lemote to +support Loongson 3A. It is planned to merge the changes made by Lemote +into the official kernel maintained by Linus Torvalds. At the time of +writing, this merge has not been made. + +@verbatim +# 5 hours mostly to get the kernel from git +pushd ${BUILD_DIR} +# The following command takes about 5 hours to complete +# with a high band width internet connection +#3.9.0: +git clone git://dev.lemote.com/linux-official.git +# The following command takes about 30 minutes to complete +# with a high band width internet connection +#2.6.36-21.lemote: +#git clone git://dev.lemote.com/linux-3A.git +wget http://linux-libre.fsfla.org/pub/linux-libre/releases/3.9-gnu/deblob-{3.9,check} +#wget http://linux-libre.fsfla.org/pub/linux-libre/releases/2.6.36-gnu/deblob-{2.6.36,check} +chmod u+x deblob* +cd linux-official +#cd linux-3A +# About 60 minutes for the following command +../deblob-3.9 --force +# About 45 minutes for the following command +#../deblob-2.6.36 --force +cd .. +# About 2 minutes for the following one (1.1G) +tar -cf linux-3.9-loongson3a-deblobbed.tar linux-official +#tar -cf linux-2.6.36-21-loongson3a-deblobbed.tar linux-3A +cd linux-official +#cd linux-3A +make mrproper +make ARCH=mips headers_check +make ARCH=mips INSTALL_HDR_PATH=dest headers_install +cp -rv dest/include/* ${TARGET_DIR}/usr/include +cd .. +rm -rf linux-official deblob* +#rm -rf linux-3A deblob* +popd +@end verbatim + +@samp{5 hours} is the time it takes to build the package on Lemote +Yeeloong with a Loongson 3A processor. For this particular package, it +incudes the time required to pull the source from git. + +The command @samp{make mrproper} cleans the sources. + +We need to specify @samp{ARCH=mips} as we are cross-compiling. + + +@node Cross Binutils +@section Cross Binutils + +GNU Binutils (GNU binary utilities) is a collection of programs for +manipulating binaries. + + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/binutils-2.23.2.tar.bz2 -C ${BUILD_DIR} +pushd $BUILD_DIR/binutils-2.23.2 +mkdir -pv ../binutils-build +cd ../binutils-build +CC="gcc" AR="ar" \ + ../binutils-2.23.2/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --enable-64-bit-bfd \ + --with-sysroot=${TARGET_DIR} \ + --disable-nls \ + --enable-shared +make configure-host +make +make install +cp -v ../binutils-2.23.2/include/libiberty.h \ + ${TARGET_DIR}/usr/include +cd .. +rm -rf binutils-build +rm -rf binutils-2.23.2 +popd +@end verbatim + +@samp{CC="gcc"} and @samp{AR="ar"} are flags that tell the +@file{configure} script to use the local commands @command{gcc} as the +C compiler and @command{ar} as the program that handles archives. + +@option{--prefix=$@{TARGET_DIR@}/cross-tools} tells the configure +script to install architecture-independant files in +@file{$@{TARGET_DIR@}/cross-tools}. + +The option @option{--enable-64-bit-bfd} enables 64 bit for +@acronym{BFD} (the Binary File Descriptor). + +@option{--with-sysroot=@env{$@{TARGET_DIR@}}} tells Binutils to +consider @env{$@{TARGET_DIR@}} as the root of a tree that contains (a +subset of) the root filesystem of the target operating system. Target +system headers, libraries and run-time object files will be searched +in there. + +The @option{--enable-nls} option enables Native Language Support +(NLS), which lets Binutils output diagnostics in languages other than +American English. Native Language Support is enabled by default if not +doing a canadian cross build. The @option{--disable-nls} option +disables NLS. + +The option @option{--enable-shared} is used to build shared versions +of libraries, if shared libraries are supported on the target +platform. Use @option{--disable-shared} to build only static +libraries. + +@c cp -v ../binutils-2.22/include/libiberty.h \ +@c ${TARGET_DIR}/usr/include + + +@node Cross GCC +@section Cross GCC (C support only) + +GCC is the GNU compiler collection. It can compile many languages, of +which only C and C++ will be enabled in this document. + +In this section, we build a minimal GCC in order to build glibc. + +@quotation Warning +to build GMP (a GCC dependency), you need a version of GCC different +from 4.3.2 on you system@footnote{@uref{http://gmplib.org/#STATUS}}: +@end quotation + +@quotation +GCC 4.3.2 miscompiles GMP on 64-bit machines; please use a different +gcc version (e.g., gcc 4.3.1 and gcc 4.3.3 both work properly). We +have not been able to find any workaround for this gcc bug. +Unfortunately, Debian 5.0 has decided to stay with this trouble gcc +version, resulting in that many users strike this bug. +@end quotation + +I recommend installing @samp{gcc-4.4} on gNewSense Parkes to avoid +this issue. + +@verbatim +# 35 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.3.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gcc-4.7.3 +tar xf ${DOWNLOAD_DIR}/gmp-5.1.2.tar.bz2 +mv gmp-5.1.2 gmp +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz +mv mpc-1.0.1 mpc +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.2.tar.bz2 +mv mpfr-3.1.2 mpfr +mkdir -pv ../gcc-build +cd ../gcc-build +../gcc-4.7.3/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --with-sysroot=${TARGET_DIR} \ + --disable-multilib \ + --with-newlib \ + --disable-nls \ + --disable-shared \ + --disable-threads \ + --enable-languages=c \ + --with-abi=${MABI} \ + --with-mpfr-include="${BUILD_DIR}/gcc-4.7.3/mpfr/src" \ + --with-mpfr-lib="${BUILD_DIR}/gcc-build/mpfr/src/.libs" +make all-gcc +make all-target-libgcc +make install-gcc +make install-target-libgcc +cd .. +rm -r gcc-build +rm -r gcc-4.7.3 +popd +@end verbatim + +@option{--disable-multilib} specifies that multiple target libraries +to support different target variants@footnote{Such as different ABI, +for instance n32 and 64.}, calling conventions, etc@:. should not be +built. The default is to build a predefined set of them. + +@option{--with-newlib} specifies that @samp{newlib} is being used as +the target C library. + +@option{--disable-threads} specifies that threading support should be +disabled. + +@option{--enable-languages=c} specifies that only the C compiler and +its runtime libraries should be built. + +@c --with-abi=${MABI} + +@c --with-mpfr-include="${BUILD_DIR}/gcc-4.7.3/mpfr/src" \ +@c --with-mpfr-lib="${BUILD_DIR}/gcc-build/mpfr/src/.libs" +@c to avoid error: libmpfr not found or uses a different ABI (including static vs shared). + +GCC provides a low-level runtime library, @file{libgcc.a} or +@file{libgcc_s.so.1} on some platforms. GCC generates calls to +routines in this library automatically, whenever it needs to perform +some operation that is too complicated to emit inline code for. This +is built with @samp{make all-target-libgcc} and installed with +@samp{make install-target-libgcc} + + +@node Target glibc +@section Target glibc + +Glibc is the GNU C library. It provides macros, type definitions, and +functions for tasks like string handling, mathematical computations, +input/output processing, memory allocation and several other operating +system services. + +@verbatim +# 1 hour 30 minutes +tar xf ${DOWNLOAD_DIR}/glibc-2.16.0.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/glibc-2.16.0 +tar xf ${DOWNLOAD_DIR}/glibc-ports-2.16.0.tar.bz2 +mv -v glibc-ports-2.16.0 ports +sed -i.orig "s/\ -lgcc_eh\|\ -lgcc_s//g" Makeconfig +patch -Np1 -i ${DOWNLOAD_DIR}/glibc-2.16.0-cross_hacks-2.patch +echo "" > ports/sysdeps/mips/mips64/n64/Makefile +echo "" > ports/sysdeps/mips/mips64/n32/Makefile +echo "" > ports/sysdeps/mips/mips32/Makefile +sed -i "/default) machine=/s/n32/${MABI}/g" \ + ports/sysdeps/mips/preconfigure +mkdir -pv ../glibc-build +cd ../glibc-build + +cat > config.cache << EOF +libc_cv_c_cleanup=yes +libc_cv_slibdir=/lib +EOF + +cat > configparms << EOF +install_root=${TARGET_DIR} +libdir=/usr/lib +EOF + +BUILD_CC="gcc" \ + CC="${CROSS_TARGET}-gcc -march=${MARCH} -mabi=${MABI}" \ + AR="${CROSS_TARGET}-ar" \ + RANLIB="${CROSS_TARGET}-ranlib" \ + ../glibc-2.16.0/configure \ + --prefix=/usr \ + --libexecdir=/usr/lib/glibc \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --disable-profile \ + --enable-add-ons \ + --with-tls \ + --enable-kernel=2.6.36 \ + --with-__thread \ + --with-binutils=${TARGET_DIR}/cross-tools/bin \ + --with-headers=${TARGET_DIR}/usr/include \ + --cache-file=config.cache + +make # to be run twice? + +make install + +#make localedata/install-locales +# fails with (localedef patch does not fix the following): +#....../bin/sh: /gllfsc/build/glibc-build/locale/localedef-native: not found +#Giving up installing locales for now + +cd .. +rm -rf glibc-build +rm -rf glibc-2.16.0 +popd + +cat > ${TARGET_DIR}/etc/nsswitch.conf << "EOF" +# Begin /etc/nsswitch.conf + +passwd: files +group: files +shadow: files + +hosts: files dns +networks: files + +protocols: files +services: files +ethers: files +rpc: files + +# End /etc/nsswitch.conf +EOF + +cat > ${TARGET_DIR}/etc/ld.so.conf << "EOF" +# Begin /etc/ld.so.conf + +/usr/local/lib +/opt/lib + +# End /etc/ld.so.conf +EOF +@end verbatim + +@c @samp{sed -i.orig "s/\ -lgcc_eh\|\ -lgcc_s//g" Makeconfig} + +@file{glibc-2.16.0-cross_hacks-2.patch} is used to avoid the error +@samp{/usr/bin/install: cannot remove `/usr/lib/libc.a': Permission +denied}. + +Glibc uses @samp{n32} ABI by default with MIPS. To use @env{MABI} +instead, we do the following: + +@verbatim +echo "" > ports/sysdeps/mips/mips64/n64/Makefile +echo "" > ports/sysdeps/mips/mips64/n32/Makefile +echo "" > ports/sysdeps/mips/mips32/Makefile +sed -i "/default) machine=/s/n32/${MABI}/g" \ + ports/sysdeps/mips/preconfigure +@end verbatim + +@ignore +Contents of the files above. + +cat mips64/n64/Makefile +# `long double' is a distinct type we support. +long-double-fcts = yes + +ifeq ($(filter -mabi=64,$(CC)),) +CC += -mabi=64 +endif + +cat mips64/n32/Makefile +# `long double' is a distinct type we support. +long-double-fcts = yes + +ifeq ($(filter -mabi=n32,$(CC)),) +CC += -mabi=n32 +endif + +cat mips32/Makefile +ifeq ($(filter -mabi=32,$(CC)),) +CC += -mabi=32 +endif + +grep 'default)' preconfigure + + default) machine=mips/mips64/n32 mips_config_abi=n32 ;; + +@end ignore + +The file @file{config.cache} is used to attribute values to variables +of the configure script. + +@samp{libc_cv_forced_unwind=yes} is used to avoid the error message +@samp{error: forced unwind support is required}. + +@samp{libc_cv_c_cleanup=yes} is used to avoid the error message +@samp{error: the compiler must support C cleanup handling}. + +@samp{libc_cv_slibdir=/lib} defines @file{/lib} as the directory in +which the C library of the target system will be installed, instead of +@file{/lib64} or @file{/lib32}. + +You can install glibc somewhere other than where you configured it to +go by setting the @code{install_root} variable on the command line for +@samp{make install}. The value of this variable is prepended to all +the paths for installation. This is useful when setting up a chroot +environment or preparing a binary distribution. The directory should +be specified with an absolute file name. + +Files listed in @samp{install-lib} are installed in the directory +specified by @samp{libdir} in @file{configparms} or @file{Makeconfig}. + +@verbatim +BUILD_CC="gcc" \ + CC="${CROSS_TARGET}-gcc -march=${MARCH} -mabi=${MABI}" \ + AR="${CROSS_TARGET}-ar" \ + RANLIB="${CROSS_TARGET}-ranlib" +@end verbatim + +@samp{CC="$@{CROSS_TARGET@}-gcc -march=$@{MARCH@} -mabi=$@{MABI@}"} +sets @code{CC} to the cross-compiler for the target's architecture, +processor and ABI we configured the library for. @code{AR} and +@code{RANLIB} are set to cross-compiling versions of @code{ar} and +@code{ranlib} as the native tools are not configured to work with +object files for the target we configured for. + +@option{--prefix=/usr} tells the @file{configure} script to install +glibc in the @file{/usr} directory of the target system. + +@c @option{--libexecdir=/usr/lib/glibc} tells the configure script to +@c install glibc executables inside @file{/usr/lib/glibc}. + +Unlike previous builds, @option{--host} now equals +@env{$@{CROSS_TARGET@}} instead of @env{$@{CROSS_HOST@}}. This is +because we are building the glibc version that the target system will +use. We won't have to build it later. + +Profiling can be of help to optimize a program by analysing memory +use, the usage of particular instructions, etc. Option +@option{--disable-profile} is used to disable this. + +Option @option{--enable-add-ons} is used to enable all the add-on +packages in the main source directory, which includes the glibc-ports +used to support the MIPS architecture. + +The option @option{--with-tls} tells the configure script to use +@acronym{TLS} (thread-local storage). Thread-local storage is a +computer programming method that uses memory local to a thread. + +The @samp{2.6.36} parameter given to option @option{--enable-kernel} +describes the smallest version of the Linux kernel the generated +library is expected to support. The higher the version number is, the +less compatibility code is added, and the faster the code gets. + +Option @option{--with-__thread} enables threads in glibc. + +The option @option{--with-binutils=$@{TARGET_DIR@}/cross-tools/bin} +tells the @file{configure} script to use the binutils (assembler and +linker) built in the cross-compilation toolchain process. + +@option{--with-headers=$@{TARGET_DIR@}/usr/include} indicates the +location of the kernel Linux' headers. + +@option{--cache-file=config.cache} specifies the file in which cache +variables are listed for @file{configure}. + +@c @samp{make localedata/install-locales} configures all locales that are +@c supported by glibc. + +The file @file{$@{TARGET_DIR@}/etc/nsswitch.conf} contains the +configuration of @acronym{NSS} (Name Service Switch). NSS is a facility +in Unix-like operating systems that provides a variety of sources for +common configuration databases and name resolution mechanisms. These +sources include local operating system files (such as +@file{/etc/passwd}, @file{/etc/group}, and @file{/etc/hosts}), the +Domain Name System (DNS), the Network Information Service (NIS), and +LDAP. + +@c The timezone is defined for `Paris'. + +@c Purpose of the file @file{$@{TARGET_DIR@}/etc/ld.so.conf} + + +@node Cross GCC CXX +@section Cross GCC (C and C++ support) + +In this section, we build a complete cross-compiler with support for C +and C++ languages. + +@verbatim +# 3 hours and 30 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.3.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gcc-4.7.3 +tar xf ${DOWNLOAD_DIR}/gmp-5.1.2.tar.bz2 +mv gmp-5.1.2 gmp +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz +mv mpc-1.0.1 mpc +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.2.tar.bz2 +mv mpfr-3.1.2 mpfr +mkdir -v ../gcc-build +cd ../gcc-build +../gcc-4.7.3/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --with-sysroot=${TARGET_DIR} \ + --disable-nls \ + --enable-shared \ + --enable-__cxa_atexit \ + --disable-multilib \ + --with-abi=${MABI} \ + --enable-c99 \ + --enable-long-long \ + --enable-threads=posix \ + --enable-languages=c,c++ \ + --with-mpfr-include="${BUILD_DIR}/gcc-4.7.3/mpfr/src" \ + --with-mpfr-lib="${BUILD_DIR}/gcc-build/mpfr/src/.libs" +make # to be run twice +make install +cd .. +rm -rf gcc-build +rm -rf gcc-4.7.3 +popd +@end verbatim + +@option{--enable-__cxa_atexit} enables @code{__cxa_atexit}, rather +than @code{atexit}, to register C++ destructors for local statics and +global objects. This is essential for fully standards-compliant +handling of destructors, but requires @code{__cxa_atexit} in libc. + +@option{--enable-c99} enables support for the C99 standard. + +@option{--enable-long-long} enables support for @code{long long int} +types. + +@c @option{--enable-threads=posix} + + +@node Building Cross-Compilation Tools +@chapter Building the Cross-Compilation Tools + +@menu +* Cross File:: File for cross-compilation. +* Cross Groff:: Groff for cross-compilation. +* Cross Shadow:: Shadow for cross-compilation. +* Cross M4:: M4 for cross-compilation. +* Cross Ncurses:: Ncurses for cross-compilation. +* Cross Cleaning:: Cleaning up the cross-compilation toolchain. +@end menu + + +@node Cross File +@section File + +The command @command{file} is used to determine the type of a file: +text, executable or data. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/file-5.14.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/file-5.14 +./configure \ + --prefix=${TARGET_DIR}/cross-tools +make +make install +cd .. +rm -rf file-5.14 +popd +@end verbatim + + +@node Cross Groff +@section Groff + +Groff is the GNU version of the roff document formatting system which +is used to produce man pages. + +You need G++ on your system to compile this program from source. Under +gNewSense Parkes, try @samp{sudo apt-get install g++-4.4}. + +@ignore +@quotation Note +psselect (part of psutils) is needed for documentation in HTML (see +@uref{http://cblfs.cross-lfs.org/index.php/PSUtils}). +@end quotation +@end ignore + + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/groff-1.22.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/groff-1.22.2 +PAGE=A4 \ + ./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --without-x +make +make install +cd .. +rm -rf groff-1.22.2 +popd +@end verbatim + +@samp{PAGE=A4} defines the default format of pages for printed output. + +@option{--without-x} disables the dependancy on the X window system. + + +@node Cross Shadow +@section Shadow + +The package contains programs to handle users, groups and passwords in +a secure way: passwords are encrypted. + +@verbatim +# 3 minutes +tar xf ${DOWNLOAD_DIR}/shadow-4.1.4.3.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/shadow-4.1.4.3 +patch -Np1 -i ${DOWNLOAD_DIR}/shadow-4.1.4.3-sysroot_hacks-1.patch +sed -i.orig \ + 's/bindir)\/\$\$i/bindir)\/mips64el-unknown-linux-gnu-\$\$i/' \ + src/Makefile.am +automake +echo "shadow_cv_passwd_dir=${TARGET_DIR}/bin" > config.cache +echo "ac_cv_func_lckpwdf=no" >> config.cache +./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --sbindir=${TARGET_DIR}/cross-tools/bin \ + --sysconfdir=${TARGET_DIR}/etc \ + --disable-shared \ + --without-audit \ + --without-libpam \ + --without-selinux \ + --program-prefix=${CROSS_TARGET}- \ + --cache-file=config.cache +sed -i.orig "/PASSWD_PROGRAM/s/passwd/${CROSS_TARGET}-&/" config.h +make +make install +cd .. +rm -rf shadow-4.1.4.3 +popd +@end verbatim + +@c @samp{shadow_cv_passwd_dir=$@{TARGET_DIR@}/bin} +@c @samp{ac_cv_func_lckpwdf=no} + +The patch @file{shadow-4.1.4.3-sysroot_hacks-1.patch} is used so that +shadow can be built with the sysroot method. Because we use this +patch, @samp{shadow_cv_passwd_dir=$@{TARGET_DIR@}/bin} and +@samp{ac_cv_func_lckpwdf=no} have to be added in @file{config.cache} +in order for the @file{configure} script not to test the +functionalities associated. + +@c @option{--sbindir=$@{TARGET_DIR@}/cross-tools/bin} + +@c @option{--sysconfdir=$@{TARGET_DIR@}/etc} + +@option{--without-audit}, @option{--without-libpam} and +@option{--without-selinux} disable support for auditing, @acronym{PAM} +(Pluggable authentication modules) and @acronym{SELinux} +(Security-Enhanced Linux). We do not need those extra features. + +@option{--program-prefix=$@{CROSS_TARGET@}-} prepends the value of +@env{CROSS_TARGET} (that is @samp{mips64el-unknown-linux-gnu} in this +document) to installed program names for cross-compilation. + +@c @samp{sed -i.orig "/PASSWD_PROGRAM/s/passwd/$@{CROSS_TARGET@}-&/" +@c config.h} is used to avoid the error message + + +@node Cross M4 +@section M4 + +Bison 2.5 requires M4 to be built. + +GNU M4 is a package containing an implementation of the m4 macro +language. GNU M4 is used in GNU Autoconf' @file{configure} files. + +@verbatim +# 3 minutes +tar xf ${DOWNLOAD_DIR}/m4-1.4.16.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/m4-1.4.16 +./configure \ + --prefix=${TARGET_DIR}/cross-tools +make +make install +cd .. +rm -rf m4-1.4.16 +popd +@end verbatim + + +@node Cross Ncurses +@section Ncurses + +GNU ncurses contains a library used to write text-based user +interfaces in a terminal-independent manner. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/ncurses-5.9.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/ncurses-5.9 +./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --without-shared +make -C include +make -C progs tic +install -m755 progs/tic ${TARGET_DIR}/cross-tools/bin +cd .. +rm -rf ncurses-5.9 +popd +@end verbatim + +@option{--without-shared} is used to avoid building the whole library +as only @command{tic} is installed. + + +@node Cross Cleaning +@section Cleaning up Cross-Compilation Toolchain + +In order to save some space, binaries and libraries of +cross-compilation tools can be stripped out. + +@quotation Warning +incorrect cleaning arguments used against library files can lead to +library files breaking. For this reason, be careful of the command +arguments. If you are not comfortable with this, you can skip this +section as it will have no effect on the process of building the +target system. +@end quotation + + +@verbatim +pushd ${TARGET_DIR}/cross-tools +strip --strip-all bin/* +strip --strip-debug lib/* +popd +@end verbatim + +@option{--strip-all} removes all symbols. This command reduces the +size of the @file{bin} directory's content from 29 MB to 12 MB. + +@option{--strip-debug} removes debugging symbols only. This command +reduces the size of the @file{lib} directory's content from 21 MB to +20 MB. + + +@node Building the Target System +@chapter Building the Target System + +After having set up the cross-compilation toolchain and tools, the +operating system for the target machine is built in this chapter. + +@menu +* Environment Setup:: Setting up the environment. +* Man Pages:: Building Man Pages. +* Zlib:: Building Zlib. +* Binutils:: Building Binutils. +* GMP:: Building GMP. +* MPFR:: Building MPFR. +* MPC:: Building MPC. +* GCC:: Building GCC. +* Sed:: Building Sed. +* E2fsprogs:: Building E2fsprogs. +* Coreutils:: Building Coreutils. +* iana-etc:: Building iana-etc. +* M4:: Building M4. +* Bison:: Building Bison. +* Ncurses:: Building Ncurses. +* Procps:: Building Procps. +* Libtool:: Building Libtool. +* Readline:: Building Readline. +* Autoconf:: Building Autoconf. +* Automake:: Building Automake. +* Bash:: Building Bash. +* Bzip2:: Building Bzip2. +* DHCPCD:: Building DHCPCD. +* Diffutils:: Building Diffutils. +* File:: Building File. +* Findutils:: Building Findutils. +* Flex:: Building Flex. +* Gawk:: Building Gawk. +* Gettext:: Building Gettext. +* Grep:: Building Grep. +* Groff:: Building Groff. +* Gzip:: Building Gzip. +* Inetutils:: Building Inetutils. +* Iproute2:: Building Iproute2. +* Kbd:: Building Kbd. +* Kmod:: Building Kmod. +* Less:: Building Less. +* Make:: Building Make. +* Man:: Building Man. +* Nano:: Building Nano. +* Patch:: Building Patch. +* Psmisc:: Building Psmisc. +* Rsyslog:: Building Rsyslog. +* Shadow:: Building Shadow. +* Sysvinit:: Building Sysvinit. +* Tar:: Building Tar. +* Texinfo:: Building Texinfo. +* Udev:: Building Udev. +* Util-Linux:: Building Util-Linux. +* XZ-Utils:: Building XZ-Utils. +* Bootscripts:: Building Bootscripts. +* Kernel:: Building the Kernel. +@end menu + + +@node Environment Setup +@section Setting up the Environment + +Because this chapter is about the build of the target system and not +the build of the cross-compilation toolchain and tools anymore, we +need to update some environment variables. + +For more convenience, we can set environment variables up in the +@file{~/.bashrc} file, so that this setup is preserved when logging +in: + + +@verbatim +cat >> ~/.bashrc << EOF +export CC="${CROSS_TARGET}-gcc -march=${MARCH} -mabi=${MABI}" +export CXX="${CROSS_TARGET}-g++ -march=${MARCH} -mabi=${MABI}" +export AR="${CROSS_TARGET}-ar" +export AS="${CROSS_TARGET}-as" +export RANLIB="${CROSS_TARGET}-ranlib" +export LD="${CROSS_TARGET}-ld" +export STRIP="${CROSS_TARGET}-strip" +EOF +source ~/.bash_profile +@end verbatim + +@env{CC} is the flag that indicates the C compiler to be used, +@env{CXX} the C++ compiler, @env{AR} the archiver, @env{AS} the +assembler, @env{RANLIB} the archives' index generator, @env{LD} the +linker and @env{STRIP} the program for stripping. + +All the programs to be used are prefixed with +@samp{$@{CROSS_TARGET@}-} in order to use the cross-compilation +toolchain instead of the toolchain of the host. + + +@node Man Pages +@section Man Pages + +The man-pages package documents the kernel Linux and C library's +interfaces that are used by user-space programs. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/man-pages-3.52.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/man-pages-3.52 +#tar xf ${DOWNLOAD_DIR}/man-pages-3.46.tar.bz2 -C ${BUILD_DIR} +#pushd ${BUILD_DIR}/man-pages-3.46 +make prefix=${TARGET_DIR}/usr install +cd .. +rm -rf man-pages-3.52 +#rm -rf man-pages-3.46 +popd +@end verbatim + +The option @option{prefix=$@{TARGET_DIR@}/usr} is used to install the +man pages on the target partition's @env{TARGET_DIR} instead of the +@file{/usr} directory of the host. + + +@node Zlib +@section Zlib + +Zlib is a compression/decompression library. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/zlib-1.2.8.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/zlib-1.2.8 +./configure \ + --prefix=/usr +make AR="${AR}" +make prefix=${TARGET_DIR}/usr install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/lib/libz.so.* ${TARGET_DIR}/lib +#ln -svf ../../lib/libz.so.1 ${TARGET_DIR}/usr/lib/libz.so +cd .. +rm -rf zlib-1.2.8 +popd +@end verbatim + +In order to build zlib by cross-compilation, the flag @env{AR} has to +be equal to @samp{$@{AR@}}. + + +@node Binutils +@section Binutils + +@verbatim +# 15 minutes +tar xf ${DOWNLOAD_DIR}/binutils-2.23.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/binutils-2.23.2 +mkdir -pv ../binutils-build +cd ../binutils-build +../binutils-2.23.2/configure \ + --prefix=/usr \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --target=${CROSS_TARGET} \ + --enable-64-bit-bfd \ + --enable-shared +make configure-host +make tooldir=/usr +make DESTDIR=${TARGET_DIR} tooldir=/usr install +cp -v ../binutils-2.23.2/include/libiberty.h ${TARGET_DIR}/usr/include +cd .. +rm -rf binutils-build +rm -rf binutils-2.23.2 +popd +@end verbatim + +The option @option{--host} is now set to @env{CROSS_TARGET} because +the host that will run this build will be the target system. + +@c @samp{make tooldir=/usr} +@c @samp{make DESTDIR=$@{TARGET_DIR@} tooldir=/usr install} + + +@node GMP +@section GMP + +@acronym{GMP} (GNU multiple precision arithmetic library) is required +to build GCC. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/gmp-5.1.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gmp-5.1.2 +./configure \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --enable-cxx +make +make DESTDIR=${TARGET_DIR} install +rm -v ${TARGET_DIR}/usr/lib/lib{gmp,gmpxx,mp}.la +cd .. +rm -rf gmp-5.1.2 +popd +@end verbatim + +The option @option{--enable-cxx} enables support for the C++ language. + +The files @file{$@{TARGET_DIR@}/usr/lib/lib@{gmp,gmpxx,mp@}.la} are +removed to avoid the following error when building MPFR: +@samp{/usr/lib/libgmp.so: could not read symbols: File in wrong +format}. + + +@node MPFR +@section MPFR + +GNU @acronym{MPFR} (Multiple Precision Floating-Point Reliably) is a +portable C library for arbitrary-precision binary floating-point +computation with correct rounding. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/mpfr-3.1.2 +./configure \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +rm -v ${TARGET_DIR}/usr/lib/libmpfr.la +cd .. +rm -rf mpfr-3.1.2 +popd +@end verbatim + +The file @file{$@{TARGET_DIR@}/usr/lib/libmpfr.la} is removed to +avoid the following error when building MPC: +@samp{/usr/lib/libmpfr.so: could not read symbols: File in wrong +format}. + + +@node MPC +@section MPC + +GNU @acronym{MPC} (Multiple Precision Complex Library) is a C library +for the arithmetic of complex numbers with arbitrarily high precision +and correct rounding of the result. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/mpc-1.0.1 +./configure \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf mpc-1.0.1 +popd +@end verbatim + + +@node GCC +@section GCC + +@verbatim +# 3 hours and 30 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.3.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gcc-4.7.3 +sed -i.orig 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in +sed -i.orig 's@\./fixinc\.sh@-c true@' gcc/Makefile.in +mkdir -v ../gcc-build +cd ../gcc-build +../gcc-4.7.3/configure \ + --prefix=/usr \ + --libexecdir=/usr/lib \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --target=${CROSS_TARGET} \ + --enable-shared \ + --enable-threads=posix \ + --enable-__cxa_atexit \ + --enable-c99 \ + --enable-long-long \ + --disable-multilib \ + --with-abi=${MABI} \ + --enable-clocale=gnu \ + --enable-languages=c,c++ \ + --disable-libstdcxx-pch +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#ln -sv ../usr/bin/cpp ${TARGET_DIR}/lib +ln -sv gcc ${TARGET_DIR}/usr/bin/cc +cd .. +rm -rf gcc-build +rm -rf gcc-4.7.3 +popd +@end verbatim + +@ignore +# The following patch seems needless to me as it only replaces +# {usr,}/lib32 with {usr,}/lib64 and we already have: +# {usr,}/lib32 -> {usr,}/lib +# {usr,}/lib64 -> {usr,}/lib +#patch -Np1 -i ${DOWNLOAD_DIR}/gcc-4.6.0-pure64-1.patch +@end ignore + +@samp{sed -i.orig 's/install_to_$(INSTALL_DEST) //' +libiberty/Makefile.in} is used as we already installed the library +@file{libiberty.a} with Binutils. + +@c We use @samp{sed -i.orig 's@@\./fixinc\.sh@@-c true@@' +@c gcc/Makefile.in} to avoid using fixincludes that may output errors if +@c headers have been modified. + +Using @option{--enable-clocale=gnu} option ensures that the correct +locale will automatically be chosen. + +Option @option{--disable-libstdcxx-pch} disables support for +precompiled headers (PCH). + +The line @samp{ln -sv gcc $@{TARGET_DIR@}/usr/bin/cc} creates a +symbolic link @file{cc} that points on @file{gcc}. + + +@node Sed +@section Sed + +GNU sed is a stream editor: it is used to perform basic text +transformations on an input stream (a file or input from a pipeline). + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/sed-4.2.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/sed-4.2.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf sed-4.2.2 +popd +@end verbatim + +@c @option{--bindir=/bin} FHS? + + +@node E2fsprogs +@section E2fsprogs + +E2fsprogs is a package that contains tools to handle the ext2, ext3 +and ext4 filesystems. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/e2fsprogs-1.42.8.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/e2fsprogs-1.42.8 +mkdir -v build +cd build +../configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --with-root-prefix="" \ + --enable-elf-shlibs +make +make DESTDIR=${TARGET_DIR} install +make DESTDIR=${TARGET_DIR} install-libs +rm -v ${TARGET_DIR}/usr/lib/lib{blkid,com_err,e2p,ext2fs,ss,uuid}.so +ln -sv ../../lib/libblkid.so.1 ${TARGET_DIR}/usr/lib/libblkid.so +ln -sv ../../lib/libcom_err.so.2 ${TARGET_DIR}/usr/lib/libcom_err.so +ln -sv ../../lib/libe2p.so.2 ${TARGET_DIR}/usr/lib/libe2p.so +ln -sv ../../lib/libext2fs.so.2 ${TARGET_DIR}/usr/lib/libext2fs.so +ln -sv ../../lib/libss.so.2 ${TARGET_DIR}/usr/lib/libss.so +ln -sv ../../lib/libuuid.so.1 ${TARGET_DIR}/usr/lib/libuuid.so +cd ../.. +rm -rf e2fsprogs-1.42.8 +popd +@end verbatim + +@option{--with-root-prefix=""} is used to put e2fsprogs binaries +inside @file{/sbin} instead of @file{@var{PREFIX}/sbin} which would be +@file{/usr/sbin}. + +Option @option{--enable-elf-shlibs} enables e2fsprogs shared +libraries. + +@samp{make DESTDIR=$@{TARGET_DIR@} install-libs} is used to install +libraries, those are not installed with @samp{make +DESTDIR=$@{TARGET_DIR@} install}. + +The sequence of commands that follows first removes symbolic links +@file{$@{TARGET_DIR@}/usr/lib/lib@{@/blkid,com_err,e2p,ext2fs,ss,uuid@}.so} +which point on abolute paths +@file{/lib/lib@{blkid,com_err,e2p,ext2fs,ss,uuid@}.so}. In order to +use the libraries of the target operating system, we need to symlink +@file{$@{TARGET_DIR@}/usr/lib/lib@{blkid,com_err,e2p,ext2fs,ss,uuid@}.so} +to their relative paths files. + + +@node Coreutils +@section Coreutils + +GNU coreutils (core utilities) includes the standard programs for text +and file manipulation. + +On gNewSense Parkes, you need to install @file{xz-utils} to extract +the package. + +@verbatim +# 30 minutes +tar xf ${DOWNLOAD_DIR}/coreutils-8.19.tar.xz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/coreutils-8.19 +cat > config.cache << EOF +fu_cv_sys_stat_statfs2_bsize=yes +gl_cv_func_mbrtowc_incomplete_state=yes +gl_cv_func_mbrtowc_nul_retval=yes +gl_cv_func_mbrtowc_null_arg=yes +gl_cv_func_mbrtowc_retval=yes +gl_cv_func_btowc_eof=yes +gl_cv_func_wcrtomb_retval=yes +gl_cv_func_wctob_works=yes +gl_cv_func_fstatat_zero_flag=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --enable-install-program=hostname \ + --enable-no-install-program=kill,uptime \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/{cat,chgrp,chmod,chown,cp,date} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/{dd,df,echo,false,hostname,ls,mkdir} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/{mv,pwd,rm,rmdir,stty,true,ln,uname} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/chroot ${TARGET_DIR}/usr/sbin +#mv -v ${TARGET_DIR}/usr/bin/{[,basename,head,install,nice} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/{readlink,sleep,sync,test,touch} \ +# ${TARGET_DIR}/bin +#ln -svf ../../bin/install ${TARGET_DIR}/usr/bin +cd .. +rm -rf coreutils-8.19 +popd +@end verbatim + +@c @samp{sed -i.orig '/strftime/s/\ LC_ALL//' man/help2man} + +The variables listed in the file @file{config.cache} are used in order +to avoid that the @file{configure} script evaluate their values: +otherwise the build may fail when cross-compiling. + +We use @option{--enable-install-program=hostname} to install the +command @command{hostname} which is not built by default. + +We use @option{--enable-no-install-program=kill,uptime} in order not +to install commands @command{kill} and @command{uptime}. Those +commands will be installed by the package procps. + + +@node iana-etc +@section iana-etc + +The iana-etc package installs services and protocols using data from +the Internet Assigned Numbers Authority (IANA). + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/iana-etc-2.30.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/iana-etc-2.30 +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf iana-etc-2.30 +popd +@end verbatim + + +@node M4 +@section M4 + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/m4-1.4.16.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/m4-1.4.16 +sed -i.orig '/gets is a security hole/d' lib/stdio.in.h +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf m4-1.4.16 +popd +@end verbatim + +@samp{sed -i.orig '/gets is a security hole/d' lib/stdio.in.h} is used +to fix the following error when issuing @samp{make}: +@samp{./stdio.h:477:1: error: 'gets' undeclared here (not in a +function)}. + +@c It deletes the following line in lib/stdio.in.h: +@c _GL_WARN_ON_USE (gets, ``gets is a security hole - use fgets instead''); + + +@node Bison +@section Bison + +GNU bison parser generator. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/bison-2.7.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bison-2.7 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +echo '#define YYENABLE_NLS 1' >> config.h +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf bison-2.7 +popd +@end verbatim + +@samp{echo '#define YYENABLE_NLS 1' >> config.h} is used to build +@acronym{NLS} (native language support) inside bison. + + +@node Ncurses +@section Ncurses + +@verbatim +# 7 minutes +tar xf ${DOWNLOAD_DIR}/ncurses-5.9.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/ncurses-5.9 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --with-shared \ + --enable-widec \ + --without-debug \ + --without-ada \ + --with-build-cc="gcc -D_GNU_SOURCE" \ + --libdir=/lib +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/lib/lib{panel,menu,form,ncurses,ncurses++}w.a \ +# ${TARGET_DIR}/usr/lib +#rm -v ${TARGET_DIR}/lib/lib{ncurses,menu,panel,form}w.so +#ln -svf ../../lib/libncursesw.so.5 \ +# ${TARGET_DIR}/usr/lib/libncursesw.so +#ln -svf ../../lib/libmenuw.so.5 ${TARGET_DIR}/usr/lib/libmenuw.so +#ln -svf ../../lib/libpanelw.so.5 ${TARGET_DIR}/usr/lib/libpanelw.so +#ln -svf ../../lib/libformw.so.5 ${TARGET_DIR}/usr/lib/libformw.so +#for lib in curses ncurses form panel menu ; do +# echo "INPUT(-l${lib}w)" > ${TARGET_DIR}/usr/lib/lib${lib}.so +# ln -sfv lib${lib}w.a ${TARGET_DIR}/usr/lib/lib${lib}.a +# done +ln -sfv libncursesw.so ${TARGET_DIR}/lib/libncurses.so +#ln -sfv libncursesw.so ${TARGET_DIR}/usr/lib/libcursesw.so +#ln -sfv libncursesw.a ${TARGET_DIR}/usr/lib/libcursesw.a +#ln -sfv libncurses++w.a ${TARGET_DIR}/usr/lib/libncurses++.a +#ln -sfv ncursesw5-config ${TARGET_DIR}/usr/bin/ncurses5-config +#ln -sfv ../../usr/share/terminfo ${TARGET_DIR}/usr/lib/terminfo +cd .. +rm -rf ncurses-5.9 +popd +@end verbatim + +Option @option{--enable-widec} enables wide characters support in +ncurses. + +@c Option @option{--without-debug} + +Option @option{--without-ada} disables support for the Ada programming +language inside ncurses. + +@c Option @option{--with-build-cc="gcc -D_GNU_SOURCE"} + +@c Option @option{--libdir=/lib} + +@ignore +@verbatim +for lib in curses ncurses form panel menu ; do + echo "INPUT(-l${lib}w)" > ${TARGET_DIR}/usr/lib/lib${lib}.so + ln -sfv lib${lib}w.a ${TARGET_DIR}/usr/lib/lib${lib}.a + done +ln -sfv libncursesw.so ${TARGET_DIR}/usr/lib/libcursesw.so +ln -sfv libncursesw.a ${TARGET_DIR}/usr/lib/libcursesw.a +ln -sfv libncurses++w.a ${TARGET_DIR}/usr/lib/libncurses++.a +ln -sfv ncursesw5-config ${TARGET_DIR}/usr/bin/ncurses5-config +@end verbatim + +The commands above create symlinks from libraries without support for +wide characters to libraries with support for them. +@end ignore + +@c PROCPS issue: +The command @samp{ln -sfv libncursesw.so $@{TARGET_DIR@}/lib/libncurses.so} +creates the symlink @file{libcurses.so} so that programs that do not +know @file{libncursesw.so} can be linked against it. + +@c ln -sfv ../../usr/share/terminfo ${TARGET_DIR}/usr/lib/terminfo + + +@node Procps +@section Procps + +The procps package contains utilities that give information about +processes using the @file{/proc} filesystem. The package includes the +commands @command{ps}, @command{top}, @command{vmstat}, @command{w}, +@command{kill}, @command{free}, @command{slabtop}, and +@command{skill}. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/procps-3.2.8.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/procps-3.2.8 +make \ + CPPFLAGS= \ + lib64=lib +make \ + DESTDIR=${TARGET_DIR} \ + lib64=lib \ + ldconfig= \ + install="install -D" \ + install +cd .. +rm -rf procps-3.2.8 +popd +@end verbatim + +Option @option{CPPFLAGS= } is used so that the target system's ncurses +library will be used, default value would have been +@option{-I/usr/include/ncurses}. + +Option @option{lib64=lib} makes the directory @file{/lib} the one +where to put 64 bit libraries, default would be @file{/lib64}. + +Option @option{ldconfig= } is used in order not to use current host's +@command{ldconfig}. + +Option @option{install="install -D"} is used so that all the files +installed are owned by the current user. By default, all installed +files are owned by root. + + +@node Libtool +@section Libtool + +GNU libtool is a generic library support script. It hides the +complexity of using shared libraries behind a consistent, portable +interface. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/libtool-2.4.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/libtool-2.4 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf libtool-2.4 +popd +@end verbatim + + +@node Readline +@section Readline + +The GNU Readline library provides a set of functions for use by +applications that allow users to edit command lines as they are typed +in. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/readline-6.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/readline-6.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --libdir=/lib +make +make DESTDIR=${TARGET_DIR} install +make DESTDIR=${TARGET_DIR} install-doc +# For FHS compatibility: +#mv -v ${TARGET_DIR}/lib/lib{readline,history}.a ${TARGET_DIR}/usr/lib +#rm -v ${TARGET_DIR}/lib/lib{readline,history}.so +#ln -svf ../../lib/libreadline.so.6 \ +# ${TARGET_DIR}/usr/lib/libreadline.so +#ln -svf ../../lib/libhistory.so.6 ${TARGET_DIR}/usr/lib/libhistory.so +cd .. +rm -rf readline-6.2 +popd +@end verbatim + +@c sed -i 's:^SHLIB_LIBS=:SHLIB_LIBS=-lncursesw:' support/shobj-conf + + +@node Autoconf +@section Autoconf + +GNU autoconf is an extensible package of M4 macros that produce shell +scripts to automatically configure software source code +packages. These scripts can adapt the packages to many kinds of +UNIX-like systems without manual user intervention. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/autoconf-2.69.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/autoconf-2.69 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf autoconf-2.69 +popd +@end verbatim + + +@node Automake +@section Automake + +GNU automake is a tool for automatically generating @file{Makefile.in} +files compliant with the GNU Coding +Standards@footnote{@uref{http://www.gnu.org/prep/standards/}}. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/automake-1.14.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/automake-1.14 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf automake-1.14 +popd +@end verbatim + + +@node Bash +@section Bash + +GNU @acronym{Bash} (Bourne again shell) is an sh-compatible shell that +incorporates useful features from the Korn shell (ksh) and C shell +(csh). + +@verbatim +# 7 minutes +tar xf ${DOWNLOAD_DIR}/bash-4.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bash-4.2 +cat > config.cache << "EOF" +ac_cv_func_mmap_fixed_mapped=yes +ac_cv_func_strcoll_works=yes +ac_cv_func_working_mktime=yes +bash_cv_func_sigsetjmp=present +bash_cv_getcwd_malloc=yes +bash_cv_job_control_missing=present +bash_cv_printf_a_format=yes +bash_cv_sys_named_pipes=present +bash_cv_ulimit_maxfds=yes +bash_cv_under_sys_siglist=yes +bash_cv_unusable_rtsigs=no +gt_cv_int_divbyzero_sigfpe=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --cache-file=config.cache \ + --without-bash-malloc \ + --with-installed-readline +make +make \ + DESTDIR=${TARGET_DIR} \ + htmldir=/usr/share/doc/bash-4.2 \ + install +ln -sv bash ${TARGET_DIR}/bin/sh +cd .. +rm -rf bash-4.2 +popd +@end verbatim + +The variables listed in the file @file{config.cache} are used in order +to avoid that the @file{configure} script evaluate their values: +otherwise the build may fail when cross-compiling. + +@c --bindir=/bin instead of /usr/bin, FHS? + +Option @option{--without-bash-malloc} tells the @file{configure} +script not to use the @code{malloc} function shipped with +Bash. Glibc's version will be used instead. + +Option @option{--with-installed-readline} tells the configure script +to use the installed readline library instead of the one shipped with +Bash. + +@c htmldir=/usr/share/doc/bash-4.2 + +@samp{ln -sv bash $@{TARGET_DIR@}/bin/sh} creates a symlink @file{sh} +to @file{bash}. + + +@node Bzip2 +@section Bzip2 + +Bzip2 is a package that contains utilities to compress and decompress +files with a better original size/compressed size ratio than gzip. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/bzip2-1.0.6.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bzip2-1.0.6 +sed -i.orig -e "/^all:/s/ test//" Makefile +sed -i -e 's:ln -s -f $(PREFIX)/bin/:ln -s :' Makefile +make \ + -f Makefile-libbz2_so \ + CC="${CC}" \ + AR="${AR}" \ + RANLIB="${RANLIB}" +make clean +make \ + CC="${CC}" \ + AR="${AR}" \ + RANLIB="${RANLIB}" +make \ + PREFIX=${TARGET_DIR}/usr \ + install +cp -v bzip2-shared ${TARGET_DIR}/bin/bzip2 +cp -av libbz2.so* ${TARGET_DIR}/lib +ln -sv ../../lib/libbz2.so.1.0 ${TARGET_DIR}/usr/lib/libbz2.so +rm -v ${TARGET_DIR}/usr/bin/{bunzip2,bzcat,bzip2} +ln -sv bzip2 ${TARGET_DIR}/bin/bunzip2 +ln -sv bzip2 ${TARGET_DIR}/bin/bzcat +cd .. +rm -rf bzip2-1.0.6 +popd +@end verbatim + +@samp{sed -i.orig -e "/^all:/s/ test//" Makefile} is used to skip +tests when building. + +@samp{sed -i -e 's:ln -s -f $(PREFIX)/bin/:ln -s :' Makefile} is used +in order to have relative path symlinks instead of absolute ones. + +Option @option{-f Makefile-libbz2_so} is used to build shared +libraries. + +Flags @env{CC}, @env{AR} and @env{RANLIB} are used so that bzip2 is +built using cross-compilation tools instead of the host's ones. + +@samp{make clean} is used to clean up temporary files. + +The second build commands are used to build static libraries. + +@ignore +cp -v bzip2-shared ${TARGET_DIR}/bin/bzip2 +cp -av libbz2.so* ${TARGET_DIR}/lib +ln -sv ../../lib/libbz2.so.1.0 ${TARGET_DIR}/usr/lib/libbz2.so +rm -v ${TARGET_DIR}/usr/bin/{bunzip2,bzcat,bzip2} +ln -sv bzip2 ${TARGET_DIR}/bin/bunzip2 +ln -sv bzip2 ${TARGET_DIR}/bin/bzcat +@end ignore + + +@node DHCPCD +@section DHCPCD + +DHCPCD is a wrapper for the @acronym{DHCP} (Dynamic Host Configuration +Protocol) client daemon. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/dhcpcd-6.0.2.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/dhcpcd-6.0.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/sbin \ + --sysconfdir=/etc \ + --dbdir=/var/lib/dhcpcd \ + --libexecdir=/usr/lib/dhcpcd +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf dhcpcd-6.0.2 +popd +@end verbatim + +@c Option @option{--bindir=/sbin} is used to comply with FHS? +@c @option{--sysconfdir=/etc} @file{/etc} instead of ? +@c @option{--dbdir=/var/lib/dhcpcd} @file{/var/lib/dhcpcd} instead of? +@c @option{--libexecdir=/usr/lib/dhcpcd} @file{/usr/lib/dhcpcd} instead of ? + + +@node Diffutils +@section Diffutils + +GNU Diffutils is a package of several programs related to finding +differences between files. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/diffutils-3.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/diffutils-3.2 +sed -i.orig '/gets is a security hole/d' lib/stdio.in.h +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf diffutils-3.2 +popd +@end verbatim + +@samp{sed -i.orig '/gets is a security hole/d' lib/stdio.in.h} is used +to fix the following error when issuing @samp{make}: +@samp{./stdio.h:1012:1: error: 'gets' undeclared here (not in a +function)}. + +@c It deletes the following line in lib/stdio.in.h: +@c _GL_WARN_ON_USE (gets, ``gets is a security hole - use fgets instead''); + + +@node File +@section File + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/file-5.14.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/file-5.14 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf file-5.14 +popd +@end verbatim + + +@node Findutils +@section Findutils + +The GNU Find Utilities are typically used to provide directory search +and file locating capabilities. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/findutils-4.4.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/findutils-4.4.2 +cat > config.cache << EOF +gl_cv_func_wcwidth_works=yes +gl_cv_header_working_fcntl_h=yes +ac_cv_func_fnmatch_gnu=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --libexecdir=/usr/lib/locate \ + --localstatedir=/var/lib/locate \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/find ${TARGET_DIR}/bin +#sed -i.orig 's@find:=${BINDIR}@find:=/bin@' \ +# ${TARGET_DIR}/usr/bin/updatedb +cd .. +rm -rf findutils-4.4.2 +popd +@end verbatim + +@c --libexecdir=/usr/lib/locate +@c --localstatedir=/var/lib/locate + + +@node Flex +@section Flex + +Flex is a tool for generating scanners. A scanner, sometimes called a +tokenizer, is a program which recognizes lexical patterns in text. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/flex-2.5.37.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/flex-2.5.37 +cat > config.cache << EOF +ac_cv_path_M4="/usr/bin/m4" +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +ln -sv libfl.a ${TARGET_DIR}/usr/lib/libl.a +cd .. +rm -r flex-2.5.37 +popd + +cat > ${TARGET_DIR}/usr/bin/lex << "EOF" +#!/bin/sh +exec /usr/bin/flex -l "$@" +EOF +chmod -v 755 ${TARGET_DIR}/usr/bin/lex +@end verbatim + +@file{config.cache} forces flex to use @file{/usr/bin/m4} instead of +@file{/gllfsc/cross-tools/bin/m4} on the target machine. + +For compatibility issues, we create the symlink @file{libl.a}. + +We then create target system's @file{/usr/bin/lex} that will execute +@command{flex} with option @option{-l} in order to behave with maximal +compatibility like @command{lex}. + +@ignore +@samp{sed -i.orig "s/-I@@includedir@@//g" Makefile.in} is used in +order not to use host's headers in @file{/usr/include} during +cross-compilation. +@end ignore + +@c Variables @samp{ac_cv_func_malloc_0_nonnull=yes} and +@c @samp{ac_cv_func_realloc_0_nonnull=yes} are used to get rid of +@c error message: @samp{}. + +@c We use option @option{-fPIC} passed to the cross-compiler in order to +@c generate position-independent code (PIC). + + +@node Gawk +@section Gawk + +GNU awk (Gawk) is a program used to select particular records in a +file and perform operations upon them. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/gawk-4.1.0.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gawk-4.1.0 +sed -i.orig \ + '/check-recursive all-recursive/s/ check-for-shared-lib-support//' \ + extension/Makefile.in +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --libexecdir=/usr/lib +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -r gawk-4.1.0 +popd +@end verbatim + +The sed expression is used to avoid the error @samp{Building the +extensions is not supported on this platform}. + + +@node Gettext +@section Gettext + +GNU gettext utilities are a set of tools that provides a framework to +help packages produce multi-lingual messages. + +@verbatim +# 20 minutes +tar xf ${DOWNLOAD_DIR}/gettext-0.18.3.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gettext-0.18.3 +cat > config.cache << EOF +am_cv_func_iconv_works=yes +gl_cv_func_wcwidth_works=yes +gt_cv_func_printf_posix=yes +gt_cv_int_divbyzero_sigfpe=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache +make +#cp gettext-tools/gnulib-lib/.libs/libgettextlib.la{,i} +#cp gettext-tools/src/.libs/libgettextsrc.la{,i} +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf gettext-0.18.3 +popd +@end verbatim + +@c cp gettext-tools/gnulib-lib/.libs/libgettextlib.la{,i} ? +@c cp gettext-tools/src/.libs/libgettextsrc.la{,i} ? + + +@node Grep +@section Grep + +GNU @command{grep} command searches one or more input files for lines +containing a match to a specified pattern. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/grep-2.14.tar.xz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/grep-2.14 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --disable-perl-regexp +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf grep-2.14 +popd +@end verbatim + +Option @option{--disable-perl-regexp} disables support of Perl-style +regular expressions (regexp). + + +@node Groff +@section Groff + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/groff-1.22.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/groff-1.22.2 +PAGE=A4 \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make \ + TROFFBIN=troff \ + GROFFBIN=groff \ + GROFF_BIN_PATH= +make prefix=${TARGET_DIR}/usr install +ln -sv soelim ${TARGET_DIR}/usr/bin/zsoelim +ln -sv eqn ${TARGET_DIR}/usr/bin/geqn +ln -sv tbl ${TARGET_DIR}/usr/bin/gtbl +cd .. +rm -rf groff-1.22.2 +popd +@end verbatim + +The variables @env{TROFFBIN=troff} and @env{GROFFBIN=groff} tell +@command{make} to use @command{troff} and @command{groff} commands +installed in the @ref{Building Cross-Compilation Tools} to build +documentation. + +The variable @env{GROFF_BIN_PATH} before @env{PATH} is checked for +programs @command{groff} is calling (preprocessors, troff, and output +devices). If not set, it defaults to the directory where the +@file{groff} binary is located. + +The symlinks are used for compatibility. + + +@node Gzip +@section Gzip + +GNU Gzip is a data compression program. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/gzip-1.6.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/gzip-1.6 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/bin/z{egrep,cmp,diff,fgrep,force,grep,less,more} \ +# ${TARGET_DIR}/usr/bin +#mv -v ${TARGET_DIR}/bin/znew \ +# ${TARGET_DIR}/usr/bin +cd .. +rm -rf gzip-1.6 +popd +@end verbatim + + +@node Inetutils +@section Inetutils + +Inetutils is a collection of common network programs. + +@verbatim +# 6 minutes +tar xf ${DOWNLOAD_DIR}/inetutils-1.9.1.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/inetutils-1.9.1 +sed -i.orig '/gets is a security hole/d' lib/stdio.in.h +sed -i.orig -e '/PATH_PROCNET_DEV/s/\ no//' paths +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf inetutils-1.9.1 +popd +@end verbatim + +@samp{sed -i.orig '/gets is a security hole/d' lib/stdio.in.h} is used +to fix the following error when issuing @samp{make}: +@samp{./stdio.h:1030:1: error: 'gets' undeclared here (not in a +function)}. + +@c It deletes the following line in lib/stdio.in.h: +@c _GL_WARN_ON_USE (gets, ``gets is a security hole - use fgets instead''); + +@samp{sed -i.orig -e '/PATH_PROCNET_DEV/s/\ no//' paths} is used to +fix the following error when issuing @samp{make}: +@samp{'PATH_PROCNET_DEV' undeclared (first use in this function)}. + + +@node Iproute2 +@section Iproute2 + +Iproute2 is a collection of utilities for controlling TCP and UDP IP +networking and traffic. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/iproute2-3.10.0.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/iproute2-3.10.0 +sed -i.orig '/^TARGETS/s@arpd@@g' misc/Makefile +make \ + DESTDIR=${TARGET_DIR} \ + CC="${CC}" \ + DOCDIR=/usr/share/doc/iproute2 \ + MANDIR=/usr/share/man +make \ + DESTDIR=${TARGET_DIR} \ + DOCDIR=/usr/share/doc/iproute2 \ + MANDIR=/usr/share/man \ + install +cd .. +rm -rf iproute2-3.10.0 +popd +@end verbatim + +@samp{sed -i.orig '/^TARGETS/s@@arpd@@@@g' misc/Makefile} is used to +disable the build of @command{arpd} as it requires Berkeley DB to be +installed. + +@env{DOCDIR} and @env{MANDIR} indicate the location in which the +documentation and the manual pages will be installed, +respectively. Those are no absolute paths but use the value of +@env{DESTDIR} as a prefix. + + +@node Kbd +@section Kbd + +Kbd contains keytable files and keyboard utilities. + +@verbatim +# 3 minutes +tar xf ${DOWNLOAD_DIR}/kbd-1.15.5.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/kbd-1.15.5 +cat > config.cache << EOF +ac_cv_func_setpgrp_void=yes +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache \ + --disable-vlock +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility +#mv -v ${TARGET_DIR}/usr/bin/{kbd_mode,dumpkeys,loadkeys,openvt} \ +# ${TARGET_DIR}/bin +#mv -v ${TARGET_DIR}/usr/bin/setfont \ +# ${TARGET_DIR}/bin +cd .. +rm -rf kbd-1.15.5 +popd +@end verbatim + +Option @option{--disable-vlock} disables the build of vlock. vlock +needs PAM library headers to be present on the build system and is not +necessary for us, so we do not build it. + + +@node Kmod +@section Kmod + +Kmod (previously known as module-init-tools) provide userspace-side +assistance in loading kernel modules and their dependencies. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/kmod-14.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/kmod-14 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --sbindir=/sbin \ + --with-zlib +make +make \ + DESTDIR=${TARGET_DIR} \ + INSTALL=install \ + install +cd .. +rm -rf kmod-14 +popd + +# For bootscripts: +ln -sv kmod ${TARGET_DIR}/bin/lsmod +ln -sv ../bin/kmod ${TARGET_DIR}/sbin/depmod +ln -sv ../bin/kmod ${TARGET_DIR}/sbin/insmod +ln -sv ../bin/kmod ${TARGET_DIR}/sbin/modprobe +ln -sv ../bin/kmod ${TARGET_DIR}/sbin/modinfo +ln -sv ../bin/kmod ${TARGET_DIR}/sbin/rmmod +@end verbatim + +@option{--with-zlib} enables support for modules compressed with +zlib. + +By default, installation uses @env{INSTALL=install-with-care} which +checks if old utilities have not been destroyed. To avoid this check, +we use @env{INSTALL=install}. + + +@node Less +@section Less + +Less is a file pager. A file pager is used to view the content of a +text file. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/less-458.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/less-458 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --sysconfdir=/etc +make +make prefix=${TARGET_DIR}/usr install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/less ${TARGET_DIR}/bin +cd .. +rm -rf less-458 +popd +@end verbatim + + +@node Make +@section Make + +GNU @command{make} utility determines automatically which pieces of a +large program need to be recompiled, and issues the commands to +recompile them. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/make-3.82.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/make-3.82 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf make-3.82 +popd +@end verbatim + + +@node Man +@section Man + +Man is an interface to the on-line reference manuals. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/man-1.6g.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/man-1.6g +sed -i.orig -e "/PREPATH=/s@=.*@=\"$(eval echo \ + ${TARGET_DIR}/{,usr/}{sbin,bin})\"@g" -e 's@-is@&Rc@g' configure +sed -i.orig -e 's@MANPATH./usr/man@#&@g' \ + -e 's@MANPATH./usr/local/man@#&@g' src/man.conf.in +./configure \ + -confdir=/etc +sed -i.orig "s@${TARGET_DIR}@@" conf_script +gcc src/makemsg.c -o src/makemsg +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf man-1.6g +popd +@end verbatim + +In the first use of @command{sed}, the first part replaces +@env{PREPATH} default value +@samp{/bin:/usr/bin:/usr/ucb:/usr/local/@/bin:$PATH} with +@samp{$@{TARGET_DIR@}/@{,usr/@}@{sbin,bin@}}. The variable +@env{TARGET_DIR} is used to avoid errors when running the +@file{configure} script. + +The second part is used to replace default options of the man pager +@option{-is} with @option{-isRc}. Option @option{-c} will cause +@command{less} to display man pages faster as this option disables +scrolling. + +@c What about -R? + +The second call of @command{sed} tells @command{man} where the cat +pages corresponding to given man pages should not be stored: +@file{/usr/man} and @file{/usr/local/man}. + +Option @option{-confdir} is used to define configuration files +location to target system's @file{/etc}. + +The third call of @command{sed} is used in order to remove the +presence of @env{TARGET_DIR} on the target system's programs. + +@command{makemsg} will be used during the build, but because using the +cross-compiler may make its build fail, we use the host's compiler. + + +@node Nano +@section Nano + +GNU nano is a lightweight text editor. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/nano-2.3.2.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/nano-2.3.2 +#tar xf ${DOWNLOAD_DIR}/nano-2.3.1.tar.gz -C ${BUILD_DIR} +#pushd ${BUILD_DIR}/nano-2.3.1 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +sed -i.orig -e \ + '/CPPFLAGS/s/\/usr\/include\/ncursesw/${TARGET_DIR}\/usr\/include/' \ + `find . -iname 'Makefile'` +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf nano-2.3.2 +popd +@end verbatim + +The sed expression is used to replace @file{/usr/include/ncursesw} +with @file{$@{TARGET_DIR@}/usr/include} in every file named +@file{Makefile} in order to overcome the error +@samp{/usr/include/ncursesw/ncurses.h:60:34: fatal error: +ncursesw/ncurses_dll.h: No such file or directory}. + +@quotation Note +commands in nano are displayed as in `^X'. The `^' character means +@key{CTRL} key, so `^X' means @kbd{CTRL-X}. +@end quotation + + +@node Patch +@section Patch + +GNU patch takes a patch file containing a difference listing produced +by the @command{diff} program and applies those differences to one or +more original files, producing patched versions. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/patch-2.7.1.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/patch-2.7.1 +cat > config.cache << EOF +ac_cv_path_ed_PROGRAM=ed +ac_cv_func_strnlen_working=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --cache-file=config.cache +make +make prefix=${TARGET_DIR}/usr install +cd .. +rm -rf patch-2.7.1 +popd +@end verbatim + + +@node Psmisc +@section Psmisc + +This package contains utilities that use the proc filesystem. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/psmisc-22.20.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/psmisc-22.20 +cat > config.cache << EOF +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --exec-prefix="" \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/bin/pstree* ${TARGET_DIR}/usr/bin +#ln -sv killall ${TARGET_DIR}/bin/pidof +cd .. +rm -rf psmisc-22.20 +popd +@end verbatim + + +@node Rsyslog +@section Rsyslog + +Rsyslog is an utility creating log messages. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/rsyslog-5.8.6.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/rsyslog-5.8.6 +cat > config.cache << EOF +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +EOF +PKG_CONFIG_PATH="${TARGET_DIR}/usr/lib/pkgconfig" \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --sbindir=/sbin \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +install -dv ${TARGET_DIR}/etc/rsyslog.d +cd .. +rm -rf rsyslog-5.8.6 +popd + +cat > ${TARGET_DIR}/etc/rsyslog.conf << "EOF" +$ModLoad imuxsock.so +$ModLoad imklog.so + +$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +$FileOwner root +$FileGroup root +$FileCreateMode 0640 +$DirCreateMode 0755 + +$ModLoad imudp +$UDPServerRun 514 + +$RepeatedMsgReduction on + +$IncludeConfig /etc/rsyslog.d/*.conf + +auth,authpriv.* /var/log/auth.log +*.*;auth,authpriv.none -/var/log/syslog +daemon.* -/var/log/daemon.log +kern.* -/var/log/kern.log +lpr.* -/var/log/lpr.log +mail.* -/var/log/mail.log +user.* -/var/log/user.log + +# Catch All Logs +*.=debug;\ + auth,authpriv.none;\ + news.none;mail.none -/var/log/debug +*.=info;*.=notice;*.=warn;\ + auth,authpriv.none;\ + cron,daemon.none;\ + mail,news.none -/var/log/messages + +# Emergency are shown to everyone +*.emerg * +EOF +@end verbatim + +@samp{install -dv $@{TARGET_DIR@}/etc/rsyslog.d} is used to create +target system's @file{/etc/rsyslog.d} directory. Rsyslog looks for +user-defined configuration files in this directory. The line +@samp{$IncludeConfig /etc/rsyslog.d/*.conf} in the target system's +configuration file @file{/etc/rsyslog.conf} has this purpose. + +We then create the target system's configuration file +@file{/etc/rsyslog.conf}. + + +@node Shadow +@section Shadow + +@verbatim +# 4 minutes +tar xf ${DOWNLOAD_DIR}/shadow-4.1.4.3.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/shadow-4.1.4.3 +patch -Np1 -i ${DOWNLOAD_DIR}/shadow-4.1.4.3-man-ru.patch +automake +echo "ac_cv_func_setpgrp_void=yes" > config.cache +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --libdir=/lib \ + --sysconfdir=/etc \ + --enable-shared \ + --without-audit \ + --without-libpam \ + --without-selinux \ + --cache-file=config.cache \ + --enable-man +sed -i.orig 's/groups$(EXEEXT) //' src/Makefile +for mkf in $(find man -name Makefile) + do + sed -i.orig -e '/groups.1.xml/d' -e 's/groups.1 //' ${mkf} + done +make +make DESTDIR=${TARGET_DIR} install +sed -i.orig -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \ + -e 's@/var/spool/mail@/var/mail@' \ + ${TARGET_DIR}/etc/login.defs +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/passwd ${TARGET_DIR}/bin +${CROSS_TARGET}-pwconv +${CROSS_TARGET}-grpconv +${CROSS_TARGET}-passwd root +cd .. +rm -rf shadow-4.1.4.3 +popd +@end verbatim + +@ignore + ${CROSS_TARGET}-passwd root +gives the following message: + Cannot change ID to root. +@end ignore + +The patch @file{shadow-4.1.4.3-man-ru.patch} contains a fix to +@file{man/ru/Makefile.am} preventing @samp{make install} to +complete. @command{automake-1.11} is then run to update the makefile +prototype @file{Makefile.in}. + +@c echo "ac_cv_func_setpgrp_void=yes" > config.cache + +The option @option{--enable-man} is used to generate man pages. + +The first call of @command{sed} disables the build of command +@command{groups}, as coreutils already installed it. + +The second call of @command{sed} enables support for MD5 encrypted +passwords and changes the mail default directory from +@file{/var/spool/mail} to @file{/var/mail}. + +The @command{pwconv} command creates @file{shadow} file from file +@file{passwd} and an optionally existing @file{shadow} file. + +The @command{grpconv} command creates @file{gshadow} file from file +@file{group} and an optionally existing @file{gshadow} file. + +The command @samp{passwd root} will create the password for the root +user, you will need it when logging in as root on your new system. + + +@node Sysvinit +@section Sysvinit + +Sysvinit is the system-V style init process. Init is the first process +started during booting. It is started by the kernel. Init continues +running as a daemon until the system is shut down. It is the direct or +indirect ancestor of all other processes and automatically adopts all +orphaned processes. + + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/sysvinit-2.88dsf.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/sysvinit-2.88dsf +sed -i.orig -e 's@/dev/initctl@$(ROOT)&@g' \ + -e 's@\(mknod \)-m \([0-9]* \)\(.* \)p@\1\3p; chmod \2\3@g' \ + -e '/^ifeq/s/$(ROOT)//' \ + -e 's@/usr/lib@$(ROOT)&@' \ + src/Makefile +make -C src clobber +make -C src ROOT=${TARGET_DIR} CC="${CC}" +make -C src ROOT=${TARGET_DIR} INSTALL="install" install +cd .. +rm -rf sysvinit-2.88dsf +popd + +cat > ${TARGET_DIR}/etc/inittab << "EOF" +# Begin /etc/inittab + +id:3:initdefault: + +si::sysinit:/etc/rc.d/init.d/rc sysinit + +l0:0:wait:/etc/rc.d/init.d/rc 0 +l1:S1:wait:/etc/rc.d/init.d/rc 1 +l2:2:wait:/etc/rc.d/init.d/rc 2 +l3:3:wait:/etc/rc.d/init.d/rc 3 +l4:4:wait:/etc/rc.d/init.d/rc 4 +l5:5:wait:/etc/rc.d/init.d/rc 5 +l6:6:wait:/etc/rc.d/init.d/rc 6 + +ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now + +su:S016:once:/sbin/sulogin + +1:2345:respawn:/sbin/agetty tty1 9600 +2:2345:respawn:/sbin/agetty tty2 9600 +3:2345:respawn:/sbin/agetty tty3 9600 +4:2345:respawn:/sbin/agetty tty4 9600 +5:2345:respawn:/sbin/agetty tty5 9600 +6:2345:respawn:/sbin/agetty tty6 9600 + +#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100 + +# End /etc/inittab +EOF +@end verbatim + +The first call of @command{sed} replaces @file{/dev/initctl} with +@file{$(ROOT)/dev/initctl}, and @file{/usr/lib} with +@file{$(ROOT)/usr/lib} among other things in order to install sysvinit +on the target system. + +@samp{make -C src clobber} is used to clean up the @file{src} +directory. + +Then, we create the @file{inittab} file that describes which processes +are started at bootup and during normal operation. + +The line @samp{#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100} is +commented out (with @code{#}) in order to avoid the message: +@samp{INIT: Id "c0" respawning too fast: disabled for 5 minutes} on +the target system. + + +@node Tar +@section Tar + +GNU tar is an archiving utility: it stores and extracts files from a +tape or disk archive. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/tar-1.26.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/tar-1.26 +cat > config.cache << EOF +gl_cv_func_btowc_eof=yes +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +gl_cv_func_mbrtowc_incomplete_state=yes +gl_cv_func_mbrtowc_nul_retval=yes +gl_cv_func_mbrtowc_null_arg=yes +gl_cv_func_mbrtowc_retval=yes +gl_cv_func_wcrtomb_retval=yes +EOF +sed -i.orig '/gets is a security hole/d' gnu/stdio.in.h +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --bindir=/bin \ + --libexecdir=/usr/sbin \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf tar-1.26 +popd +@end verbatim + +The sed expression is use to avoid the error @samp{./stdio.h:479:1: +error: 'gets' undeclared here (not in a function)}. + + +@node Texinfo +@section Texinfo + +GNU Texinfo is a documentation system that can produce both online +information and a printed manual from a single source. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/texinfo-5.1.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/texinfo-5.1 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make -C tools/gnulib/lib +make -C tools +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf texinfo-5.1 +popd + +pushd ${TARGET_DIR}/usr/share/info +rm dir +for f in * + do install-info $f dir 2>/dev/null +done +popd +@end verbatim + +The first three calls of @command{make} make it possible to build +Texinfo by cross-compilation. + +For Info to work, the @file{info} directory must contain a file that +serves as a top level directory for the Info system. By convention, +this file is called @file{dir}. We update this file for the target +system. + + +@node Udev +@section Udev + +Udev is the dynamic device management of the kernel Linux. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/udev-175.tar.gz -C ${BUILD_DIR} +pushd ${BUILD_DIR}/udev-175 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr \ + --sysconfdir=/etc \ + --sbindir=/sbin \ + --with-rootlibdir=/lib \ + --libexecdir=/lib/udev \ + --docdir=/usr/share/doc/udev-175 \ + --disable-introspection \ + --with-pci-ids-path=no \ + --with-usb-ids-path=no \ + --disable-gudev +make +make DESTDIR=${TARGET_DIR} install +install -dv ${TARGET_DIR}/lib/firmware +ln -sv ../lib/udev/udevd ${TARGET_DIR}/sbin/udevd +cd .. +rm -rf udev-175 +popd +@end verbatim + + +@node Util-Linux +@section Util-Linux + +util-linux is a random collection of utilities for use with the kernel +Linux. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/util-linux-2.23.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/util-linux-2.23 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --enable-partx \ + --disable-wall \ + --enable-write \ + --disable-makeinstall-chown +make +make DESTDIR=${TARGET_DIR} install +mv -v ${TARGET_DIR}/usr/bin/logger ${TARGET_DIR}/bin +cd .. +rm -r util-linux-2.23 +popd +@end verbatim + +Option @option{--enable-partx} enables the build and installation of +the @command{addpart}, @command{delpart} and @command{partx} commands. + +Option @option{--disable-wall} disables the build of the +@command{wall} command which is already provided by sysvinit. + +Option @option{--enable-write} enables the build and installation of +the @command{write} command. + +Option @option{--disable-makeinstall-chown} disables the change of +owner to root for installed programs. + + +@node XZ-Utils +@section XZ-Utils + +XZ Utils is a general-purpose data compression software with high +compression ratio. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/xz-5.0.5.tar.bz2 -C ${BUILD_DIR} +pushd ${BUILD_DIR}/xz-5.0.5 +#tar xf ${DOWNLOAD_DIR}/xz-5.0.4.tar.bz2 -C ${BUILD_DIR} +#pushd ${BUILD_DIR}/xz-5.0.4 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix=/usr +make +make DESTDIR=${TARGET_DIR} install +# For FHS compatibility: +#mv -v ${TARGET_DIR}/usr/bin/{xz,lzma,lzcat,unlzma,unxz,xzcat} \ +# ${TARGET_DIR}/bin +cd .. +rm -rf xz-5.0.5 +popd +@end verbatim + + +@node Bootscripts +@section Bootscripts + +The bootscript archive contains scripts that manage services during +system's bootup and shutdown. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/bootscripts-cross-lfs-2.0.0.tar.xz \ + -C ${BUILD_DIR} +pushd ${BUILD_DIR}/bootscripts-cross-lfs-2.0-pre2 +make DESTDIR=${TARGET_DIR} install-bootscripts +make DESTDIR=${TARGET_DIR} install-network +cd .. +rm -rf bootscripts-cross-lfs-2.0-pre2 +popd +@end verbatim + +This installs basic bootscripts required for bootup and shutdown, and +network-related bootscripts. + + +@node Kernel +@section The Kernel + +@verbatim +# 40 minutes +tar xf ${DOWNLOAD_DIR}/linux-3.9-loongson3a-deblobbed.tar \ + -C ${BUILD_DIR} +pushd ${BUILD_DIR}/linux-official +#tar xf ${DOWNLOAD_DIR}/linux-2.6.36-21-loongson3a-deblobbed.tar \ +# -C ${BUILD_DIR} +#pushd ${BUILD_DIR}/linux-3A +patch -Np1 -i $DOWNLOAD_DIR/linux-3.9-firmware-timeout.patch +patch -Np1 -i $DOWNLOAD_DIR/linux-3.9-kernel-panic.patch +#patch -Np1 -i $DOWNLOAD_DIR/linux-2.6.36-firmware-timeout.patch +#patch -Np1 -i $DOWNLOAD_DIR/linux-2.6.36-kernel-panic.patch +make mrproper +@end verbatim + +@file{linux-3.9-firmware-timeout.patch} is used to avoid waiting 60 +seconds for the binary-blob firmware to load, as those have been +removed by the @file{deblob} script. + +@file{linux-3.9-kernel-panic.patch} is used in order to avoid a kernel +panic that may occur frequently at boot with the deblobbed kernel. + +Then: + +@verbatim +#cp arch/mips/configs/loongson3a_defconfig .config +cp arch/mips/configs/loongson3_defconfig .config +#cp arch/mips/configs/loongson3_config .config +#Skip the following as, with 4 CPUs, the result is ugly: +#patch -Np1 -i ${DOWNLOAD_DIR}/100gnu+freedo.patch +@end verbatim + +Then, if you want to change the configuration: + +@verbatim +#make ARCH=mips CROSS_COMPILE=${CROSS_TARGET}- config +make ARCH=mips CROSS_COMPILE=${CROSS_TARGET}- menuconfig +@end verbatim + +@verbatim +make \ + ARCH=mips \ + CROSS_COMPILE=${CROSS_TARGET}- +make \ + ARCH=mips \ + CROSS_COMPILE=${CROSS_TARGET}- \ + INSTALL_MOD_PATH=${TARGET_DIR} \ + modules_install +cp vmlinuz ${TARGET_DIR}/boot/vmlinuz +cp System.map ${TARGET_DIR}/boot/System.map +cp .config ${TARGET_DIR}/boot/config +cd .. +popd +@end verbatim + +@quotation Tip +because future compilation may need kernel sources, the compilation +directory of the kernel should be preserved. +@end quotation + + +@node Configuration Files +@chapter Creating Required Configuration Files for the New System + +@menu +* Time Setup File:: File for time setup. +* Bash Keyboard Setup:: Setting up keyboard function keys + for the Shell. +* Bash Startup Files:: Setting up Bash shell startup files. +* Localhost Setup:: Setting up localhost. +* hosts Setup:: Setting up @file{hosts} file. +* Network Address Setup:: Setting up network address. +* DNS Setup:: Setting up DNS. +* fstab File Creation:: Creating @file{fstab} file. +@end menu + + +@node Time Setup File +@section File for Time Setup + +@verbatim +cat > ${TARGET_DIR}/etc/sysconfig/clock << "EOF" +# Begin /etc/sysconfig/clock + +UTC=1 + +# End /etc/sysconfig/clock +EOF +@end verbatim + + +@node Bash Keyboard Setup +@section Setting up Keyboard Function keys for the Shell + +Readline default configuration file is set: + +@verbatim +cat > ${TARGET_DIR}/etc/inputrc << "EOF" +set bell-style none +set convert-meta Off +set horizontal-scroll-mode Off +set input-meta On +set output-meta On +"\eOd": backward-word +"\eOc": forward-word +"\e[1~": beginning-of-line +"\e[4~": end-of-line +"\e[5~": beginning-of-history +"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert +"\eOH": beginning-of-line +"\eOF": end-of-line +"\e[H": beginning-of-line +"\e[F": end-of-line +EOF +@end verbatim + +If @option{convert-meta} is set to @samp{on}, Readline will convert +characters with the eighth bit set to an @sc{ascii} key sequence by +stripping the eighth bit and prefixing an @key{ESC} character, +converting them to a meta-prefixed key sequence. + +@option{horizontal-scroll-mode} set to @samp{off} means that the text +of the lines being edited will be wrapped onto a new screen line when +they are longer than the width of the screen, instead of being +scrolled horizontally on a single screen line. + +@c set meta-flag On + +@option{input-meta} If set to @samp{on}, Readline will enable +eight-bit input (it will not clear the eighth bit in the characters it +reads), regardless of what the terminal claims it can support. + +If @option{output-meta} is set to @samp{on}, Readline will display +characters with the eighth bit set directly rather than as a +meta-prefixed escape sequence. + +@ignore +"\eOd": backward-word +"\eOc": forward-word +"\e[1~": beginning-of-line +"\e[4~": end-of-line +"\e[5~": beginning-of-history +"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert +"\eOH": beginning-of-line +"\eOF": end-of-line +"\e[H": beginning-of-line +"\e[F": end-of-line +@end ignore + + +@node Bash Startup Files +@section Setting up Bash Shell Startup Files + +@verbatim +cat > ${TARGET_DIR}/etc/profile << "EOF" +# Begin /etc/profile + +export LANG=en_US.UTF-8 +export INPUTRC=/etc/inputrc +export PS1='\[\e[31m\]\A-\W\[\e[00m\]\$ ' + +# End /etc/profile +EOF +@end verbatim + +The environement variable @env{LANG} defines the default language that +should be used on the system. @samp{en_US.UTF-8} means ``english'' +language, country ``US'' and @acronym{UTF-8} (UCS Transformation +Format—8-bit) encoding (Unicode). + +@c For a full list, see??? + +For explanations on @env{PS1}, @pxref{Environment Variables Setup}. + + +@node Localhost Setup +@section Localhost Setup + +@verbatim +echo "HOSTNAME=gllfsc" > ${TARGET_DIR}/etc/sysconfig/network +@end verbatim + + +@node hosts Setup +@section Setting up @file{hosts} File + +@verbatim +cat > ${TARGET_DIR}/etc/hosts << "EOF" +# Begin /etc/hosts + +127.0.0.1 gllfsc localhost + +# End /etc/hosts +EOF +@end verbatim + + +@node Network Address Setup +@section Setting up Network Address + +You can choose to have a network static or dynamic address. + +@menu +* Network Static Address Setup:: Setting up Network Static Address. +* Network Dynamic Address Setup:: Setting up Network Dynamic + Address. +@end menu + + +@node Network Static Address Setup +@subsection Setting up Network Static Address + +@verbatim +pushd ${TARGET_DIR}/etc/sysconfig/network-devices +mkdir -v ifconfig.eth0 +cat > ifconfig.eth0/ipv4 << "EOF" +ONBOOT=yes +SERVICE=ipv4-static +IP=192.168.1.1 +GATEWAY=192.168.1.2 +PREFIX=24 +BROADCAST=192.168.1.255 +EOF +popd +@end verbatim + +@quotation Warning +@code{IP}, @code{GATEWAY}, @code{BROADCAST} addresses are set up +according to one's situation. +@end quotation + + +@node Network Dynamic Address Setup +@subsection Setting up Network Dynamic Address + +@verbatim +pushd ${TARGET_DIR}/etc/sysconfig/network-devices +mkdir -v ifconfig.eth0 +cat > ifconfig.eth0/dhcpcd << "EOF" +ONBOOT=yes +SERVICE=dhcpcd +DHCP_START="-q" +DHCP_STOP="-k" +EOF +popd +@end verbatim + + +@node DNS Setup +@section Setting up DNS + +@verbatim +cat > ${TARGET_DIR}/etc/resolv.conf << "EOF" +# Begin /etc/resolv.conf + +nameserver your-main-DNS-address +nameserver your-secondary-DNS-address + +# End /etc/resolv.conf +EOF +@end verbatim + + +@node fstab File Creation +@section @file{fstab} File Creation + +The file @file{/etc/fstab} is used at boot to mount partitions under +the requested directories. + +@verbatim +cat > ${TARGET_DIR}/etc/fstab << "EOF" +# Begin /etc/fstab + +# file system mount-point type options dump fsck order + +/dev/sda8 / ext3 defaults 1 1 +/dev/sda3 swap swap pri=1 0 0 +proc /proc proc defaults 0 0 +sysfs /sys sysfs defaults 0 0 +devpts /dev/pts devpts gid=4,mode=620 0 0 +shm /dev/shm tmpfs defaults 0 0 + +# End /etc/fstab +EOF +@end verbatim + +@quotation Warning +the name of the hard drive and the name of filesystem used here have +to be modified to reflect @emph{your} real situation. +@end quotation + + +@node End +@chapter The End + +@menu +* Archiving:: All the system archived in one + package. +* Recommendations:: Some tips. +@end menu + + +@node Archiving +@section Archiving the System + +After the system has been completed, we use the command @command{exit} +to logout as the @emph{gllfsc} user. + +Now, login as the @emph{root} user. + +Then fix the permissions on the new system: + +@verbatim +export TARGET_DIR=/gllfsc +pushd ${TARGET_DIR} +mknod -m 600 dev/console c 5 1 +mknod -m 666 dev/null c 1 3 +cp -a dev/{console,null} lib/udev/devices/ +chown -R root:root * +@end verbatim + +We archive the entire system by using the following command: + +@verbatim +# 20 minutes without kernel sources nor cross-tools +#tar -cjf gllfsc-20130723.tar.bz2 bin boot dev etc home lib* media \ +# mnt opt proc root sbin srv sys tmp usr var + +# 20 minutes without kernel sources +tar -cjf gllfsc-20130723.tar.bz2 bin boot cross-tools dev etc home \ + lib* media mnt opt proc root sbin srv sys tmp usr var + +# 60 minutes with kernel sources + cross-tools +#tar -cjf gllfsc-20130723.tar.bz2 * +@end verbatim + +It is then easy to copy the archive to the target machine and extract. + + +@node Recommendations +@section Some Recommendations + +We recommend extracting the system to an empty partition. Moreover, +the filesystem of the chosen partition has to be a filesystem +supported by the kernel you compiled. Finally, this partition has to +be consistent with the system description in the file +@file{/etc/fstab} you created during setup (@pxref{fstab File +Creation}). + +Then, you will have to edit the PMON BIOS configuration file of the +target machine: @file{/boot.cfg}. This file has to be put on the first +partition of the hard +drive@footnote{@uref{http://gnewsense.org/Projects/Lemote#Updating_of_the_PMON_configuration}}. A +minimal @file{/boot.cfg} could be: + +On the Yeeloong 8133, vmlinuz must be on the first primary partition +to be able to boot. + +@verbatim +default 0 +timeout 2 +showmenu 1 + +title GLLFSC +kernel /dev/fs/ext2@wd0/vmlinuz +args console=tty1 root=/dev/sda8 +@end verbatim + + +@node Further Readings +@chapter Further Readings + +Haiyong Sun's website (in Chinese): +@uref{http://youbest.cublog.cn}. It includes documents on building a +GNU/Linux system for Loongson and a GNU/Hurd system for x86. + +Cross [GNU/]Linux from scratch: @uref{http://www.cross-lfs.org}. +Includes a lot of documentation to build a GNU/Linux system by +cross-compilation on a variety of hardware, no information (yet) for +cross-compiling with sysroot on MIPS though. There is also a +Community-driven Beyond [GNU/]Linux From Scratch on +@uref{http://cblfs.cross-lfs.org}. It documents the building of Xorg +and TeXLive among other things. + +@c Some patches from the above project are available for download on +@c @uref{http://svn.cross-lfs.org/svn/repos/patches/}. + +@uref{http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_@/man.txt} +documents an interesting way of managing packages. Quotation from the +file: + +@quotation +DESCRIPTION: +@itemize + +@item +You want to know which packages your files belong to? + +@item +You want to deinstall software that doesn't have make uninstall? + +@item +You are bothered by programs installed setuid root behind your back? + +@item +You don't like packages quietly overwriting files from other packages? + +@item +You don't like package managers like RPM? + +@item +YOU WANT TOTAL CONTROL USING ONLY UNIX BUILTINS? +@end itemize +@end quotation + +The suckless team@footnote{@uref{http://suckless.org}} is a group of +programmers that share the following +philosophy@footnote{@uref{http://suckless.org/philosophy}}: + +@quotation +Focus on simplicity, clarity and frugality. Our philosophy is about +keeping things simple, minimal and usable. We believe this should +become the mainstream philosophy in the IT sector. Unfortunately, the +tendency for complex, error-prone and slow software seems to be +prevalent in the present-day software industry. We intend to prove the +opposite with our software projects. +@end quotation + +The simple and lightweight programs released by this team are +interesting for machines based on Loongson 3A processor as performance +is limited compared to current x86 processors. + + +@node Thanks +@chapter Thanks + +I thank Lemote and particularily the CEO, Fuxin Zhang, for offering me +a Yeeloong 8133, Huacai Chen and Haiyong Sun for their help in fixing +the bugs I found in the deblobbed kernel. + +I am particularily grateful to Haiyong Sun for having shared his +knowledge on building a free operating system for Loongson 2F +machines, this document is heavily based on this. + + +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include fdl-1.3.texi + + +@node GNU General Public License +@appendix GNU General Public License +@include gpl.texi + +@bye diff --git a/gllfsc-pentium4-1.7.texi b/gllfsc-pentium4-1.7.texi new file mode 100644 index 0000000..110a65b --- /dev/null +++ b/gllfsc-pentium4-1.7.texi @@ -0,0 +1,5233 @@ +\input texinfo +@c -*-texinfo-*- +@c %**start of header +@setfilename gllfsc-pentium4-1.7.info +@settitle GNU/Linux-libre from source code for Pentium 4 +@c Comment the following if you want Letter format instead of A4 for +@c PDF output +@afourpaper +@c %**end of header +@c Book headers for PDF version +@setchapternewpage odd +@documentencoding UTF-8 + +@copying +This is edition 1.7 (last updated April 2020) of +@cite{GNU/Linux-libre from source code for Pentium 4}. + +Copyright @copyright{} 2020 Christophe Jarry. + +@ignore +This document is based on the Chinese page +@url{http://zdbr.net.cn/download/Loongson64-@/2.0.htm}, which is +copyright @copyright{} 2009 +@c Because TeX does not handle Chinese fonts automatically, we need to +@c do the following: +@ifnottex +Haiyong Sun (孙海勇). +@end ifnottex +@iftex +Haiyong Sun. +@end iftex +His blog is on @url{http://blog.chinaunix.net/uid/436750.html}. +@end ignore + +Various formats of this manual as well as its texinfo source are +available on +@uref{http://cjarry.org/gnu-linux/gllfsc/pentium4/}. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +Texts. A copy of the license is included in the section entitled ``GNU +Free Documentation License''. +@end quotation + +@quotation +Computer instructions in this manual are free software: you can +redistribute them and/or modify them under the terms of the GNU +General Public License as published by the Free Software Foundation, +either version 3 of the License, or (at your option) any later +version. + +Those instructions are distributed in the hope that they will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this manual. If not, see . +@end quotation + +@end copying + +@c @setchapternewpage odd + +@titlepage +@title GNU/Linux-libre from source code +@subtitle for Pentium 4 +@c @subtitle SUBTITLE-IF-ANY +@c @subtitle SECOND-SUBTITLE +@author Christophe Jarry + +@c The following two commands +@c start the copyright page. +@page +@vskip 0pt plus 1filll +@insertcopying + +@c Published by ... +@end titlepage + +@c Short table of contents +@shortcontents + +@c So the toc is printed at the start. +@contents + +@ifnottex +@node Top +@top GNU/Linux-libre from source code for Pentium 4 + +This manual describes how to build a GNU/Linux-libre system from +source for Pentium 4 processor. + +@insertcopying +@end ifnottex + +@menu +* Introduction:: What this document is all about. +* Prerequisites:: Useful knowledge before proceeding. +* Preliminary Work:: Preparing the build. +* Building the Cross-Compilation Toolchain:: Building the cross- + compilation Toolchain. +* Building the Cross-Compilation Tools:: Building the + cross-compilation Tools. +* Building the Target System:: How to build the target system. +* Configuration Files:: Creating configuration files + needed by the new system. +* Before Booting GLLFSC:: Final things to do before booting + into the new system. +* After Booting GLLFSC:: Some packages to install and + configuration to tweek in order + to extend the system. +* Further Readings:: Websites useful to know more. +@c * Thanks:: Thanks. +* GNU Free Documentation License:: Your rights and freedoms with the + text. +* GNU General Public License:: Your rights and freedoms with the + commands. +@end menu + + +@node Introduction +@chapter Introduction + +@menu +* GNU/Linux History:: A brief history of GNU/Linux. +* Purpose of this Document:: What this document is all about. +@end menu + + +@node GNU/Linux History +@section GNU/Linux History + +@menu +* GNU:: Presentation of the GNU project +* HURD:: Presentation of the HURD +* Linux:: Presentation of the kernel Linux +* Linux-libre:: Presentation of the kernel Linux-libre +* References:: Where to get more information +@end menu + +@node GNU +@subsection GNU + +@acronym{GNU} (GNU's Not Unix) is a project launched by Richard +Stallman in 1984 with the goal of building an entirely free operating +system compatible with Unix@footnote{See +@uref{http://en.wikipedia.org/wiki/Unix}}. ``Free'' here means ``free +as in freedom''. In this context, a free operating system is an +operating system you can use and share in freedom. A core part of his +motivation is given in the GNU +Manifesto@footnote{@uref{http://www.gnu.org/gnu/manifesto.html}}: + +@quotation +I consider that the Golden Rule requires that if I like a program I +must share it with other people who like it. Software sellers want to +divide the users and conquer them, making each user agree not to share +with others. I refuse to break solidarity with other users in this +way. I cannot in good conscience sign a nondisclosure agreement or a +software license agreement. For years I worked within the Artificial +Intelligence Lab to resist such tendencies and other inhospitalities, +but eventually they had gone too far: I could not remain in an +institution where such things are done for me against my will. + +So that I can continue to use computers without dishonor, I have +decided to put together a sufficient body of free software so that I +will be able to get along without any software that is not free. I +have resigned from the AI Lab to deny MIT any legal excuse to prevent +me from giving GNU away. +@end quotation + +A program is free software if the program's user has the four +essential freedoms: + +@itemize +@item +The freedom to run the program, for any purpose (freedom 0). + +@item +The freedom to study how the program works, and change it so it does +her computing as she wishes (freedom 1). Access to the source code is +a precondition for this. + +@item +The freedom to redistribute copies so she can help her neighbor +(freedom 2). + +@item +The freedom to distribute copies of her modified versions to others +(freedom 3). By doing this she can give the whole community a chance +to benefit from her changes. Access to the source code is a +precondition for this. +@end itemize + +One of the most popular free software license is the GNU General +Public License (GNU +GPL@footnote{@uref{http://www.gnu.org/licenses/gpl.html}}). + +The free software movement is supported by the Free Software +Foundation (FSF@footnote{@uref{http://www.fsf.org}}). + + +@node HURD +@subsection HURD + +The @acronym{HURD} is an acronym for @acronym{HIRD} (HURD of +interfaces representing depth) of Unix-replacing daemons. It is the +GNU project's replacement for the Unix kernel. It is a collection of +servers that run on the Mach microkernel to implement file systems, +network protocols, file access control, and other features that are +implemented by the Unix kernel or similar kernels (such as Linux). + +The purpose of the GNU HURD is to improve the user's freedom on her +operating system by allowing her to either add or remove a feature of +the kernel on the fly. + +From early on, the HURD was developed to use GNU Mach as the +microkernel. This was a technical decision made by Richard Stallman, +who thought it would speed up the work by saving a large part of +it. He has admitted that he was wrong about that. + +Nevertheless, development of the HURD is increasingly attracting +developers and GNU/HURD systems exist and are usable. + + +@node Linux +@subsection Linux + +Linux is a monolithic kernel created by Linus Torvalds in 1991. Linus +Torvalds initially wrote a terminal emulator, which he used to access +the large UNIX servers of his university. He wrote the program +specifically for the hardware he was using and independent of an +operating system because he wanted to use the functions of his new PC +with an 80386 processor. This later became the kernel Linux. + +Initially, Torvalds first published the kernel Linux under its own +licence, which had a restriction on commercial activity. + +In the notes for the first release of the kernel Linux, Torvalds lists +the GNU software that is required to run Linux: + +@quotation +Sadly, a kernel by itself gets you nowhere. To get a working system +you need a shell, compilers, a library etc. [...] Most of the tools +used with linux are GNU software and are under the GNU copyleft. +@end quotation + +In 1992, he suggested releasing the kernel under the GNU General +Public License. He first announced this decision in the release notes +of version 0.12. In the middle of December 1992 he published version +0.99 using the GNU GPL. + +The kernel Linux is now a contribution of many professionals and +volonteers around the world. + + +@node Linux-libre +@subsection Linux-libre + +Linux, the kernel developed and distributed by Linus Torvalds et al, +contains non-Free Software@footnote{For more information about the +presence of proprietary firmware in the kernel Linux, read +@uref{http://www.fsfla.org/ikiwiki/anuncio/2010-03-Linux-2.6.33-libre.en} +and +@uref{http://www.gnu.org/@/distros/free-system-distribution-guidelines.html#nonfree-firmware}.}, +i.e., software that does not respect your essential freedoms, and it +induces you to install additional non-Free Software that it doesn't +contain. + +GNU +Linux-libre@footnote{@uref{http://www.fsfla.org/ikiwiki/selibre/linux-libre/index.en.html}} +is a project to maintain and publish 100% Free distributions of Linux, +suitable for use in Free System Distributions@footnote{For a full list +of free as in freedom GNU/Linux distributions, see +@uref{http://www.gnu.org/distros/}.}, removing software that is +included without source code, with obfuscated or obscured source code, +under non-Free Software licenses, that do not permit you to change the +software so that it does what you wish, and that induces or requires +you to install additional pieces of non-Free Software. + + +@node References +@subsection References + +For more information on the GNU project and its relation with the +kernel Linux, you can read @uref{http://www.gnu.org/gnu/thegnuproject.html} +and @uref{http://www.gnu.org/gnu/gnu-linux-faq.html}. + +For more information on the history of the HURD, I recommend you to +read @uref{http://www.h-online.com/open/features/GNU-HURD-Altered-visions-and-lost-promise@/-1030942.html}. + +For more information on the HURD, read @uref{http://www.gnu.org/software/hurd/}. + +For more information on the early versions of the kernel Linux, read +@uref{https://www.cs.cmu.edu/~awb/linux.history.html}. + + +@node Purpose of this Document +@section Purpose of this Document + +One day I found a Dell Optiplex 745 minitower with a Pentium 4 CPU in +a municipal waste. I just replaced the button battery and the computer +was able to boot. I decided to adapt the work I did for the Lemote +Yeeloong 8133: GNU/Linux@footnote{Note: in this document, we use the +term ``GNU/Linux'' to name the entire system and ``Linux'' to name the +kernel. For more information, read +@uref{http://www.gnu.org/gnu/why-gnu-linux.html}.} Libre from Source +Code for Pentium 4 was born. + + +@node Prerequisites +@chapter Prerequisites + +@menu +* Definitions:: Definitions of important notions used to build the + system +* Commands:: Help on commands +@end menu + + +@node Definitions +@section Definitions + +@menu +* sysroot:: @option{sysroot} +* Toolchain:: What a Toolchain is. +* build host target:: Understanding the meaning of the + @option{build}-@option{host}-@option{target} + triplet. +* FHS:: The Filesystem Hierarchy Standard. +@end menu + + +@node sysroot +@subsection @option{sysroot} + +The traditional way of building a GNU/Linux operating system consists +on building a (cross-) compilation toolchain to build a temporary +operating system which in turn will be used to build the target +system@footnote{@pxref{Further Readings} for more details}. This +requires almost as much time to complete the temporary system as to +build the target one. Using sysroot resolves this problem. + +From GCC installation manual, under Cross-Compiler-Specific Options: + +@table @code +@item --with-sysroot +@itemx --with-sysroot=@var{dir} +Tells GCC to consider @var{dir} as the root of a tree that contains (a +subset of) the root filesystem of the target operating system. Target +system headers, libraries and run-time object files will be searched +in there. More specifically, this acts as if +@option{--sysroot=@var{dir}} was added to the default options of the +built compiler. The specified directory is not copied into the +install tree, unlike the options @option{--with-headers} and +@option{--with-libs} that this option obsoletes. The default value, +in case @option{--with-sysroot} is not given an argument, is +@option{$@{gcc_tooldir@}/sys-root}. If the specified directory is a +subdirectory of @option{$@{exec_prefix@}}, then it will be found +relative to the GCC binaries if the installation tree is moved. + +This option affects the system root for the compiler used to build +target libraries (which runs on the build system) and the compiler +newly installed with @code{make install}; it does not affect the +compiler which is used to build GCC itself. +@end table + + +@node Toolchain +@subsection Toolchain + +According to +Wikipedia@footnote{@uref{http://en.wikipedia.org/wiki/Toolchain}}: + +@quotation +In software, a toolchain is the set of programming tools that are used +to create a product (typically another computer program or system of +programs). The tools may be used in a chain, so that the output of +each tool becomes the input for the next, but the term is used widely +to refer to any set of linked development tools. + +A simple software development toolchain consists of a text editor for +editing source code, a compiler and linker to transform the source +code into an executable program, libraries to provide interfaces to +the operating system, and a debugger. +@end quotation + + +@node build host target +@subsection @option{build}, @option{host} and @option{target} + +During a cross-compilation, @option{build} @option{host} and +@option{target} are among the most used options: understanding the +precise meaning of those parameters is very important. We could define +them thus: + +@itemize +@item @option{--build=@var{platform on which the program is +compiled}}, +@item @option{--host=@var{platform on which the program will run}}, +@item @option{--target=@var{platform for which the program will create +output}}. +@end itemize + +Let's use GCC as an example to explain the role of those three +parameters. + +During GCC compilation, we use: + +@samp{./configure --build=@var{build-platform} +--host=@var{host-platform} --target=@var{target-platform} [various +compilation parameters]} + +So in those configuration parameters: + +@itemize +@item +@option{--build} provides the name of the platform currently running. +If we were using an Intel Pentium processor to compile the system, our +@var{build-platform} would be something like @samp{i686-pc-linux-gnu}. + +If this parameter is not specified, it will be guessed automatically. + +@item +@option{--host} represents the type of machine we are going to run GCC +on after the compilation succeeds. During a cross-compilation this has +to be specified, because the current machine can not know which +architecture we wish to target. We want to produce executables to run +on @emph{Pentium4}, but there is currently no way we can specify +@samp{Pentium4} directly; because of this we specify +@samp{i386-unknown-linux-gnu}. + +@option{--host} can also be left unspecified, in that case, +@var{host-platform} would automatically define itself as +@var{build-platform}, but this is not cross-compilation anymore. + +@quotation Note +when @option{--build} and @option{--host} are different, configuration +files will maintain the cross-compilation mode. +@end quotation + +@item +@option{--target} defines the system for which compiler tools will +create output. + +@var{target-platform} parameter is useful only for a limited number of +programs. Although this parameter is often present when issuing +@samp{./configure --help}, hardly any packages will need it. + +This parameter is only useful for performing tasks with different +platforms; for instance, executable files compiled for different +platforms can have a totally different code. +@end itemize + +If we summarize, we have: + +@itemize +@item @var{build-platform}: automatically guessed from platform in +use; has to be specified if not guessed. + +@item @var{host-platform}: if unspecified, automatically equals +@var{build-platform}. When @var{build-platform} and +@var{host-platform} values are identical, it is a local compilation; +otherwise it is a cross-compilation. + +@item @var{target-platform}: defines the system for which compiler +tools will create output; it equals @var{host-platform} if +unspecified. GCC, binutils, and programs related to the platform's +instructions have this parameter; most programs do not use this +parameter. +@end itemize + + +@node FHS +@subsection FHS + +The Filesystem Hierarchy Standard (FHS) has been created to specify +the location and use of main directories on a GNU/Linux operating +system. Common commands, user data, libraries have to be put inside a +specific directory given in the standard. During the build process, +some commands are used to comply with FHS. + + +@node Commands +@section Commands + +Because most commands are common for a regular Unix user, only +uncommon commands are explained in this document. If you do not +understand a command that is not explained, you can use the +documentation available on your computer; in a terminal, typing +@samp{man @var{command}} should give you enough information. For GNU +software, @samp{info @var{package}} can also give additional +information. + +To know more about command line, I suggest you read "Introduction to +the Command Line" which is available on +@uref{http://flossmanuals.net/command-line/}. + + +@node Preliminary Work +@chapter Preliminary Work + +@quotation Important +In order to complete the first steps of this chapter, you will need to +have root permissions. +@end quotation + +@menu +* Build Partition Creation:: Creating a partition for the build. +* Build User Creation:: Creating a user account dedicated to + the build. +* Work Directory Creation:: Creating the parent directory for the + build. +* Partition Mount:: Mounting the partition dedicated to the + build. +* Useful Directories Creation:: Creating the directories for downloads + and compilations. +* User Switch:: Switching to the user dedicated to the + build. +* Environment Variables Setup:: Setting up the environment variables + of the target system. +* Downloads:: Downloading needed packages and + patches. +* Final Preparations:: Preparing the system for the build. +@end menu + + +@node Build Partition Creation +@section Build Partition Creation + +To dedicate the partition @file{/dev/sda1} to the system build, and to +define the filesystem to be used for it as @samp{ext3}: + +@verbatim +mke2fs -t ext3 /dev/sda1 +@end verbatim + +Option @option{-t} is followed by the type of filesystem to be +used. The filesystem @samp{ext3} is used as it is one of the most +common filesystem used with the kernel Linux. + + +@node Build User Creation +@section Build User Creation + +To create the builder group, user and password: + +@verbatim +groupadd gllfsc +useradd -s /bin/bash -g gllfsc -m -k /dev/null gllfsc +passwd gllfsc +@end verbatim + +@itemize +@item +Option @option{-s} (or @option{--shell}) is used to define the created +user's default shell, here @file{/bin/bash}. + +@item +Option @option{-g} (or @option{--gid}) is used to define the group +name or number of the created user's initial login group, here +@samp{gllfsc}. + +@item +Option @option{-m} (or @option{--create-home}) does create the user's +home directory if it does not exist (@file{/home/@var{username}}). + +@item +Option @option{-k} (or @option{--skel}) is used to define the skeleton +directory to be copied in the user's home directory, here +@file{/dev/null}. @file{/dev/null} is a special file which, in this +case, will give no skeleton at all to @command{useradd}. +@end itemize + + +@node Work Directory Creation +@section Work Directory Creation + +To create the directory @file{/gllfsc} in which the system will be +built: + +@verbatim +export TARGET_DIR="/gllfsc" +mkdir -pv ${TARGET_DIR} +@end verbatim + +@samp{export TARGET_DIR="/gllfsc"} sets the value of the variable +@env{TARGET_DIR} to @file{/gllfsc}, the directory in which the system +will be built. + + +@node Partition Mount +@section Mounting Partition + +To mount the hard drive partition, for instance @file{/dev/sda1}, used +to build the system: + +@verbatim +mount /dev/sda1 ${TARGET_DIR} +@end verbatim + + +@node Useful Directories Creation +@section Creating Compilation and Download Directories + +@verbatim +mkdir -pv ${TARGET_DIR}/{build,download} +chown -Rv gllfsc ${TARGET_DIR} +@end verbatim + + +@node User Switch +@section Switching to the Build User + +To login as the user that will build the system: + +@verbatim +su - gllfsc +@end verbatim + +With the command @command{su}, it is possible to change the user +ID. The option @option{-} provides an environment similar to what the +user would expect had the user logged in directly. + + +@node Environment Variables Setup +@section Setting up Required Environment Variables + +@file{~/.bash_profile} is a personal initialization file that is read +when Bash is invoked as an interactive login shell (@file{~} is the +location of the user's home directory). To write the content of the +file @file{~/.bash_profile}: + +@verbatim +cat > ~/.bash_profile << 'EOF' +exec env -i HOME=${HOME} TERM=${TERM} PS1=${PS1} /bin/bash +EOF +@end verbatim + +The first line creates the file @file{~/.bash_profile} and opens it +for writing until @samp{@acronym{EOF}} (End Of File) is written in it. + +The second line tells Bash to execute @file{/bin/bash} with the option +@option{-i} (or @option{--ignore-environment}) which will make Bash +start with an empty environment. Variables @env{HOME}, @env{TERM} and +@env{PS1} define respectively the home directory of the current user, +the terminal used and the primary prompt string displayed. + +@file{~/.bashrc} is a personal initialization file that is read when +Bash is invoked as an interactive shell but not a login one. To write +the content of the file @file{~/.bashrc}: + +@verbatim +export TARGET_DIR=/gllfsc +cat > ~/.bashrc << EOF +set +h +umask 022 +#alias make='make -j5' +export PS1='\[\e[35m\]\A-\W\[\e[00m\]$ ' +export LC_ALL=POSIX +export TARGET_DIR=/gllfsc +export BUILD_DIR="${TARGET_DIR}/build" +export DOWNLOAD_DIR="${TARGET_DIR}/download" +export CROSS_HOST="$(echo $MACHTYPE |\ + sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")" +export CROSS_TARGET="i686-unknown-linux-gnu" +#export MABI="n32" +#export MABI="64" +export MARCH="pentium4" +export PATH=${TARGET_DIR}/cross-tools/bin:/bin:/usr/bin +unset CFLAGS +unset CXXFLAGS +EOF +source ~/.bash_profile +@end verbatim + +@samp{set +h} tells Bash to not locate nor remember commands (hash) as +they are looked up for execution. + +@samp{umask 022} sets Bash process' file creation mask to +@samp{022}. This results in permissions of `755' for those files. + +@samp{alias make='make -j5'} tells Bash to replace every call of +@samp{make} by @samp{make -j5}. This is useful for multiple-cores CPUs +as it parallelizes tasks. + +@samp{export PS1='\[\e[35m\]\A-\W\[\e[00m\]$ '} sets the primary +prompt strings. The primary prompt strings are the strings you see +before the commands you type in the terminal. The part @samp{\A-\W} +means that the time, in 24-hour HH:MM format and the basename of +@env{$PWD} will be displayed separated by a `-', as in +@samp{19:33-bin}. The part @samp{\$} adds a dollar sign at the end, +@samp{\[\e[35m\]} colors the strings in purple and @samp{\[\e[00m\]} +gets the original color back. For other colors, you can browse +@uref{http://en.wikipedia.org/wiki/ANSI_escape_code}. + +@env{LC_ALL} is a macro used to define a single locale to overwrite +other @env{LC_*} and @env{LANG} environment variables so that +language, numeric values, time and other locale-dependant values have +all the same value. It is set to the standard POSIX locale. + +@samp{export BUILD_DIR="$@{TARGET_DIR@}/build"} sets the environment +variable @env{BUILD_DIR} to the value of @samp{$@{TARGET_DIR@}/build} +which is @samp{/gllfsc/build} in this document. + +The value of variable @env{CROSS_HOST} equals the value of variable +@env{MACHTYPE} of the current machine (for instance +@samp{i686-pc-linux-gnu}) modulo the second word, which is replaced by +@samp{cross} (i.e. @samp{i486-cross-linux-gnu}). + +The value of variable @env{CROSS_TARGET} equals the value of variable +@env{MACHTYPE} of the machine for which the system is built (i.e. +@samp{i686-unknown-linux-gnu}). + +The variable @env{MABI} defines the @acronym{ABI} (Application Binary +Interface) for which the system will be built. @option{-mabi} is an +option of GCC. n32/64 are for 64-bit CPUs only. 64 has 64-bit pointers +and long integers, whereas n32 has 32-bit pointers and long integers. +This does not apply to pentium 4 machines. + +The variable @env{MARCH} defines the architecture for which the system +will be built. @option{-march} is an option of @acronym{GCC} (GNU +Compiler Collection). + +The variable @env{PATH} contains a colon-separated list of directories +in which the shell looks for commands. The shell will first look for +commands in @file{$@{TARGET_DIR@}/cross-tools/bin}, then, if the +command was not found, in @file{/bin} and finally in @file{/usr/bin}. + +@command{unset} command removes the variable associated, here +@env{CFLAGS} and @env{CXXFLAGS}. Those variables are used by GCC as +extra flags given to the C compiler and the C++ compiler +respectively. + +Finally @samp{source ~/.bash_profile} reads and executes the content +of the file @file{~/.bash_profile}. + + +@node Downloads +@section Downloads + +@menu +* Packages Download:: List of packages to be downloaded. +* Patches Download:: List of patches to be downloaded. +@end menu + + +@node Packages Download +@subsection Downloading Packages + +The packages listed below are those used in this document. You can try +other versions but you will need a recent version of Binutils, GCC and +the kernel Linux in order to build GLLFSC. + +Download those files under @env{$@{DOWNLOAD_DIR@}} (which is +@file{/gllfsc/download} in this document). + +@quotation Note +If you have trouble with a savannah mirror, you can have a full list +of them at @uref{http://download.savannah.gnu.org/mirmon/savannah/}. +If you have trouble with a GNU mirror, you can have a full list +of them at @uref{http://www.gnu.org/prep/ftp.html}. +@end quotation + +@itemize +@item +Autoconf: @uref{http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz}. + +@item +Automake: @uref{http://ftpmirror.gnu.org/automake/automake-1.14.tar.gz}. + +@item +Bash: @uref{http://ftpmirror.gnu.org/bash/bash-4.2.tar.gz}. + +@item +Binutils: @uref{http://ftpmirror.gnu.org/binutils/binutils-2.24.tar.bz2}. + +@item +Bison: @uref{http://ftpmirror.gnu.org/bison/bison-2.7.tar.gz}. + +@item +Bootscripts: @uref{http://ftp.clfs.org/pub/clfs/conglomeration/bootscripts@/-cross@/-lfs/@/bootscripts-cross-lfs-2.0.0.tar.xz}. + +@item +Bzip2: @uref{http://downloads.sourceforge.net/bzip2/bzip2-1.0.6.tar.gz}. + +@item +CA-Certificates: @uref{http://anduin.linuxfromscratch.org/sources/other/certdata.txt}. + +@item +Coreutils: @uref{http://ftpmirror.gnu.org/coreutils/coreutils-8.19.tar.xz}. + +@item +DHCPCD: @uref{https://roy.marples.name/downloads/dhcpcd/dhcpcd-6.1.0.tar.bz2}. + +@item +Diffutils: @uref{http://ftpmirror.gnu.org/diffutils/diffutils-3.3.tar.xz}. + +@item +E2fsprogs: @uref{http://downloads.sourceforge.net/e2fsprogs/e2fsprogs-1.42.8.tar@/.gz}. + +@item +File: @uref{ftp://ftp.astron.com/pub/file/file-5.16.tar.gz}. + +@item +Findutils: @uref{http://ftpmirror.gnu.org/findutils/findutils-4.4.2.tar.gz}. + +@item +Flex: @uref{http://downloads.sourceforge.net/flex/flex-2.5.37.tar.bz2}. + +@item +Gawk: @uref{http://ftpmirror.gnu.org/gawk/gawk-4.1.0.tar.gz}. + +@item +GCC: @uref{http://ftpmirror.gnu.org/gcc/gcc-4.7.3/gcc-4.7.3.tar.bz2}. + +@item +Gdbm: @uref{http://ftp.gnu.org/gnu/gdbm/gdbm-1.11.tar.gz}. + +@item +Gettext: @uref{http://ftpmirror.gnu.org/gettext/gettext-0.18.3.1.tar.gz}. + +@item +Glibc: @uref{http://ftpmirror.gnu.org/glibc/glibc-2.18.tar.bz2}. + +@item +Gmp: @uref{http://ftpmirror.gnu.org/gmp/gmp-5.1.3.tar.bz2}. + +@item +Grep: @uref{http://ftpmirror.gnu.org/grep/grep-2.15.tar.xz}. + +@item +Groff: @uref{http://ftpmirror.gnu.org/groff/groff-1.22.2.tar.gz}. + +@item +GRUB: @uref{http://ftpmirror.gnu.org/grub/grub-2.00.tar.gz}. + +@item +Gzip: @uref{http://ftpmirror.gnu.org/gzip/gzip-1.6.tar.gz}. + +@item +Iana-Etc: @uref{http://sethwklein.net/iana-etc-2.30.tar.bz2}. + +@item +Inetutils: @uref{http://ftpmirror.gnu.org/inetutils/inetutils-1.9.1.tar.gz}. + +@item +Iproute2: @uref{https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-3.10.0@/.tar.bz2}. + +@item +Kbd: @uref{http://ftp.altlinux.org/pub/people/legion/kbd/kbd-2.0.1.tar.gz}. + +@item +Kmod: @uref{https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-15.tar.gz}. + +@item +Less: @uref{http://www.greenwoodsoftware.com/less/less-458.tar.gz}. + +@item +Libpipeline: @uref{http://download.savannah.gnu.org/releases/libpipeline/@/libpipeline-1.3.0.tar.gz}. + +@item +Libtasn1: @uref{http://ftpmirror.gnu.org/libtasn1/libtasn1-3.4.tar.gz}. + +@item +Libtool: @uref{http://ftpmirror.gnu.org/libtool/libtool-2.4.2.tar.gz}. + +@item +Linux-Libre @footnote{The kernel Linux is shipped with proprietary +firmware. The version called Linux-Libre exists without them, it is +available for download at +@uref{http://www.fsfla.org/ikiwiki/selibre/linux-libre/}.}. +@uref{http://linux-libre.fsfla.org/pub/linux-libre/releases/3.10-gnu/@/linux-libre-3.10-gnu.tar.xz}. + +@item +Lynx: @uref{http://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.8dev.16.tar@/.bz2}. + +@item +M4: @uref{http://ftpmirror.gnu.org/m4/m4-1.4.17.tar.bz2}. + +@item +Make: @uref{http://ftpmirror.gnu.org/make/make-4.0.tar.bz2}. + +@item +Man-db: @uref{http://download.savannah.gnu.org/releases/man-db/man-db-2.6.7.1.tar@/.xz}. + +@item +Man-Pages: @uref{https://www.kernel.org/pub/linux/docs/man-pages/Archive/man-pages-@/3.54.tar.bz2}. + +@item +Mpc: @uref{http://ftpmirror.gnu.org/mpc/mpc-1.0.1.tar.gz}. + +@item +Mpfr: @uref{http://ftpmirror.gnu.org/mpfr/mpfr-3.1.2.tar.bz2}. + +@item +Nano: @uref{http://ftpmirror.gnu.org/nano/nano-2.3.2.tar.gz}. + +@item +Ncurses: @uref{http://ftpmirror.gnu.org/ncurses/ncurses-5.9.tar.gz}. + +@item +Openssl: @uref{ftp://ftp.openssl.org/source/old/1.0.1/openssl-1.0.1i.tar.gz}. + +@item +Patch: @uref{http://ftpmirror.gnu.org/patch/patch-2.7.1.tar.bz2}. + +@item +Perl: @uref{http://www.cpan.org/src/5.0/perl-5.18.1.tar.gz}. + +@item +Procps: @uref{http://procps.sourceforge.net/procps-3.2.8.tar.gz}. + +@item +Psmisc: @uref{https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-22.20.tar@/.gz}. + +@item +Readline: @uref{http://ftpmirror.gnu.org/readline/readline-6.2.tar.gz}. + +@item +Runit: @uref{http://smarden.org/runit/runit-2.1.2.tar.gz} + +@item +Sed: @uref{http://ftpmirror.gnu.org/sed/sed-4.2.2.tar.bz2}. + +@item +Shadow: @uref{https://src.fedoraproject.org/repo/pkgs/shadow-utils/shadow-4.1.4.3@/.tar.bz2/b8608d8294ac88974f27b20f991c0e79/shadow-4.1.4.3.tar.bz2}. + +@item +Sysvinit: @uref{http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf@/.tar.bz2}. + +@item +Tar: @uref{http://ftpmirror.gnu.org/tar/tar-1.27.1.tar.bz2}. + +@item +Texinfo: @uref{http://ftpmirror.gnu.org/texinfo/texinfo-4.13a.tar.gz}. + +@item +Tzcode: @uref{http://www.iana.org/time-zones/repository/releases/tzcode2013h.tar@/.gz}. + +@item +Tzdata: @uref{http://www.iana.org/time-zones/repository/releases/tzdata2013h.tar@/.gz}. + +@item +Udev: @uref{https://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-175.tar.gz}. + +@item +Util-Linux: @uref{https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-@/linux-2.24.tar.bz2}. + +@item +Wireless_tools: @uref{http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz}. + +@item +Wpa_supplicant: @uref{http://w1.fi/releases/wpa_supplicant-2.0.tar.gz}. + +@item +Wget: @uref{http://ftpmirror.gnu.org/wget/wget-1.14.tar.gz}. + +@item +XZ-Utils: @uref{https://tukaani.org/xz/xz-5.0.8.tar.bz2}. + +@item +Zlib: @uref{http://www.zlib.net/fossils/zlib-1.2.8.tar.gz}. +@end itemize + + +@node Patches Download +@subsection Downloading Patches + +Patches and configuration files location: + +@itemize +@item +@uref{http://cjarry.org/gnu-linux/gllfsc/pentium4/gllfsc-pentium4-1.7-patches@/.tar.gz}. After +having downloaded this file under @env{$@{DOWNLOAD_DIR@}}, execute +the following commands to extract its content: + +@verbatim +cd ${DOWNLOAD_DIR} +tar xvf gllfsc-pentium4-1.7-patches.tar.gz +cd +@end verbatim + +@ignore +@item +The page +@uref{http://dev.lemote.com/cgit/linux-official.git/commit/?h=linux-3.6@/&id=94fe1f0a7d2e3042fa7fadfd15da71b9d0c11809} +describes the changes to be made to the kernel in order to add support +for Chinese fonts in console. The patch applies to Linux 3.6. +Be aware though that applying this patch to the kernel may make +characters that are both non-@acronym{CJK} (Chinese Japanese Korean) +and non-ASCII unreadable (accented letters, cyrillic, etc.). + +@item +The page +@uref{http://microcai.gsalex.net/old/archives/2011/01/fbcon_UNICODE_font_support.html} +is useful for users who want support for @acronym{CJK} (Chinese +Japanese Korean) characters under the (non-graphical) terminal. It +gives access to a git@footnote{@uref{http://git-scm.com/}} repository +with kernel patches@footnote{The patches to use with version 3.5 of +the kernel are the first four on +@uref{http://repo.or.cz/w/linux-2.6/cjktty.git/shortlog/refs/heads/3.5-utf8}.} +that permit direct rendering of UTF-8 characters under the framebuffer +environment. Be aware though that applying those CJK patches to the +kernel may make characters that are both non-CJK and non-ASCII +unreadable (accented letters, cyrillic, etc.). +@end ignore + +@item +@uref{http://www.fsfla.org/svn/fsfla/software/linux-libre/lemote/gnewsense/tags/@/2.6.36-libre-lemote_0lxo/100gnu+freedo.patch} +this patch adds a picture of a GNU beside Freedo, Freedo being the +mascot of Linux-Libre. The image can be seen on +@uref{http://www.fsfla.org/ikiwiki/selibre/linux-libre/100gnu+freedo}. + +@item +@uref{http://linux-libre.fsfla.org/pub/linux-libre/releases/3.10.7-gnu/patch-3.10-@/gnu-3.10.7-gnu.xz} +this patch updates linux-libre-3.10 to linux-libre-3.10.7. +@end itemize + + +@node Final Preparations +@section Final Preparations + +@menu +* Target Filesystem Hierarchy Creation:: Creating the directories of + the target system. +* Needed Files Creation:: Creating files for needed + user, groups and log. +@end menu + + +@node Target Filesystem Hierarchy Creation +@subsection Target Filesystem Hierarchy Creation + +@verbatim +cd ${TARGET_DIR} + +# /usr is required for cmake, python and ruby at least +mkdir -v usr +cd usr +mkdir -v bin include lib share src +ln -sv bin sbin +ln -sv lib lib32 +ln -sv lib lib64 +cd .. + +mkdir -v boot dev etc home local mnt proc root run static sys var +mkdir -v cross-tools libexec + +ln -sv usr/bin bin +ln -sv usr/bin sbin +ln -sv usr/include include +ln -sv usr/lib lib +ln -sv usr/lib lib32 +ln -sv usr/lib lib64 +ln -sv usr/share share +ln -sv usr/src src +install -dv -m 0777 tmp + +install -dv -m 1777 var +cd var +mkdir -v cache local lock log mail run spool +mkdir -pv lib/misc lib/locate +cd .. + +install -dv -m 0750 root + +cd local +mkdir -v bin include lib src +ln -sv bin sbin +ln -sv lib lib32 +mkdir -v share +cd share +mkdir -v doc info locale man misc terminfo zoneinfo +mkdir -v man/man{1..8} +cd ../.. +ln -sv share/man man +cd +@end verbatim + +The command @samp{install -dv -m 1777 var} creates the directory +@file{var} with the permissions to read, write and execute for +everyone. The '1' in @samp{1777} is the sticky bit which allows +deletion of the file or directory having this attribute only for the +owner of the file or directory. + +The command @samp{ln -svf lib lib64} creates a symbolic link (option +@option{-s}) with the name @file{lib64} which will point to +@file{lib}. + + +@node Needed Files Creation +@subsection Creating needed user, groups and log files + +@verbatim +cat > ${TARGET_DIR}/etc/passwd << EOF +root::0:0:root:/root:/bin/bash +EOF +@end verbatim + +The file @file{/etc/passwd} contains one line for each user account, +with seven fields delimited by colons. These fields are: + +@itemize +@item +login name; + +@item +optional encrypted password; + +@item +numerical user ID; + +@item +numerical group ID; + +@item +user name or comment field; + +@item +user home directory; + +@item +optional user command interpreter. +@end itemize + + +@verbatim +cat > ${TARGET_DIR}/etc/group << EOF +root:x:0: +bin:x:1: +sys:x:2: +kmem:x:3: +tty:x:4: +tape:x:5: +daemon:x:6: +floppy:x:7: +disk:x:8: +lp:x:9: +dialout:x:10: +audio:x:11: +video:x:12: +utmp:x:13: +usb:x:14: +cdrom:x:15: +EOF +@end verbatim + +The file @file{/etc/group} is a text file which defines the groups on +the system. There is one entry per line, with the following format: +@samp{group_name:password:GID:user_list}. + + +@verbatim +touch ${TARGET_DIR}/var/run/utmp \ + ${TARGET_DIR}/var/log/{btmp,lastlog,wtmp} +chmod -v 664 ${TARGET_DIR}/var/run/utmp \ + ${TARGET_DIR}/var/log/lastlog +@end verbatim + + +@node Building the Cross-Compilation Toolchain +@chapter Building the Cross-Compilation Toolchain + +In this chapter, the cross-compilation toolchain is built as well as +core components of the target system. Those will then be used to build +the target system. + +@menu +* Target Linux-Header:: Linux-Header for target system. +* Cross Binutils:: Binutils for cross-compilation. +* Cross GCC:: GCC for cross-compilation (C support only). +* Target glibc:: glibc for target system. +* Cross GCC CXX:: GCC for cross-compilation (C and C++ support). +@end menu + + +@node Target Linux-Header +@section Target Linux-Header + +In this document, the kernel used is version 3.10.7 of Linux-libre. I +stick to this version because some changes made in the kernel since +3.14 require the non-free firmware of the radeon driver earlier at +boot: without the firmware, the screen will remain blank on a machine +that requires it, making the computer unusable.@footnote{See +@uref{https://bugzilla.kernel.org/show_bug.cgi?id=77861} for details.} +I think version 3.10.7 of Linux-libre is usable on such a machine +without the non-free firmware of the radeon driver. + +You need Patch, Make and GCC on your system to compile this program +from source. Under gNewSense 4.0, try @samp{sudo apt-get install patch +make gcc-4.4} and then @samp{sudo ln -sv gcc-4.4 /usr/bin/gcc}. + +@verbatim +# 14 minutes mostly to compress the kernel with xz +cd ${BUILD_DIR} + +tar xf ${DOWNLOAD_DIR}/linux-libre-3.10-gnu.tar.xz \ + -C ${BUILD_DIR} +cd ${BUILD_DIR}/linux-3.10 +unxz ${DOWNLOAD_DIR}/patch-3.10-gnu-3.10.7-gnu.xz +patch -Np1 -i ${DOWNLOAD_DIR}/patch-3.10-gnu-3.10.7-gnu +cd .. + +# About 2 minutes for the following command (490 MB) +tar -cf linux-libre-3.10.7-gnu.tar linux-3.10 + +# About 12 minutes for the following command (68 MB) +# (requires ~800 MB of RAM) +xz -9 linux-libre-3.10.7-gnu.tar + +mv linux-libre-3.10.7-gnu.tar.xz ${DOWNLOAD_DIR} + +cd linux-3.10 + +make mrproper +make ARCH=i386 headers_check +make ARCH=i386 INSTALL_HDR_PATH=dest headers_install +cp -rv dest/include/* ${TARGET_DIR}/include +cd .. +rm -rf linux-3.10 +cd +@end verbatim + +@samp{14 minutes} is the time it takes to build the package on Dell +Optiplex 745 with a Pentium 4 processor. + +The command @samp{make mrproper} cleans the sources. + +We need to specify @samp{ARCH=i386} as we are cross-compiling. + + +@node Cross Binutils +@section Cross Binutils + +GNU Binutils (GNU binary utilities) is a collection of programs for +manipulating binaries. + +@verbatim +# 4 minutes +tar xf ${DOWNLOAD_DIR}/binutils-2.24.tar.bz2 -C ${BUILD_DIR} +cd $BUILD_DIR/binutils-2.24 +mkdir -pv ../binutils-build +cd ../binutils-build +CC="gcc" AR="ar" \ + ../binutils-2.24/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --enable-64-bit-bfd \ + --with-sysroot=${TARGET_DIR} \ + --disable-nls \ + --enable-shared +make configure-host +make +make install +cp -v ../binutils-2.24/include/libiberty.h \ + ${TARGET_DIR}/include +cd .. +rm -rf binutils-build +rm -rf binutils-2.24 +cd +@end verbatim + +@samp{CC="gcc"} and @samp{AR="ar"} are flags that tell the +@file{configure} script to use the local commands @command{gcc} as the +C compiler and @command{ar} as the program that handles archives. + +@option{--prefix=$@{TARGET_DIR@}/cross-tools} tells the configure +script to install architecture-independant files in +@file{$@{TARGET_DIR@}/cross-tools}. + +The option @option{--enable-64-bit-bfd} enables 64 bit for +@acronym{BFD} (the Binary File Descriptor). + +@option{--with-sysroot=@env{$@{TARGET_DIR@}}} tells Binutils to +consider @env{$@{TARGET_DIR@}} as the root of a tree that contains (a +subset of) the root filesystem of the target operating system. Target +system headers, libraries and run-time object files will be searched +in there. + +The @option{--enable-nls} option enables Native Language Support +(NLS), which lets Binutils output diagnostics in languages other than +American English. Native Language Support is enabled by default if not +doing a canadian cross build. The @option{--disable-nls} option +disables NLS. + +The option @option{--enable-shared} is used to build shared versions +of libraries, if shared libraries are supported on the target +platform. Use @option{--disable-shared} to build only static +libraries. + +@c cp -v ../binutils-2.22/include/libiberty.h \ +@c ${TARGET_DIR}/include + + +@node Cross GCC +@section Cross GCC (C support only) + +GCC is the GNU compiler collection. It can compile many languages, of +which only C and C++ will be enabled in this document. + +In this section, we build a minimal GCC in order to build glibc. + +@quotation Warning +to build GMP (a GCC dependency), you need a version of GCC different +from 4.3.2 on your system@footnote{@uref{https://gmplib.org/#STATUS}}: +@end quotation + +@quotation +GCC 4.3.2 miscompiles GMP on 64-bit machines; please use a different +gcc version (e.g., gcc 4.3.1 and gcc 4.3.3 both work properly). We +have not been able to find any workaround for this gcc bug. +Unfortunately, Debian 5.0 has decided to stay with this trouble gcc +version, resulting in that many users strike this bug. +@end quotation + +I recommend installing @samp{gcc-4.4} on gNewSense 4.0 to avoid this +issue. + +@verbatim +# 20 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.3.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/gcc-4.7.3 +tar xf ${DOWNLOAD_DIR}/gmp-5.1.3.tar.bz2 +mv gmp-5.1.3 gmp +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz +mv mpc-1.0.1 mpc +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.2.tar.bz2 +mv mpfr-3.1.2 mpfr +# Fix undefined reference to `__stack_check_guard' when compiling glibc: +sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure +mkdir -pv ../gcc-build +cd ../gcc-build +../gcc-4.7.3/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --with-sysroot=${TARGET_DIR} \ + --disable-multilib \ + --with-newlib \ + --disable-nls \ + --disable-shared \ + --disable-threads \ + --enable-languages=c \ + --with-mpfr-include="${BUILD_DIR}/gcc-4.7.3/mpfr/src" \ + --with-mpfr-lib="${BUILD_DIR}/gcc-build/mpfr/src/.libs" \ + --disable-decimal-float +# fixes bid_decimal_globals: fenv.h: No such file or directory + +make all-gcc +make all-target-libgcc +make install-gcc +make install-target-libgcc +cd .. +rm -r gcc-build +rm -r gcc-4.7.3 +cd +@end verbatim + +@option{--disable-multilib} specifies that multiple target libraries +to support different target variants@footnote{Such as different ABI, +for instance n32 and 64.}, calling conventions, etc@:. should not be +built. The default is to build a predefined set of them. + +@option{--with-newlib} specifies that @samp{newlib} is being used as +the target C library. + +@option{--disable-threads} specifies that threading support should be +disabled. + +@option{--enable-languages=c} specifies that only the C compiler and +its runtime libraries should be built. + +@c --with-abi=${MABI} + +@c --with-mpfr-include="${BUILD_DIR}/gcc-4.7.3/mpfr/src" \ +@c --with-mpfr-lib="${BUILD_DIR}/gcc-build/mpfr/src/.libs" +@c to avoid error: libmpfr not found or uses a different ABI (including static vs shared). + +GCC provides a low-level runtime library, @file{libgcc.a} or +@file{libgcc_s.so.1} on some platforms. GCC generates calls to +routines in this library automatically, whenever it needs to perform +some operation that is too complicated to emit inline code for. This +is built with @samp{make all-target-libgcc} and installed with +@samp{make install-target-libgcc} + + +@node Target glibc +@section Target glibc + +Glibc is the GNU C library. It provides macros, type definitions, and +functions for tasks like string handling, mathematical computations, +input/output processing, memory allocation and several other operating +system services. + +You need Gawk on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install gawk}. + +@verbatim +# 20 minutes +tar xf ${DOWNLOAD_DIR}/glibc-2.18.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/glibc-2.18 +sed -i.orig '4775s/3.79\* | 3.\[89\]\*/& | 4.0/' configure +sed -i.orig "s/ -lgcc_eh\| -lgcc_s//g" Makeconfig +#echo "" > ports/sysdeps/mips/mips64/n64/Makefile +#echo "" > ports/sysdeps/mips/mips64/n32/Makefile +#echo "" > ports/sysdeps/mips/mips32/Makefile +#sed -i "/default) machine=/s/n32/${MABI}/g" \ +# ports/sysdeps/mips/preconfigure +mkdir -pv ../glibc-build +cd ../glibc-build + +cat > config.cache << EOF +libc_cv_c_cleanup=yes +libc_cv_slibdir=/lib +EOF + +cat > configparms << EOF +install_root=${TARGET_DIR} +libdir=/lib +EOF + +BUILD_CC="gcc" \ + CC="${CROSS_TARGET}-gcc -march=${MARCH}" \ + AR="${CROSS_TARGET}-ar" \ + RANLIB="${CROSS_TARGET}-ranlib" \ + ../glibc-2.18/configure \ + --prefix= \ + --libexecdir=/lib/glibc \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --disable-profile \ + --enable-add-ons \ + --with-tls \ + --enable-kernel=3.10 \ + --with-__thread \ + --with-binutils=${TARGET_DIR}/cross-tools/bin \ + --with-headers=${TARGET_DIR}/include \ + --enable-obsolete-rpc \ + --cache-file=config.cache + +make + +make install + +cd .. +rm -rf glibc-build +rm -rf glibc-2.18 +cd + +cat > ${TARGET_DIR}/etc/nsswitch.conf << EOF +# Begin /etc/nsswitch.conf + +passwd: files +group: files +shadow: files + +hosts: files dns +networks: files + +protocols: files +services: files +ethers: files +rpc: files + +# End /etc/nsswitch.conf +EOF + +cat > ${TARGET_DIR}/etc/ld.so.conf << EOF +# Begin /etc/ld.so.conf + +/local/lib + +# End /etc/ld.so.conf +EOF +@end verbatim + +@c @samp{sed -i.orig "s/\ -lgcc_eh\|\ -lgcc_s//g" Makeconfig} + +@c Glibc uses @samp{n32} ABI by default with MIPS. To use @env{MABI} +@c instead, we do the following: +@c +@c @verbatim +@c echo "" > ports/sysdeps/mips/mips64/n64/Makefile +@c echo "" > ports/sysdeps/mips/mips64/n32/Makefile +@c echo "" > ports/sysdeps/mips/mips32/Makefile +@c sed -i "/default) machine=/s/n32/${MABI}/g" \ +@c ports/sysdeps/mips/preconfigure +@c @end verbatim + +@ignore +Contents of the files above. + +cat mips64/n64/Makefile +# `long double' is a distinct type we support. +long-double-fcts = yes + +ifeq ($(filter -mabi=64,$(CC)),) +CC += -mabi=64 +endif + +cat mips64/n32/Makefile +# `long double' is a distinct type we support. +long-double-fcts = yes + +ifeq ($(filter -mabi=n32,$(CC)),) +CC += -mabi=n32 +endif + +cat mips32/Makefile +ifeq ($(filter -mabi=32,$(CC)),) +CC += -mabi=32 +endif + +grep 'default)' preconfigure + + default) machine=mips/mips64/n32 mips_config_abi=n32 ;; + +@end ignore + +The file @file{config.cache} is used to attribute values to variables +of the configure script. + +@samp{libc_cv_forced_unwind=yes} is used to avoid the error message +@samp{error: forced unwind support is required}. + +@samp{libc_cv_c_cleanup=yes} is used to avoid the error message +@samp{error: the compiler must support C cleanup handling}. + +@samp{libc_cv_slibdir=/lib} defines @file{/lib} as the directory in +which the C library of the target system will be installed, instead of +@file{/lib64} or @file{/lib32}. + +You can install glibc somewhere other than where you configured it to +go by setting the @code{install_root} variable on the command line for +@samp{make install}. The value of this variable is prepended to all +the paths for installation. This is useful when setting up a chroot +environment or preparing a binary distribution. The directory should +be specified with an absolute file name. + +Files listed in @samp{install-lib} are installed in the directory +specified by @samp{libdir} in @file{configparms} or @file{Makeconfig}. + +@verbatim +BUILD_CC="gcc" \ + CC="${CROSS_TARGET}-gcc -march=${MARCH}" \ + AR="${CROSS_TARGET}-ar" \ + RANLIB="${CROSS_TARGET}-ranlib" +@end verbatim + +@samp{CC="$@{CROSS_TARGET@}-gcc -march=$@{MARCH@}"} +sets @code{CC} to the cross-compiler for the target's architecture, +processor and ABI we configured the library for. @code{AR} and +@code{RANLIB} are set to cross-compiling versions of @code{ar} and +@code{ranlib} as the native tools are not configured to work with +object files for the target we configured for. + +@option{--prefix=} tells the @file{configure} script to install +glibc in the root directory (@file{/}) of the target system. + +@c @option{--libexecdir=/lib/glibc} tells the configure script to +@c install glibc executables inside @file{/lib/glibc}. + +Unlike previous builds, @option{--host} now equals +@env{$@{CROSS_TARGET@}} instead of @env{$@{CROSS_HOST@}}. This is +because we are building the glibc version that the target system will +use. We won't have to build it later. + +Profiling can be of help to optimize a program by analysing memory +use, the usage of particular instructions, etc. Option +@option{--disable-profile} is used to disable this. + +Option @option{--enable-add-ons} is used to enable all the add-on +packages in the main source directory, which includes the glibc-ports +used to support the MIPS architecture. + +The option @option{--with-tls} tells the configure script to use +@acronym{TLS} (thread-local storage). Thread-local storage is a +computer programming method that uses memory local to a thread. + +The @samp{3.10} parameter given to option @option{--enable-kernel} +describes the smallest version of the Linux kernel the generated +library is expected to support. The higher the version number is, the +less compatibility code is added, and the faster the code gets. + +Option @option{--with-__thread} enables threads in glibc. + +The option @option{--with-binutils=$@{TARGET_DIR@}/cross-tools/bin} +tells the @file{configure} script to use the binutils (assembler and +linker) built in the cross-compilation toolchain process. + +@option{--with-headers=$@{TARGET_DIR@}/include} indicates the +location of the kernel Linux' headers. + +@option{--enable-obsolete-rpc} tells the @file{configure} script to +install remote procedure call (RPC) headers. Those may be required by +some programs. + +@option{--cache-file=config.cache} specifies the file in which cache +variables are listed for @file{configure}. + +The file @file{$@{TARGET_DIR@}/etc/nsswitch.conf} contains the +configuration of @acronym{NSS} (Name Service Switch). NSS is a facility +in Unix-like operating systems that provides a variety of sources for +common configuration databases and name resolution mechanisms. These +sources include local operating system files (such as +@file{/etc/passwd}, @file{/etc/group}, and @file{/etc/hosts}), the +Domain Name System (DNS), the Network Information Service (NIS), and +LDAP. + +@c Purpose of the file @file{$@{TARGET_DIR@}/etc/ld.so.conf} + + +@node Cross GCC CXX +@section Cross GCC (C and C++ support) + +In this section, we build a complete cross-compiler with support for C +and C++ languages. + +@verbatim +# 35 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.3.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/gcc-4.7.3 +tar xf ${DOWNLOAD_DIR}/gmp-5.1.3.tar.bz2 +mv gmp-5.1.3 gmp +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz +mv mpc-1.0.1 mpc +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.2.tar.bz2 +mv mpfr-3.1.2 mpfr +mkdir -v ../gcc-build +cd ../gcc-build +../gcc-4.7.3/configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --build=${CROSS_HOST} \ + --host=${CROSS_HOST} \ + --target=${CROSS_TARGET} \ + --with-sysroot=${TARGET_DIR} \ + --disable-nls \ + --enable-shared \ + --enable-__cxa_atexit \ + --disable-multilib \ + --enable-c99 \ + --enable-long-long \ + --enable-threads=posix \ + --enable-languages=c,c++ \ + --with-mpfr-include="${BUILD_DIR}/gcc-4.7.3/mpfr/src" \ + --with-mpfr-lib="${BUILD_DIR}/gcc-build/mpfr/src/.libs" +make +make install +cd .. +rm -rf gcc-build +rm -rf gcc-4.7.3 +cd +@end verbatim + +@option{--enable-__cxa_atexit} enables @code{__cxa_atexit}, rather +than @code{atexit}, to register C++ destructors for local statics and +global objects. This is essential for fully standards-compliant +handling of destructors, but requires @code{__cxa_atexit} in libc. + +@option{--enable-c99} enables support for the C99 standard. + +@option{--enable-long-long} enables support for @code{long long int} +types. + +@c @option{--enable-threads=posix} + + +@node Building the Cross-Compilation Tools +@chapter Building the Cross-Compilation Tools + +@menu +* Cross File:: File for cross-compilation. +* Cross Groff:: Groff for cross-compilation. +* Cross Shadow:: Shadow for cross-compilation. +* Cross M4:: M4 for cross-compilation. +* Cross Ncurses:: Ncurses for cross-compilation. +* Cross Cleaning:: Cleaning up the cross-compilation toolchain. +@end menu + + +@node Cross File +@section File + +The command @command{file} is used to determine the type of a file: +text, executable or data. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/file-5.16.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/file-5.16 +./configure \ + --prefix=${TARGET_DIR}/cross-tools +make +make install +cd .. +rm -rf file-5.16 +cd +@end verbatim + + +@node Cross Groff +@section Groff + +Groff is the GNU version of the roff document formatting system which +is used to produce man pages. + +You need G++ on your system to compile this program from source. Under +gNewSense 4.0, try @samp{sudo apt-get install g++-4.4} and then +@samp{sudo ln -sv g++-4.4 /usr/bin/g++}. + + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/groff-1.22.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/groff-1.22.2 +PAGE=A4 \ + ./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --without-x +make +make install +cd .. +rm -rf groff-1.22.2 +cd +@end verbatim + +@samp{PAGE=A4} defines the default format of pages for printed output. + +@option{--without-x} disables the dependancy on the X window system. + + +@node Cross Shadow +@section Shadow + +The package contains programs to handle users, groups and passwords in +a secure way: passwords are encrypted. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/shadow-4.1.4.3.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/shadow-4.1.4.3 +patch -Np1 -i ${DOWNLOAD_DIR}/shadow-4.1.4.3-sysroot_hacks-1.patch +#sed -i.orig \ +# 's/bindir)\/\$\$i/bindir)\/mips64el-unknown-linux-gnu-\$\$i/' \ +# src/Makefile.am +#automake-1.11 +echo "shadow_cv_passwd_dir=${TARGET_DIR}/bin" > config.cache +echo "ac_cv_func_lckpwdf=no" >> config.cache +./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --sbindir=${TARGET_DIR}/cross-tools/bin \ + --sysconfdir=${TARGET_DIR}/etc \ + --disable-shared \ + --without-audit \ + --without-libpam \ + --without-selinux \ + --program-prefix=${CROSS_TARGET}- \ + --cache-file=config.cache +sed -i.orig "/PASSWD_PROGRAM/s/passwd/${CROSS_TARGET}-&/" config.h +make +make install +cd .. +rm -rf shadow-4.1.4.3 +cd +@end verbatim + +@c @samp{shadow_cv_passwd_dir=$@{TARGET_DIR@}/bin} +@c @samp{ac_cv_func_lckpwdf=no} + +The patch @file{shadow-4.1.4.3-sysroot_hacks-1.patch} is used so that +shadow can be built with the sysroot method. Because we use this +patch, @samp{shadow_cv_passwd_dir=$@{TARGET_DIR@}/bin} and +@samp{ac_cv_func_lckpwdf=no} have to be added in @file{config.cache} +in order for the @file{configure} script not to test the +functionalities associated. + +@c @option{--sbindir=$@{TARGET_DIR@}/cross-tools/bin} + +@c @option{--sysconfdir=$@{TARGET_DIR@}/etc} + +@option{--without-audit}, @option{--without-libpam} and +@option{--without-selinux} disable support for auditing, @acronym{PAM} +(Pluggable authentication modules) and @acronym{SELinux} +(Security-Enhanced Linux). We do not need those extra features. + +@option{--program-prefix=$@{CROSS_TARGET@}-} prepends the value of +@env{CROSS_TARGET} (that is @samp{i386-unknown-linux-gnu} in this +document) to installed program names for cross-compilation. + +@c @samp{sed -i.orig "/PASSWD_PROGRAM/s/passwd/$@{CROSS_TARGET@}-&/" +@c config.h} is used to avoid the error message + + +@node Cross M4 +@section M4 + +Bison 2.5 requires M4 to be built. + +GNU M4 is a package containing an implementation of the m4 macro +language. GNU M4 is used in GNU Autoconf' @file{configure} files. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/m4-1.4.17.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/m4-1.4.17 +./configure \ + --prefix=${TARGET_DIR}/cross-tools +make +make install +cd .. +rm -rf m4-1.4.17 +cd +@end verbatim + + +@node Cross Ncurses +@section Ncurses + +GNU ncurses contains a library used to write text-based user +interfaces in a terminal-independent manner. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/ncurses-5.9.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/ncurses-5.9 +./configure \ + --prefix=${TARGET_DIR}/cross-tools \ + --without-shared +make -C include +make -C progs tic +install -m755 progs/tic ${TARGET_DIR}/cross-tools/bin +cd .. +rm -rf ncurses-5.9 +cd +@end verbatim + +@option{--without-shared} is used to avoid building the whole library +as only @command{tic} is installed. + + +@node Cross Cleaning +@section Cleaning up Cross-Compilation Toolchain + +In order to save some space, binaries and libraries of +cross-compilation tools can be stripped out. + +@quotation Warning +incorrect cleaning arguments used against library files can lead to +library files breaking. For this reason, be careful of the command +arguments. If you are not comfortable with this, you can skip this +section as it will have no effect on the process of building the +target system. +@end quotation + + +@verbatim +cd ${TARGET_DIR}/cross-tools +strip --strip-all bin/* +strip --strip-debug lib/* +cd +@end verbatim + +@option{--strip-all} removes all symbols. This command reduces the +size of the @file{bin} directory's content from 26 MB to 9 MB. + +@option{--strip-debug} removes debugging symbols only. This command +reduces the size of the @file{lib} directory's content from 13 MB to +13 MB. + + +@node Building the Target System +@chapter Building the Target System + +After having set up the cross-compilation toolchain and tools, the +operating system for the target machine is built in this chapter. + +@menu +* Environment Setup:: Setting up the environment. +* Man Pages:: Building Man Pages. +* Zlib:: Building Zlib. +* Binutils:: Building Binutils. +* GMP:: Building GMP. +* MPFR:: Building MPFR. +* MPC:: Building MPC. +* GCC:: Building GCC. +* Sed:: Building Sed. +* E2fsprogs:: Building E2fsprogs. +* Coreutils:: Building Coreutils. +* iana-etc:: Building iana-etc. +* M4:: Building M4. +* Bison:: Building Bison. +* Ncurses:: Building Ncurses. +* Procps:: Building Procps. +* Libtool:: Building Libtool. +* Readline:: Building Readline. +* Autoconf:: Building Autoconf. +* Automake:: Building Automake. +* Bash:: Building Bash. +* Bzip2:: Building Bzip2. +* DHCPCD:: Building DHCPCD. +* Diffutils:: Building Diffutils. +* File:: Building File. +* Findutils:: Building Findutils. +* Flex:: Building Flex. +* Gawk:: Building Gawk. +* Gdbm:: Building Gdbm. +* Gettext:: Building Gettext. +* Grep:: Building Grep. +* Groff:: Building Groff. +* Gzip:: Building Gzip. +* Inetutils:: Building Inetutils. +* Iproute2:: Building Iproute2. +* Kbd:: Building Kbd. +* Kmod:: Building Kmod. +* Less:: Building Less. +* Libpipeline:: Building Libpipeline. +* Make:: Building Make. +* Man-db:: Building Man-db. +* Nano:: Building Nano. +* Patch:: Building Patch. +* Psmisc:: Building Psmisc. +* Shadow:: Building Shadow. +* Sysvinit:: Building Sysvinit. +* Tar:: Building Tar. +* Texinfo:: Building Texinfo. +* Udev:: Building Udev. +* Util-Linux:: Building Util-Linux. +* XZ-Utils:: Building XZ-Utils. +* Bootscripts:: Building Bootscripts. +* Kernel:: Building the Kernel. +@end menu + + +@node Environment Setup +@section Setting up the Environment + +Because this chapter is about the build of the target system and not +the build of the cross-compilation toolchain and tools anymore, we +need to update some environment variables. + +For more convenience, we can set environment variables up in the +@file{~/.bashrc} file, so that this setup is preserved when logging +in: + + +@verbatim +cat >> ~/.bashrc << EOF +export CC="${CROSS_TARGET}-gcc -march=${MARCH}" +export CXX="${CROSS_TARGET}-g++ -march=${MARCH}" +export AR="${CROSS_TARGET}-ar" +export AS="${CROSS_TARGET}-as" +export RANLIB="${CROSS_TARGET}-ranlib" +export LD="${CROSS_TARGET}-ld" +export STRIP="${CROSS_TARGET}-strip" +EOF +source ~/.bash_profile +@end verbatim + +@env{CC} is the flag that indicates the C compiler to be used, +@env{CXX} the C++ compiler, @env{AR} the archiver, @env{AS} the +assembler, @env{RANLIB} the archives' index generator, @env{LD} the +linker and @env{STRIP} the program for stripping. + +All the programs to be used are prefixed with +@samp{$@{CROSS_TARGET@}-} in order to use the cross-compilation +toolchain instead of the toolchain of the host. + + +@node Man Pages +@section Man Pages + +The man-pages package documents the kernel Linux and C library's +interfaces that are used by user-space programs. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/man-pages-3.54.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/man-pages-3.54 +make prefix=${TARGET_DIR} install +cd .. +rm -rf man-pages-3.54 +cd +@end verbatim + +The option @option{prefix=$@{TARGET_DIR@}} is used to install the man +pages on the target directory instead of the @file{/usr} directory of +the host. + + +@node Zlib +@section Zlib + +Zlib is a compression/decompression library. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/zlib-1.2.8.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/zlib-1.2.8 +./configure \ + --prefix= +make AR="${AR}" +make prefix=${TARGET_DIR} install +cd .. +rm -rf zlib-1.2.8 +cd +@end verbatim + +In order to build zlib by cross-compilation, the flag @env{AR} has to +be equal to @samp{$@{AR@}}. + + +@node Binutils +@section Binutils + +GNU Binutils (GNU binary utilities) is a collection of programs for +manipulating binaries. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/binutils-2.24.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/binutils-2.24 +mkdir -pv ../binutils-build +cd ../binutils-build +../binutils-2.24/configure \ + --prefix= \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --target=${CROSS_TARGET} \ + --enable-64-bit-bfd \ + --enable-shared +make configure-host +make tooldir= +make DESTDIR=${TARGET_DIR} tooldir= install +cp -v ../binutils-2.24/include/libiberty.h ${TARGET_DIR}/include +cd .. +rm -rf binutils-build +rm -rf binutils-2.24 +cd +@end verbatim + +The option @option{--host} is now set to @env{CROSS_TARGET} because +the host that will run this build will be the target system. + +@c @samp{make tooldir=} +@c @samp{make DESTDIR=$@{TARGET_DIR@} tooldir= install} + + +@node GMP +@section GMP + +@acronym{GMP} (GNU multiple precision arithmetic library) is required +to build GCC. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/gmp-5.1.3.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/gmp-5.1.3 +./configure \ + --host=${CROSS_TARGET} \ + --prefix= \ + --enable-cxx +make +make DESTDIR=${TARGET_DIR} install +rm -v ${TARGET_DIR}/lib/lib{gmp,gmpxx}.la +cd .. +rm -rf gmp-5.1.3 +cd +@end verbatim + +The option @option{--enable-cxx} enables support for the C++ language. + +The files @file{$@{TARGET_DIR@}/lib/lib@{gmp,gmpxx@}.la} are removed +to avoid the following error when building MPFR: +@samp{/lib/libgmp.so: could not read symbols: File in wrong format}. + + +@node MPFR +@section MPFR + +GNU @acronym{MPFR} (Multiple Precision Floating-Point Reliably) is a +portable C library for arbitrary-precision binary floating-point +computation with correct rounding. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/mpfr-3.1.2.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/mpfr-3.1.2 +./configure \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +rm -v ${TARGET_DIR}/lib/libmpfr.la +cd .. +rm -rf mpfr-3.1.2 +cd +@end verbatim + +The file @file{$@{TARGET_DIR@}/lib/libmpfr.la} is removed to avoid the +following error when building MPC: +@samp{/lib/libmpfr.so: could not read symbols: File in wrong format}. + + +@node MPC +@section MPC + +GNU @acronym{MPC} (Multiple Precision Complex Library) is a C library +for the arithmetic of complex numbers with arbitrarily high precision +and correct rounding of the result. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/mpc-1.0.1.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/mpc-1.0.1 +./configure \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf mpc-1.0.1 +cd +@end verbatim + + +@node GCC +@section GCC + +GCC is the GNU Compiler Collection. + +@verbatim +# 25 minutes +tar xf ${DOWNLOAD_DIR}/gcc-4.7.3.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/gcc-4.7.3 +sed -i.orig 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in +sed -i.orig 's@\./fixinc\.sh@-c true@' gcc/Makefile.in +mkdir -v ../gcc-build +cd ../gcc-build +../gcc-4.7.3/configure \ + --prefix= \ + --libexecdir=/lib \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --target=${CROSS_TARGET} \ + --enable-shared \ + --enable-threads=posix \ + --enable-__cxa_atexit \ + --enable-c99 \ + --enable-long-long \ + --disable-multilib \ + --enable-clocale=gnu \ + --enable-languages=c,c++ \ + --disable-libstdcxx-pch +make +make DESTDIR=${TARGET_DIR} install +ln -sv gcc ${TARGET_DIR}/bin/cc +cd .. +rm -rf gcc-build +rm -rf gcc-4.7.3 +cd +@end verbatim + +@samp{sed -i.orig 's/install_to_$(INSTALL_DEST) //' +libiberty/Makefile.in} is used as we already installed the library +@file{libiberty.a} with Binutils. + +@c We use @samp{sed -i.orig 's@@\./fixinc\.sh@@-c true@@' +@c gcc/Makefile.in} to avoid using fixincludes that may output errors if +@c headers have been modified. + +Using @option{--enable-clocale=gnu} option ensures that the correct +locale will automatically be chosen. + +Option @option{--disable-libstdcxx-pch} disables support for +precompiled headers (PCH). + +The line @samp{ln -sv gcc $@{TARGET_DIR@}/bin/cc} creates a +symbolic link @file{cc} that points on @file{gcc}. + + +@node Sed +@section Sed + +GNU sed is a stream editor: it is used to perform basic text +transformations on an input stream (a file or input from a pipeline). + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/sed-4.2.2.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/sed-4.2.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --bindir=/bin +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf sed-4.2.2 +cd +@end verbatim + +@c @option{--bindir=/bin} FHS? + + +@node E2fsprogs +@section E2fsprogs + +E2fsprogs is a package that contains tools to handle the ext2, ext3 +and ext4 filesystems. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/e2fsprogs-1.42.8.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/e2fsprogs-1.42.8 +mkdir -v build +cd build +../configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --with-root-prefix="" \ + --enable-elf-shlibs +make +make DESTDIR=${TARGET_DIR} install +make DESTDIR=${TARGET_DIR} install-libs +rm -v ${TARGET_DIR}/lib/lib{blkid,com_err,e2p,ext2fs,ss,uuid}.so +cd ../.. +rm -rf e2fsprogs-1.42.8 +cd +@end verbatim + +@option{--with-root-prefix=""} is used to put e2fsprogs binaries +inside @file{/sbin} instead of @file{@var{PREFIX}/sbin} which would be +@file{/sbin}. + +Option @option{--enable-elf-shlibs} enables e2fsprogs shared +libraries. + +@samp{make DESTDIR=$@{TARGET_DIR@} install-libs} is used to install +libraries, those are not installed with @samp{make +DESTDIR=$@{TARGET_DIR@} install}. + +The sequence of commands that follows first removes symbolic links +@file{$@{TARGET_DIR@}/lib/lib@{@/blkid,com_err,e2p,ext2fs,ss,uuid@}.so} +which point on abolute paths +@file{/lib/lib@{blkid,com_err,e2p,ext2fs,ss,uuid@}.so}. In order to +use the libraries of the target operating system, we need to symlink +@file{$@{TARGET_DIR@}/lib/lib@{blkid,com_err,e2p,ext2fs,ss,uuid@}.so} +to their relative paths files. + + +@node Coreutils +@section Coreutils + +GNU coreutils (core utilities) includes the standard programs for text +and file manipulation. + +On gNewSense Parkes, you need to install @file{xz-utils} to extract +the package. + +@verbatim +# 3 minutes +tar xf ${DOWNLOAD_DIR}/coreutils-8.19.tar.xz -C ${BUILD_DIR} +cd ${BUILD_DIR}/coreutils-8.19 +cat > config.cache << EOF +fu_cv_sys_stat_statfs2_bsize=yes +gl_cv_func_mbrtowc_incomplete_state=yes +gl_cv_func_mbrtowc_nul_retval=yes +gl_cv_func_mbrtowc_null_arg=yes +gl_cv_func_mbrtowc_retval=yes +gl_cv_func_btowc_eof=yes +gl_cv_func_wcrtomb_retval=yes +gl_cv_func_wctob_works=yes +gl_cv_func_fstatat_zero_flag=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --enable-install-program=hostname \ + --enable-no-install-program=kill,uptime \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf coreutils-8.19 +cd +@end verbatim + +@c @samp{sed -i.orig '/strftime/s/\ LC_ALL//' man/help2man} + +The variables listed in the file @file{config.cache} are used in order +to avoid that the @file{configure} script evaluate their values: +otherwise the build may fail when cross-compiling. + +We use @option{--enable-install-program=hostname} to install the +command @command{hostname} which is not built by default. + +We use @option{--enable-no-install-program=kill,uptime} in order not +to install commands @command{kill} and @command{uptime}. Those +commands will be installed by the package procps. + + +@node iana-etc +@section iana-etc + +The iana-etc package installs services and protocols using data from +the Internet Assigned Numbers Authority (IANA). + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/iana-etc-2.30.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/iana-etc-2.30 +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf iana-etc-2.30 +cd +@end verbatim + + +@node M4 +@section M4 + +GNU M4 is a package containing an implementation of the m4 macro +language. GNU M4 is used in GNU Autoconf' @file{configure} files. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/m4-1.4.17.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/m4-1.4.17 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf m4-1.4.17 +cd +@end verbatim + + +@node Bison +@section Bison + +GNU bison parser generator. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/bison-2.7.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/bison-2.7 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +echo '#define YYENABLE_NLS 1' >> config.h +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf bison-2.7 +cd +@end verbatim + +@samp{echo '#define YYENABLE_NLS 1' >> config.h} is used to build +@acronym{NLS} (native language support) inside bison. + + +@node Ncurses +@section Ncurses + +@verbatim +# 4 minutes +tar xf ${DOWNLOAD_DIR}/ncurses-5.9.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/ncurses-5.9 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --with-shared \ + --enable-widec \ + --without-debug \ + --without-ada \ + --with-build-cc="gcc -D_GNU_SOURCE" \ + --libdir=/lib +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf ncurses-5.9 +cd +@end verbatim + +Option @option{--enable-widec} enables wide characters support in +ncurses. + +@c Option @option{--without-debug} + +Option @option{--without-ada} disables support for the Ada programming +language inside ncurses. + +@c Option @option{--with-build-cc="gcc -D_GNU_SOURCE"} + +@c Option @option{--libdir=/lib} + +@ignore +@c PROCPS issue: +The command @samp{ln -sfv libncursesw.so $@{TARGET_DIR@}/lib/libncurses.so} +creates the symlink @file{libcurses.so} so that programs that do not +know @file{libncursesw.so} can be linked against it. +@end ignore + +@c ln -sfv ../../share/terminfo ${TARGET_DIR}/lib/terminfo + + +@node Procps +@section Procps + +The procps package contains utilities that give information about +processes using the @file{/proc} filesystem. The package includes the +commands @command{ps}, @command{top}, @command{vmstat}, @command{w}, +@command{kill}, @command{free}, @command{slabtop}, and +@command{skill}. + +@verbatim +# 1 minute +ln -sv ncursesw/curses.h ${TARGET_DIR}/include/curses.h +ln -sv ncursesw/ncurses.h ${TARGET_DIR}/include/ncurses.h +ln -sv ncursesw/term.h ${TARGET_DIR}/include/term.h +ln -sfv libncursesw.so ${TARGET_DIR}/lib/libncurses.so +tar xf ${DOWNLOAD_DIR}/procps-3.2.8.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/procps-3.2.8 + +# From http://lists.gnu.org/archive/html/bug-make/2010-07/msg00153.html +sed '177s,\*/module.mk,proc/module.mk ps/proc.mk,' -i.orig Makefile + +make \ + CPPFLAGS= \ + lib64=lib +make \ + DESTDIR=${TARGET_DIR} \ + lib64=lib \ + ldconfig= \ + install="install -D" \ + install +cd .. +rm -rf procps-3.2.8 +cd +@end verbatim + +@ignore +Option @option{CPPFLAGS= } is used so that the target system's ncurses +library will be used, default value would have been +@option{-I/include/ncurses}. +@end ignore + +Option @option{lib64=lib} makes the directory @file{/lib} the one +where to put 64 bit libraries, default would be @file{/lib64}. + +Option @option{ldconfig= } is used in order not to use current host's +@command{ldconfig}. + +Option @option{install="install -D"} is used so that all the files +installed are owned by the current user. By default, all installed +files are owned by root. + + +@node Libtool +@section Libtool + +GNU libtool is a generic library support script. It hides the +complexity of using shared libraries behind a consistent, portable +interface. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/libtool-2.4.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/libtool-2.4.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf libtool-2.4.2 +cd +@end verbatim + + +@node Readline +@section Readline + +The GNU Readline library provides a set of functions for use by +applications that allow users to edit command lines as they are typed +in. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/readline-6.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/readline-6.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --libdir=/lib +make +make DESTDIR=${TARGET_DIR} install +make DESTDIR=${TARGET_DIR} install-doc +cd .. +rm -rf readline-6.2 +cd +@end verbatim + +@c sed -i 's:^SHLIB_LIBS=:SHLIB_LIBS=-lncursesw:' support/shobj-conf + + +@node Autoconf +@section Autoconf + +GNU autoconf is an extensible package of M4 macros that produce shell +scripts to automatically configure software source code +packages. These scripts can adapt the packages to many kinds of +UNIX-like systems without manual user intervention. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/autoconf-2.69.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/autoconf-2.69 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf autoconf-2.69 +cd +@end verbatim + + +@node Automake +@section Automake + +GNU automake is a tool for automatically generating @file{Makefile.in} +files compliant with the GNU Coding +Standards@footnote{@uref{http://www.gnu.org/prep/standards/}}. + +You need Autoconf on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install autoconf} +(version 2.69 here). + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/automake-1.14.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/automake-1.14 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf automake-1.14 +cd +@end verbatim + + +@node Bash +@section Bash + +GNU @acronym{Bash} (Bourne again shell) is an sh-compatible shell that +incorporates useful features from the Korn shell (ksh) and C shell +(csh). + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/bash-4.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/bash-4.2 +cat > config.cache << EOF +ac_cv_func_mmap_fixed_mapped=yes +ac_cv_func_strcoll_works=yes +ac_cv_func_working_mktime=yes +bash_cv_func_sigsetjmp=present +bash_cv_getcwd_malloc=yes +bash_cv_job_control_missing=present +bash_cv_printf_a_format=yes +bash_cv_sys_named_pipes=present +bash_cv_ulimit_maxfds=yes +bash_cv_under_sys_siglist=yes +bash_cv_unusable_rtsigs=no +gt_cv_int_divbyzero_sigfpe=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --bindir=/bin \ + --cache-file=config.cache \ + --without-bash-malloc \ + --with-installed-readline +make +make \ + DESTDIR=${TARGET_DIR} \ + htmldir=/share/doc/bash-4.2 \ + install +ln -sv bash ${TARGET_DIR}/bin/sh +cd .. +rm -rf bash-4.2 +cd +@end verbatim + +The variables listed in the file @file{config.cache} are used in order +to avoid that the @file{configure} script evaluate their values: +otherwise the build may fail when cross-compiling. + +Option @option{--without-bash-malloc} tells the @file{configure} +script not to use the @code{malloc} function shipped with +Bash. Glibc's version will be used instead. + +Option @option{--with-installed-readline} tells the configure script +to use the installed readline library instead of the one shipped with +Bash. + +@samp{ln -sv bash $@{TARGET_DIR@}/bin/sh} creates a symlink @file{sh} +to @file{bash}. + + +@node Bzip2 +@section Bzip2 + +Bzip2 is a package that contains utilities to compress and decompress +files with a better original size/compressed size ratio than gzip. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/bzip2-1.0.6.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/bzip2-1.0.6 +sed -i -e "/^all:/s/ test//" Makefile +sed -i -e 's:ln -s -f $(PREFIX)/bin/:ln -s :' Makefile +make \ + -f Makefile-libbz2_so \ + CC="${CC}" \ + AR="${AR}" \ + RANLIB="${RANLIB}" +make clean +make \ + CC="${CC}" \ + AR="${AR}" \ + RANLIB="${RANLIB}" +make \ + PREFIX=${TARGET_DIR} \ + install +cp -av libbz2.so* ${TARGET_DIR}/lib +ln -sv ../../lib/libbz2.so.1.0 ${TARGET_DIR}/lib/libbz2.so +rm -v ${TARGET_DIR}/bin/{bunzip2,bzcat,bzip2} +cp -v bzip2-shared ${TARGET_DIR}/bin/bzip2 +ln -sv bzip2 ${TARGET_DIR}/bin/bunzip2 +ln -sv bzip2 ${TARGET_DIR}/bin/bzcat +cd .. +rm -rf bzip2-1.0.6 +cd +@end verbatim + +@samp{sed -i.orig -e "/^all:/s/ test//" Makefile} is used to skip +tests when building. + +@samp{sed -i -e 's:ln -s -f $(PREFIX)/bin/:ln -s :' Makefile} is used +in order to have relative path symlinks instead of absolute ones. + +Option @option{-f Makefile-libbz2_so} is used to build shared +libraries. + +Flags @env{CC}, @env{AR} and @env{RANLIB} are used so that bzip2 is +built using cross-compilation tools instead of the host's ones. + +@samp{make clean} is used to clean up temporary files. + +The second build commands are used to build static libraries. + +@ignore +cp -v bzip2-shared ${TARGET_DIR}/bin/bzip2 +cp -av libbz2.so* ${TARGET_DIR}/lib +ln -sv ../../lib/libbz2.so.1.0 ${TARGET_DIR}/lib/libbz2.so +rm -v ${TARGET_DIR}/bin/{bunzip2,bzcat,bzip2} +ln -sv bzip2 ${TARGET_DIR}/bin/bunzip2 +ln -sv bzip2 ${TARGET_DIR}/bin/bzcat +@end ignore + + +@node DHCPCD +@section DHCPCD + +DHCPCD is a wrapper for the @acronym{DHCP} (Dynamic Host Configuration +Protocol) client daemon. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/dhcpcd-6.1.0.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/dhcpcd-6.1.0 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --bindir=/sbin \ + --sysconfdir=/etc \ + --dbdir=/var/lib/dhcpcd \ + --libexecdir=/lib/dhcpcd +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf dhcpcd-6.1.0 +cd +@end verbatim + +@c Option @option{--bindir=/sbin} is used to comply with FHS? +@c @option{--sysconfdir=/etc} @file{/etc} instead of ? +@c @option{--dbdir=/var/lib/dhcpcd} @file{/var/lib/dhcpcd} instead of? +@c @option{--libexecdir=/lib/dhcpcd} @file{/lib/dhcpcd} instead of ? + + +@node Diffutils +@section Diffutils + +GNU Diffutils is a package of several programs related to finding +differences between files. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/diffutils-3.3.tar.xz -C ${BUILD_DIR} +cd ${BUILD_DIR}/diffutils-3.3 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf diffutils-3.3 +cd +@end verbatim + + +@node File +@section File + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/file-5.16.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/file-5.16 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf file-5.16 +cd +@end verbatim + + +@node Findutils +@section Findutils + +The GNU Find Utilities are typically used to provide directory search +and file locating capabilities. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/findutils-4.4.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/findutils-4.4.2 +cat > config.cache << EOF +gl_cv_func_wcwidth_works=yes +gl_cv_header_working_fcntl_h=yes +ac_cv_func_fnmatch_gnu=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --libexecdir=/lib/locate \ + --localstatedir=/var/lib/locate \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf findutils-4.4.2 +cd +@end verbatim + +@c --libexecdir=/lib/locate +@c --localstatedir=/var/lib/locate + + +@node Flex +@section Flex + +Flex is a tool for generating scanners. A scanner, sometimes called a +tokenizer, is a program which recognizes lexical patterns in text. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/flex-2.5.37.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/flex-2.5.37 +# From http://sourceforge.net/p/flex/bugs/151/ +sed '1s/$/\n#undef malloc\n#undef realloc/' \ + -i.orig lib/realloc.c +cat > config.cache << EOF +ac_cv_path_M4="/bin/m4" +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +ln -sv libfl.a ${TARGET_DIR}/lib/libl.a +cd .. +rm -r flex-2.5.37 +cd + +cat > ${TARGET_DIR}/bin/lex << EOF +#!/bin/sh +exec /bin/flex -l \$@ +EOF +chmod -v 755 ${TARGET_DIR}/bin/lex +@end verbatim + +@file{config.cache} forces flex to use @file{/bin/m4} instead of +@file{/gllfsc/cross-tools/bin/m4} on the target machine. + +For compatibility issues, we create the symlink @file{libl.a}. + +We then create target system's @file{/bin/lex} that will execute +@command{flex} with option @option{-l} in order to behave with maximal +compatibility like @command{lex}. + +@ignore +@samp{sed -i.orig "s/-I@@includedir@@//g" Makefile.in} is used in +order not to use host's headers in @file{/include} during +cross-compilation. +@end ignore + +@c Variables @samp{ac_cv_func_malloc_0_nonnull=yes} and +@c @samp{ac_cv_func_realloc_0_nonnull=yes} are used to get rid of +@c error message: @samp{}. + +@c We use option @option{-fPIC} passed to the cross-compiler in order to +@c generate position-independent code (PIC). + + +@node Gawk +@section Gawk + +GNU awk (Gawk) is a program used to select particular records in a +file and perform operations upon them. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/gawk-4.1.0.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/gawk-4.1.0 +sed -i.orig \ + '/check-recursive all-recursive/s/ check-for-shared-lib-support//' \ + extension/Makefile.in +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --libexecdir=/lib +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -r gawk-4.1.0 +cd +@end verbatim + +The sed expression is used to avoid the error @samp{Building the +extensions is not supported on this platform}. + + +@node Gdbm +@section Gdbm + +GNU dbm is a library of database functions. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/gdbm-1.11.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/gdbm-1.11 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -r gdbm-1.11 +cd +@end verbatim + + +@node Gettext +@section Gettext + +GNU gettext utilities are a set of tools that provides a framework to +help packages produce multi-lingual messages. + +@verbatim +# 7 minutes +tar xf ${DOWNLOAD_DIR}/gettext-0.18.3.1.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/gettext-0.18.3.1 +cat > config.cache << EOF +am_cv_func_iconv_works=yes +gl_cv_func_wcwidth_works=yes +gt_cv_func_printf_posix=yes +gt_cv_int_divbyzero_sigfpe=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --cache-file=config.cache +make +#cp gettext-tools/gnulib-lib/.libs/libgettextlib.la{,i} +#cp gettext-tools/src/.libs/libgettextsrc.la{,i} +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf gettext-0.18.3.1 +cd +@end verbatim + +@c cp gettext-tools/gnulib-lib/.libs/libgettextlib.la{,i} ? +@c cp gettext-tools/src/.libs/libgettextsrc.la{,i} ? + + +@node Grep +@section Grep + +GNU @command{grep} command searches one or more input files for lines +containing a match to a specified pattern. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/grep-2.15.tar.xz -C ${BUILD_DIR} +cd ${BUILD_DIR}/grep-2.15 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --bindir=/bin \ + --disable-perl-regexp +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf grep-2.15 +cd +@end verbatim + +Option @option{--disable-perl-regexp} disables support of Perl-style +regular expressions (regexp). + + +@node Groff +@section Groff + +Groff is the GNU version of the roff document formatting system which +is used to produce man pages. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/groff-1.22.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/groff-1.22.2 +PAGE=A4 \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make \ + TROFFBIN=troff \ + GROFFBIN=groff \ + GROFF_BIN_PATH= +make prefix=${TARGET_DIR} install +ln -sv soelim ${TARGET_DIR}/bin/zsoelim +ln -sv eqn ${TARGET_DIR}/bin/geqn +ln -sv tbl ${TARGET_DIR}/bin/gtbl +cd .. +rm -rf groff-1.22.2 +cd +@end verbatim + +The variables @env{TROFFBIN=troff} and @env{GROFFBIN=groff} tell +@command{make} to use @command{troff} and @command{groff} commands +installed in the @ref{Building the Cross-Compilation Tools} to build +documentation. + +The variable @env{GROFF_BIN_PATH} before @env{PATH} is checked for +programs @command{groff} is calling (preprocessors, @command{troff}, +and output devices). If not set, it defaults to the directory where +the @file{groff} binary is located. + +The symlinks are used for compatibility. + + +@node Gzip +@section Gzip + +GNU Gzip is a data compression program. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/gzip-1.6.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/gzip-1.6 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf gzip-1.6 +cd +@end verbatim + + +@node Inetutils +@section Inetutils + +Inetutils is a collection of common network programs. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/inetutils-1.9.1.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/inetutils-1.9.1 +sed -i '/gets is a security hole/d' lib/stdio.in.h +sed -i -e '/PATH_PROCNET_DEV/s/\ no//' paths +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf inetutils-1.9.1 +cd +@end verbatim + +@samp{sed -i.orig '/gets is a security hole/d' lib/stdio.in.h} is used +to fix the following error when issuing @samp{make}: +@samp{./stdio.h:1030:1: error: 'gets' undeclared here (not in a +function)}. + +@c It deletes the following line in lib/stdio.in.h: +@c _GL_WARN_ON_USE (gets, ``gets is a security hole - use fgets instead''); + +@samp{sed -i.orig -e '/PATH_PROCNET_DEV/s/\ no//' paths} is used to +fix the following error when issuing @samp{make}: +@samp{'PATH_PROCNET_DEV' undeclared (first use in this function)}. + + +@node Iproute2 +@section Iproute2 + +Iproute2 is a collection of utilities for controlling TCP and UDP IP +networking and traffic. + +You need Bison and Flex on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install bison flex}. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/iproute2-3.10.0.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/iproute2-3.10.0 +sed -i.orig '/^TARGETS/s@arpd@@g' misc/Makefile +make \ + DESTDIR=${TARGET_DIR} \ + CC="${CC}" \ + DOCDIR=/share/doc/iproute2 \ + MANDIR=/share/man +make \ + DESTDIR=${TARGET_DIR} \ + DOCDIR=/share/doc/iproute2 \ + MANDIR=/share/man \ + install +cd .. +rm -rf iproute2-3.10.0 +cd +@end verbatim + +@samp{sed -i.orig '/^TARGETS/s@@arpd@@@@g' misc/Makefile} is used to +disable the build of @command{arpd} as it requires Berkeley DB to be +installed. + +@env{DOCDIR} and @env{MANDIR} indicate the location in which the +documentation and the manual pages will be installed, +respectively. Those are no absolute paths but use the value of +@env{DESTDIR} as a prefix. + + +@node Kbd +@section Kbd + +Kbd contains keytable files and keyboard utilities. + +You need Check on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install check}. + +@verbatim +# 3 minutes +tar xf ${DOWNLOAD_DIR}/kbd-2.0.1.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/kbd-2.0.1 + +# Do not check for CHECK: +sed '14s/^/#/' -i.orig configure.ac +autoconf configure.ac > configure + +sed -i.orig '/^SUBDIRS/s/ tests//' Makefile.am +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --disable-vlock +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf kbd-2.0.1 +cd +@end verbatim + +@samp{sed -i.orig '/SUBDIRS/s/ tests//' Makefile.in} is used to +prevent files in the @file{tests} directory to be built. + +Option @option{--disable-vlock} disables the build of vlock. vlock +needs PAM library headers to be present on the build system and is not +necessary for us, so we do not build it. + + +@node Kmod +@section Kmod + +Kmod (previously known as module-init-tools) provide userspace-side +assistance in loading kernel modules and their dependencies. + +You need Xsltproc on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install xsltproc}. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/kmod-15.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/kmod-15 +zlib_CFLAGS="-I${TARGET_DIR}/include" \ + zlib_LIBS="-L${TARGET_DIR}/lib -lz" \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --with-zlib +make +make \ + DESTDIR=${TARGET_DIR} \ + INSTALL=install \ + install +cd .. +rm -rf kmod-15 +cd + +# For bootscripts: +ln -sv kmod ${TARGET_DIR}/bin/lsmod +ln -sv kmod ${TARGET_DIR}/bin/depmod +ln -sv kmod ${TARGET_DIR}/bin/insmod +ln -sv kmod ${TARGET_DIR}/bin/modprobe +ln -sv kmod ${TARGET_DIR}/bin/modinfo +ln -sv kmod ${TARGET_DIR}/bin/rmmod +@end verbatim + +@samp{zlib_CFLAGS} and @samp{zlib_LIBS} are defined to avoid the error +message: @samp{The pkg-config script could not be found or is too +old. Make sure it is in your PATH or set the PKG_CONFIG environment +variable to the full path to pkg-config. Alternatively, you may set +the environment variables zlib_CFLAGS and zlib_LIBS to avoid the need +to call pkg-config.} + +@option{--with-zlib} enables support for modules compressed with +zlib. + +By default, installation uses @env{INSTALL=install-with-care} which +checks if old utilities have not been destroyed. To avoid this check, +we use @env{INSTALL=install}. + + +@node Less +@section Less + +Less is a file pager: it is used to view the content of a text file. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/less-458.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/less-458 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make prefix=${TARGET_DIR} install +cd .. +rm -rf less-458 +cd +@end verbatim + + +@node Libpipeline +@section Libpipeline + +Libpipeline is a C library for manipulating pipelines of subprocesses +in a flexible and convenient way. + +@verbatim +tar xf ${DOWNLOAD_DIR}/libpipeline-1.3.0.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/libpipeline-1.3.0 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make prefix=${TARGET_DIR} install +cd .. +rm -rf libpipeline-1.3.0 +cd +@end verbatim + + +@node Make +@section Make + +GNU @command{make} utility determines automatically which pieces of a +large program need to be recompiled, and issues the commands to +recompile them. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/make-4.0.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/make-4.0 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf make-4.0 +cd +@end verbatim + + +@node Man-db +@section Man-db + +Man-db is an implementation of the standard Unix documentation system +accessed using the man command. It uses a Berkeley DB database in +place of the traditional flat-text whatis databases. + +@verbatim +# fix /lib/libpipeline.so: error adding symbols: File in wrong format +rm ${TARGET_DIR}/lib/libgdbm.la +rm ${TARGET_DIR}/lib/libpipeline.la + +tar xf ${DOWNLOAD_DIR}/man-db-2.6.7.1.tar.xz -C ${BUILD_DIR} +cd ${BUILD_DIR}/man-db-2.6.7.1 +libpipeline_CFLAGS="-I${TARGET_DIR}/include" \ + libpipeline_LIBS="-L${TARGET_DIR}/lib -lpipeline" \ + ./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf man-db-2.6.7.1 +cd + +sed -i 's/#\(DEFINE.*pager.*\)less -s/\1 less -isRc/' \ + ${TARGET_DIR}/etc/man_db.conf +@end verbatim + +@samp{libpipeline_CFLAGS} and @samp{libpipeline_LIBS} are defined to +avoid the error message: @samp{The pkg-config script could not be +found or is too old. Make sure it is in your PATH or set the +PKG_CONFIG environment variable to the full path to +pkg-config. Alternatively, you may set the environment variables +libpipeline_CFLAGS and libpipeline_LIBS to avoid the need to call +pkg-config.} + +The @command{sed} command is used to replace default pager with +@command{less}. Option @option{-c} will cause @command{less} to +display man pages faster as this option disables scrolling. Option +@option{-R} will cause @command{less} to render colors in the man +pages. + + +@node Nano +@section Nano + +GNU nano is a lightweight text editor. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/nano-2.3.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/nano-2.3.2 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +sed -i.orig -e \ + '/CPPFLAGS/s@/usr/include/ncursesw@${TARGET_DIR}/include@' \ + `find . -iname 'Makefile'` +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf nano-2.3.2 +cd +@end verbatim + +The sed expression is used to replace @file{/usr/include/ncursesw} +with @file{$@{TARGET_DIR@}/include} in every file named +@file{Makefile} in order to overcome the error +@samp{/usr/include/ncursesw/ncurses.h:60:34: fatal error: +ncursesw/ncurses_dll.h: No such file or directory}. + +@quotation Note +commands in nano are displayed as in `^X'. The `^' character means +@key{CTRL} key, so `^X' means @kbd{CTRL-X}. +@end quotation + + +@node Patch +@section Patch + +GNU patch takes a patch file containing a difference listing produced +by the @command{diff} program and applies those differences to one or +more original files, producing patched versions. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/patch-2.7.1.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/patch-2.7.1 +cat > config.cache << EOF +ac_cv_path_ed_PROGRAM=ed +ac_cv_func_strnlen_working=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --cache-file=config.cache +make +make prefix=${TARGET_DIR} install +cd .. +rm -rf patch-2.7.1 +cd +@end verbatim + + +@node Psmisc +@section Psmisc + +This package contains utilities that use the proc filesystem. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/psmisc-22.20.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/psmisc-22.20 +cat > config.cache << EOF +ac_cv_func_malloc_0_nonnull=yes +ac_cv_func_realloc_0_nonnull=yes +EOF +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --cache-file=config.cache +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf psmisc-22.20 +cd +@end verbatim + + +@node Shadow +@section Shadow + +@verbatim +# 4 minutes +tar xf ${DOWNLOAD_DIR}/shadow-4.1.4.3.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/shadow-4.1.4.3 +#automake +echo "ac_cv_func_setpgrp_void=yes" > config.cache +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --libdir=/lib \ + --sysconfdir=/etc \ + --enable-shared \ + --without-audit \ + --without-libpam \ + --without-selinux \ + --cache-file=config.cache \ + --enable-man +sed -i.orig '/man_MANS/s/$(man_nopam) //' man/ru/Makefile +sed -i.orig 's/groups$(EXEEXT) //' src/Makefile +for mkf in $(find man -name Makefile) + do + sed -i.orig -e '/groups.1.xml/d' -e 's/groups.1 //' ${mkf} + done +make +make DESTDIR=${TARGET_DIR} install +sed -i.orig -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \ + -e 's@/var/spool/mail@/var/mail@' \ + ${TARGET_DIR}/etc/login.defs +${CROSS_TARGET}-pwconv +${CROSS_TARGET}-grpconv +cd .. +rm -rf shadow-4.1.4.3 +cd +@end verbatim + +@c echo "ac_cv_func_setpgrp_void=yes" > config.cache + +The option @option{--enable-man} is used to generate man pages. + +The first call of @command{sed} removes @var{$(man_nopam)} on the line +with man_MANS in @file{man/ru/Makefile.am} in order for @samp{make +install} to complete. + +The second call of @command{sed} disables the build of command +@command{groups}, as coreutils already installed it. + +The last call of @command{sed} enables support for MD5 encrypted +passwords and changes the mail default directory from +@file{/var/spool/mail} to @file{/var/mail}. + +The @command{pwconv} command creates @file{shadow} file from file +@file{passwd} and an optionally existing @file{shadow} file. + +The @command{grpconv} command creates @file{gshadow} file from file +@file{group} and an optionally existing @file{gshadow} file. + + +@node Sysvinit +@section Sysvinit + +Sysvinit is the system-V style init process. Init is the first process +started during booting. It is started by the kernel. Init continues +running as a daemon until the system is shut down. It is the direct or +indirect ancestor of all other processes and automatically adopts all +orphaned processes. + + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/sysvinit-2.88dsf.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/sysvinit-2.88dsf +sed -i.orig -e 's@/dev/initctl@$(ROOT)&@g' \ + -e 's@\(mknod \)-m \([0-9]* \)\(.* \)p@\1\3p; chmod \2\3@g' \ + -e '/^ifeq/s/$(ROOT)//' \ + -e 's@/usr/lib@$(ROOT)/lib@' \ + src/Makefile +make -C src clobber +make -C src ROOT=${TARGET_DIR} CC="${CC}" +make -C src ROOT=${TARGET_DIR} INSTALL="install" install +cd .. +rm -rf sysvinit-2.88dsf +cd + +cat > ${TARGET_DIR}/etc/inittab << EOF +# Begin /etc/inittab + +id:3:initdefault: + +si::sysinit:/etc/rc.d/init.d/rc sysinit + +l0:0:wait:/etc/rc.d/init.d/rc 0 +l1:S1:wait:/etc/rc.d/init.d/rc 1 +l2:2:wait:/etc/rc.d/init.d/rc 2 +l3:3:wait:/etc/rc.d/init.d/rc 3 +l4:4:wait:/etc/rc.d/init.d/rc 4 +l5:5:wait:/etc/rc.d/init.d/rc 5 +l6:6:wait:/etc/rc.d/init.d/rc 6 + +ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now + +su:S016:once:/sbin/sulogin + +1:2345:respawn:/sbin/agetty --noclear tty1 9600 +2:2345:respawn:/sbin/agetty tty2 9600 +#3:2345:respawn:/sbin/agetty tty3 9600 +#4:2345:respawn:/sbin/agetty tty4 9600 +#5:2345:respawn:/sbin/agetty tty5 9600 +#6:2345:respawn:/sbin/agetty tty6 9600 + +#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100 + +# End /etc/inittab +EOF +@end verbatim + +The first call of @command{sed} replaces @file{/dev/initctl} with +@file{$(ROOT)/dev/initctl}, and @file{/usr/lib} with +@file{$(ROOT)/lib} among other things in order to install sysvinit +on the target system. + +@samp{make -C src clobber} is used to clean up the @file{src} +directory. + +Then, we create the @file{inittab} file that describes which processes +are started at bootup and during normal operation. + +The line @samp{#c0:12345:respawn:/sbin/agetty 115200 ttyS0 vt100} is +commented out (with @code{#}) in order to avoid the message: +@samp{INIT: Id "c0" respawning too fast: disabled for 5 minutes} on +the target system. + + +@node Tar +@section Tar + +GNU tar is an archiving utility: it stores and extracts files from a +tape or disk archive. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/tar-1.27.1.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/tar-1.27.1 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf tar-1.27.1 +cd +@end verbatim + + +@node Texinfo +@section Texinfo + +GNU Texinfo is a documentation system that can produce both online +information and a printed manual from a single source. + +You need Ncurses headers on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install +libncurses5-dev}. + +@verbatim +# 10 minutes +tar xf ${DOWNLOAD_DIR}/texinfo-4.13a.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/texinfo-4.13 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make -C tools/gnulib/lib +make -C tools +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf texinfo-4.13 +cd + +cd ${TARGET_DIR}/share/info +rm dir +for f in * + do install-info $f dir 2>/dev/null +done +cd +@end verbatim + +The first three calls of @command{make} make it possible to build +Texinfo by cross-compilation. + +For Info to work, the @file{info} directory must contain a file that +serves as a top level directory for the Info system. By convention, +this file is called @file{dir}. We update this file for the target +system. + + +@node Udev +@section Udev + +Udev is the dynamic device management of the kernel Linux. + +You need Gperf on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install gperf}. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/udev-175.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/udev-175 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= \ + --with-rootlibdir=/lib \ + --libexecdir=/lib/udev \ + --docdir=/share/doc/udev-175 \ + --disable-introspection \ + --with-pci-ids-path=no \ + --with-usb-ids-path=no \ + --disable-gudev +make +make DESTDIR=${TARGET_DIR} install +install -dv ${TARGET_DIR}/lib/firmware +ln -sv ../lib/udev/udevd ${TARGET_DIR}/sbin/udevd +cd .. +rm -rf udev-175 +cd +@end verbatim + + +@node Util-Linux +@section Util-Linux + +util-linux is a random collection of utilities for use with the kernel +Linux. + +@quotation Warning +If you have trouble building util-linux, try to uninstall the package +named libtinfo-dev. Then remove @file{$@{BUILD_DIR@}/util-linux-2.24} +and build it again. +@end quotation + +@verbatim +# 5 minutes +# fix /lib/libudev.so: error adding symbols: File in wrong format +rm ${TARGET_DIR}/lib/libudev.la + +tar xf ${DOWNLOAD_DIR}/util-linux-2.24.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/util-linux-2.24 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --enable-partx \ + --disable-wall \ + --enable-write \ + --disable-makeinstall-chown +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -r util-linux-2.24 +cd +@end verbatim + +Option @option{--enable-partx} enables the build and installation of +the @command{addpart}, @command{delpart} and @command{partx} commands. + +Option @option{--disable-wall} disables the build of the +@command{wall} command which is already provided by sysvinit. + +Option @option{--enable-write} enables the build and installation of +the @command{write} command. + +Option @option{--disable-makeinstall-chown} disables the change of +owner to root for installed programs. + + +@node XZ-Utils +@section XZ-Utils + +XZ Utils is a general-purpose data compression software with high +compression ratio. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/xz-5.0.8.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/xz-5.0.8 +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf xz-5.0.8 +cd +@end verbatim + + +@node Bootscripts +@section Bootscripts + +The bootscript archive contains scripts that manage services during +system's bootup and shutdown. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/bootscripts-cross-lfs-2.0.0.tar.xz \ + -C ${BUILD_DIR} +cd ${BUILD_DIR}/bootscripts-cross-lfs-2.0-pre2 +make DESTDIR=${TARGET_DIR} install-bootscripts +make DESTDIR=${TARGET_DIR} install-network +cd .. +rm -rf bootscripts-cross-lfs-2.0-pre2 +cd +@end verbatim + +This installs basic bootscripts required for bootup and shutdown, and +network-related bootscripts. + + +@node Kernel +@section The Kernel + +Linux is a kernel aimed towards POSIX and Single UNIX Specification +compliance. + +You need Bc and Lzma on your system to compile this program from +source. Under gNewSense 4.0, try @samp{sudo apt-get install bc lzma}. + +@ignore +@quotation Warning +You may need to install the package libncurses5-dev to build the +Kernel. +@end quotation +@end ignore + +@verbatim +# 35 minutes +tar xf ${DOWNLOAD_DIR}/linux-libre-3.10.7-gnu.tar.xz \ + -C ${BUILD_DIR} +cd ${BUILD_DIR}/linux-3.10 +make mrproper +@end verbatim + +The @command{sed} expression is used to avoid waiting 60 seconds for +the binary-blob firmware to load at boot time, as those have been +removed by the @file{deblob} script. + +Then: + +@verbatim +cp arch/x86/configs/i386_defconfig .config +#patch -Np1 -i ${DOWNLOAD_DIR}/100gnu+freedo.patch +@end verbatim + +Then, if you want to change the configuration: + +@verbatim +make ARCH=i386 CROSS_COMPILE=${CROSS_TARGET}- menuconfig +@end verbatim + +@quotation Note +In order for GLLFSC to boot properly, you have to activate the two options +below: + +@verbatim +Device Drivers + > Generic Driver Options + > [*] Maintain a devtmpfs fs to mount on /dev + > [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs. +@end verbatim + +@ignore +The second option is for runit + +You can also disable bootup logos in +_D_evice drivers > _G_raphics support > _B_ootup logo. + +# _F_ile systems : stay with ext4 even with an ext3 partition +@end ignore +@end quotation + +Then: + +@verbatim +make \ + ARCH=i386 \ + CROSS_COMPILE=${CROSS_TARGET}- +make \ + ARCH=i386 \ + CROSS_COMPILE=${CROSS_TARGET}- \ + INSTALL_MOD_PATH=${TARGET_DIR} \ + modules_install +cp arch/x86/boot/bzImage ${TARGET_DIR}/boot/vmlinuz-3.10.7-gnu +cp System.map ${TARGET_DIR}/boot/System.map +cp .config ${TARGET_DIR}/boot/config +cd .. +cd +@end verbatim + +@quotation Tip +because future compilation may need kernel sources, the compilation +directory of the kernel should be preserved. +@end quotation + + +@node Configuration Files +@chapter Creating Required Configuration Files for the New System + +@menu +* Time Setup File:: File for time setup. +* Bash Keyboard Setup:: Setting up keyboard function keys + for the Shell. +* Bash Startup Files:: Setting up Bash shell startup files. +* Localhost Setup:: Setting up localhost. +* hosts Setup:: Setting up @file{hosts} file. +* Network Address Setup:: Setting up network address. +* DNS Setup:: Setting up DNS. +* fstab File Creation:: Creating @file{fstab} file. +@end menu + + +@node Time Setup File +@section File for Time Setup + +@verbatim +#mkdir ${TARGET_DIR}/etc/sysconfig +cat > ${TARGET_DIR}/etc/sysconfig/clock << EOF +# Begin /etc/sysconfig/clock + +UTC=1 + +# End /etc/sysconfig/clock +EOF +@end verbatim + +If you have trouble with the clock behaviour, do: + +@verbatim +mv ${TARGET_DIR}/etc/rc.d/rcsysinit.d/S15setclock \ + ${TARGET_DIR}/etc/rc.d/rcsysinit.d/K15setclock +@end verbatim + + +@node Bash Keyboard Setup +@section Setting up Keyboard Function keys for the Shell + +Readline default configuration file is set: + +@verbatim +cat > ${TARGET_DIR}/etc/inputrc << EOF +set bell-style none +set convert-meta Off +set horizontal-scroll-mode Off +set input-meta On +set output-meta On +"\eOd": backward-word +"\eOc": forward-word +"\e[1~": beginning-of-line +"\e[4~": end-of-line +"\e[5~": beginning-of-history +"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert +"\eOH": beginning-of-line +"\eOF": end-of-line +"\e[H": beginning-of-line +"\e[F": end-of-line +EOF +@end verbatim + +If @option{convert-meta} is set to @samp{on}, Readline will convert +characters with the eighth bit set to an @sc{ascii} key sequence by +stripping the eighth bit and prefixing an @key{ESC} character, +converting them to a meta-prefixed key sequence. + +@option{horizontal-scroll-mode} set to @samp{off} means that the text +of the lines being edited will be wrapped onto a new screen line when +they are longer than the width of the screen, instead of being +scrolled horizontally on a single screen line. + +@c set meta-flag On + +@option{input-meta} If set to @samp{on}, Readline will enable +eight-bit input (it will not clear the eighth bit in the characters it +reads), regardless of what the terminal claims it can support. + +If @option{output-meta} is set to @samp{on}, Readline will display +characters with the eighth bit set directly rather than as a +meta-prefixed escape sequence. + +@ignore +"\eOd": backward-word +"\eOc": forward-word +"\e[1~": beginning-of-line +"\e[4~": end-of-line +"\e[5~": beginning-of-history +"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert +"\eOH": beginning-of-line +"\eOF": end-of-line +"\e[H": beginning-of-line +"\e[F": end-of-line +@end ignore + + +@node Bash Startup Files +@section Setting up Bash Shell Startup Files + +@verbatim +cat > ${TARGET_DIR}/etc/profile << 'EOF' +# Begin /etc/profile + +export LANG=en_US.UTF-8 +export INPUTRC=/etc/inputrc +export PS1='\[\e[31m\]\A-\W\[\e[00m\]# ' + +# End /etc/profile +EOF +@end verbatim + +The environment variable @env{LANG} defines the default language that +should be used on the system. @samp{en_US.UTF-8} means ``english'' +language, country ``US'' and @acronym{UTF-8} (UCS Transformation +Format—8-bit) encoding (Unicode). + +@c For a full list, see??? + +For explanations on @env{PS1}, @pxref{Environment Variables Setup}. + + +@node Localhost Setup +@section Localhost Setup + +@verbatim +echo "HOSTNAME=gllfsc" > ${TARGET_DIR}/etc/sysconfig/network +@end verbatim + + +@node hosts Setup +@section Setting up @file{hosts} File + +@verbatim +cat > ${TARGET_DIR}/etc/hosts << EOF +# Begin /etc/hosts + +127.0.0.1 gllfsc localhost + +# End /etc/hosts +EOF +@end verbatim + + +@node Network Address Setup +@section Setting up Network Address + +You can choose to have a network static or dynamic address. + +@menu +* Network Static Address Setup:: Setting up Network Static Address. +* Network Dynamic Address Setup:: Setting up Network Dynamic + Address. +@end menu + + +@node Network Static Address Setup +@subsection Setting up Network Static Address + +@verbatim +cd ${TARGET_DIR}/etc/sysconfig/network-devices +mkdir -v ifconfig.eth0 +cat > ifconfig.eth0/ipv4 << EOF +ONBOOT=yes +SERVICE=ipv4-static +IP=192.168.1.1 +GATEWAY=192.168.1.2 +PREFIX=24 +BROADCAST=192.168.1.255 +EOF +cd +@end verbatim + +@quotation Warning +@code{IP}, @code{GATEWAY}, @code{BROADCAST} addresses are set up +according to one's situation. +@end quotation + + +@node Network Dynamic Address Setup +@subsection Setting up Network Dynamic Address + +@verbatim +cd ${TARGET_DIR}/etc/sysconfig/network-devices +mkdir -v ifconfig.eth0 +cat > ifconfig.eth0/dhcpcd << EOF +ONBOOT=yes +SERVICE=dhcpcd +DHCP_START="-q" +DHCP_STOP="-k" +EOF +cd +@end verbatim + + +@node DNS Setup +@section Setting up DNS + +@verbatim +cat > ${TARGET_DIR}/etc/resolv.conf << EOF +# Begin /etc/resolv.conf + +nameserver your-main-DNS-address +nameserver your-secondary-DNS-address + +# End /etc/resolv.conf +EOF +@end verbatim + + +@node fstab File Creation +@section @file{fstab} File Creation + +The file @file{/etc/fstab} is used at boot to mount partitions under +the requested directories. + +@verbatim +cat > ${TARGET_DIR}/etc/fstab << EOF +# Begin /etc/fstab + +# file system mount-point type options dump fsck order + +/dev/sda1 / ext3 defaults 0 0 +#/dev/sda7 /home ext3 defaults 0 0 +/dev/sda5 swap swap pri=1 0 0 +devtmpfs /dev dev defaults 0 0 +proc /proc proc defaults 0 0 +tmpfs /run run defaults 0 0 +sysfs /sys sysfs defaults 0 0 +devpts /dev/pts devpts gid=4,mode=620 0 0 +shm /dev/shm tmpfs defaults 0 0 + +# End /etc/fstab +EOF +@end verbatim + +@quotation Warning +the name of the hard drive and the name of filesystem used here have +to be modified to reflect @emph{your} real situation. +@end quotation + + +@node Before Booting GLLFSC +@chapter Before Booting GLLFSC + +@menu +* Archiving:: All the system archived in one + package. +* Recommendations:: Some tips. +@end menu + + +@node Archiving +@section Archiving the System + +After the system has been completed, we use the command @command{exit} +to logout as the @emph{gllfsc} user. + +Now, login as the @emph{root} user. + +Then fix the permissions on the new system: + +@verbatim +export TARGET_DIR=/gllfsc +cd ${TARGET_DIR} +mknod -m 600 dev/console c 5 1 +mknod -m 666 dev/null c 1 3 +cp -a dev/{console,null} lib/udev/devices/ +#chown -R root:root * +chown -R root:root \ + bin boot dev etc home include lib* local man mnt proc root run \ + sbin share src static sys tmp usr var +@end verbatim + +Also copy packages to be built after reboot: + +@verbatim +export DOWNLOAD_DIR="${TARGET_DIR}/download" +for FILE in \ + tzcode2013h.tar.gz \ + tzdata2013h.tar.gz \ + runit-2.1.2.tar.gz \ + openssl-1.0.1i.tar.gz \ + wpa_supplicant-2.0.tar.gz \ + wireless_tools.29.tar.gz \ + wget-1.14.tar.gz \ + perl-5.18.1.tar.gz \ + libtasn1-3.4.tar.gz \ + lynx2.8.8dev.16.tar.bz2 \ + certdata.txt \ + inetutils-1.9.1.tar.gz \ + man-db-2.6.7.1.tar.xz; do +cp -v ${DOWNLOAD_DIR}/$FILE ${TARGET_DIR}/src +done +@end verbatim + +We archive the entire system by using the following command: + +@verbatim +# 8 minutes +tar -cjf gllfsc-pentium4-1.7.tar.bz2 \ + bin boot dev etc home include lib* local man mnt proc root run \ + sbin share src static sys tmp usr var +@end verbatim + +It is then simple to copy the archive to the target machine and extract +it. + + +@node Recommendations +@section Some Recommendations + +We recommend extracting the system to an empty partition. Moreover, +the filesystem of the chosen partition has to be a filesystem +supported by the kernel you compiled. Finally, this partition has to +be consistent with the system description in the file +@file{/etc/fstab} you created during setup (@pxref{fstab File +Creation}). + +@ignore + +extlinux +lilo + +@verbatim +# ? minute +tar xf ${DOWNLOAD_DIR}/grub-2.00.tar.gz \ + -C ${BUILD_DIR} +cd ${BUILD_DIR}/grub-2.00 +sed -i '/gets is a security hole/d' grub-core/gnulib/stdio.in.h +./configure \ + --build=${CROSS_HOST} \ + --host=${CROSS_TARGET} \ + --prefix= +make +make DESTDIR=${TARGET_DIR} install +cd .. +rm -rf grub-2.00 +cd + +mkdir ${TARGET_DIR}/boot/grub +@end verbatim +@end ignore + +Then, you will have to edit the GRUB configuration file of the target +machine: @file{/boot/grub/grub.cfg}. + +@c ?This file has to be put on the first partition of the hard drive. + +@c GRUB sur /dev/sda1 >= 1MB +@c mount ... /mnt/boot && grub-install --boot-directory=/mnt/boot /dev/sda +@c grub-script-check + +@ignore +@quotation Note +?On the Yeeloong 8133, vmlinuz @emph{must} be on the first primary +partition to be able to boot. +@end quotation + +# Install in the MBR +#grub-install /dev/sda +# Install in the OS partition +grub-install /dev/sda1 +@end ignore + +A minimal @file{/boot/grub/grub.cfg} could be: + +@verbatim +insmod ext2 +set default=0 +set root=(hd0,1) +set timeout=5 + +menuentry 'GLLFSC 1.7' { + echo 'Loading linux-libre-3.10.7-gnu...' + linux (hd0,1)/boot/vmlinuz-3.10.7-gnu root=/dev/sda1 quiet +} +@end verbatim + +@c Or use grub-mkconfig -o /boot/grub/grub.cfg + + +@node After Booting GLLFSC +@chapter After Booting GLLFSC + +Some system configuration and package installation can only be made +after booting onto the new system. + +@menu +* Login:: Login onto GLLFSC. +* Locales:: Configure the language of GLLFSC. +* Timezone:: Building Tzcode, Tzdata and choosing timezone. +* Runit:: Building Runit. +* Perl:: Building Perl. +* OpenSSL:: Building OpenSSL. +* Wpa_supplicant:: Building Wpa_supplicant. +* Wireless_tools:: Building Wireless_tools. +* Wget:: Building Wget. +* Libtasn1:: Building Libtasn1. +* Lynx:: Building Lynx. +* CA-Certificates:: Building CA-Certificates. +* Inetutils 2:: Building Inetutils under GLLFSC. +* Man-db 2:: Building Man-db under GLLFSC. +* Archiving Complete System:: Archiving the Complete System. +* Add User:: Creating a New User Account. +* Halting Computer:: Halting the Computer +@end menu + + +@node Login +@section Login + +To login as @emph{root}, just type @samp{root} when the system asks +for your @samp{login:}. Then, update your bash profile: + +@quotation Note +To use the french keyboard layout, type @samp{loadkeys -q fr}. +@end quotation + +@verbatim +cat > ~/.bash_profile << EOF +export BUILD_DIR=/tmp +export DOWNLOAD_DIR=/src +EOF + +source ~/.bash_profile +@end verbatim + + +@node Locales +@section Locales + +You may want to have your new system display messages in your native +language. If you desire to have a system supporting german, US +english, french and China mainland's chinese: + +@verbatim +mkdir /lib/locale + +#localedef -i de_DE -f UTF-8 de_DE +localedef -i en_US -f UTF-8 en_US +#localedef -i fr_FR -f UTF-8 fr_FR +#localedef -i zh_CN -f UTF-8 zh_CN +@end verbatim + +Other locales are available: + +@itemize +@item +For available charmaps, see the content of @file{/share/i18n/charmaps}. + +@item +For available locales, see the content of @file{/share/i18n/locales}. + +@end itemize + + +@node Timezone +@section Timezone + +In order to have the time and date corresponding to the area where you +live, you should build tzcode, tzdata and define your timezone. + +@verbatim +mkdir ${BUILD_DIR}/tz +tar xf ${DOWNLOAD_DIR}/tzcode2013h.tar.gz -C ${BUILD_DIR}/tz +tar xf ${DOWNLOAD_DIR}/tzdata2013h.tar.gz -C ${BUILD_DIR}/tz +cd ${BUILD_DIR}/tz + +make \ + TOPDIR=/ \ + TZDIR=/share/zoneinfo \ + ETCDIR=/bin + +for TZ in africa antarctica asia australasia europe northamerica \ + southamerica pacificnew etcetera backward systemv factory \ + solar87 solar88 solar89; do + zic -y "sh yearistype.sh" \ + -d /share/zoneinfo \ + -L /dev/null $TZ +done + +zic -y "bash yearistype.sh" \ + -d /share/zoneinfo \ + -l GMT \ + -p America/New_York + +cp iso3166.tab zone.tab /share/zoneinfo +cd .. +rm -rf tz +cd +@end verbatim + +Then, we define our timezone, in this case @file{Europe/Paris}: + +@verbatim +cp -v --remove-destination \ + /share/zoneinfo/Europe/Paris \ + /etc/localtime +@end verbatim + + +@node Runit +@section Runit + +runit is a cross-platform Unix init scheme with service supervision, a +replacement for sysvinit, and other init schemes. + + +@verbatim +tar xf ${DOWNLOAD_DIR}/runit-2.1.2.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/admin/runit-2.1.2 + +# On GLLFSC, sleep is not under /bin: +sed -i 's,/bin/sleep,sleep,' etc/debian/ctrlaltdel + +cd src + +make +make check + +install -s -m0755 \ + chpst runit runit-init runsv runsvchdir runsvdir sv svlogd utmpset \ + /sbin + +install -m0644 ../man/* \ + /share/man/man8 + +cd .. + +mkdir /etc/runit + +mkdir /service + +cp etc/debian/ctrlaltdel /etc/runit/ + +mv /sbin/init /sbin/init.sysv +ln -sv runit-init /sbin/init + +cd ../.. +rm -rf admin +cd +@end verbatim + +The init-related programs have been installed. We need to create the +boot scripts too: @file{/etc/runit/1} to boot the system, +@file{/etc/runit/2} to launch 2 ttys and the service logging daemon +and @file{/etc/runit/3} to halt or reboot the system. + +@verbatim +cat > /etc/runit/1 << 'EOF' +#!/bin/sh +# system one time tasks + +# Exit on error: +set -e + +PATH=/bin + +echo -n '16. Mounting kernel-based file systems:' +echo -n ' /proc' +mount -n -o nosuid,noexec,nodev -t proc proc /proc +echo -n ' /sys' +mount -n -o nosuid,noexec,nodev -t sysfs sys /sys +echo ' /run' +mount -n -o mode=0755,nosuid,nodev -t tmpfs run /run + +echo -n '15. Creating directories:' +echo -n ' /run/lock' +mkdir -m 1777 /run/lock +echo -n ' /dev/pts' +mkdir -p /dev/pts +echo ' /dev/shm' +mkdir -p /dev/shm + +echo '14. Mounting root file system in read-write mode.' +mount -n -o remount,rw / >/dev/null + +# Remove fsck-related system watermarks. +rm -f /fastboot /forcefsck + +echo '13. Recording existing mounts in /etc/mtab.' +> /etc/mtab +mount -f / +mount -f /proc +mount -f /sys +mount -f /run +mount -f /dev + +echo '12. Mounting remaining file systems.' +mount -a -r >/dev/null + +echo '11. Cleaning file system /tmp.' +cd /tmp && find . -xdev -mindepth 1 ! -name lost+found -delete + +echo '10. Creating /var/run/utmp.' +if grep -q '^utmp:' /etc/group; then + chmod 664 /var/run/utmp + chgrp utmp /var/run/utmp +fi + +echo '9. Starting udevd...' +echo '' > /sys/kernel/uevent_helper + +/lib/udev/udevd --daemon + +echo '8. Performing Coldplugging...' +/sbin/udevadm trigger --action=add --type=subsystems +/sbin/udevadm trigger --action=add --type=devices + +/sbin/udevadm settle + +echo '7. Activating all swap files/partitions...' +swapon -a + +echo '6. Setting Font...' +setfont LatArCyrHeb-16 -C /dev/tty2 +setfont LatArCyrHeb-16 -C /dev/tty3 + +echo '5. Setting keymap to UTF-8...' +dumpkeys | loadkeys --unicode + +echo '4. Enabling Multibyte input...' +kbd_mode -u + +echo '3. Setting up US Keymap...' +loadkeys -q us + +echo '2. Setting encoding to UTF-8...' +echo -ne $'\033%G' > /dev/tty2 +echo -ne $'\033%G' > /dev/tty3 + +echo '1. Bringing up the loopback interface...' +ip addr add 127.0.0.1/8 label lo dev lo +ip link set lo up + +echo '0. Setting hostname to gllfsc...' +hostname gllfsc + +echo +echo To login, remember: +echo your login is root +echo with no password +echo +echo You can now login through tty2 by pressing simultaneously +echo Ctrl, Alt and F2 keys +echo +echo You can then come back to this screen \(tty1\) by pressing +echo simultaneously Ctrl, Alt and F1 keys +echo +echo Edit /etc/runit/1 if you want to remove this message +echo + +touch /etc/runit/stopit +chmod 0 /etc/runit/stopit + +exit 0 +EOF + +chmod +x /etc/runit/1 +@end verbatim + +@verbatim +cat > /etc/runit/2 << EOF +#!/bin/sh + +PATH=/bin + +exec env -i PATH=/bin \ +runsvdir -P /service 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................' +EOF + +chmod +x /etc/runit/2 +@end verbatim + +@verbatim +cat > /etc/runit/3 << EOF +#!/bin/sh + +# Exit on error: +set -e + +exec 2>&1 + +PATH=/bin + +echo '4. Waiting for services to stop...' +sv down /service/* + +echo '3. Exiting services...' +sv exit /service/* + +echo '2. Deactivating all swap files/partitions...' +swapoff -a + +# Unmount everything but /: +echo -n '1. Unmounting filesystems: /home' +umount -r /home +echo -n ' /proc' +umount -r /proc +echo -n ' /sys' +umount -r /sys +echo -n ' /dev/pts' +umount -r /dev/pts +echo ' /dev/shm' +umount -r /dev/shm + +echo '0. Shutdown...' + +exit 0 +EOF + +chmod +x /etc/runit/3 +@end verbatim + +We now create useful services: + +@verbatim +mkdir /etc/sv +mkdir /etc/sv/getty-2 + +cat > /etc/sv/getty-2/run << EOF +#!/bin/sh +exec /sbin/agetty tty2 9600 +EOF +chmod +x /etc/sv/getty-2/run + +cat > /etc/sv/getty-2/finish << EOF +#!/bin/sh +exec utmpset -w tty2 +EOF +chmod +x /etc/sv/getty-2/finish + +ln -sv /etc/sv/getty-2 /service/getty-2 + + +mkdir -p /etc/sv/getty-3 + +cat > /etc/sv/getty-3/run << EOF +#!/bin/sh +exec /sbin/agetty tty3 9600 +EOF +chmod +x /etc/sv/getty-3/run + +cat > /etc/sv/getty-3/finish << EOF +#!/bin/sh +exec utmpset -w tty3 +EOF +chmod +x /etc/sv/getty-3/finish + +ln -sv /etc/sv/getty-3 /service/getty-3 + + +mkdir /etc/sv/svlogd + +cat > /etc/sv/svlogd/run << EOF +#!/bin/sh +exec svlogd +EOF +chmod +x /etc/sv/svlogd/run + +ln -sv /etc/sv/svlogd /service/svlogd +@end verbatim + + +@node Perl +@section Perl + +Perl is a high-level programming language. + +@quotation Note +You may have to type @samp{exit} twice during the configure phase of +the Perl installation. +@end quotation + +@verbatim +tar xf ${DOWNLOAD_DIR}/perl-5.18.1.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/perl-5.18.1 +sh Configure -ds -e -Dprefix= +make +make install +cd .. +rm -rf perl-5.18.1 +cd +@end verbatim + + +@node OpenSSL +@section OpenSSL + +OpenSSL is a toolkit implementing the Transport Layer Security (TLS) +and Secure Sockets Layer (SSL) protocols as well as a cryptography +library. + +@verbatim +tar xf ${DOWNLOAD_DIR}/openssl-1.0.1i.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/openssl-1.0.1i +./config \ + --prefix=/usr \ + --openssldir=/etc/ssl \ + shared +make -j1 +# Install without the documentation: +make install_sw +cd .. +rm -rf openssl-1.0.1i +cd +@end verbatim + + +@node Wpa_supplicant +@section Wpa_supplicant + +Wpa_supplicant is a user space IEEE 802.1X/WPA supplicant (wireless +client) for many wireless drivers. + +@verbatim +# 2 minutes +tar xf ${DOWNLOAD_DIR}/wpa_supplicant-2.0.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/wpa_supplicant-2.0/wpa_supplicant + +cat > .config << EOF +CONFIG_DRIVER_HOSTAP=y +CONFIG_DRIVER_WEXT=y +#CONFIG_DRIVER_NL80211=y +#CONFIG_DRIVER_WIRED=y + +#CONFIG_PKCS12=y +#CONFIG_SMARTCARD=y + +CONFIG_CTRL_IFACE=y + +CONFIG_BACKEND=file +CONFIG_PEERKEY=y +#CONFIG_IEEE80211W=y + +CONFIG_TLS=openssl + +#CONFIG_IEEE80211N=y +EOF + +sed -i.orig 's@local/@@g' Makefile +make +make install +cd ../.. +rm -rf wpa_supplicant-2.0 +cd + +cat > /etc/wpa_supplicant.conf << EOF +network={ + ssid="MYESSID" + key_mgmt=WPA-PSK + pairwise=TKIP + group=TKIP + psk="MYPASSWORD" +} +EOF +chmod 600 /etc/wpa_supplicant.conf +@end verbatim + + +@node Wireless_tools +@section Wireless_tools + +The Wireless Tools is a set of tools allowing to manipulate the +Wireless Extensions. + +@verbatim +# 1 minute +tar xf ${DOWNLOAD_DIR}/wireless_tools.29.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/wireless_tools.29 +make +make PREFIX= install +cd .. +rm -rf wireless_tools.29 +cd +@end verbatim + + +@ignore +Launch wireless connection: + +ifconfig wlan0 up +iwconfig wlan0 essid MYESSID +sleep 10s +dhcpcd wlan0 +@end ignore + + +@node Wget +@section Wget + +GNU wget is an utility for downloading network data. + +@verbatim +# 5 minutes +tar xf ${DOWNLOAD_DIR}/wget-1.14.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/wget-1.14 +sed -i.orig 's/item $thing/item C<$thing>/' doc/texi2pod.pl +./configure \ + --prefix= \ + --with-ssl=openssl +make +make install +cd .. +rm -rf wget-1.14 +cd +@end verbatim + + +@node Libtasn1 +@section Libtasn1 + +GNU libtasn1 is a ASN.1 library. + +@verbatim +tar xf ${DOWNLOAD_DIR}/libtasn1-3.4.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/libtasn1-3.4 +./configure \ + --prefix= +make +make install +cd .. +rm -rf libtasn1-3.4 +cd +@end verbatim + + +@node Lynx +@section Lynx + +Lynx is a text web browser. + +@verbatim +tar xf ${DOWNLOAD_DIR}/lynx2.8.8dev.16.tar.bz2 -C ${BUILD_DIR} +cd ${BUILD_DIR}/lynx2-8-8 +./configure \ + --prefix= \ + --with-ssl=/lib \ + --enable-nls \ + --with-screen=ncursesw +make +make install +cd .. +rm -rf lynx2-8-8 + +# Stop asking questions about certificates: +sed -i s/#FORCE_SSL_PROMPT:PROMPT/FORCE_SSL_PROMPT:yes/ \ + /etc/lynx.cfg + +# Display non-ascii characters: +sed -i s/#CHARACTER_SET:iso-8859-1/CHARACTER_SET:utf-8/ \ + /etc/lynx.cfg + +# I don't want cookies: +sed -i 's/#SET_COOKIES:TRUE/SET_COOKIES:FALSE/' \ + /etc/lynx.cfg +sed -i 's/#ACCEPT_ALL_COOKIES:FALSE/ACCEPT_ALL_COOKIES:FALSE/' \ + /etc/lynx.cfg +sed -i 's/#PERSISTENT_COOKIES:FALSE/PERSISTENT_COOKIES:FALSE/' \ + /etc/lynx.cfg +cd +@end verbatim + + +@node CA-Certificates +@section CA-Certificates + +CA-Certificates are used for https web pages. + +@verbatim +# Inspired from +# http://linuxfromscratch.org/blfs/view/stable/postlfs/cacerts.html + +cp ${DOWNLOAD_DIR}/certdata.txt ${BUILD_DIR} +cd ${BUILD_DIR} + +cat > /bin/make-cert.pl << 'EOF' +#!/bin/perl -w + +# Used to generate PEM encoded files from Mozilla certdata.txt. +# Run as ./make-cert.pl > certificate.crt +# +# Parts of this script courtesy of RedHat (mkcabundle.pl) +# +# This script modified for use with single file data (tempfile.cer) +# extracted from certdata.txt, taken from the latest version in the +# Mozilla NSS source. +# mozilla/security/nss/lib/ckfw/builtins/certdata.txt +# +# Authors: DJ Lucas +# Bruce Dubbs +# +# Version 20120211 + +my $certdata = './tempfile.cer'; + +open( IN, "cat $certdata|" ) + || die "could not open $certdata"; + +my $incert = 0; + +while ( ) +{ + if ( /^CKA_VALUE MULTILINE_OCTAL/ ) + { + $incert = 1; + open( OUT, "|openssl x509 -text -inform DER -fingerprint" ) + || die "could not pipe to openssl x509"; + } + + elsif ( /^END/ && $incert ) + { + close( OUT ); + $incert = 0; + print "\n\n"; + } + + elsif ($incert) + { + my @bs = split( /\\/ ); + foreach my $b (@bs) + { + chomp $b; + printf( OUT "%c", oct($b) ) unless $b eq ''; + } + } +} +EOF + +chmod +x /bin/make-cert.pl + + + +cat > /bin/make-ca.sh << 'EOF' +#!/bin/sh +# Begin make-ca.sh +# Script to populate OpenSSL's CApath from a bundle of PEM formatted +# CAs +# +# The file certdata.txt must exist in the local directory +# Version number is obtained from the version of the data. +# +# Authors: DJ Lucas +# Bruce Dubbs +# +# Version 20120211 + +certdata="certdata.txt" + +if [ ! -r $certdata ]; then + echo "$certdata must be in the local directory" + exit 1 +fi + +REVISION=$(grep CVS_ID $certdata | cut -f4 -d'$') + +if [ -z "${REVISION}" ]; then + echo "$certfile has no 'Revision' in CVS_ID" + exit 1 +fi + +VERSION=$(echo $REVISION | cut -f2 -d" ") + +TEMPDIR=$(mktemp -d) +TRUSTATTRIBUTES="CKA_TRUST_SERVER_AUTH" +BUNDLE="BLFS-ca-bundle-${VERSION}.crt" +CONVERTSCRIPT="/bin/make-cert.pl" +SSLDIR="/etc/ssl" + +mkdir "${TEMPDIR}/certs" + +# Get a list of starting lines for each cert +CERTBEGINLIST=$(grep -n "^# Certificate" "${certdata}" | cut -d ":" -f1) + +# Get a list of ending lines for each cert +CERTENDLIST=$(grep -n "^CKA_TRUST_STEP_UP_APPROVED" "${certdata}" \ + | cut -d ":" -f 1) + +# Start a loop +for certbegin in ${CERTBEGINLIST}; do + for certend in ${CERTENDLIST}; do + if test "${certend}" -gt "${certbegin}"; then + break + fi + done + + # Dump to a temp file with the name of the file as the beginning + # line number + sed -n "${certbegin},${certend}p" "${certdata}" \ + > "${TEMPDIR}/certs/${certbegin}.tmp" +done + +unset CERTBEGINLIST CERTDATA CERTENDLIST certbegin certend + +mkdir -p certs +rm -f certs/* # Make sure the directory is clean + +for tempfile in ${TEMPDIR}/certs/*.tmp; do + # Make sure that the cert is trusted... + grep "CKA_TRUST_SERVER_AUTH" "${tempfile}" | \ + egrep "TRUST_UNKNOWN|NOT_TRUSTED" > /dev/null + + if test "${?}" = "0"; then + # Throw a meaningful error and remove the file + cp "${tempfile}" tempfile.cer + perl ${CONVERTSCRIPT} > tempfile.crt + keyhash=$(openssl x509 -noout -in tempfile.crt -hash) + echo "Certificate ${keyhash} is not trusted! Removing..." + rm -f tempfile.cer tempfile.crt "${tempfile}" + continue + fi + + # If execution made it to here in the loop, the temp cert is trusted + # Find the cert data and generate a cert file for it + + cp "${tempfile}" tempfile.cer + perl ${CONVERTSCRIPT} > tempfile.crt + keyhash=$(openssl x509 -noout -in tempfile.crt -hash) + mv tempfile.crt "certs/${keyhash}.pem" + rm -f tempfile.cer "${tempfile}" + echo "Created ${keyhash}.pem" +done + +# Remove blacklisted files +# MD5 Collision Proof of Concept CA +if test -f certs/8f111d69.pem; then + echo "Certificate 8f111d69 is not trusted! Removing..." + rm -f certs/8f111d69.pem +fi + +# Finally, generate the bundle and clean up. +cat certs/*.pem > ${BUNDLE} +rm -r "${TEMPDIR}" +EOF + +chmod +x /bin/make-ca.sh + + + +cat > /bin/remove-expired-certs.sh << 'EOF' +#!/bin/sh +# Begin /bin/remove-expired-certs.sh +# +# Version 20120211 + +# Make sure the date is parsed correctly on all systems +mydate() +{ + local y=$( echo $1 | cut -d" " -f4 ) + local M=$( echo $1 | cut -d" " -f1 ) + local d=$( echo $1 | cut -d" " -f2 ) + local m + + if [ ${d} -lt 10 ]; then d="0${d}"; fi + + case $M in + Jan) m="01";; + Feb) m="02";; + Mar) m="03";; + Apr) m="04";; + May) m="05";; + Jun) m="06";; + Jul) m="07";; + Aug) m="08";; + Sep) m="09";; + Oct) m="10";; + Nov) m="11";; + Dec) m="12";; + esac + + certdate="${y}${m}${d}" +} + +OPENSSL=/bin/openssl +DIR=/etc/ssl/certs + +if [ $# -gt 0 ]; then + DIR="$1" +fi + +certs=$( find ${DIR} -type f -name "*.pem" -o -name "*.crt" ) +today=$( date +%Y%m%d ) + +for cert in $certs; do + notafter=$( $OPENSSL x509 -enddate -in "${cert}" -noout ) + date=$( echo ${notafter} | sed 's/^notAfter=//' ) + mydate "$date" + + if [ ${certdate} -lt ${today} ]; then + echo "${cert} expired on ${certdate}! Removing..." + rm -f "${cert}" + fi +done +EOF + +chmod +x /bin/remove-expired-certs.sh + + +make-ca.sh +remove-expired-certs.sh certs + + +install -d /etc/ssl/certs +cp -v certs/*.pem /etc/ssl/certs +c_rehash +install BLFS-ca-bundle*.crt /etc/ssl/ca-bundle.crt +ln -sfv ../ca-bundle.crt /etc/ssl/certs/ca-certificates.crt + +rm BLFS-ca-bundle*.crt +rm certdata.txt +rm -rf certs + +cd +@end verbatim + + +@node Inetutils 2 +@section Inetutils 2 + +Installed @samp{ifconfig} may hang. Reinstalling under GLLFSC to fix this: + +@verbatim +tar xf ${DOWNLOAD_DIR}/inetutils-1.9.1.tar.gz -C ${BUILD_DIR} +cd ${BUILD_DIR}/inetutils-1.9.1 +sed -i '/gets is a security hole/d' lib/stdio.in.h +#sed -i -e '/PATH_PROCNET_DEV/s/\ no//' paths +./configure \ + --prefix= +make +make DESTDIR= install +cd .. +rm -rf inetutils-1.9.1 +cd +@end verbatim + + +@node Man-db 2 +@section Man-db 2 + +Installed @samp{man} is buggy. Reinstalling under GLLFSC to fix this: + +@verbatim +tar xf ${DOWNLOAD_DIR}/man-db-2.6.7.1.tar.xz -C ${BUILD_DIR} +cd ${BUILD_DIR}/man-db-2.6.7.1 +libpipeline_CFLAGS="-I/include" \ + libpipeline_LIBS="-L/lib -lpipeline" \ + ./configure \ + --prefix= +make +make DESTDIR= install +cd .. +rm -rf man-db-2.6.7.1 +cd +@end verbatim + + +@node Archiving Complete System +@section Archiving the Complete System + +@verbatim +# Clean up: +rm /src/* +rm /root/* +rm /root/.bash* +rm -rf /share/doc +mv /share/man/man* /share +rm -rf /share/man/* +mv /share/man[1-8] /share/man + +# Strip binaries +# 109 MB before, 36 MB after +strip --strip-all /bin/* + +# To be done outside GLLFSC: +tar -cjf gllfsc-pentium4-1.7-completed.tar.bz2 \ + bin boot dev etc home include lib* local man mnt proc root run \ + sbin service share src sys tmp usr var +@end verbatim + + +@node Add User +@section Add User + +To create a new user, without root rights: + +@verbatim +useradd -m USER +@end verbatim + +This will create a new user named @samp{USER}, with group +@samp{USER} and user's home at @file{/home/USER}. + +To give a password to this user: + +@verbatim +passwd USER +@end verbatim + +You may want to change the color of this user's prompt: + +@verbatim +cat > /home/USER/.bash_profile << EOF +export PS1='\[\e[32m\]\A-\W\[\e[00m\]$ ' +EOF +chown USER:USER /home/USER/.bash_profile +@end verbatim + + +@node Halting Computer +@section Halting the Computer + +In order to halt the computer after this build process, type: + +@verbatim +init.sysv 0 +@end verbatim + +If you prefer to reboot instead type: + +@verbatim +init.sysv 6 +@end verbatim + +The next time you use GLLFSC, runit will be the default init system +and you will have to type @samp{init 0} to halt the operating system +and @samp{init 6} to reboot. + + +@node Further Readings +@chapter Further Readings + +On my personal website at +@uref{http://cjarry.org/gnu-linux/gllfsc@//gllfsc.en.html}, +there is some information on how to extend GLLFSC, for instance +instructions on how to build Xorg and programs on top of it. + +Haiyong Sun's website (in Chinese): +@uref{http://blog.chinaunix.net/uid/436750.html}. It includes documents on building a +GNU/Linux system for Loongson and a GNU/Hurd system for x86. + +Cross [GNU/]Linux from scratch: @uref{http://www.clfs.org} (PDF +files may be downloaded from @uref{http://clfs.org/files/BOOK/}). +Includes a lot of documentation to build a GNU/Linux system by +cross-compilation on a variety of hardware, no information (yet) for +cross-compiling with sysroot on MIPS though. There is also a +Community-driven Beyond [GNU/]Linux From Scratch on +@uref{http://cblfs.clfs.org/index.php/Main_Page}. It documents +the building of Xorg and TeXLive among other things. + +@c Some patches from the above project are available for download on +@c @uref{http://svn.clfs.org/svn/repos/patches/}. + +@uref{http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_@/man.txt} +documents an interesting way of managing packages. Quotation from the +file: + +@quotation +DESCRIPTION: +@itemize + +@item +You want to know which packages your files belong to? + +@item +You want to deinstall software that doesn't have make uninstall? + +@item +You are bothered by programs installed setuid root behind your back? + +@item +You don't like packages quietly overwriting files from other packages? + +@item +You don't like package managers like RPM? + +@item +YOU WANT TOTAL CONTROL USING ONLY UNIX BUILTINS? +@end itemize +@end quotation + +The suckless team@footnote{@uref{http://suckless.org}} is a group of +programmers that share the following +philosophy@footnote{@uref{http://suckless.org/philosophy}}: + +@quotation +Focus on simplicity, clarity and frugality. Our philosophy is about +keeping things simple, minimal and usable. We believe this should +become the mainstream philosophy in the IT sector. Unfortunately, the +tendency for complex, error-prone and slow software seems to be +prevalent in the present-day software industry. We intend to prove the +opposite with our software projects. +@end quotation + +The simple and lightweight programs released by this team are +interesting for everyone who like small, reactive and reliable +programs. + + +@ignore +@node Thanks +@chapter Thanks + +I thank Lemote and particularily the CEO, Fuxin Zhang, for offering me +a Yeeloong 8133, Huacai Chen and Haiyong Sun for their help in fixing +the bugs I found in the deblobbed kernel. + +I am particularily grateful to Haiyong Sun for having shared his +knowledge on building a free operating system for Loongson 2F +machines, this document is heavily based on this. +@end ignore + + +@node GNU Free Documentation License +@appendix GNU Free Documentation License +@include fdl-1.3.texi + + +@node GNU General Public License +@appendix GNU General Public License +@include gpl.texi + +@bye diff --git a/gpl.txt b/gpl.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/gpl.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. -- 2.31.1