#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Targets for building U-Boot
#
# The following must be set before including this file:
# TARGET_UBOOT_SRC must be set the base of a U-Boot tree.
# TARGET_UBOOT_DEFCONFIG must name a base U-Boot config.
# TARGET_UBOOT_ARCH must be set to match U-Boot arch.
#
# The following may be set:
# TARGET_UBOOT_CROSS_COMPILE_PREFIX to override toolchain.
# TARGET_UBOOT_CONFIGS to specify a set of additional U-Boot config files.
# TARGET_UBOOT_ENV to specify an environment to be compiled into uboot.env.
# TARGET_UBOOT_ENV_SIZE to specify the size reserved in U-Boot for the env.

ifeq ($(TARGET_UBOOT_SRC),)
$(error TARGET_UBOOT_SRC not defined but uboot.mk included)
endif

ifeq ($(TARGET_UBOOT_DEFCONFIG),)
$(error TARGET_UBOOT_DEFCONFIG not defined)
endif

ifeq ($(TARGET_UBOOT_ARCH),)
$(error TARGET_UBOOT_ARCH not defined)
endif

ifeq ($(TARGET_UBOOT_ENV_SIZE),)
ifneq ($(TARGET_UBOOT_ENV),)
$(error If TARGET_UBOOT_ENV is set TARGET_UBOOT_ENV_SIZE must also be set. See\
 CONFIG_ENV_SIZE in the selected U-Boot board config file.)
endif
endif

# These may be assigned in target BoardConfig.mk.
TARGET_UBOOT_MAKE_TARGET ?= u-boot.bin
TARGET_UBOOT_COPY_TARGETS ?= $(TARGET_UBOOT_MAKE_TARGET)

# Check target arch.
TARGET_UBOOT_ARCH := $(strip $(TARGET_UBOOT_ARCH))
UBOOT_ARCH := $(TARGET_UBOOT_ARCH)
UBOOT_CC_WRAPPER := $(CC_WRAPPER)
UBOOT_AFLAGS :=

ifeq ($(TARGET_UBOOT_ARCH), arm)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/arm/arm-linux-androideabi-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/arm-linux-androidkernel-
UBOOT_SRC_ARCH := arm
UBOOT_CFLAGS :=
else ifeq ($(TARGET_UBOOT_ARCH), arm64)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/aarch64/aarch64-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/aarch64-linux-androidkernel-
UBOOT_SRC_ARCH := arm64
UBOOT_CFLAGS :=
else ifeq ($(TARGET_UBOOT_ARCH), i386)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/x86_64-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/x86_64-linux-androidkernel-
UBOOT_SRC_ARCH := x86
UBOOT_CFLAGS := -mstack-protector-guard=tls
else ifeq ($(TARGET_UBOOT_ARCH), x86_64)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/x86_64-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/x86_64-linux-androidkernel-
UBOOT_SRC_ARCH := x86
UBOOT_CFLAGS := -mstack-protector-guard=tls
else ifeq ($(TARGET_UBOOT_ARCH), mips)
UBOOT_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/mips/mips64el-linux-android-4.9/bin)
UBOOT_CROSS_COMPILE := $(UBOOT_TOOLCHAIN_ABS)/mips64el-linux-androidkernel-
UBOOT_SRC_ARCH := mips
UBOOT_CFLAGS :=
else
$(error U-Boot arch not supported at present)
endif

# Allow caller to override toolchain.
TARGET_UBOOT_CROSS_COMPILE_PREFIX := $(strip $(TARGET_UBOOT_CROSS_COMPILE_PREFIX))
ifneq ($(TARGET_UBOOT_CROSS_COMPILE_PREFIX),)
UBOOT_CROSS_COMPILE := $(TARGET_UBOOT_CROSS_COMPILE_PREFIX)
endif

# Use ccache if requested by USE_CCACHE variable
UBOOT_CROSS_COMPILE_WRAPPER := $(realpath $(UBOOT_CC_WRAPPER)) $(UBOOT_CROSS_COMPILE)

UBOOT_GCC_NOANDROID_CHK := $(shell (echo "int main() {return 0;}" | $(UBOOT_CROSS_COMPILE)gcc -E -mno-android - > /dev/null 2>&1 ; echo $$?))
ifeq ($(strip $(UBOOT_GCC_NOANDROID_CHK)),0)
UBOOT_CFLAGS += -mno-android
UBOOT_AFLAGS += -mno-android
endif

# Set the output for the U-Boot build products.
UBOOT_OUT := $(TARGET_OUT_INTERMEDIATES)/UBOOT_OBJ
UBOOT_ENV_OUT := $(PRODUCT_OUT)/uboot.env

# Merge all U-Boot config file sources.
UBOOT_CONFIG_DIR := device/ti/beagle_x15/uboot_config
UBOOT_CONFIG_DEFAULT := $(TARGET_UBOOT_SRC)/configs/$(TARGET_UBOOT_DEFCONFIG)
UBOOT_CONFIG_RECOMMENDED := $(UBOOT_CONFIG_DIR)/recommended.config
UBOOT_CONFIG_REQUIRED_SRC := $(UBOOT_CONFIG_DIR)/common.config
UBOOT_CONFIG_REQUIRED := $(UBOOT_OUT)/.config.required
UBOOT_CONFIG_SRC := $(UBOOT_CONFIG_DEFAULT) \
  $(UBOOT_CONFIG_RECOMMENDED) \
  $(TARGET_UBOOT_CONFIGS) \
  $(UBOOT_CONFIG_REQUIRED)
UBOOT_CONFIG := $(UBOOT_OUT)/.config
UBOOT_MERGE_CONFIG := device/ti/beagle_x15/mergeconfig.sh
# List of all the Kconfig files from the source code. Changing the Kconfig files
# requires to reassemble the .config, so we add them as dependencies.
UBOOT_SRC_KCONFIGS := \
  $(call find-files-in-subdirs,.,Kconfig,$(TARGET_UBOOT_SRC))

$(UBOOT_OUT):
	mkdir -p $@

define build_uboot
	# We don't support bundling a device tree with U-Boot yet.
	CCACHE_NODIRECT="true" PATH=$$(cd device/ti/beagle_x15/hostcc; pwd):$$PATH \
		BISON_PKGDATADIR=$$(cd prebuilts/build-tools/common/bison; pwd) \
		$(MAKE) -C $(TARGET_UBOOT_SRC) \
		O=$(realpath $(UBOOT_OUT)) \
		CROSS_COMPILE="$(UBOOT_CROSS_COMPILE_WRAPPER)" \
		KCFLAGS="$(UBOOT_CFLAGS)" \
		KAFLAGS="$(UBOOT_AFLAGS)" \
		SOURCE_DATE_EPOCH="$(BUILD_DATETIME_FROM_FILE)" \
		$(1)
endef

# Merge the required U-Boot config elements into a single file.
$(UBOOT_CONFIG_REQUIRED): $(UBOOT_CONFIG_REQUIRED_SRC) | $(UBOOT_OUT)
	$(hide) cat $^ > $@

# Merge the final target U-Boot config.
$(UBOOT_CONFIG): $(UBOOT_CONFIG_SRC) $(UBOOT_SRC_KCONFIGS) | $(UBOOT_OUT)
	$(hide) echo Merging U-Boot config
	$(call build_uboot,mrproper)
	PATH=$$(cd device/ti/beagle_x15/hostcc; pwd):$$PATH \
		BISON_PKGDATADIR=$$(cd prebuilts/build-tools/common/bison; pwd) \
		$(UBOOT_MERGE_CONFIG) \
		$(TARGET_UBOOT_SRC) $(realpath $(UBOOT_OUT)) \
		$(UBOOT_ARCH) $(UBOOT_CROSS_COMPILE) \
		$(UBOOT_CONFIG_SRC)

$(UBOOT_OUT)/$(TARGET_UBOOT_MAKE_TARGET): $(UBOOT_CONFIG) | $(UBOOT_OUT)
	$(hide) echo "Building $(UBOOT_ARCH) U-Boot ..."
	$(call build_uboot,$(TARGET_UBOOT_MAKE_TARGET))

$(addprefix $(UBOOT_OUT)/,$(TARGET_UBOOT_COPY_TARGETS)): $(UBOOT_OUT)/$(TARGET_UBOOT_MAKE_TARGET)

ifneq ($(TARGET_UBOOT_ENV),)
$(UBOOT_ENV_OUT): $(TARGET_UBOOT_ENV) | $(addprefix $(UBOOT_OUT)/,$(TARGET_UBOOT_COPY_TARGETS))
	$(UBOOT_OUT)/tools/mkenvimage -s $(TARGET_UBOOT_ENV_SIZE) -o $@ $<
endif

ALL_DEFAULT_INSTALLED_MODULES += $(addprefix $(PRODUCT_OUT)/,$(TARGET_UBOOT_COPY_TARGETS))

# Produces the actual U-Boot image!
define copy_uboot
$$(PRODUCT_OUT)/$(1): $$(UBOOT_OUT)/$(1) | $$(ACP)
	$$(ACP) -fp $$< $$@
endef
$(foreach _t,$(TARGET_UBOOT_COPY_TARGETS),$(eval $(call copy_uboot,$(_t))))
