#!/usr/bin/env make

##### Have default "all" target listed at the beginning
.PHONY: default
default: all

# Configurable options
CONTAINER_CMD ?= docker
CONTAINER_IMAGE_TAG ?= imagebuilder-openeuler-24.03-lts
LOG_LEVEL ?= INFO
ECHOCTL := @

ifeq ($(LOG_LEVEL),DEBUG)
ECHOCTL :=
endif

define stack_include
#$$(info Makefile "$$(lastword $$(MAKEFILE_STACK))" includes "$1")
MAKEFILE_STACK += $1
CURRENT_MAKEFILE := $$(lastword $$(MAKEFILE_STACK))
CURRENT_DIR := $$(dir $$(CURRENT_MAKEFILE))
include $1
MAKEFILE_STACK := $$(wordlist 1,$$(shell expr $$(words $$(MAKEFILE_STACK)) - 1),$$(MAKEFILE_STACK))
CURRENT_MAKEFILE := $$(lastword $$(MAKEFILE_STACK))
CURRENT_DIR := $$(dir $$(CURRENT_MAKEFILE))
endef
MAKEFILE_STACK := $(dir .)$(lastword $(MAKEFILE_LIST))
CURRENT_MAKEFILE := $(lastword $(MAKEFILE_STACK))
CURRENT_DIR := $(dir $(CURRENT_MAKEFILE))

##### Setup out-of-tree build
# ROOT_DIR & WORK_DIR are all absolute path.
# As well as DIST_DIR & STAGING_DIR
ROOT_DIR := $(realpath .)
# O= must be an absolute path, otherwise unexpected behavior will occur when used in combination with make -C
ifdef O
WORK_DIR := $(realpath $(O))
else
WORK_DIR := $(ROOT_DIR)/build
endif
STAGING_DIR := $(WORK_DIR)/staging
DIST_DIR := $(WORK_DIR)/dist

# Collected targets
ROOTFS_TARGETS :=
BSP_TARGETS :=

# Makefile function definations
$(eval $(call stack_include,$(CURRENT_DIR)functions.mk))

# Load receipes
$(eval $(call stack_include,$(CURRENT_DIR)receipes/receipes.mk))

.PHONY: all_rootfs
all_rootfs: $(ROOTFS_TARGETS)

.PHONY: all_bsp
all_bsp: $(BSP_TARGETS)

.PHONY: list_rootfs
list_rootfs:
	@echo $(ROOTFS_TARGETS)

.PHONY: list_bsp
list_bsp:
	@echo $(BSP_TARGETS)

.PHONY: list
list:
	@echo "ROOTFS targets:"
	@echo "$(ROOTFS_TARGETS)" | tr ' ' '\n'
	@echo
	@echo "BSP targets:"
	@echo "$(BSP_TARGETS)" | tr ' ' '\n'

.PHONY: clean
clean:
	rm -rf "$(WORK_DIR)"

.PHONY: clean_staging
clean_staging:
	rm -rf "$(STAGING_DIR)"

.PHONY: container
container:
	$(CONTAINER_CMD) build -t $(CONTAINER_IMAGE_TAG) $(ROOT_DIR)
	@echo "New container image is tagged as: $(CONTAINER_IMAGE_TAG)"


.PHONY: .test
.test:
	@echo $(ROOTFS_TARGETS)
	@echo $(BSP_TARGETS)
