# Copyright (c) 2020 ARM Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# not be construed as granting a license to any other intellectual
# property including but not limited to intellectual property relating
# to a hardware implementation of the functionality of the software
# licensed hereunder.  You may use the software subject to the license
# terms below provided that you ensure that this notice is replicated
# unmodified and in its entirety in all distributions of the software,
# modified or unmodified, in source code or in binary form.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

# Input files for each build type. We whitelist barmetal ones,
# and blacklist
BARE_INS = \
  m5_exit \
  m5_checkpoint
USER_INS = $(basename $(foreach BASE_DIR, . $(ISA), $(foreach IN_EXT, \
  $(IN_EXT_ASM) $(IN_EXT_C) $(IN_EXT_CXX), $(wildcard $(BASE_DIR)/*$(IN_EXT)))))

# Input values.
BOOTLOADER_SRC = bootloader/$(ISA)$(IN_EXT_ASM)
BOOTLOADER_OBJ = $(OUT_DIR)/bootloader$(OBJ_EXT)
CC = $(PREFIX)gcc
CXX = $(PREFIX)g++
GEM5_ROOT = $(CURDIR)/../../../gem5
M5OP_OBJ = $(GEM5_ROOT)/util/m5/build/$(M5_ISA)/out/libm5.a
# Common to USER and BARE.
CFLAGS = $(CCFLAGS) -std=c11
# Common to C and C++.
CCFLAGS = \
  -I $(GEM5_ROOT)/include/ \
  -O3 \
  -Wall \
  -Werror \
  -Wextra \
  -fno-pie \
  -ggdb3 \
  -no-pie \
  -pedantic \
  -static \
  $(CCFLAGS_ISA)
# -Wl,--whole-archive allows C++ threads to work with -static.
# https://stackoverflow.com/questions/35116327/when-g-static-link-pthread-cause-segmentation-fault-why
LDFLAGS_USER = \
  -lrt \
  -pthread \
  -Wl,--whole-archive \
  -lpthread \
  -Wl,--no-whole-archive
CCFLAGS_BARE = $(CFLAGS) \
  -T link.ld \
  -Wl,--section-start=.text=0x80000000 \
  -fno-asynchronous-unwind-tables \
  -fno-unwind-tables \
  -nostartfiles \
  -nostdlib
CFLAGS_USER = $(CFLAGS)
CXXFLAGS = $(CCFLAGS) -std=c++11
CXXFLAGS_BARE = $(CXXFLAGS)
CXXFLAGS_USER = $(CXXFLAGS)
IN_EXT_ASM = .S
IN_EXT_C = .c
IN_EXT_CXX = .cpp
OUT_DIR_BASE = out
OUT_DIR = $(OUT_DIR_BASE)/$(ISA)
OUT_BARE_DIR = $(OUT_DIR)/bare
OUT_USER_DIR = $(OUT_DIR)/user
OBJ_EXT = .o
OUT_EXT = .out

ifeq ($(ISA),)
ISA = $(shell uname -m)
endif

ifeq ($(ISA),x86_64)
CCFLAGS_ISA = -msse3
M5_ISA = x86
PREFIX =
else
M5_ISA = $(ISA)
ifeq ($(ISA),aarch64)
CCFLAGS_ISA = -Xassembler -march=all
# Input files just for this ISA.
ISA_BARE_INS = semihost_exit
# Exclude baremetal only builds.
USER_INS := $(filter-out $(ISA)/semihost_exit, $(USER_INS))
# Commented out for now because otherwise adds an
# empty entry to the target list.
#ISA_USER_INS =
PREFIX = aarch64-linux-gnu-
else
ifeq ($(ISA),arm)
PREFIX = arm-linux-gnueabihf-
else
ifeq ($(ISA),riscv)
PREFIX = riscv64-linux-gnu-
# riscv does not have an util/m5/m5op_
M5OP_OBJ =
USER_INS := $(filter-out ./m5_checkpoint ./m5_exit, $(USER_INS))
else
$(error unknown isa $(ISA))
endif
endif
endif
endif

# Calculated values.
BARE_OUTS = $(addprefix $(OUT_BARE_DIR)/, $(addsuffix $(OUT_EXT), $(BARE_INS) $(addprefix $(ISA)/,$(ISA_BARE_INS))))
USER_OUTS = $(addprefix $(OUT_USER_DIR)/, $(addsuffix $(OUT_EXT), $(USER_INS)))

.PHONY: all bare clean mkdir user

user: mkdir-user $(USER_OUTS)

bare: mkdir-bare $(BARE_OUTS)

all: bare user

user-show:
	@echo $(USER_OUTS)

$(OUT_BARE_DIR)/%$(OUT_EXT): %$(IN_EXT_ASM) $(M5OP_OBJ)
	$(CC) $(CCFLAGS_BARE) -o '$@' $^

$(OUT_USER_DIR)/%$(OUT_EXT): %$(IN_EXT_ASM) $(M5OP_OBJ)
	$(CC) $(CFLAGS_USER) -o '$@' $^

$(OUT_BARE_DIR)/%$(OUT_EXT): %$(IN_EXT_C) $(M5OP_OBJ) $(BOOTLOADER_OBJ)
	$(CC) $(CCFLAGS_BARE) -o '$@' $^

$(OUT_USER_DIR)/%$(OUT_EXT): %$(IN_EXT_C) $(M5OP_OBJ)
	$(CC) $(CFLAGS_USER) -o '$@' $^ $(LDFLAGS_USER)

$(OUT_BARE_DIR)/%$(OUT_EXT): %$(IN_EXT_CXX) $(M5OP_OBJ) $(BOOTLOADER_OBJ)
	$(CXX) $(CXXFLAGS_BARE) -o '$@' $^

$(OUT_USER_DIR)/%$(OUT_EXT): %$(IN_EXT_CXX) $(M5OP_OBJ)
	$(CXX) $(CXXFLAGS_USER) -o '$@' $^ $(LDFLAGS_USER)

$(BOOTLOADER_OBJ): $(BOOTLOADER_SRC)
	$(CC) $(CFLAGS_USER) -c -o '$@' '$<'

$(M5OP_OBJ):
	cd $(GEM5_ROOT) && scons -C util/m5 build/$(M5_ISA)/out/m5

clean:
	rm -rf '$(OUT_DIR_BASE)'

mkdir-bare:
	mkdir -p '$(OUT_BARE_DIR)/$(ISA)'

mkdir-user:
	mkdir -p '$(OUT_USER_DIR)/$(ISA)'

