Makefile.llvm 5.23 KB
# Main makefile for building test with llvm/binutils toolchain

TOP:=$(shell pwd)

TOOL=llvm
TOOLCHAIN=riscv64-daiteq-elf
CC=clang
LC=llc
LD=$(TOOLCHAIN)-ld
AS=$(TOOLCHAIN)-as
AR=$(TOOLCHAIN)-ar
OBJDUMP=$(TOOLCHAIN)-objdump
RANLIB=llvm-ranlib
INSPECT=$(TOP)/../scripts/inspectfp_rv.py 

# default linker script
DEFLNKSCR=scripts/qemu_noelv.lds
# source codes of libraries 
LIBDIR=$(abspath $(TOP)/../libs)
# added objects (from BSP/LIBBCC library)
ADDOBJS=bcc/first.o bcc/crt0.o

LIBFLAGS=-ggdb

# include project settings from a specific test
include $(TEST)/Makefile


$(info * Process in Makefile.llvm)
#$(info .   TOP=$(TOP))
#$(info .   BDIR=$(BDIR))
#$(info .   DSUFFIX=$(DSUFFIX))
#$(info .   TEST=$(TEST))
#$(info .   LDS=$(LDS))
#$(info .   ID=$(ID))
$(info .   FPUCFG=$(FPUCFG))
$(info .   SWARCFG=$(SWARCFG))
#$(info .   MAKEVAR=$(MAKEVAR))
#$(info .   UCFLAGS=$(UCFLAGS))
#$(info .   ARCH=$(ARCH))
#$(info .   ABI=$(ABI))
#$(info .   ARCHCFLAGS=$(ARCHCFLAGS))
#$(info . * BIN=$(BIN))
#$(info .   SOURCES=$(SOURCES))
#$(info .   HEADERS=$(HEADERS))
#$(info .   LIBS=$(LIBS))

ADD_ARCH_CCFLG=
ifneq ($(FPUCFG),)
  ADD_ARCH_CCFLG+=-daiteq-fpu-type=$(FPUCFG)
endif
ifneq ($(SWARCFG),)
#  ADD_ARCH_CCFLG+=-daiteq-fpu-type=$(FPUCFG)
endif
ARCH_CC_FLAGS:=-march=$(ARCH) -mabi=$(ABI) $(ADD_ARCH_CCFLG) $(ARCHCFLAGS)

#:%=-m%)
# assembler has not special extensions specified with ARCH (from version 220706 additional extensions are used)
#ARCH_AS_FLAGS:=-march=$(word 1,$(subst _, ,$(ARCH))) -mabi=$(ABI)
ARCH_AS_FLAGS:=-march=$(ARCH) -mabi=$(ABI)

$(info : ARCH_CC_FLAGS=$(ARCH_CC_FLAGS))

ifeq (n,$(findstring n,$(firstword -$(MAKEFLAGS))))
 $(info RUN SHELL CMD: touch /tmp/dummy.c; $(CC) -print-sf-uid $(ARCH_CC_FLAGS) -c /tmp/dummy.c -o /dev/null 2>/dev/null)
endif

ARCHID:=$(shell touch /tmp/dummy.c; $(CC) -print-sf-uid $(ARCH_CC_FLAGS) -c /tmp/dummy.c -o /dev/null 2>/dev/null)

$(info : ARCHID=$(ARCHID))

ifeq ($(ARCHID),)
$(error ARCHID cannot be empty)
endif

LIBDSTDIR=$(BDIR)
DSTDIR=$(BDIR)/$(ARCHID)$(DSUFFIX)
PRGBIN=$(DSTDIR)/$(ID)-$(BIN).elf
PRGDIS=$(DSTDIR)/$(ID)-$(TEST)/$(BIN).dis
PRGINF=$(DSTDIR)/$(ID)-$(TEST)/$(BIN).inf
PRGINSPECT=$(DSTDIR)/$(ID)-$(TEST)/$(BIN).inspect


ifeq ($(LDS),)
LNKSCR=-T $(TOP)/$(DEFLNKSCR)
else
LNKSCR=-T $(TOP)/$(LDS)
endif

OBJS=$(SOURCES:%.c=$(DSTDIR)/$(ID)-$(TEST)/%.o)
LIBSAID:=$(foreach lib,$(LIBS),$(LIBDSTDIR)/lib$(lib)/$(ARCHID)/lib$(lib).a)
LIBDIRS:=$(foreach lib,$(sort $(LIBS)),$(LIBDSTDIR)/lib$(lib)/$(ARCHID))
AOBJDST=$(foreach ao,$(ADDOBJS),$(LIBDSTDIR)/lib$(dir $(ao))$(ARCHID)/$(notdir $(ao)))


# we need building directory, program directories and program binaries
all: $(DSTDIR)/$(ID)-$(TEST) $(PRGBIN) $(PRGDIS) $(PRGINF) $(PRGINSPECT)
	@echo "done..."

$(DSTDIR)/$(ID)-$(TEST):
	@mkdir -p $(DSTDIR)/$(ID)-$(TEST)

$(PRGINSPECT): $(PRGDIS) $(INSPECT)
	@$(INSPECT) $< list > $@

$(PRGINF):
	@echo "Compilation settings (llvm)" > $@
	@echo ".   TOP=$(TOP)" >> $@
	@echo ".   BDIR=$(BDIR)" >> $@
	@echo ".   DSUFFIX=$(DSUFFIX)" >> $@
	@echo ".   TEST=$(TEST)" >> $@
	@echo ".   LDS=$(LDS)" >> $@
	@echo ".   ID=$(ID)" >> $@
	@echo ".   FPUCFG=$(FPUCFG)" >> $@
	@echo ".   SWARCFG=$(SWARCFG)" >> $@
	@echo ".   MAKEVAR=$(MAKEVAR)" >> $@
	@echo ".   UCFLAGS=$(UCFLAGS)" >> $@
	@echo ".   ARCH=$(ARCH)" >> $@
	@echo ".   ABI=$(ABI)" >> $@
	@echo ".   ARCHCFLAGS=$(ARCHCFLAGS)" >> $@
	@echo ". * BIN=$(BIN)" >> $@
	@echo ".   SOURCES=$(SOURCES)" >> $@
	@echo ".   HEADERS=$(HEADERS)" >> $@
	@echo ".   LIBS=$(LIBS)" >> $@
	@echo "->  ARCHID=$(ARCHID)" >> $@

$(PRGDIS): $(PRGBIN)
	@$(OBJDUMP) -S $< > $@

$(PRGBIN): $(LIBSAID) $(OBJS)
	@echo "Link application $@"
	@$(LD) --gc-sections $(LNKSCR) $(LIBDIRS:%=-L%) -o $@ $(AOBJDST) $(OBJS) $(LIBS:%=-l%)

# rules for building libraries
define GEN_LIB_RULE
$(LIBDSTDIR)/lib$(lib)/$(ARCHID)/lib$(lib).a: $(LIBDIR)/Makefile.lib$(lib)
	@mkdir -p $(LIBDSTDIR)/lib$(lib)/$(ARCHID)
	@make -C $(LIBDIR) -f Makefile.lib$(lib) all LIB=lib$(lib) LIBFILE=$(abspath $(LIBDSTDIR)/lib$(lib)/$(ARCHID))/lib$(lib).a TOP=$(abspath $(TOP)) DSTDIR=$(abspath $(LIBDSTDIR)/lib$(lib)/$(ARCHID)) CCARCH="$(ARCH_CC_FLAGS)" ASARCH="$(ARCH_AS_FLAGS)" ARCHID=$(ARCHID) TOOL=$(TOOL) TOOLCHAIN=$(TOOLCHAIN) LIBFLAGS=$(LIBFLAGS) CC=$(CC) LC=$(LC) LD=$(LD) AS=$(AS) AR=$(AR) RANLIB=$(RANLIB)
endef

$(foreach lib,$(sort $(LIBS)), \
  $(eval $(GEN_LIB_RULE)) \
)

# rules for compiling object files
define GEN_OBJ_RULE
$(DSTDIR)/$(ID)-$(TEST)/$(src).o: $(DSTDIR)/$(ID)-$(TEST)/$(src).c_S
	@echo "Assemble $$@ from $$<"
	@$(AS) $(ARCH_AS_FLAGS) -gdwarf-5 -o $$@ $$<
$(DSTDIR)/$(ID)-$(TEST)/$(src).c_S: $(TOP)/$(TEST)/$(src).c $(HEADERS:%=$(TOP)/$(TEST)/%)
	@echo "Compile $$@ from $$<"
	@$(CC) $(ARCH_CC_FLAGS) $(CFLAGS) $(addprefix -D,$(DEFS)) $(UCFLAGS) $(addsuffix /include,$(addprefix -I$(LIBDSTDIR)/lib,$(sort $(LIBS)))) -fno-addrsig -S -o $$@ $$<
endef

#$(DSTDIR)/$(ID)-$(TEST)/$(src).c_S: $(DSTDIR)/$(ID)-$(TEST)/$(src).bc
#	@echo "Compile $$@ from $$<"
#	@$(LC) --target-abi=$(ABI) --filetype=asm -o $$@ $$<
#$(DSTDIR)/$(ID)-$(TEST)/$(src).bc: $(TOP)/$(TEST)/$(src).c $(HEADERS:%=$(TOP)/$(TEST)/%)
#	@echo "Compile $$@ from $$<"
#	@$(CC) -emit-llvm $(ARCH_CC_FLAGS) $(CFLAGS) $(addprefix -D,$(DEFS)) $(UCFLAGS) $(addsuffix /include,$(addprefix -I$(LIBDSTDIR)/lib,$(sort $(LIBS)))) -c -o $$@ $$<


$(foreach src,$(SOURCES:%.c=%), \
	$(eval $(GEN_OBJ_RULE)) \
)