====== Build the CIP System and Artifacts (4/5) ====== This set of instructions assumes you have already Setup and Configured the B@D Virtual Machine. If that is not the case please go back to the [[beagleboneblackboard | Beaglebone Black Setup & Configuration]] or the [[renesasboard| IWG20M Setup & Configuration]] depending on which board you are using. ===== Creating an initramfs with BusyBox for the board ===== BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. BusyBox provides a fairly complete environment from which to boot any embedded system. **Prerequisites:** You must have the CIP Board-at-Desk Single-Developer (B@D) Virtual Machine set up with make, gcc and the arm cross compilers. 1. Connect to the B@D Virtual Machine. '' user@host:~/location-of-B@D-Vagrant-files$ **vagrant ssh**'' 2. Install the library for curses which is used by the make menuconfig command '' vagrant@guest:~$ **sudo apt-get install libncurses5-dev**'' **Create a directory to work in** 3. Make the necessary directories in which to work and where the output will be stored so it is accessible from the website. ''vagrant@guest:~$ **mkdir -p work/initramfs**'' ''vagrant@guest:~$ **cd work**'' ''vagrant@guest:~/work$ **sudo mkdir /var/www/images/kernel-ci/initramfs**'' 4. Download the busybox source code and unzip it. ''vagrant@guest:~/work$ **wget http://busybox.net/downloads/busybox-1.28.0.tar.bz2**'' ''vagrant@guest:~/work$ **tar -xvf busybox-1.28.0.tar.bz2**'' ''vagrant@guest:~/work$ **cd busybox-1.28.0**'' 5. Create the default configuration ''vagrant@guest:~/work/busybox-1.28.0$ **make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig**'' 6. Configure and make the ''initramfs'' ''vagrant@guest:~/work/busybox-1.28.0$ **make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig**'' 7. Select the following settings: **Busybox Settings -> Build Options -> Build Busybox as a static binary (no shared libs)** 8. Press **Y** or the **space bar** to select that option. 9. Press the **Tab** key to move to the buttons at the bottom of the window and select the **< Exit >** button twice. 10. On the dialog box that asks "Do you wish to save your new configuration?" Select **Yes** and press **Enter**. 11. Execute the following commands for building the ''initramfs'' ''vagrant@guest:~/work/busybox-1.28.0$ **make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=/home/vagrant/work/initramfs /home/vagrant/work/initramfs install**'' ''vagrant@guest:~/work/busybox-1.28.0$ **cd ../initramfs**'' //Note:// //After the successful completion of the above commands, you can see 3 directories (''bin'', ''sbin'', ''usr'') and one file, ''linuxrc'' created in your ''initramfs'' directory.// 12. Create the ''initramfs.cpio.gz'' ''vagrant@guest:~/work/initramfs$ /vagrant/scripts/configure_initramfs.sh '' **Make it available for the LAVA testing environment:** 13. Copy the ''initramfs.cpio.gz'' to the ''initramfs'' directory where it can be retrieved by LAVA. ''vagrant@guest:~/work/initramfs$ **sudo cp ../initramfs.cpio.gz /var/www/images/kernel-ci/initramfs**'' ---- ===== Building the CIP Kernel with Kernel CI ===== ==== Prerequisites: ==== * A working CIP Board-at-Desk Single-Developer (B@D) Virtual Machine ==== Procedure: ==== 1. Connect to the B@D Virtual Machine. '' user@host:~/location-of-B@D-Vagrant-files$ **vagrant ssh**'' '' vagrant@guest:~$ '' 2. Change to the ''git-repos'' directory '' vagrant@guest:~$ **cd git-repos** '' // Note that in the case of the pre-provisioned Vagrant instance it already has a clone of the linux-cip repository, you only need a ''git pull'' from within the linux-cip directory to ensure that it is up to date and proceed to step 4. // 3. Clone the CIP Linux Kernel '' vagrant@guest:~/git-repos$ **git clone [[git://git.kernel.org/pub/scm/linux/kernel/git/bwh/linux-cip.git]]** '' 4. Find the branch of the kernel version you want (We will use '4.4.83-cip8' for this example) '' vagrant@guest:~/git-repos$ **cd linux-cip** '' '' vagrant@guest:~/git-repos/linux-cip$ **git tag -l | grep cip** '' v4.4.42-cip1 v4.4.48-cip2 v4.4.55-cip3 v4.4.69-cip4 v4.4.75-cip5 v4.4.75-cip6 v4.4.75-cip7 v4.4.83-cip8 etc. 5. Create a new branch using the latest CIP tag. For example: '' vagrant@guest:~/git-repos/linux-cip$ **git checkout -b cip_v4.4.83 v4.4.83-cip8** '' 6. Set the environment variables. You can create a tree name that describes your project. Select the Architecture of the target device (i.e. arm, arm64, mips, i386, amd64, etc.). Choose the cross compiler you need for that architecture. '' vagrant@guest:~/git-repos/linux-cip$ **export TREE_NAME=cip-example** '' '' vagrant@guest:~/git-repos/linux-cip$ **export ARCH=arm** '' '' vagrant@guest:~/git-repos/linux-cip$ **export CROSS_COMPILE=arm-linux-gnueabihf-** '' //Note: Don't forget the dash (-) at the end of the ''CROSS_COMPILE'' line!// 7. If using the Beaglebone Black execute the ''build.py'' command, passing in the Beaglebone Black configuration. ''vagrant@guest:~/git-repos/linux-cip$ **~/kernelci-build/build.py -c omap2plus_defconfig -p CIP-KernelCI**'' make -j4 -k -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build-arm omap2plus_defconfig make -j4 -k -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build-arm make -j4 -k -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build-arm modules make -j4 -k -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build-arm modules_install INFO: published artifacts ... cip-example/cip_v4.4.83/v4.4.83-cip8/arm/omap2plus_defconfig/dtbs/am335x-boneblack.dtb ... INFO: triggering build 202 8. If using the Renesas IWG20M execute the ''build.py'' command, passing in the IWG20M configuration. ''vagrant@guest:~/git-repos/linux-cip$ **~/kernelci-build/build.py -c shmobile_defconfig -p CIP-KernelCI**'' make -j4 -k -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build-arm shmobile_defconfig make -j4 -k -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build-arm INFO: published artifacts ... cip-example/cip4.4.126/v4.4.126-cip22/arm/shmobile_defconfig/dtbs/r8a7743-iwg20d-q7.dtb ... INFO: triggering build 202 9. Start the Kernel CI web server ''vagrant@guest:**/vagrant/scripts/start_webserver.sh &**'' 10. On your host machine, open a web browser and enter the following in the address box: ''**http://localhost:5000**'' //Note that if you are using Windows 10 as a host you will need to use either Chrome or Firefox as a browser for the Windows browsers do not work with the KernelCI webserver.// 11. You will see the KernelCI Website home page from which you can navigate to the different builds and Trees that you've created (see the **Example Builds** section below). 12. Click on the **Jobs** button at the top of the page and you will see all of the available Trees 13. Click on the **Tree name** (cip-example) and you will see the list of available builds, or kernel versions for that tree. 14. Click on the (for example) **v4.4.83** kernel and you will see the list of build configurations (for example omap2plus). 15. The files that resulted from the build are available in the KernelCI website by navigating to the Tree Name, Kernel version, and Configuration. They are stored on the hard drive at: ''/var/www/images/kernel-ci/TREE_NAME/KERNEL_VERSION/BRANCH/ARCH/CONFIG'' === Example Builds === 16. For instance, for the build with the following parameters: * TREE_NAME: **cip-example** * KERNEL_VERSION: **v4.4.83-cip8** * BRANCH: **cip_v4.4.83** (This came from the name we used in the ''git checkout'' step.) * ARCH: **arm** * CONFIG: **omap2plus** The files will be located at: ''/var/www/images/kernel-ci/cip-example/v4.4.83-cip8/cip_v4.4.83/arm/omap2plus'' 17. Kernel CI generates the following files. Make a note of the ones in **bold**. They will be needed for testing the CIP Kernel: * ''build.log'' shows the output of the build process to help track down any issues in compilation. * ''kernel.config'' holds the configuration settings used to build the kernel. * ''system.map'' is the kernel's symbol table that is used to debug kernel runtime errors. * ''**zImage**'' is the compressed kernel image to be installed on target device. * ''**modules**'' is a directory that holds all of the kernel modules needed for the CIP Kernel. * ''**dtbs**'' directory which holds all of the generated Device Tree Binary's. 18. Check the [[civilinfrastructureplatform/ciptestingreferencetestcases|reference test cases]] and try them as reference examples.