This shows you the differences between two versions of the page.
ass:laboratoare:02:tasks:01 [2024/08/06 14:55] florin.stancu [01. Preparing the Linux μImage] |
ass:laboratoare:02:tasks:01 [2024/08/06 15:05] (current) florin.stancu [01. Preparing the Linux μImage] |
||
---|---|---|---|
Line 20: | Line 20: | ||
You must set the ''ARCH'' argument to the appropriate architecture **AT ALL TIMES** when invoking linux's ''make''! \\ | You must set the ''ARCH'' argument to the appropriate architecture **AT ALL TIMES** when invoking linux's ''make''! \\ | ||
Check out the subdirectories in ''linux/arch/'' for possible values. \\ | Check out the subdirectories in ''linux/arch/'' for possible values. \\ | ||
- | Also, do not forget about the ''CROSS_COMPILE'' argument (export it inside your Makefile & terminal). | + | Also, do not forget about the ''CROSS_COMPILE'' environment variable (export it inside your Makefile & terminal). |
</note> | </note> | ||
Line 60: | Line 60: | ||
Buildroot on the other hand is geared towards simplicity and ease of use. Being based on Kbuild and Makefile (same as Linux and U-Boot) makes it instantly familiar to most developers. And even if you are new to this, while Yocto requires you to read entire [[https://www.goodreads.com/search?q=yocto|books]] in order to utilize it properly, Buildroot can be summed up in a 1k LoC Makefile. | Buildroot on the other hand is geared towards simplicity and ease of use. Being based on Kbuild and Makefile (same as Linux and U-Boot) makes it instantly familiar to most developers. And even if you are new to this, while Yocto requires you to read entire [[https://www.goodreads.com/search?q=yocto|books]] in order to utilize it properly, Buildroot can be summed up in a 1k LoC Makefile. | ||
- | == Step 1: Download Buildroot == | + | == Download Buildroot == |
Clone the official [[https://github.com/buildroot/buildroot.git|Buildroot repo]]. | Clone the official [[https://github.com/buildroot/buildroot.git|Buildroot repo]]. | ||
- | == Step 2: Create the configuration == | + | == Create the configuration == |
Find an existing defconfig for our platform (the **imx8mq**) and take a look at what it contains. Notice how the following config options are enabled: | Find an existing defconfig for our platform (the **imx8mq**) and take a look at what it contains. Notice how the following config options are enabled: | ||
Line 75: | Line 75: | ||
Yes, Buildroot also integrates the bootloaders into its build system. However, keeping the components separate makes it easier to appply patches and debug problems. What we want from Buildroot is a minimal root filesystem and nothing more. So, after generating ''.config'', enter ''menuconfig'' and make a few changes: | Yes, Buildroot also integrates the bootloaders into its build system. However, keeping the components separate makes it easier to appply patches and debug problems. What we want from Buildroot is a minimal root filesystem and nothing more. So, after generating ''.config'', enter ''menuconfig'' and make a few changes: | ||
+ | |||
* Disable all components that we've already integrated in our build environment (starting with the ones above). | * Disable all components that we've already integrated in our build environment (starting with the ones above). | ||
- | * Use an **external, custom, pre-installed toolchain**. | + | * Use an **external, custom, pre-installed toolchain** (remember ''CROSS_COMPILE''? check the menu for it!). |
* Use **systemd** as the init system instead of **BusyBox**. | * Use **systemd** as the init system instead of **BusyBox**. | ||
* Make sure **systemd-logind** is included in the build, or you may have [[https://lore.kernel.org/all/b49c7676-1864-d838-fcf7-7a1208d6ba78@benettiengineering.com/T/|this problem]]. | * Make sure **systemd-logind** is included in the build, or you may have [[https://lore.kernel.org/all/b49c7676-1864-d838-fcf7-7a1208d6ba78@benettiengineering.com/T/|this problem]]. | ||
- | * Use **bash** as the default shell instead of **sh**. | + | * Choose **bash** as the default shell instead of **sh**. |
* Enable password login for the //root// user, then set a password. | * Enable password login for the //root// user, then set a password. | ||
- | * Include a text editor package (e.g.: **vim** or **nano**). | + | * Include a text editor PACKAGE (e.g.: **vim** or **nano**). |
- | * Include the **coreutils** package. | + | * Include the **coreutils** PACKAGE. |
* Generate an **uncompressed CPIO** image from the output file system (see the Note below). | * Generate an **uncompressed CPIO** image from the output file system (see the Note below). | ||
+ | |||
+ | <note> | ||
+ | Note how the the configuration variables are prefixed with ''BR2_'', packages with ''BR2_PACKAGE_'' and so on! | ||
+ | </note> | ||
<note> | <note> | ||
Line 163: | Line 168: | ||
</solution> | </solution> | ||
- | == Step 3: Build it! == | + | == Build & inspect the rootfs == |
Not much to it, really. Once everything's done, check out the ''output/'' directory. What does it contain? Where is your CPIO archive? | Not much to it, really. Once everything's done, check out the ''output/'' directory. What does it contain? Where is your CPIO archive? |