# 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/ \
  -I $(GEM5_ROOT)/util/m5/src/ \
  -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
ifeq ($(ISA),sparc64)
PREFIX = sparc64-linux-
# sparc64 does not have an util/m5/m5op_
M5OP_OBJ =
# At present sparc64 only compiles the pthread binaries. Other binaries have
# not been tested.
USER_INS := $(filter-out ./m5_checkpoint \
                         ./m5_exit \
                         ./chdir_print \
                         ./hello \
                         ./hellp_cpp \
                         ./m5_exit_addr \
                         ./page_access_wrap \
                         ./stack_print \
                         ./std_thread, $(USER_INS))
else
$(error unknown isa $(ISA))
endif
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)
	@# Create dev so that the kernel can automount CONFIG_DEVTMPFS=y.
	mkdir -p '$(basename $@)/sbin' '$(basename $@)/dev'
	cp '$<' '$(basename $@)/sbin/init'
	@# Existing squashfs files don't get updated otherwise.
	rm -f '$@'
	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)'

