# 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")
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)
