# Setting up a Linux Toolchain ## Choosing the C-Library The C-Library is an interface layer between applications and the system kernel implemented in the C-Language, which conforms to the POSIX standards. It can be looked at as an abstraction layer for programms running on a system, even if the programm itself is not implemented in C. Python, Java and many more languages eventually call functions from the C-Library, which makes it an essential part of the toolchain. There are multible C-Libraries to choose from: * glibc * musl libc * uClibc-ng * eglibc The GNU standard C-Library is **glibc**. Depending on your system specs, you might choose a different C-Library. If you are very limited on RAM and Disk space, **musl libc** may be your go-to, since it uses very little resources. **uClibc-ng** only if you are using uClinux and otherwise glibc. ![clib image](../img/whichclibtochoose.jpg) ## Installation ### Requirements For the installation of the toolchain you first need some tools: ```bash sudo apt-get install autoconf automake bison bzip2 cmake flex g++ gawk gcc \ gettext git gperf help2man libncurses5-dev libstdc++6 libtool \ libtool-bin make patch python3-dev rsync texinfo unzip wget xz-utils ``` ### Building a toolchain In this example of a toolchain build process, we are using crosstool-NG. Start with installing the dependencies mentioned above. Starting off, you want to clone the crosstool-ng git repository: ```bash git clone https://github.com/crosstool-ng/crosstool-ng.git ``` After the download has finished, install the package from source. In this example, we are using version 1.24.0: ```bash cd crosstool-ng git checkout crosstool-ng-1.24.0 ./bootstrap ./configure --prefix=${PWD} make make install ``` The configure script with the "--prefix" option defines the build path for the installation. In this case, we install it into the current working directory, which is the git repository we just cloned. Under "bin/", there are the just built binaries. To start the crosstool, run ```bash bin/t-ng ``` The following section, describes the toolchain build for the beaglebone black board: At first, we select a a target configuration: ```bash bin/ct-ng arm-cortex_a8-linux-gnueabi ``` Other samples can be listed with ```bash bin/ct-ng list-samples ``` After all this, every config specific detail can be customized by using the menuconfig: ```bash bin/ct-ng menuconfig ``` For the Beaglebone Black we change the following settings: - In Paths and misc options, disable Render the toolchain read-only (`CT_PREFIX_DIR_RO`). - In Target options | Floating point, select hardware (FPU) (`CT_ARCH_FLOAT_HW`). - In Target options, enter neon for Use specific FPU. Now we can use crosstool-ng to build the environment we just specified: ```bash bin/ct-ng build ``` *source:* Mastering Embedded Linux Programming - Third Edition By Frank Vasquez, Chris Simmonds