[PATCH 1/2] Makefile: Support building with Clang and LLVM binutils
Anup Patel
anup at brainfault.org
Tue Jul 6 01:33:30 PDT 2021
On Mon, Jul 5, 2021 at 6:35 PM 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.
Yes, we will need some documentation about building with LLVM. If you don't
want to add it as part of this series then some of us can add it separately.
>
> > 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
There were build issues reported by yocto folks so we had to
bring-in "?=" assignments.
How about this ....
ifneq ($(LLVM),)
CC = clang
AR = llvm-ar
LD = ld.lld
OBJCOPY = llvm-objcopy
else
CC ?= $(CROSS_COMPILE)gcc
AR ?= $(CROSS_COMPILE)ar
LD ?= $(CROSS_COMPILE)ld
OBJCOPY ?= $(CROSS_COMPILE)objcopy
endif
CPP = $(CC) -E
> >
> > -# 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?
I think it makes sense to keep this change here because it is required for
clang support and this patch adds clang support.
It will be certainly good to have one sentence in the commit description
describing this change. No need to have a separate patch for this change.
Regards,
Anup
>
> > ELFFLAGS += $(platform-ldflags-y)
> > ELFFLAGS += $(firmware-ldflags-y)
> >
> > 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
> > --
>
> Regards,
> Bin
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list