# Component makefile for extras/spiffs

# If spiffs is configured as SINGLETON it must be configured in compile time.
SPIFFS_SINGLETON ?= 1

SPIFFS_BASE_ADDR ?= 0x300000
SPIFFS_SIZE ?= 0x100000
SPIFFS_LOG_PAGE_SIZE ?= 256
SPIFFS_LOG_BLOCK_SIZE ?= 8192


spiffs_CFLAGS += -DSPIFFS_SINGLETON=$(SPIFFS_SINGLETON)
ifeq ($(SPIFFS_SINGLETON),1)
# Singleton configuration
spiffs_CFLAGS += -DSPIFFS_BASE_ADDR=$(SPIFFS_BASE_ADDR)
spiffs_CFLAGS += -DSPIFFS_SIZE=$(SPIFFS_SIZE)
endif

spiffs_CFLAGS += -DSPIFFS_LOG_PAGE_SIZE=$(SPIFFS_LOG_PAGE_SIZE)
spiffs_CFLAGS += -DSPIFFS_LOG_BLOCK_SIZE=$(SPIFFS_LOG_BLOCK_SIZE)

# Main program needs SPIFFS definitions because it includes spiffs_config.h
PROGRAM_CFLAGS += $(spiffs_CFLAGS)

spiffs_CFLAGS := $(CFLAGS) $(spiffs_CFLAGS)

INC_DIRS += $(spiffs_ROOT)
INC_DIRS += $(spiffs_ROOT)spiffs/src

# args for passing into compile rule generation
spiffs_SRC_DIR = $(spiffs_ROOT)spiffs/src
spiffs_SRC_DIR += $(spiffs_ROOT)

# Create an SPIFFS image of specified directory and flash it with
# the rest of the firmware.
#
# Argumens:
#   $(1) - directory with files which go into spiffs image
#
# Example:
#  $(eval $(call make_spiffs_image,files))
define make_spiffs_image
SPIFFS_IMAGE = $(addprefix $(FIRMWARE_DIR),spiffs.bin)
MKSPIFFS_DIR = $(ROOT)/extras/spiffs/mkspiffs
MKSPIFFS = $$(MKSPIFFS_DIR)/mkspiffs
SPIFFS_FILE_LIST = $(shell find $(1))

all: $$(SPIFFS_IMAGE)

clean: clean_spiffs_img clean_mkspiffs

$$(SPIFFS_IMAGE): $$(MKSPIFFS) $$(SPIFFS_FILE_LIST) Makefile
	$$< -D $(1) -f $$@ -s $(SPIFFS_SIZE) -p $(SPIFFS_LOG_PAGE_SIZE) \
		-b $(SPIFFS_LOG_BLOCK_SIZE)

# Rebuild SPIFFS if Makefile is changed, where SPIFF_SIZE is defined
$$(spiffs_ROOT)spiffs_config.h: Makefile
	$$(Q) touch $$@

$$(MKSPIFFS):
	$$(MAKE) -C $$(MKSPIFFS_DIR)

clean_spiffs_img:
	$$(Q) rm -f $$(SPIFFS_IMAGE)

clean_mkspiffs:
	$$(Q) $$(MAKE) -C $$(MKSPIFFS_DIR) clean

SPIFFS_ESPTOOL_ARGS = $(SPIFFS_BASE_ADDR) $$(SPIFFS_IMAGE)
endef

$(eval $(call component_compile_rules,spiffs))