Manjaro Linux kernel build with Clang/LLVM(linux-5.17)


Manjaro Linuxでkernel-5.17をclangでビルドしました。

まずビルド用のPKGBUILDファイルを取得する。

mkdir pkgbuild
cd pkgbuild
git clone --depth 1 https://gitlab.manjaro.org/packages/core/linux517
cd linux517

まだrc8(release candidate)用のPKGBUILDなので正式リリースされた5.17用に修正する。
また環境変数を設定することでgccではなく、clangでもビルドを行えるので、その指示もPKGBUILDに含めています。
自分でカーネルオプションを調整できるように、make menuconfigも加えています。

以下、PKGBUILDの差分。

diff --git a/PKGBUILD b/PKGBUILD
index 021239b..0700650 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -5,23 +5,24 @@
 # Thomas Baechler <[email protected]>
 
 _basekernel=5.17
-_rc=rc8
-_commit=09688c0166e76ce2fb85e86b9d99be8b0084cdf9
+#_rc=rc8
+#_commit=09688c0166e76ce2fb85e86b9d99be8b0084cdf9
 pkgrel=1
 
 _basever=${_basekernel//.}
 _kernelname=-MANJARO
 pkgbase=linux${_basever}
 pkgname=("$pkgbase" "$pkgbase-headers")
-pkgver=5.17rc8.220315.g6c11cfe
+pkgver=5.17
 arch=('x86_64')
 url="https://www.kernel.org/"
 license=('GPL2')
 makedepends=(bc docbook-xsl libelf pahole git inetutils kmod xmlto cpio perl tar xz)
 options=('!strip')
-source=("linux517-$_commit.zip::https://codeload.github.com/torvalds/linux/zip/$_commit"
-        #"https://www.kernel.org/pub/linux/kernel/v5.x/linux-${_basekernel}.tar.xz"
-        #"https://www.kernel.org/pub/linux/kernel/v5.x/patch-${pkgver}.xz"
+source=(
+#"linux517-$_commit.zip::https://codeload.github.com/torvalds/linux/zip/$_commit"
+        "https://www.kernel.org/pub/linux/kernel/v5.x/linux-${_basekernel}.tar.xz"
+        "https://www.kernel.org/pub/linux/kernel/v5.x/patch-${pkgver}.xz"
         'config'
         # ARCH Patches
 
@@ -44,8 +45,9 @@ source=("linux517-$_commit.zip::https://codeload.github.com/torvalds/linux/zip/$
         '0411-bootsplash.patch'
         '0412-bootsplash.patch'
         '0413-bootsplash.gitpatch')
-sha256sums=('bb9e54042d47237f4d629a6da2dc0a13d85e579779d214b8d560d600223eaa02'
-            '0bfccfe6be1e61cd418a84d5244858a03b5d15f5e59d4d4362d63c633e7146c5'
+sha256sums=('555fef61dddb591a83d62dd04e252792f9af4ba9ef14683f64840e46fa20b1b1'
+            'e8725bd614fc6fd45f4102262adefdc2d5af778a68975fbeb27e66688f22fc9b'
+            'SKIP'
             '2b11905b63b05b25807dd64757c779da74dd4c37e36d3f7a46485b1ee5a9d326'
             '94a8538251ad148f1025cc3de446ce64f73dc32b01815426fb159c722e8fa5bc'
             '1f18c5c10a3c63e41ecd05ad34cd9f6653ba96e9f1049ce2b7bb6da2578ae710'
@@ -63,13 +65,17 @@ sha256sums=('bb9e54042d47237f4d629a6da2dc0a13d85e579779d214b8d560d600223eaa02'
             '60e295601e4fb33d9bf65f198c54c7eb07c0d1e91e2ad1e0dd6cd6e142cb266d'
             '035ea4b2a7621054f4560471f45336b981538a40172d8f17285910d4e0e0b3ef')
 
-pkgver() {
-  printf %s%s.%s.g%s "$_basekernel" "$_rc" "$(date +%y%m%d)" "$(git rev-parse --short HEAD)"
-}
+export set LLVM=1
+export set LLVM_IAS=1
+export set CC='clang'
+export set CXX='clang++'
+export set HOSTCC='clang'
+export set HOSTCXX='clang++'
+export set LD=ld.lld
 
 prepare() {
-  cd linux-$_commit
-#  cd "linux-${_basekernel}"
+#  cd linux-$_commit
+  cd "linux-${_basekernel}"
 
   # add upstream patch
 #  msg "add upstream patch"
@@ -108,13 +114,15 @@ prepare() {
   msg "get kernel version"
   make prepare
 
+  make menuconfig 
+
   msg "rewrite configuration"
   yes "" | make config >/dev/null
 }
 
 build() {
-  cd linux-$_commit
-#  cd "linux-${_basekernel}"
+#  cd linux-$_commit
+  cd "linux-${_basekernel}"
 
   msg "build"
   make ${MAKEFLAGS} LOCALVERSION= bzImage modules
@@ -126,8 +134,8 @@ package_linux517() {
   optdepends=('crda: to set the correct wireless channels of your country')
   provides=("linux=${pkgver}" VIRTUALBOX-GUEST-MODULES WIREGUARD-MODULE)
 
-  cd linux-$_commit
-#  cd "linux-${_basekernel}"
+#  cd linux-$_commit
+  cd "linux-${_basekernel}"
 
   # get kernel version
   _kernver="$(make LOCALVERSION= kernelrelease)"
@@ -166,8 +174,8 @@ package_linux517-headers() {
   depends=('gawk' 'python' 'libelf' 'pahole')
   provides=("linux-headers=$pkgver")
 
-  cd linux-$_commit
-#  cd "linux-${_basekernel}"
+#  cd linux-$_commit
+  cd "linux-${_basekernel}"
   local _builddir="${pkgdir}/usr/lib/modules/${_kernver}/build"
 
   install -Dt "${_builddir}" -m644 Makefile .config Module.symvers

コンソールコマンドで音声を流すためにsoxをインストール。

pamac install sox

カーネルのパッケージをビルドして、終わったら音を鳴らしています。

MAKEFLAGSでコンパイルの同時並列処理数を指定する。
makepkg -Cで既存のソースディレクトリを削除。

MAKEFLAGS='-j3' makepkg -C && play ~/Downloads/done.wav || play error.wav

ちなみにビルド途中でエラーが出た場合には、makepkg -eでビルドだけ続行できる。

MAKEFLAGS='-j3' makepkg -e && play ~/Downloads/done.wav || play error.wav

パッケージができたら、インストールして終わりです。
自分は独自リポジトリを用意しているので、そこに追加してリポジトリのdbファイルを更新して、pamac updateでインストールしています。
以上です。