# Copyright Statement:
#
# This software/firmware and related documentation ("MediaTek Software") are
# protected under relevant copyright laws. The information contained herein
# is confidential and proprietary to MediaTek Inc. and/or its licensors.
# Without the prior written permission of MediaTek inc. and/or its licensors,
# any reproduction, modification, use or disclosure of MediaTek Software,
# and information contained herein, in whole or in part, shall be strictly
# prohibited.
#
# MediaTek Inc. (C) 2018. All rights reserved.
#
# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY
# ACKNOWLEDGES THAT IT IS RECEIVER\'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY
# THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK
# SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO
# RECEIVER\'S SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN
# FORUM. RECEIVER\'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK\'S ENTIRE AND
# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER
# WILL BE, AT MEDIATEK\'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE
# AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
# RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
#
# The following software/firmware and/or related documentation
# ("MediaTek Software") have been modified by MediaTek Inc. All revisions are
# subject to any receiver\'s applicable license agreements with MediaTek Inc.
#
###########################################################
## Generic definitions
###########################################################
# Remove $@ if error occurs
.DELETE_ON_ERROR:

# Turn off suffix build rules built into make
.SUFFIXES:

SHELL       := /bin/bash
TINYSYS_MEDMCU := tinysys-medmcu

.DEFAULT_GOAL := scp

###########################################################
## Parameter control
###########################################################
PROJECT := $(strip $(PROJECT))
ifeq ($(PROJECT),)
  $(error $(TINYSYS_MEDMCU): project name is required)
endif

ifeq ($(strip $(O)),)
O := tinysys_out
endif

# Verbosity control
V ?= 1
ifeq ($(V),1)
hide :=
else
hide := @
endif

###########################################################
## Common directory locations and generic variables
###########################################################
SCP_DIR                := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
SCP_IMAGE_NAME         := medmcu.img
SCP_BUILT_DIR          := $(O)
SCP_INSTALLED_TARGET   := $(O)/$(SCP_IMAGE_NAME)

SCP_PROJECT_DIR        := $(SCP_DIR)/project
SCP_DRIVERS_DIR        := $(SCP_DIR)/drivers
SCP_KERNEL_DIR         := $(SCP_DIR)/kernel
SCP_BUILD_DIR          := $(SCP_DIR)/build
SCP_TOOLS_DIR          := $(SCP_DIR)/tools
SCP_MIDDLEWARE_DIR     := $(SCP_DIR)/middleware

KERNEL_DIR             := $(SCP_DIR)/../kernel
COMMON_DIR             := $(SCP_DIR)/../common
PRIVATE_DIR            := $(SCP_DIR)/../private
COMMON_DRIVERS_DIR     := $(COMMON_DIR)/drivers
COMMON_MIDDLEWARE_DIR  := $(COMMON_DIR)/middleware
COMMON_BUILD_DIR       := $(COMMON_DIR)/build
COMMON_TOOLS_DIR       := $(COMMON_DIR)/tools
COMMON_INCLUDE_DIR     := $(COMMON_DIR)/include
PRIVATE_DRIVERS_DIR    := $(PRIVATE_DIR)/drivers
PRIVATE_MIDDLEWARE_DIR := $(PRIVATE_DIR)/middleware
PRIVATE_BUILD_DIR      := $(PRIVATE_DIR)/build
PRIVATE_TOOLS_DIR      := $(PRIVATE_DIR)/tools

MKIMAGE                := $(COMMON_TOOLS_DIR)/mkimage
OBJSIZE                := $(COMMON_TOOLS_DIR)/objsize
MCHECK                 := $(COMMON_TOOLS_DIR)/memoryReport.py
GEN_LINK_LD            := $(SCP_TOOLS_DIR)/link_ld.py

###########################################################
## Generic build flow
###########################################################
include $(COMMON_BUILD_DIR)/definitions.mk
-include $(SCP_BUILD_DIR)/definitions.mk

# Initialize the environment for each processor
include $(SCP_BUILD_DIR)/main.mk

ifeq (1,$(V))
  $(info $(TINYSYS_MEDMCU): PROCESSORS=$(PROCESSORS))
  $(info $(TINYSYS_MEDMCU): PROJECT=$(PROJECT))
  $(info $(TINYSYS_MEDMCU): PLATFORM=$(PLATFORM))
  $(info $(TINYSYS_MEDMCU): O=$(O))
  $(info $(TINYSYS_MEDMCU): SCP_DIR=$(SCP_DIR))
  $(info $(TINYSYS_MEDMCU): ALL_SCP_BINS=$(ALL_SCP_BINS))
  $(info $(TINYSYS_MEDMCU): ALL_SCP_ESL_BINS=$(ALL_SCP_ESL_BINS))
endif

SCP_SETTING_INI := $(SCP_PROJECT_DIR)/$(word 1,$(PROCESSORS))/$(PLATFORM)/platform/Setting.ini

###########################################################
## Build targets
###########################################################
.PHONY: scp

ifneq (,$(ALL_SCP_BINS))
scp: $(SCP_INSTALLED_TARGET)

SORTED_SCP_BINS := $(call sort_scp_binaries,$(ALL_SCP_BINS),RV33)

$(SCP_INSTALLED_TARGET): $(SORTED_SCP_BINS)
	@mkdir -p $(dir $@)
	@echo '$(TINYSYS_MEDMCU): BIN   $@'
	@if [ -s '$($(PROCESSOR)_DRAM.BIN_BUILT)' ]; then \
		if [ -s '$($(PROCESSOR)_MEDHW.BIN_BUILT)' ]; then \
			echo 'cat $^ $($(PROCESSOR)_DRAM.BIN_BUILT) $($(PROCESSOR)_MEDHW.BIN_BUILT) > $@'; \
			cat $^ $($(PROCESSOR)_DRAM.BIN_BUILT) $($(PROCESSOR)_MEDHW.BIN_BUILT) > $@; \
		else \
			echo 'cat $^ $($(PROCESSOR)_DRAM.BIN_BUILT) > $@'; \
			cat $^ $($(PROCESSOR)_DRAM.BIN_BUILT) > $@; \
		fi; \
	elif [ -s '$($(PROCESSOR)_MEDHW.BIN_BUILT)' ]; then \
		echo 'cat $^ $($(PROCESSOR)_MEDHW.BIN_BUILT) > $@'; \
		cat $^ $($(PROCESSOR)_MEDHW.BIN_BUILT) > $@; \
	else \
		echo 'cat $^ > $@'; \
		cat $^ > $@; \
	fi;
endif

ifneq (,$(ALL_SCP_ESL_BINS))
scp: $(ALL_SCP_ESL_BINS)
endif

clean:
	rm -rf $(SCP_INSTALLED_TARGET) $(O)
