[PATCH 1/2] Makefile: Support building with Clang and LLVM binutils
Jessica Clarke
jrtc27 at jrtc27.com
Mon Jul 5 06:09:09 PDT 2021
On 5 Jul 2021, at 14:05, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> On Sun, Jul 4, 2021 at 1:56 AM Jessica Clarke <jrtc27 at jrtc27.com> wrote:
>>
>> 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).
>>
>
> Please update the documentation for how to use LLVM to build as well.
>
>> 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
>
> This looks like an irrelevant bug fix?
No; GCC will forward -N to the linker despite it being a linker-only
option, Clang requires it to be manually forwarded with -Wl.
Jess
More information about the opensbi
mailing list