[PATCH 1/2] Makefile: Support building with Clang and LLVM binutils

Xiang W wxjstz at 126.com
Thu Jul 8 01:24:00 PDT 2021


在 2021-07-03星期六的 18:56 +0100,Jessica Clarke写道:
> This is intended to mirror the Linux kernel. Building with CC=clang
> will
> use Clang as the compiler but default to using the existing binutils.
> Building with LLVM=1 will default to using Clang and LLVM binutils.
> 
> Note that the ifdef CROSS_COMPILE is removed, since it served little
> purpose. Variables assigned with = are still overridable on the
> command
> line, the only difference compared with ?= is whether environment
> variables also override them, but that's not something Kbuild-using
> projects usually support (at least Linux and U-Boot both
> unconditionally
> use = like this now does).
> 
> Signed-off-by: Jessica Clarke <jrtc27 at jrtc27.com>
> ---
>  Makefile | 59 ++++++++++++++++++++++++++++++++++++++++++++----------
> --
>  1 file changed, 47 insertions(+), 12 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 6b64205..40bcab6 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -76,26 +76,47 @@ OPENSBI_VERSION_MINOR=`grep "define
> OPENSBI_VERSION_MINOR" $(include_dir)/sbi/sb
>  OPENSBI_VERSION_GIT=$(shell if [ -d $(src_dir)/.git ]; then git
> describe 2> /dev/null; fi)
>  
>  # Setup compilation commands
> -ifdef CROSS_COMPILE
> +ifneq ($(LLVM),)
> +CC             =       clang
> +AR             =       llvm-ar
> +LD             =       ld.lld
> +OBJCOPY                =       llvm-objcopy
> +else
>  CC             =       $(CROSS_COMPILE)gcc
> -CPP            =       $(CROSS_COMPILE)cpp
>  AR             =       $(CROSS_COMPILE)ar
>  LD             =       $(CROSS_COMPILE)ld
>  OBJCOPY                =       $(CROSS_COMPILE)objcopy
> -else
> -CC             ?=      gcc
> -CPP            ?=      cpp
> -AR             ?=      ar
> -LD             ?=      ld
> -OBJCOPY                ?=      objcopy
>  endif
> +CPP            =       $(CC) -E
>  AS             =       $(CC)
>  DTC            =       dtc
>  
> -# Guess the compillers xlen
> -OPENSBI_CC_XLEN := $(shell TMP=`$(CC) -dumpmachine | sed
> 's/riscv\([0-9][0-9]\).*/\1/'`; echo $${TMP})
> +ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
> +CC_IS_CLANG    =       y
> +else
> +CC_IS_CLANG    =       n
> +endif
> +
> +ifneq ($(shell $(LD) --version 2>&1 | head -n 1 | grep LLD),)
> +LD_IS_LLD      =       y
> +else
> +LD_IS_LLD      =       n
> +endif
> +
> +ifeq ($(CC_IS_CLANG),y)
> +ifneq ($(CROSS_COMPILE),)
> +CLANG_TARGET   =       -target $(notdir $(CROSS_COMPILE:%-=%))
> +endif
> +endif
> +
> +# Guess the compiler's XLEN
> +OPENSBI_CC_XLEN := $(shell TMP=`$(CC) $(CLANG_TARGET) -dumpmachine |
> sed 's/riscv\([0-9][0-9]\).*/\1/'`; echo $${TMP})
> +
> +# Guess the compiler's ABI and ISA
> +ifneq ($(CC_IS_CLANG),y)
>  OPENSBI_CC_ABI := $(shell TMP=`$(CC) -v 2>&1 | sed -n 's/.*\(with\-
> abi=\([a-zA-Z0-9]*\)\).*/\2/p'`; echo $${TMP})
>  OPENSBI_CC_ISA := $(shell TMP=`$(CC) -v 2>&1 | sed -n 's/.*\(with\-
> arch=\([a-zA-Z0-9]*\)\).*/\2/p'`; echo $${TMP})
> +endif
>  
>  # Setup platform XLEN
>  ifndef PLATFORM_RISCV_XLEN
> @@ -194,7 +215,11 @@ else
>  endif
>  
>  # Setup compilation commands flags
> -GENFLAGS       =       -I$(platform_src_dir)/include
> +ifeq ($(CC_IS_CLANG),y)
> +GENFLAGS       +=      $(CLANG_TARGET)
> +GENFLAGS       +=      -Wno-unused-command-line-argument
> +endif
> +GENFLAGS       +=      -I$(platform_src_dir)/include
>  GENFLAGS       +=      -I$(include_dir)
>  ifneq ($(OPENSBI_VERSION_GIT),)
>  GENFLAGS       +=      -
> DOPENSBI_VERSION_GIT="\"$(OPENSBI_VERSION_GIT)\""
> @@ -208,6 +233,9 @@ CFLAGS              +=      -fno-omit-frame-
> pointer -fno-optimize-sibling-calls
>  CFLAGS         +=      -mno-save-restore -mstrict-align
>  CFLAGS         +=      -mabi=$(PLATFORM_RISCV_ABI) -
> march=$(PLATFORM_RISCV_ISA)
>  CFLAGS         +=      -mcmodel=$(PLATFORM_RISCV_CODE_MODEL)
> +ifeq ($(LD_IS_LLD),y)
> +CFLAGS         +=      -mno-relax
> +endif
>  CFLAGS         +=      $(GENFLAGS)
>  CFLAGS         +=      $(platform-cflags-y)
>  CFLAGS         +=      -fno-pie -no-pie
> @@ -222,18 +250,25 @@ ASFLAGS           +=      -fno-omit-frame-
> pointer -fno-optimize-sibling-calls
>  ASFLAGS                +=      -mno-save-restore -mstrict-align
>  ASFLAGS                +=      -mabi=$(PLATFORM_RISCV_ABI) -
> march=$(PLATFORM_RISCV_ISA)
>  ASFLAGS                +=      -mcmodel=$(PLATFORM_RISCV_CODE_MODEL)
> +ifeq ($(LD_IS_LLD),y)
> +ASFLAGS                +=      -mno-relax
> +endif
>  ASFLAGS                +=      $(GENFLAGS)
>  ASFLAGS                +=      $(platform-asflags-y)
>  ASFLAGS                +=      $(firmware-asflags-y)
>  
>  ARFLAGS                =       rcs
>  
> -ELFFLAGS       +=      -Wl,--build-id=none -N -static-libgcc -lgcc
> +ELFFLAGS       +=      -Wl,--build-id=none -Wl,-N -static-libgcc -
> lgcc
>  ELFFLAGS       +=      $(platform-ldflags-y)
>  ELFFLAGS       +=      $(firmware-ldflags-y)
I tested it on my computer and clang will use GNU linker by default.
Because the GNU linker on my system does not support RISCV, it caused a
link error. The following code should be added here:

ifeq ($(LD_IS_LLD),y)
ELFFLAGS	+=	-fuse-ld=lld
endif

Regards,
Xiang W
>  

>  MERGEFLAGS     +=      -r
> +ifeq ($(LD_IS_LLD),y)
> +MERGEFLAGS     +=      -b elf
> +else
>  MERGEFLAGS     +=      -b elf$(PLATFORM_RISCV_XLEN)-littleriscv
> +endif
>  MERGEFLAGS     +=      -m elf$(PLATFORM_RISCV_XLEN)lriscv
>  
>  DTSCPPFLAGS    =       $(CPPFLAGS) -nostdinc -nostdlib -fno-builtin
> -D__DTS__ -x assembler-with-cpp
> -- 
> 2.31.0
> 
> 





More information about the opensbi mailing list