1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Manjaro Linux kernel build with Clang/LLVM(and ccache)

Last updated at Posted at 2021-11-05

参考サイト
llvm、clangでkernelをビルドする

Manjaroで、clangでkernelをビルドする場合、リンカーlldもインストールする。

sudo pacman -S clang llvm lld

kernelビルドの時間短縮について、以下に網羅されています。

ManjaroのkernelのPKGBUILDに若干修正を加えて、ccacheを利用するためのMakefile.patchを用意しています。
以下は、clang(Clang/llvm and linker is lld.)を利用する場合です。

diff --git a/PKGBUILD b/PKGBUILD
index 06ba6bd..07b92ed 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -60,7 +60,8 @@ source=("https://www.kernel.org/pub/linux/kernel/v5.x/linux-${_basekernel}.tar.x
         '0510-bootsplash.patch'
         '0511-bootsplash.patch'
         '0512-bootsplash.patch'
-        '0513-bootsplash.gitpatch')
+        '0513-bootsplash.gitpatch'
+	'Makefile.patch')
 sha256sums=('7e068b5e0d26a62b10e5320b25dce57588cbbc6f781c090442138c9c9c3271b2'
             'e96f1d8ea64bf66cd2e01e54e0929117feafe443161bc665af1ef48474cb45e2'
             '5e18e915aa406ad1548c2cdf0a1485657bf582c5aff64076882b9572af65673e'
@@ -88,7 +89,8 @@ sha256sums=('7e068b5e0d26a62b10e5320b25dce57588cbbc6f781c090442138c9c9c3271b2'
             'e9f22cbb542591087d2d66dc6dc912b1434330ba3cd13d2df741d869a2c31e89'
             '27471eee564ca3149dd271b0817719b5565a9594dc4d884fe3dc51a5f03832bc'
             '60e295601e4fb33d9bf65f198c54c7eb07c0d1e91e2ad1e0dd6cd6e142cb266d'
-            '035ea4b2a7621054f4560471f45336b981538a40172d8f17285910d4e0e0b3ef')
+            '035ea4b2a7621054f4560471f45336b981538a40172d8f17285910d4e0e0b3ef'
+            'f1b209cd65fd198e33f86570a84d5310936bbc2bbafa7a64d3a34270cf9433bd')
 
 prepare() {
   cd "linux-${_basekernel}"
@@ -129,10 +131,16 @@ prepare() {
   sed -i '2iexit 0' scripts/depmod.sh
 
   msg "get kernel version"
+  LLVM=1
+  LLVM_IAS=1
+  CC='ccache clang'
+  CXX='ccache clang++'
   make prepare
 
   msg "rewrite configuration"
-  yes "" | make config >/dev/null
+  make oldconfig
+  #lsmod > `pwd`/lsmod.txt && LSMOD=`pwd`/lsmod.txt make localmodconfig
+  make menuconfig
 }
 
 build() {
--- src/linux-5.14/Makefile	2021-11-05 16:58:25.293406677 +0900
+++ ./Makefile	2021-11-05 16:42:13.026766134 +0900
@@ -425,11 +425,11 @@
 HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
 
 ifneq ($(LLVM),)
-HOSTCC	= clang
-HOSTCXX	= clang++
+HOSTCC	= ccache clang
+HOSTCXX	= ccache clang++
 else
-HOSTCC	= gcc
-HOSTCXX	= g++
+HOSTCC	= ccache gcc
+HOSTCXX	= ccache g++
 endif
 
 export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
@@ -444,7 +444,7 @@
 # Make variables (CC, etc...)
 CPP		= $(CC) -E
 ifneq ($(LLVM),)
-CC		= clang
+CC		= ccache clang
 LD		= ld.lld
 AR		= llvm-ar
 NM		= llvm-nm
@@ -453,7 +453,7 @@
 READELF		= llvm-readelf
 STRIP		= llvm-strip
 else
-CC		= $(CROSS_COMPILE)gcc
+CC		= ccache $(CROSS_COMPILE)gcc
 LD		= $(CROSS_COMPILE)ld
 AR		= $(CROSS_COMPILE)ar
 NM		= $(CROSS_COMPILE)nm

DKMS:Support CC=clang and LD=ld.lld
Dynamic Kernel Module Supportでカーネルモジュールをコンパイルする際、clang/llvm,ld.lldを用いるようにしておきます。
上記の修正を取り込み、clang,lldでビルドしたカーネルの場合、dkmsでカーネルモジュールをコンパイルする場合、clang,lldを用いるようにします。

dkms-3.0.1

diff --git a/dkms.in b/dkms.in
index 9c98a89..ce213e1 100644
--- a/dkms.in
+++ b/dkms.in
@@ -575,6 +575,23 @@ read_conf()
     [[ ! $make_command ]] && make_command="make -C $kernel_source_dir M=$dkms_tree/$module/$module_version/build"
     [[ ! $clean ]] && clean="make -C $kernel_source_dir M=$dkms_tree/$module/$module_version/build clean"

+    # Check if clang was used to compile or lld was used to link the kernel.
+    if [[ -e $kernel_source_dir/vmlinux ]]; then
+      if  readelf -p .comment $kernel_source_dir/vmlinux | grep -q clang; then
+        make_command="${make_command} CC=clang"
+      fi
+      if  readelf -p .comment $kernel_source_dir/vmlinux | grep -q LLD; then
+        make_command="${make_command} LD=ld.lld"
+      fi
+    elif [[ -e $kernel_source_dir/.config ]]; then
+      if grep -q CONFIG_CC_IS_CLANG=y $kernel_source_dir/.config; then
+        make_command="${make_command} CC=clang"
+      fi
+      if grep -q CONFIG_LD_IS_LLD=y $kernel_source_dir/.config; then
+        make_command="${make_command} LD=ld.lld"
+      fi
+    fi
+
     # Set patch_array (including kernel specific patches)
     count=0
     for ((index=0; index < ${#PATCH[@]}; index++)); do```

カーネルオプションを調整して様子を見たい場合などに便利です。
私がオプション調整で使うのは、デフォルトで使うファイルシステムをモジュールでなく、カーネル埋め込みにするなどしています。

追記
余談ですが、makepkgコマンドではなく、manjaro-toolsのbuildpkgコマンドを使う際は、chroot下の環境にclangが含まれていないので、PKGBUILDのmakedependsにclang,llvm,lldを加えておくとmanjaro-toolsのbuildpkgでも、clangを用いてカーネルをビルドできます。

diff --git a/PKGBUILD b/PKGBUILD
index ad28275..623d53d 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -25,6 +25,9 @@ makedepends=('bc'
     'cpio'
     'perl'
     'tar'
+    'clang'
+    'llvm'
+    'lld'
     'xz')
 options=('!strip')
 source=("https://www.kernel.org/pub/linux/kernel/v5.x/linux-${_basekernel}.tar.xz"
@@ -93,6 +96,11 @@ sha256sums=('57b2cf6991910e3b67a1b3490022e8a0674b6965c74c12da1e99d138d1991ee8'
             '60e295601e4fb33d9bf65f198c54c7eb07c0d1e91e2ad1e0dd6cd6e142cb266d'
             '035ea4b2a7621054f4560471f45336b981538a40172d8f17285910d4e0e0b3ef')
 
+export set LLVM=1
+export set LLVM_IAS=1
+export set CC='ccache clang'
+export set CXX='ccache clang++'
+
 prepare() {
   cd "linux-${_basekernel}"
 

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?