# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
#
##########################################################################
## The following variables must be set prior to invoking this Makefile  ##
## NAME        - Top level name of the final elf                        ##
## SRCS        - List of files to be compiled                           ##
## PROGRAM_DIR - Location of file corresponding to NAME                 ##
##########################################################################

PROGRAM_CFLAGS += -Wall -g -Os
ifeq ($(SIM),1)
  PROGRAM_CFLAGS += -DSIMULATION
endif

EXE           := $(NAME)
SW_DIR        := $(PROGRAM_DIR)/../..
LIB_DIR       := $(SW_DIR)/lib
LIB_NAME       = ot
EXT_DIR       := $(SW_DIR)/exts/common
EXT_SRCS      := $(EXT_DIR)/_crt.c
EXT_ASMS      :=

RV_TOOLS      ?= /tools/riscv/bin/
OBJCOPY       ?= $(subst gcc,objcopy,$(wordlist 1,1,$(CC)))
OBJDUMP       ?= $(subst gcc,objdump,$(wordlist 1,1,$(CC)))

# ARCH = rv32im # to disable compressed instructions
ARCH           = rv32imc
LINKER_SCRIPT ?= $(EXT_DIR)/link.ld

REGTOOL        = ../../util/regtool.py

CC            := $(RV_TOOLS)/riscv32-unknown-elf-gcc
CFLAGS        ?= -Wall -g -Os -march=$(ARCH) -mabi=ilp32 -static -mcmodel=medany \
	         -fvisibility=hidden -nostdlib -nostartfiles $(PROGRAM_CFLAGS)

OBJS          := $(SRCS:.c=.o) $(EXT_SRCS:.c=.o) $(EXT_ASMS:.S=.o)
DEPS           = $(OBJS:%.o=%.d)

LIBS           =-L$(LIB_DIR) -l$(LIB_NAME)
INCS          +=-I$(LIB_DIR)

OUTFILES      := $(EXE).elf $(EXE).vmem $(EXE).bin $(EXE).dis $(EXE).map
