Compiling kernels with envkernel.sh: Difference between revisions
m →Compile the kernel: Remove invalid comma |
No edit summary |
||
Line 1: | Line 1: | ||
This page details how to compile a kernel manually using the <code>envkernel.sh</code> helper script. This workflow can be used to quickly | This page details how to compile a kernel manually using the <code>envkernel.sh</code> helper script as well as how to package and install a locally compiled kernel. This workflow can be used to quickly iterate and test during kernel development by using the existing kernel packaging and upgrade process to install a development kernel. | ||
Usually when compiling a kernel, you would install [https://kernelnewbies.org/KernelBuild all dependencies] and a cross compiler in your host system. To make it easier, we have the <code>envkernel.sh</code> script (for fish shell: <code>envkernel.fish</code>). It sets up an Alpine Linux chroot with all the dependencies by using <code>pmbootstrap</code> internally, exports the environment variables to use the right cross compiler and creates an alias to <code>make</code>. This means, whenever you type <code>make</code> after sourcing that script, it will actually run <code>make</code> in the chroot. | Usually when compiling a kernel, you would install [https://kernelnewbies.org/KernelBuild all dependencies] and a cross compiler in your host system. To make it easier, we have the <code>envkernel.sh</code> script (for fish shell: <code>envkernel.fish</code>). It sets up an Alpine Linux chroot with all the dependencies by using <code>pmbootstrap</code> internally, exports the environment variables to use the right cross compiler and creates an alias to <code>make</code>. This means, whenever you type <code>make</code> after sourcing that script, it will actually run <code>make</code> in the chroot. | ||
== Selecting a kernel == | == Selecting a kernel == | ||
Line 20: | Line 20: | ||
<syntaxhighlight lang="shell-session"> | <syntaxhighlight lang="shell-session"> | ||
$ git checkout dd65620ba04a8c6ba0e30553c9c95388daefae02 | $ git checkout dd65620ba04a8c6ba0e30553c9c95388daefae02 # example | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 42: | Line 42: | ||
The <code>envkernel.sh</code> script will set up a build environment based on the target device configured for <code>pmbootstrap</code>. | The <code>envkernel.sh</code> script will set up a build environment based on the target device configured for <code>pmbootstrap</code>. | ||
In this example we are using the <code>oneplus-bacon</code> device. So we should be sure to have run <code>pmbootstrap init</code> and select <code>oneplus-bacon</code> as the target device. | In this example we are using the <code>oneplus-bacon</code> device. So we should be sure to have run <code>pmbootstrap init</code> and select <code>oneplus-bacon</code> as the target device. Most devices should include a link to their kernel package at the bottom of their wiki page. | ||
<syntaxhighlight lang="shell-session"> | <syntaxhighlight lang="shell-session"> | ||
Line 83: | Line 83: | ||
=== Packaging and flashing the kernel === | === Packaging and flashing the kernel === | ||
A kernel compiled under <code>envkernel.sh</code> can be packaged by pmbootstrap by using the <code>--envkernel</code> build option. | A kernel compiled under <code>envkernel.sh</code> can be packaged by pmbootstrap by using the <code>--envkernel</code> build option. | ||
<syntaxhighlight lang="shell-session"> | <syntaxhighlight lang="shell-session"> | ||
Line 88: | Line 89: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
After compiling and packaging the kernel, it can be flashed to device using the standard pmbootstrap flash commands. | Usually if the device boots to SSH with USB networking and has support for kernel upgrades, you can install the new kernel by sideloading. | ||
<syntaxhighlight lang="shell-session"> | |||
$ pmbootstrap sideload linux-oneplus-bacon | |||
</syntaxhighlight> | |||
After compiling and packaging the kernel, it can be flashed to device using the standard pmbootstrap flash commands. Note that if your kernel includes kernel modules (most mainline kernels do) these will not be installed and some features might break when you boot back up. In this case you can sideload as above once you have a booting kernel. | |||
<syntaxhighlight lang="shell-session"> | <syntaxhighlight lang="shell-session"> | ||
$ pmbootstrap flasher flash_kernel | $ pmbootstrap flasher flash_kernel | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Packaging kernels built without envkernel == | |||
As of {{MR|2175}} (not yet merged as of 2022-09-13) the envkernel packaging logic can be used to package kernels built directly on the host. This is intended to allow folks who prefer to set up their own kernel building environment to still make use of pmbootstrap for packaging and sideloading the new kernel. | |||
Currently this requires that you use <code>.output</code> as your output directory (add <code>O=.output</code> as an argument to make). With that done just build your kernel as normal and follow the packaging/flashing steps above. | |||
== See also == | == See also == | ||
Line 97: | Line 109: | ||
* {{MR|1747}} pmbootstrap build --envkernel | * {{MR|1747}} pmbootstrap build --envkernel | ||
* [https://gitlab.com/postmarketOS/pmbootstrap/issues/1672#note_105668759 a quick Q&A about using envkernel.sh for the Nexus 5] (if you have more questions, please open a new issue or ask in the chat). | * [https://gitlab.com/postmarketOS/pmbootstrap/issues/1672#note_105668759 a quick Q&A about using envkernel.sh for the Nexus 5] (if you have more questions, please open a new issue or ask in the chat). | ||
* {{MR|2175}} support for using the envkernel packaging logic on kernels built on the host | |||
[[Category:Guide]] | [[Category:Guide]] |
Revision as of 16:09, 13 September 2022
This page details how to compile a kernel manually using the envkernel.sh
helper script as well as how to package and install a locally compiled kernel. This workflow can be used to quickly iterate and test during kernel development by using the existing kernel packaging and upgrade process to install a development kernel.
Usually when compiling a kernel, you would install all dependencies and a cross compiler in your host system. To make it easier, we have the envkernel.sh
script (for fish shell: envkernel.fish
). It sets up an Alpine Linux chroot with all the dependencies by using pmbootstrap
internally, exports the environment variables to use the right cross compiler and creates an alias to make
. This means, whenever you type make
after sourcing that script, it will actually run make
in the chroot.
Selecting a kernel
This section details how to fetch the kernel source of an existing postmarketOS device. Existing kernel aports can be found in the aports/device
directory.
In the following example we will use the oneplus-bacon
device. The kernel aport is in the aports/device/linux-oneplus-bacon
directory. Within the APKBUILD is the source
variable which lists the kernel source repository.
After determining the kernel you want to work with, download the source code.
$ git clone https://github.com/LineageOS/android_kernel_oneplus_msm8974.git
$ cd android_kernel_oneplus_msm8974
Preparing the source directory
To compile the current version of the kernel, check out the git revision found in the APKBUILD.
$ git checkout dd65620ba04a8c6ba0e30553c9c95388daefae02 # example
Applying patches
Some kernel aports have patches applied on top of the remote source. You may want to apply these patches if they aren't in the source tree you have checked out.
For example oneplus-bacon
has a patch which isn't in the git revision in the prior example.
$ git apply /code/pmboostrap/aports/device/linux-oneplus-bacon/02_gpu-msm-fix-gcc5-compile.patch
Kernels which can only be compiled with older GCC versions may need the compiler-gcc6.h
. If this header exists in the kernel aport then copy it to the kernel source directory.
$ cp /code/pmboostrap/aports/device/linux-oneplus-bacon/compiler-gcc6.h include/linux/
Compile the kernel
The envkernel.sh script is not provided when you installed pmbootstrap from pip. You have to install pmbootstrap from git to have it. |
The envkernel.sh
script will set up a build environment based on the target device configured for pmbootstrap
.
In this example we are using the oneplus-bacon
device. So we should be sure to have run pmbootstrap init
and select oneplus-bacon
as the target device. Most devices should include a link to their kernel package at the bottom of their wiki page.
$ pmbootstrap init
Run the envkernel.sh
script once in the kernel source directory to initialize the build environment. If the kernel can only be compiled with GCC6 then pass the --gcc6
flag.
$ source /code/pmbootstrap/helpers/envkernel.sh --gcc6
Copy the defconfig from the kernel aport to the kernel source directory.
$ cp /code/pmboostrap/aports/device/testing/linux-oneplus-bacon/config-oneplus-bacon.armv7 arch/arm/configs/oneplus_bacon_defconfig
Build the defconfig and kernel with the following commands.
$ make oneplus_bacon_defconfig
$ make
Run the kernel
Post make scripts
Some kernels require extra packaging steps such as dtbtool
. The envkernel.sh
build environment works within the pmbootstrap chroots. The run-script
alias can be used to execute scripts within the source or build directory in the chroot.
In this example we are using the oneplus-bacon
which requires dtbtool
. Create a script with the dtbtool
command named post-make.sh
in the kernel source directory.
#!/bin/sh
dtbTool -s 2048 -p "${srcdir}/scripts/dtc/" -o \
"${builddir}/arch/arm/boot/dt.img" \
"${builddir}/arch/arm/boot"
Run the script.
$ run-script post-make.sh
Packaging and flashing the kernel
A kernel compiled under envkernel.sh
can be packaged by pmbootstrap by using the --envkernel
build option.
$ pmbootstrap build --envkernel linux-oneplus-bacon
Usually if the device boots to SSH with USB networking and has support for kernel upgrades, you can install the new kernel by sideloading.
$ pmbootstrap sideload linux-oneplus-bacon
After compiling and packaging the kernel, it can be flashed to device using the standard pmbootstrap flash commands. Note that if your kernel includes kernel modules (most mainline kernels do) these will not be installed and some features might break when you boot back up. In this case you can sideload as above once you have a booting kernel.
$ pmbootstrap flasher flash_kernel
Packaging kernels built without envkernel
As of !2175 (not yet merged as of 2022-09-13) the envkernel packaging logic can be used to package kernels built directly on the host. This is intended to allow folks who prefer to set up their own kernel building environment to still make use of pmbootstrap for packaging and sideloading the new kernel.
Currently this requires that you use .output
as your output directory (add O=.output
as an argument to make). With that done just build your kernel as normal and follow the packaging/flashing steps above.
See also
- !1703 optional gcc6 argument
- !1747 pmbootstrap build --envkernel
- a quick Q&A about using envkernel.sh for the Nexus 5 (if you have more questions, please open a new issue or ask in the chat).
- !2175 support for using the envkernel packaging logic on kernels built on the host