#==================================================================================== # makeESPArduino -- patched version # # A makefile for ESP8286 and ESP32 Arduino projects. # Edit the contents of this file to suit your project # or just include it and override the applicable macros. # # License: LGPL 2.1 # General and full license information is available at: # https://github.com/plerup/makeEspArduino # # Copyright (c) 2016-2017 Peter Lerup. All rights reserved. # #==================================================================================== #==================================================================================== # Project specific values #==================================================================================== # Include possible project makefile. This can be used to override the defaults below -include $(firstword $(PROJ_CONF) $(dir $(SKETCH))config.mk) #=== Default values not available in the Arduino configuration files CHIP ?= esp8266 # Set chip specific default board unless specified BOARD ?= $(if $(filter $(CHIP), esp32),esp32,generic) # Serial flashing parameters UPLOAD_PORT ?= $(shell ls -1tr /dev/ttyUSB* 2>/dev/null | tail -1) UPLOAD_PORT := $(if $(UPLOAD_PORT),$(UPLOAD_PORT),/dev/ttyS0) UPLOAD_VERB ?= -v # OTA parameters ESP_ADDR ?= ESP_123456 ESP_PORT ?= 8266 ESP_PWD ?= 123 # HTTP update parameters HTTP_ADDR ?= ESP_123456 HTTP_URI ?= /update HTTP_PWD ?= user HTTP_USR ?= password # Output directory BUILD_ROOT ?= /tmp/mkESP BUILD_DIR ?= $(BUILD_ROOT)/$(MAIN_NAME)_$(BOARD) # File system source directory FS_DIR ?= $(dir $(SKETCH))data FS_REST_DIR ?= $(BUILD_DIR)/file_system # Bootloader BOOT_LOADER ?= $(ESP_ROOT)/bootloaders/eboot/eboot.elf #==================================================================================== # Standard build logic and values #==================================================================================== START_TIME := $(shell perl -e "print time();") OS ?= $(shell uname -s) # Utility functions git_description = $(shell git -C $(1) describe --tags --always --dirty 2>/dev/null || echo Unknown) time_string = $(shell date +$(1)) ifeq ($(OS), Darwin) find_files = $(shell find -E $2 -regex ".*\.($1)") else find_files = $(shell find $2 -regextype posix-egrep -regex ".*\.($1)") endif # ESP Arduino directories ifndef ESP_ROOT # Location not defined, find and use possible version in the Arduino IDE installation ifeq ($(OS), Windows_NT) ARDUINO_ROOT = $(shell cygpath -m $(LOCALAPPDATA)/Arduino15) else ifeq ($(OS), Darwin) ARDUINO_ROOT = $(HOME)/Library/Arduino15 else ARDUINO_ROOT = $(HOME)/.arduino15 endif ARDUINO_WORKSPACE = $(shell grep -o "sketchbook.path=.*" $(ARDUINO_ROOT)/preferences.txt 2>/dev/null | cut -f2- -d=) ARDUINO_ESP_ROOT = $(ARDUINO_ROOT)/packages/$(CHIP) ESP_ROOT := $(lastword $(wildcard $(ARDUINO_ESP_ROOT)/hardware/$(CHIP)/*)) ifeq ($(ESP_ROOT),) # search for ESP32 in arduino workspace ARDUINO_ESP_ROOT = $(ARDUINO_WORKSPACE)/hardware/espressif ESP_ROOT = $(ARDUINO_ESP_ROOT)/$(CHIP) ifeq ($(ESP_ROOT),) $(error No installed version of $(CHIP) Arduino found) endif endif ARDUINO_LIBS = $(ARDUINO_WORKSPACE)/libraries ESP_ARDUINO_VERSION := $(notdir $(ESP_ROOT)) # Find used version of compiler and tools ifeq ($(CHIP), esp32) COMP_PATH := $(ARDUINO_ESP_ROOT)/tools/xtensa-lx106-elf-gcc/ ESPTOOL_PATH := $(ARDUINO_ESP_ROOT)/tools/esptool MKSPIFFS_PATH := $(ARDUINO_ESP_ROOT)/tools/mkspiffs else COMP_PATH := $(lastword $(wildcard $(ARDUINO_ESP_ROOT)/tools/xtensa-lx106-elf-gcc/*)) ESPTOOL_PATH := $(lastword $(wildcard $(ARDUINO_ESP_ROOT)/tools/esptool/*)) MKSPIFFS_PATH := $(lastword $(wildcard $(ARDUINO_ESP_ROOT)/tools/mkspiffs/*)) endif else # Location defined, assume it is a git clone ESP_ARDUINO_VERSION = $(call git_description,$(ESP_ROOT)) MKSPIFFS_PATH := $(lastword $(wildcard $(ESP_ROOT)/tools/mkspiffs/*)) endif ESP_LIBS = $(ESP_ROOT)/libraries SDK_ROOT = $(ESP_ROOT)/tools/sdk TOOLS_ROOT = $(ESP_ROOT)/tools ifeq ($(wildcard $(ESP_ROOT)/cores/$(CHIP)),) $(error $(ESP_ROOT) is not a vaild directory for $(CHIP)) endif ESPTOOL ?= $(shell which esptool.py 2>/dev/null || which esptool 2>/dev/null) ifneq ($(ESPTOOL),) # esptool exists in path, overide defaults and use it for esp8266 flash operations ifeq ($(CHIP),esp8266) ESPTOOL_COM = $(ESPTOOL) UPLOAD_COM = $(ESPTOOL_PATTERN) -a soft_reset write_flash 0x00000 $(BUILD_DIR)/$(MAIN_NAME).bin FS_UPLOAD_COM = $(ESPTOOL_PATTERN) -a soft_reset write_flash $(SPIFFS_START) $(FS_IMAGE) endif endif ESPTOOL_PATTERN = echo Using: $(UPLOAD_PORT) @ $(UPLOAD_SPEED) && "$(ESPTOOL_COM)" --baud=$(UPLOAD_SPEED) --port $(UPLOAD_PORT) --chip $(CHIP) ifeq ($(MAKECMDGOALS),help) DEMO=1 endif ifdef DEMO SKETCH := $(if $(filter $(CHIP), esp32),$(ESP_LIBS)/WiFi/examples/WiFiScan/WiFiScan.ino,$(ESP_LIBS)/ESP8266WebServer/examples/HelloServer/HelloServer.ino) endif SKETCH ?= $(wildcard *.ino) ifeq ($(SKETCH),) $(error No sketch specified or found. Use "DEMO=1" for testing) endif ifeq ($(wildcard $(SKETCH)),) $(error Sketch $(SKETCH) not found) endif SRC_GIT_VERSION := $(call git_description,$(dir $(SKETCH))) # Main output definitions MAIN_NAME := $(basename $(notdir $(SKETCH))) MAIN_EXE = $(BUILD_DIR)/$(MAIN_NAME).bin FS_IMAGE = $(BUILD_DIR)/FS.spiffs ifeq ($(OS), Windows_NT) # Adjust some paths for cygwin BUILD_DIR := $(shell cygpath -m $(BUILD_DIR)) SKETCH := $(shell cygpath -m $(SKETCH)) ifdef ARDUINO_LIBS ARDUINO_LIBS := $(shell cygpath -m $(ARDUINO_LIBS)) endif endif # Build file extensions OBJ_EXT = .o DEP_EXT = .d # Auto generated makefile with Arduino definitions ARDUINO_MK = $(BUILD_DIR)/arduino.mk # Special tool definitions OTA_TOOL ?= $(TOOLS_ROOT)/espota.py HTTP_TOOL ?= curl # Core source files CORE_DIR = $(ESP_ROOT)/cores/$(CHIP) CORE_SRC := $(call find_files,S|c|cpp,$(CORE_DIR)) CORE_OBJ := $(patsubst %,$(BUILD_DIR)/%$(OBJ_EXT),$(notdir $(CORE_SRC))) CORE_LIB = $(BUILD_DIR)/arduino.ar SKETCH_DIR = $(dir $(SKETCH)) # User defined compilation units and directories ifeq ($(LIBS),) # Automatically find directories with header files used by the sketch LIBS := $(shell perl -e 'use File::Find;@d = split(" ", shift);while (<>) {$$f{"$$1"} = 1 if /^\s*\#include\s+[<"]([^>"]+)/;}find(sub {if ($$f{$$_}){print $$File::Find::dir," ";$$f{$$_}=0;}}, @d);' \ "$(CUSTOM_LIBS) $(ESP_LIBS) $(ARDUINO_LIBS)" $(SKETCH) $(call find_files,S|c|cpp,$(SKETCH_DIR))) endif IGNORE_PATTERN := $(foreach dir,$(EXCLUDE_DIRS),$(dir)/%) USER_INC := $(filter-out $(IGNORE_PATTERN),$(call find_files,h|hpp,$(SKETCH_DIR) $(dir $(LIBS)))) USER_SRC := $(SKETCH) $(filter-out $(IGNORE_PATTERN),$(call find_files,S|c|cpp,$(SKETCH_DIR) $(LIBS))) # Object file suffix seems to be significant for the linker... USER_OBJ := $(subst .ino,_.cpp,$(patsubst %,$(BUILD_DIR)/%$(OBJ_EXT),$(notdir $(USER_SRC)))) USER_DIRS := $(sort $(dir $(USER_SRC))) USER_INC_DIRS := $(sort $(dir $(USER_INC))) # Use first flash definition for the board as default FLASH_DEF_MATCH = $(if $(filter $(CHIP), esp32),build\.flash_size=(\S+),menu\.FlashSize\.([^\.]+)=(.+)) FLASH_DEF ?= $(shell cat $(ESP_ROOT)/boards.txt | perl -e 'while (<>) {if (/^$(BOARD)\.$(FLASH_DEF_MATCH)/){ print "$$1"; exit;}}') # Same method for LwIPVariant LWIP_VARIANT ?= $(shell cat $(ESP_ROOT)/boards.txt | perl -e 'while (<>) {if (/^$(BOARD)\.menu\.LwIPVariant\.([^\.=]+)=/){ print "$$1"; exit;}}') # Handle possible changed state i.e. make command line parameters or changed git versions ifeq ($(OS), Darwin) CMD_LINE := $(shell ps $$PPID -o command | tail -1) else CMD_LINE := $(shell tr "\0" " " $(STATE_LOG)) endif # The actual build commands are to be extracted from the Arduino description files ARDUINO_DESC := $(shell find $(ESP_ROOT) -maxdepth 1 -name "*.txt" | sort) $(ARDUINO_MK): $(ARDUINO_DESC) $(MAKEFILE_LIST) | $(BUILD_DIR) perl -e "$$PARSE_ARDUINO" $(BOARD) '$(FLASH_DEF)' '$(OS)' '$(LWIP_VARIANT)' $(ARDUINO_EXTRA_DESC) $(ARDUINO_DESC) >$(ARDUINO_MK) -include $(ARDUINO_MK) # Compilation directories and path INCLUDE_DIRS += $(CORE_DIR) $(ESP_ROOT)/variants/$(INCLUDE_VARIANT) $(BUILD_DIR) C_INCLUDES := $(foreach dir,$(INCLUDE_DIRS) $(USER_INC_DIRS),-I$(dir)) VPATH += $(shell find $(CORE_DIR) -type d) $(USER_DIRS) # Automatically generated build information data # Makes the build date and git descriptions at the actual build event available as string constants in the program BUILD_INFO_H = $(BUILD_DIR)/buildinfo.h BUILD_INFO_CPP = $(BUILD_DIR)/buildinfo.c++ BUILD_INFO_OBJ = $(BUILD_INFO_CPP)$(OBJ_EXT) $(BUILD_INFO_H): | $(BUILD_DIR) echo "typedef struct { const char *date, *time, *src_version, *env_version;} _tBuildInfo; extern _tBuildInfo _BuildInfo;" >$@ # Build rules for the different source file types $(BUILD_DIR)/%.cpp$(OBJ_EXT): %.cpp $(BUILD_INFO_H) $(ARDUINO_MK) echo $(' >$(BUILD_INFO_CPP) echo '_tBuildInfo _BuildInfo = {"$(BUILD_DATE)","$(BUILD_TIME)","$(SRC_GIT_VERSION)","$(ESP_ARDUINO_VERSION)"};' >>$(BUILD_INFO_CPP) $(CPP_COM) $(BUILD_INFO_CPP) -o $(BUILD_INFO_OBJ) $(LD_COM) $(LD_EXTRA) $(GEN_PART_COM) $(ELF2BIN_COM) $(SIZE_COM) | perl -e "$$MEM_USAGE" "$(MEM_FLASH)" "$(MEM_RAM)" ifneq ($(LWIP_INFO),) printf "LwIPVariant: $(LWIP_INFO)\n" endif ifneq ($(FLASH_INFO),) printf "Flash size: $(FLASH_INFO)\n\n" endif perl -e 'print "Build complete. Elapsed time: ", time()-$(START_TIME), " seconds\n\n"' upload flash: all $(UPLOAD_COM) ota: all $(OTA_TOOL) -r -i $(ESP_ADDR) -p $(ESP_PORT) -a $(ESP_PWD) -f $(MAIN_EXE) http: all $(HTTP_TOOL) --verbose -F image=@$(MAIN_EXE) --user $(HTTP_USR):$(HTTP_PWD) http://$(HTTP_ADDR)$(HTTP_URI) echo "\n" $(FS_IMAGE): $(ARDUINO_MK) $(wildcard $(FS_DIR)/*) echo Generating filesystem image: $(FS_IMAGE) $(MKSPIFFS_COM) fs: $(FS_IMAGE) upload_fs flash_fs: $(FS_IMAGE) $(FS_UPLOAD_COM) ota_fs: $(FS_IMAGE) $(OTA_TOOL) -r -i $(ESP_ADDR) -p $(ESP_PORT) -a $(ESP_PWD) -s -f $(FS_IMAGE) run: flash python -m serial.tools.miniterm --rts=0 --dtr=0 $(UPLOAD_PORT) 115200 FLASH_FILE ?= $(BUILD_DIR)/esp_flash.bin dump_flash: echo Dumping flash memory to file: $(FLASH_FILE) $(ESPTOOL_PATTERN) read_flash 0 $(shell perl -e 'shift =~ /(\d+)([MK])/ || die "Invalid memory size\n";$$mem_size=$$1*1024;$$mem_size*=1024 if $$2 eq "M";print $$mem_size;' $(FLASH_DEF)) $(FLASH_FILE) dump_fs: echo Dumping flash file system to directory: $(FS_REST_DIR) -$(ESPTOOL_PATTERN) read_flash $(SPIFFS_START) $(SPIFFS_SIZE) $(FS_IMAGE) mkdir -p $(FS_REST_DIR) echo echo == Files == $(RESTSPIFFS_COM) restore_flash: echo Restoring flash memory from file: $(FLASH_FILE) $(ESPTOOL_PATTERN) -a soft_reset write_flash 0 $(FLASH_FILE) erase_flash: $(ESPTOOL_PATTERN) erase_flash clean: echo Removing all build files rm -rf "$(BUILD_DIR)" $(FILES_TO_CLEAN) list_boards: echo === Available boards === cat $(ESP_ROOT)/boards.txt | perl -e 'while (<>) { if (/^(\w+)\.name=(.+)/){ print sprintf("%-20s %s\n", $$1,$$2);} }' list_lib: echo === User specific libraries === perl -e 'foreach (@ARGV) {print "$$_\n"}' "* Include directories:" $(USER_INC_DIRS) "* Library source files:" $(USER_SRC) list_flash_defs: echo === Memory configurations for board: $(BOARD) === cat $(ESP_ROOT)/boards.txt | perl -e 'while (<>) { if (/^$(BOARD)\.$(FLASH_DEF_MATCH)/){ print sprintf("%-10s %s\n", $$1,$$2);} }' help: echo echo "Generic makefile for building Arduino esp8266 and esp32 projects" echo "This file can either be used directly or included from another makefile" echo "" echo "The following targets are available:" echo " all (default) Build the project application" echo " clean Remove all intermediate build files" echo " flash Build and and flash the project application" echo " flash_fs Build and and flash file system (when applicable)" echo " ota Build and and flash via OTA" echo " Params: ESP_ADDR, ESP_PORT and ESP_PWD" echo " ota_fs Build and and flash file system via OTA" echo " http Build and and flash via http (curl)" echo " Params: HTTP_ADDR, HTTP_URI, HTTP_PWD and HTTP_USR" echo " dump_flash Dump the whole board flash memory to a file" echo " restore_flash Restore flash memory from a previously dumped file" echo " dump_fs Extract all files from the flash file system" echo " Params: FS_DUMP_DIR" echo " erase_flash Erase the whole flash" echo " list_lib Show a list of used library files and include paths" echo "Configurable parameters:" echo " SKETCH Main source file" echo " If not specified the first sketch in current" echo " directory will be used." echo " LIBS Includes in the sketch file of libraries from within" echo " the ESP Arduino directories are automatically" echo " detected. If this is not enough, define this" echo " variable with all libraries or directories needed." echo " CHIP Set to esp8266 or esp32. Default: '$(CHIP)'" echo " BOARD Name of the target board. Default: '$(BOARD)'" echo " Use 'list_boards' to get list of available ones" echo " FLASH_DEF Flash partitioning info. Default '$(FLASH_DEF)'" echo " Use 'list_flash_defs' to get list of available ones" echo " BUILD_DIR Directory for intermediate build files." echo " Default '$(BUILD_DIR)'" echo " BUILD_EXTRA_FLAGS Additional parameters for the compilation commands" echo " FS_DIR File system root directory" echo " UPLOAD_PORT Serial flashing port name. Default: '$(UPLOAD_PORT)'" echo " UPLOAD_SPEED Serial flashing baud rate. Default: '$(UPLOAD_SPEED)'" echo " FLASH_FILE File name for dump and restore flash operations" echo " Default: '$(FLASH_FILE)'" echo " LWIP_VARIANT Use specified variant of the lwip library when applicable" echo " Default: $(LWIP_VARIANT) ($(LWIP_INFO))" echo " VERBOSE Set to 1 to get full printout of the build" echo " SINGLE_THREAD Use only one build thread" echo $(BUILD_DIR): mkdir -p $(BUILD_DIR) .PHONY: all all: $(BUILD_DIR) $(ARDUINO_MK) $(BUILD_INFO_H) prebuild $(MAIN_EXE) prebuild: ifdef USE_PREBUILD $(CORE_PREBUILD) endif $(SKETCH_PREBUILD) # Include all available dependencies -include $(wildcard $(BUILD_DIR)/*$(DEP_EXT)) .DEFAULT_GOAL = all ifndef SINGLE_THREAD # Use multithreaded builds by default MAKEFLAGS += -j endif ifndef VERBOSE # Set silent mode as default MAKEFLAGS += --silent endif # Inline Perl scripts # Parse Arduino definitions and build commands from the descriptions define PARSE_ARDUINO my $$board = shift; my $$flashSize = shift; my $$os = (shift =~ /Windows_NT/) ? "windows" : "linux"; my $$lwipvariant = shift; my %v; sub def_var { my ($$name, $$var) = @_; print "$$var ?= $$v{$$name}\n"; $$v{$$name} = "\$$($$var)"; } $$v{'runtime.platform.path'} = '$$(ESP_ROOT)'; $$v{'includes'} = '$$(C_INCLUDES)'; $$v{'runtime.ide.version'} = '10605'; $$v{'build.arch'} = uc('$(CHIP)'); $$v{'build.project_name'} = '$$(MAIN_NAME)'; $$v{'build.path'} = '$$(BUILD_DIR)'; $$v{'object_files'} = '$$^ $$(BUILD_INFO_OBJ)'; foreach my $$fn (@ARGV) { open($$f, $$fn) || die "Failed to open: $$fn\n"; while (<$$f>) { s/\s+$$//; next unless /^(\w[\w\-\.]+)=(.*)/; my ($$key, $$val) =($$1, $$2); $$board_defined = 1 if $$key eq "$$board.name"; $$key =~ s/$$board\.menu\.FlashSize\.$$flashSize\.//; $$key =~ s/$$board\.menu\.CpuFrequency\.[^\.]+\.//; $$key =~ s/$$board\.menu\.FlashFreq\.[^\.]+\.//; $$key =~ s/$$board\.menu\.UploadSpeed\.[^\.]+\.//; $$key =~ s/$$board\.menu\.ResetMethod\.[^\.]+\.//; $$key =~ s/$$board\.menu\.FlashMode\.[^\.]+\.//; $$key =~ s/$$board\.menu\.LwIPVariant\.$$lwipvariant\.//; $$key =~ s/^$$board\.//; $$v{$$key} ||= $$val; $$v{$$1} = $$v{$$key} if $$key =~ /(.+)\.$$os$$/; } close($$f); } $$v{'runtime.tools.xtensa-lx106-elf-gcc.path'} ||= '$$(COMP_PATH)'; $$v{'runtime.tools.esptool.path'} ||= '$$(ESPTOOL_PATH)'; die "* Unknown board $$board\n" unless $$board_defined; print "# Board definitions\n"; def_var('build.code_debug', 'CORE_DEBUG_LEVEL'); def_var('build.f_cpu', 'F_CPU'); def_var('build.flash_mode', 'FLASH_MODE'); def_var('build.flash_freq', 'FLASH_SPEED'); def_var('upload.resetmethod', 'UPLOAD_RESET'); def_var('upload.speed', 'UPLOAD_SPEED'); def_var('compiler.warning_flags', 'COMP_WARNINGS'); $$v{'upload.verbose'} = '$$(UPLOAD_VERB)'; $$v{'serial.port'} = '$$(UPLOAD_PORT)'; $$v{'recipe.objcopy.hex.pattern'} =~ s/[^"]+\/bootloaders\/eboot\/eboot.elf/\$$(BOOT_LOADER)/; $$v{'recipe.hooks.linking.prelink.1.pattern'} =~ s/\{build.vtable_flags\}/\$$(VTABLE_FLAGS)/; $$v{'tools.esptool.upload.pattern'} =~ s/\{(cmd|path)\}/\{tools.esptool.$$1\}/g; $$v{'compiler.cpreprocessor.flags'} .= " \$$(C_PRE_PROC_FLAGS)"; $$v{'build.extra_flags'} .= " \$$(BUILD_EXTRA_FLAGS)"; foreach my $$key (sort keys %v) { while ($$v{$$key} =~/\{/) { $$v{$$key} =~ s/\{([\w\-\.]+)\}/$$v{$$1}/; $$v{$$key} =~ s/""//; } $$v{$$key} =~ s/ -o\s+$$//; $$v{$$key} =~ s/(-D\w+=)"([^"]+)"/$$1\\"$$2\\"/g; } print "INCLUDE_VARIANT = $$v{'build.variant'}\n"; print "# Commands\n"; print "C_COM=$$v{'recipe.c.o.pattern'}\n"; print "CPP_COM=$$v{'recipe.cpp.o.pattern'}\n"; print "S_COM=$$v{'recipe.S.o.pattern'}\n"; print "AR_COM=$$v{'recipe.ar.pattern'}\n"; print "LD_COM=$$v{'recipe.c.combine.pattern'}\n"; print "PART_FILE?=$$1\n" if $$v{'recipe.objcopy.eep.pattern'} =~ /\"([^\"]+\.csv)\"/; $$v{'recipe.objcopy.eep.pattern'} =~ s/\"([^\"]+\.csv)\"/\$$(PART_FILE)/; print "GEN_PART_COM=$$v{'recipe.objcopy.eep.pattern'}\n"; print "ELF2BIN_COM=$$v{'recipe.objcopy.hex.pattern'}\n"; print "SIZE_COM=$$v{'recipe.size.pattern'}\n"; print "ESPTOOL_COM?=$$v{'tools.esptool.path'}/$$v{'tools.esptool.cmd'}\n"; print "UPLOAD_COM?=$$v{'tools.esptool.upload.pattern'}\n"; if ($$v{'build.spiffs_start'}) { print "SPIFFS_START?=$$v{'build.spiffs_start'}\n"; my $$spiffs_size = sprintf("0x%X", hex($$v{'build.spiffs_end'})-hex($$v{'build.spiffs_start'})); print "SPIFFS_SIZE?=$$spiffs_size\n"; } elsif ($$v{'build.partitions'}) { print "COMMA=,\n"; print "SPIFFS_SPEC:=\$$(subst \$$(COMMA), ,\$$(shell grep spiffs \$$(PART_FILE)))\n"; print "SPIFFS_START:=\$$(word 4,\$$(SPIFFS_SPEC))\n"; print "SPIFFS_SIZE:=\$$(word 5,\$$(SPIFFS_SPEC))\n"; } $$v{'build.spiffs_blocksize'} ||= "4096"; print "SPIFFS_BLOCK_SIZE?=$$v{'build.spiffs_blocksize'}\n"; print "MKSPIFFS_COM?=\"\$$(MKSPIFFS_PATH)\" -b \$$(SPIFFS_BLOCK_SIZE) -s \$$(SPIFFS_SIZE) -c \$$(FS_DIR) \$$(FS_IMAGE)\n"; print "RESTSPIFFS_COM?=\"\$$(MKSPIFFS_PATH)\" -b \$$(SPIFFS_BLOCK_SIZE) -s \$$(SPIFFS_SIZE) -u \$$(FS_REST_DIR) \$$(FS_IMAGE)\n"; my $$fs_upload_com = $$v{'tools.esptool.upload.pattern'}; $$fs_upload_com =~ s/(.+ -ca) .+/$$1 \$$(SPIFFS_START) -cf \$$(FS_IMAGE)/; $$fs_upload_com =~ s/(.+ --flash_size detect) .+/$$1 \$$(SPIFFS_START) \$$(FS_IMAGE)/; print "FS_UPLOAD_COM?=$$fs_upload_com\n"; my $$val = $$v{'recipe.hooks.core.prebuild.1.pattern'}; $$val =~ s/bash -c "(.+)"/$$1/; $$val =~ s/(#define .+0x)(\`)/"\\$$1\"$$2/; $$val =~ s/(\\)//; print "CORE_PREBUILD=$$val\n"; print "SKETCH_PREBUILD=$$v{'recipe.hooks.sketch.prebuild.1.pattern'}\n"; print "VTABLE_FLAGS?=$$v{'build.vtable_flags'}\n"; print "LINK_PREBUILD=$$v{'recipe.hooks.linking.prelink.1.pattern'}\n"; print "MEM_FLASH=$$v{'recipe.size.regex'}\n"; print "MEM_RAM=$$v{'recipe.size.regex.data'}\n"; print "FLASH_INFO=$$v{'menu.FlashSize.' . $$flashSize}\n"; print "LWIP_INFO=$$v{'menu.LwIPVariant.' . $$lwipvariant}\n"; endef export PARSE_ARDUINO # Convert memory information define MEM_USAGE $$fp = shift; $$rp = shift; while (<>) { $$r += $$1 if /$$rp/; $$f += $$1 if /$$fp/; } print "\nMemory usage\n"; print sprintf(" %-6s %6d bytes\n" x 2 ."\n", "Ram:", $$r, "Flash:", $$f); endef export MEM_USAGE