# 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_SQUASHFS_DIR = $(OUT_DIR)/squashfs
OUT_SQUASHFS_EXT = .squashfs
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))))
SQUASHFS_OUTS = $(addprefix $(OUT_USER_DIR)/, $(addsuffix $(OUT_EXT), $(USER_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_SQUASHFS_DIR)/%$(OUT_SQUASHFS_EXT): $(OUT_USER_DIR)/%$(OUT_EXT)
	mkdir -p '$(basename $@)/sbin'
	cp '$<' '$(basename $@)/sbin/init'
	mksquashfs '$(basename $@)' '$@'

$(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)'

