From b196c42657703b93c93210bf6743f2aa745a88bc Mon Sep 17 00:00:00 2001
From: sbwml <admin@cooluc.com>
Date: Fri, 4 Oct 2024 10:51:22 +0800
Subject: [PATCH 05/10] kernel: Add support for llvm/clang compiler

Signed-off-by: sbwml <admin@cooluc.com>
---
 config/Config-devel.in |  7 +++++++
 include/kernel.mk      | 13 ++++++++++++-
 include/package.mk     |  4 ++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/config/Config-devel.in b/config/Config-devel.in
index cbac91c..9079303 100644
--- a/config/Config-devel.in
+++ b/config/Config-devel.in
@@ -95,6 +95,13 @@ menuconfig DEVEL
 		default "-falign-functions=32" if TARGET_bcm53xx
 		default ""
 
+	config KERNEL_CC
+		string "Set kernel C compiler" if DEVEL
+		default "\$(TARGET_CC)"
+		help
+		  Enter C compiler name or full pathname i.e.: clang
+		  If not set, uses '$(TARGET_CC)'
+
 	config EXTERNAL_KERNEL_TREE
 		string "Use external kernel tree" if DEVEL
 		default ""
diff --git a/include/kernel.mk b/include/kernel.mk
index 6ef7663..1648a6f 100644
--- a/include/kernel.mk
+++ b/include/kernel.mk
@@ -35,7 +35,7 @@ else
     KERNEL_CC?=$(HOSTCC)
     KERNEL_CROSS?=
   else
-    KERNEL_CC?=$(TARGET_CC)
+    KERNEL_CC?=$(call qstrip,$(CONFIG_KERNEL_CC))
     KERNEL_CROSS?=$(TARGET_CROSS)
   endif
 
@@ -125,6 +125,17 @@ ifneq (,$(KERNEL_CC))
   KERNEL_MAKE_FLAGS += CC="$(KERNEL_CC)"
 endif
 
+ifneq (,$(findstring clang,$(KERNEL_CC)))
+  ifneq (,$(filter clang-%,$(KERNEL_CC)))
+    LLVM := $(subst clang-,,$(KERNEL_CC))
+    LLVM_LLD := ld.lld-$(subst clang-,,$(KERNEL_CC))
+  else
+    LLVM := 1
+    LLVM_LLD := ld.lld
+  endif
+  KERNEL_MAKE_FLAGS += LD="$(LLVM_LLD)" LLVM=$(LLVM) LLVM_IAS=1
+endif
+
 KERNEL_NOSTDINC_FLAGS = \
 	-nostdinc $(if $(DUMP),, -isystem $(shell $(TARGET_CC) -print-file-name=include))
 
diff --git a/include/package.mk b/include/package.mk
index 7fbecf9..3e988ed 100644
--- a/include/package.mk
+++ b/include/package.mk
@@ -23,6 +23,10 @@ else
 PKG_JOBS?=$(if $(PKG_BUILD_PARALLEL),$(MAKE_J),-j1)
 endif
 
+ifneq (,$(findstring clang,$(KERNEL_CC)))
+  MAKE := $(KERNEL_MAKE)
+endif
+
 PKG_BUILD_FLAGS?=
 __unknown_flags=$(filter-out no-iremap no-mips16 gc-sections no-gc-sections lto no-lto no-mold,$(PKG_BUILD_FLAGS))
 ifneq ($(__unknown_flags),)
-- 
2.43.5

