# borrowed from kernel headers depends on it, e.g. put_unaligned_*().
 CFLAGS += -fno-strict-aliasing
 
-# Enabled Wthread-safety analysis for clang builds.
+# Set target flag and options when using clang as compiler.
 ifeq ($(CC_NO_CLANG), 0)
+  CLANG_TARGET_FLAGS_arm       := arm-linux-gnueabi
+  CLANG_TARGET_FLAGS_arm64     := aarch64-linux-gnu
+  CLANG_TARGET_FLAGS_m68k      := m68k-linux-gnu
+  CLANG_TARGET_FLAGS_mips      := mipsel-linux-gnu
+  CLANG_TARGET_FLAGS_powerpc   := powerpc64le-linux-gnu
+  CLANG_TARGET_FLAGS_riscv     := riscv64-linux-gnu
+  CLANG_TARGET_FLAGS_s390      := s390x-linux-gnu
+  CLANG_TARGET_FLAGS_x86       := x86_64-linux-gnu
+  CLANG_TARGET_FLAGS_x86_64    := x86_64-linux-gnu
+
+  # Default to host architecture if ARCH is not explicitly given.
+  ifeq ($(ARCH), $(HOSTARCH))
+    CLANG_TARGET_FLAGS := $(shell $(CLANG) -print-target-triple)
+  else
+    CLANG_TARGET_FLAGS := $(CLANG_TARGET_FLAGS_$(ARCH))
+  endif
+
+  ifeq ($(CROSS_COMPILE),)
+    ifeq ($(CLANG_TARGET_FLAGS),)
+      $(error Specify CROSS_COMPILE or add CLANG_TARGET_FLAGS for $(ARCH))
+    else
+      CLANG_FLAGS += --target=$(CLANG_TARGET_FLAGS)
+    endif # CLANG_TARGET_FLAGS
+  else
+    CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
+  endif # CROSS_COMPILE
+
+  CC := $(CLANG) $(CLANG_FLAGS) -fintegrated-as
+  CXX := $(CXX) $(CLANG_FLAGS) -fintegrated-as
+
+  # Enabled Wthread-safety analysis for clang builds.
   CFLAGS += -Wthread-safety
 endif