# Makefile for Rockchip Linux SDK
#
# Based on buildroot-2022.08's Makefile
#
# Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org>
# Copyright (C) 2006-2014 by the Buildroot developers <buildroot@uclibc.org>
# Copyright (C) 2014-2020 by the Buildroot developers <buildroot@buildroot.org>
# Copyright (C) 2022 by Jeffy Chen <jeffy.chen@rock-chips.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#

#--------------------------------------------------------------
# Just run 'make menuconfig', configure stuff, then run 'make'.
# You shouldn't need to mess with anything beyond this point...
#--------------------------------------------------------------

# Delete default rules. We don't use them. This saves a bit of time.
.SUFFIXES:

# we want bash as shell
SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
	 else if [ -x /bin/bash ]; then echo /bin/bash; \
	 else echo sh; fi; fi)

# Strip quotes and then whitespaces
qstrip = $(strip $(subst ",,$(1)))
#"))

# Needed for the foreach loops to loop over the list of hooks, so that
# each hook call is properly separated by a newline.
define sep


endef

# absolute path
COMMON_DIR := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST)))))
DEVICE_DIR := $(abspath $(COMMON_DIR)/..)
SDK_DIR := $(abspath $(DEVICE_DIR)/../..)
CHIP_DIR := $(DEVICE_DIR)/.chip
CONFIG_DIR := $(COMMON_DIR)/configs
CONFIG_CONFIG_IN = Config.in
CONFIG = $(SDK_DIR)/buildroot/support/kconfig
OUTDIR := $(SDK_DIR)/output
BUILD_DIR := $(OUTDIR)/kconf
SCRIPT_TARGETS := $(shell $(SDK_DIR)/build.sh make-targets)

RK_CONFIG = $(OUTDIR)/.config

# To put more focus on warnings, be less verbose as default
# Use 'make V=1' to see the full commands
ifeq ("$(origin V)", "command line")
	KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
	KBUILD_VERBOSE = 0
endif

ifeq ($(KBUILD_VERBOSE),1)
	Q =
ifndef VERBOSE
	VERBOSE = 1
endif
export VERBOSE
else
	Q = @
endif

# Default to build script's default target
.PHONY: build
build:
	$(Q)$(SDK_DIR)/build.sh

# kconfig uses CONFIG_SHELL
CONFIG_SHELL := $(SHELL)

export SHELL CONFIG_SHELL Q KBUILD_VERBOSE

HOSTCC := gcc
HOSTCXX := g++

export HOSTCC HOSTCXX

# silent mode requested?
QUIET := $(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),-q)

$(BUILD_DIR)/auto.conf: $(RK_CONFIG)
	make -j1 $(EXTRAMAKEARGS) HOSTCC="$(HOSTCC)" HOSTCXX="$(HOSTCXX)" syncconfig

$(BUILD_DIR)/%onf:
	mkdir -p $(@D)/lxdialog
	make CC="$(HOSTCC)" HOSTCC="$(HOSTCC)" \
	    obj=$(@D) -C $(CONFIG) -f Makefile.br $(@F)

TARGET_DEFCONFIG := $(filter %_defconfig,$(MAKECMDGOALS))
ifneq ($(TARGET_DEFCONFIG),)
RK_DEFCONFIG := $(realpath $(CHIP_DIR)/$(TARGET_DEFCONFIG))
else
RK_DEFCONFIG := $(shell [ -e ${RK_CONFIG} ] && \
	grep RK_DEFCONFIG ${RK_CONFIG} | cut -d'=' -f2)
endif
DEFCONFIG := $(call qstrip,$(RK_DEFCONFIG))
DEFCONFIG_NAME := $(notdir $(DEFCONFIG))

# Setup some default values
RK_CHIP_FAMILY := $(notdir $(realpath $(CHIP_DIR)))
RK_CHIP := $(shell echo ${DEFCONFIG_NAME} | \
	cut -d'_' -f2 | grep -E "^(px|rk|rv)")

COMMON_CONFIG_ENV = \
	RK_DEFCONFIG='$(call qstrip,$(RK_DEFCONFIG))' \
	RK_CHIP_FAMILY='$(call qstrip,$(RK_CHIP_FAMILY))' \
	RK_CHIP='$(call qstrip,$(RK_CHIP))' \
	KCONFIG_AUTOCONFIG=$(BUILD_DIR)/auto.conf \
	KCONFIG_AUTOHEADER=$(BUILD_DIR)/autoconf.h \
	KCONFIG_TRISTATE=$(BUILD_DIR)/tristate.config \
	srctree=$(CONFIG_DIR) BR2_CONFIG=$(RK_CONFIG)

menuconfig: $(BUILD_DIR)/mconf
	$(Q)$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)

.PHONY: menuconfig

oldconfig syncconfig olddefconfig: $(BUILD_DIR)/conf
	$(Q)$(COMMON_CONFIG_ENV) $< --$@ $(CONFIG_CONFIG_IN)

.PHONY: oldconfig syncconfig olddefconfig

%_defconfig: $(BUILD_DIR)/conf $(CHIP_DIR)/%_defconfig
	$(Q)$(COMMON_CONFIG_ENV) $< --defconfig=$(CHIP_DIR)/$@ $(CONFIG_CONFIG_IN)

.PHONY: %_defconfig

savedefconfig: $(BUILD_DIR)/conf
	$(Q)$(COMMON_CONFIG_ENV) $< \
		--savedefconfig=$(if $(DEFCONFIG),$(DEFCONFIG),$(CHIP_DIR)/defconfig) \
		$(CONFIG_CONFIG_IN)
	$(Q)sed '/^RK_DEFCONFIG=/d' $(if $(DEFCONFIG),$(DEFCONFIG),$(CHIP_DIR)/defconfig)

.PHONY: savedefconfig

.PHONY: help
help:
	@echo '  menuconfig             - interactive curses-based configurator'
	@echo '  oldconfig              - resolve any unresolved symbols in .config'
	@echo '  syncconfig             - Same as oldconfig, but quietly, additionally update deps'
	@echo '  olddefconfig           - Same as syncconfig but sets new symbols to their default value'
	@echo '  savedefconfig          - Save current config to RK_DEFCONFIG (minimal config)'
	@echo '  clean                  - Cleanup'
	@echo
	@echo 'from build.sh:'
	@$(SDK_DIR)/build.sh make-usage

define script_target
$(1):
	$(Q)$(SDK_DIR)/build.sh $$@
endef
$(eval $(foreach t,$(SCRIPT_TARGETS),$(call script_target,$(t))$(sep)))

.PHONY: $(SCRIPT_TARGETS)

.PHONY: clean
clean:
ifeq ($(RK_SESSION),)
	$(Q)$(SDK_DIR)/build.sh cleanall
endif

.PHONY: distclean
distclean: clean
	$(Q)rm -rf $(BUILD_DIR) $(RK_CONFIG)*
