# This helper makefile is used for creating
#  - symbolic links (arch/$ARCH/include/asm/arch
#  - include/autoconf.mk, {spl,tpl}/include/autoconf.mk
#  - include/config.h
#
# When our migration to Kconfig is done
# (= When we move all CONFIGs from header files to Kconfig)
# this makefile can be deleted.

# obj is "include" or "spl/include" or "tpl/include"
# for non-SPL, SPL, TPL, respectively
include $(obj)/config/auto.conf

include scripts/Kbuild.include

# Need to define CC and CPP again here in case the top Makefile did not
# include config.mk.  Some architectures expect CROSS_COMPILE to be defined
# in arch/$(ARCH)/config.mk
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E

include config.mk

UBOOTINCLUDE    := \
		-I$(obj) \
		-Iinclude \
		$(if $(KBUILD_SRC), -I$(srctree)/include) \
		-I$(srctree)/arch/$(ARCH)/include \
		-include $(srctree)/include/linux/kconfig.h

c_flags := $(KBUILD_CFLAGS) $(KBUILD_CPPFLAGS) $(PLATFORM_CPPFLAGS) \
					$(UBOOTINCLUDE) $(NOSTDINC_FLAGS)

quiet_cmd_autoconf_dep = GEN     $@
      cmd_autoconf_dep = $(CC) -x c -DDO_DEPS_ONLY -M -MP $(c_flags) \
	-MQ include/config/auto.conf $(srctree)/include/common.h > $@ || {	\
		rm $@; false;							\
	}
include/autoconf.mk.dep: FORCE
	$(call cmd,autoconf_dep)

# We are migrating from board headers to Kconfig little by little.
# In the interim, we use both of
#  - include/config/auto.conf (generated by Kconfig)
#  - include/autoconf.mk      (used in the U-Boot conventional configuration)
# The following rule creates autoconf.mk
# include/config/auto.conf is grepped in order to avoid duplication of the
# same CONFIG macros
quiet_cmd_autoconf = GEN     $@
      cmd_autoconf = \
	$(CPP) $(c_flags) -DDO_DEPS_ONLY -dM $(srctree)/include/common.h > $@.tmp && {	\
		sed -n -f $(srctree)/tools/scripts/define2mk.sed $@.tmp |		\
		while read line; do							\
			if ! grep -q "$${line%=*}=" $(obj)/config/auto.conf; then	\
				echo "$$line";						\
			fi								\
		done > $@;								\
		rm $@.tmp;								\
	} || {										\
		rm $@.tmp; false;							\
	}

$(obj)/autoconf.mk: FORCE
	$(call cmd,autoconf)

include/autoconf.mk include/autoconf.mk.dep: include/config.h

# support amlogic config folder and customer folder

# 1st. this is old u-boot config file folder
config_file=$(shell echo "$(srctree)/include/configs/$(CONFIG_SYS_BOARD).h")
ifneq ($(config_file), $(wildcard $(config_file)))

# 2nd. this is amlogic config file folder
config_file=$(shell echo "$(srctree)/board/amlogic/configs/$(CONFIG_SYS_BOARD).h")
ifneq ($(config_file), $(wildcard $(config_file)))

# 3rd. this is amlogic customer config folder
config_file=$(shell echo "$(srctree)/customer/board/configs/$(CONFIG_SYS_BOARD).h")

# 4th. this is khadas config folder
config_file=$(shell echo "$(srctree)/board/khadas/configs/$(CONFIG_SYS_BOARD).h")
ifneq ($(config_file), $(wildcard $(config_file)))
$(error $(shell echo "Error: Can not find $(CONFIG_SYS_BOARD).h"))
endif
endif
endif

#$(warning "final file"$(config_file))

# include/config.h
# Prior to Kconfig, it was generated by mkconfig. Now it is created here.
define filechk_config_h
	(echo "/* Automatically generated - do not edit */";		\
	for i in $$(echo $(CONFIG_SYS_EXTRA_OPTIONS) | sed 's/,/ /g'); do \
		echo \#define CONFIG_$$i				\
		| sed '/=/ {s/=/	/;q; } ; { s/$$/	1/; }'; \
	done;								\
	echo \#define CONFIG_BOARDDIR board/$(if $(VENDOR),$(VENDOR)/)$(BOARD);\
	echo \#include \<config_defaults.h\>;				\
	echo \#include \<$(config_file)\>;		\
	echo \#include \<asm/config.h\>;				\
	echo \#include \<config_fallbacks.h\>;				\
	echo \#include \<config_uncmd_spl.h\>; \
	echo \#define SYS_PROMPT \"$(CONFIG_SYS_CONFIG_NAME)\#\"; )
endef

include/config.h: scripts/Makefile.autoconf create_symlink FORCE
	$(call filechk,config_h)

# symbolic links
PHONY += create_symlink
create_symlink:
ifneq ($(KBUILD_SRC),)
	$(Q)mkdir -p include/asm
	$(Q)ln -fsn $(KBUILD_SRC)/arch/$(ARCH)/include/asm/arch-$(if $(SOC),$(SOC),$(CPU)) \
		include/asm/arch
	$(Q)mkdir -p include2
	$(Q)ln -fsn $(KBUILD_SRC)/arch/$(ARCH)/include/asm \
		include2/asm
else
	$(Q)ln -fsn arch-$(if $(SOC),$(SOC),$(CPU)) \
		arch/$(ARCH)/include/asm/arch
endif

PHONY += FORCE
FORCE:

.PHONY: $(PHONY)
