#
.PHONY: partition_table partition_table-flash partition_table-clean
+MD5_OPT :=
ifneq ("$(CONFIG_PARTITION_TABLE_MD5)", "y")
-MD5_OPT ?= "--disable-md5sum"
+MD5_OPT := "--disable-md5sum"
endif
-# NB: gen_esp32part.py lives in the sdk/bin/ dir not component dir
-GEN_ESP32PART := $(PYTHON) $(COMPONENT_PATH)/gen_esp32part.py -q $(MD5_OPT)
+FLASHSIZE_OPT :=
+ifneq ("$(CONFIG_ESPTOOLPY_FLASHSIZE)", "")
+FLASHSIZE_OPT := --flash-size $(CONFIG_ESPTOOLPY_FLASHSIZE)
+endif
+
+GEN_ESP32PART := $(PYTHON) $(COMPONENT_PATH)/gen_esp32part.py -q $(MD5_OPT) $(FLASHSIZE_OPT)
+
+undefine FLASHSIZE_OPT # we don't need these any more, so take them out of global scope
+undefine MD5_OPT
# Has a matching value in bootloader_support esp_flash_partitions.h
PARTITION_TABLE_OFFSET := 0x8000
raise InputError("Partition at 0x%x overlaps 0x%x-0x%x" % (p.offset, last.offset, last.offset+last.size-1))
last = p
+ def flash_size(self):
+ """ Return the size that partitions will occupy in flash
+ (ie the offset the last partition ends at)
+ """
+ try:
+ last = sorted(self, reverse=True)[0]
+ except IndexError:
+ return 0 # empty table!
+ return last.offset + last.size
+
@classmethod
def from_binary(cls, b):
md5 = hashlib.md5();
global md5sum
parser = argparse.ArgumentParser(description='ESP32 partition table utility')
+ parser.add_argument('--flash-size', help='Optional flash size limit, checks partition table fits in flash',
+ nargs='?', choices=[ '1MB', '2MB', '4MB', '8MB', '16MB' ])
parser.add_argument('--disable-md5sum', help='Disable md5 checksum for the partition table', default=False, action='store_true')
parser.add_argument('--verify', '-v', help='Verify partition table fields', default=True, action='store_false')
parser.add_argument('--quiet', '-q', help="Don't print status messages to stderr", action='store_true')
status("Verifying table...")
table.verify()
+ if args.flash_size:
+ size_mb = int(args.flash_size.replace("MB", ""))
+ size = size_mb * 1024 * 1024 # flash memory uses honest megabytes!
+ table_size = table.flash_size()
+ if size < table_size:
+ raise InputError("Partitions defined in '%s' occupy %.1fMB of flash (%d bytes) which does not fit in configured flash size %dMB. Change the flash size in menuconfig under the 'Serial Flasher Config' menu." %
+ (args.input.name, table_size / 1024.0 / 1024.0, table_size, size_mb))
+
if input_is_binary:
output = table.to_csv()
with sys.stdout if args.output == '-' else open(args.output, 'w') as f:
[ -f ${IDF_PATH}/.gitmodules_backup ] && mv ${IDF_PATH}/.gitmodules_backup ${IDF_PATH}/.gitmodules
export PATH=$OLD_PATH
+ print_status "Build fails if partitions don't fit in flash"
+ cp sdkconfig sdkconfig.bak
+ sed -i "s/CONFIG_ESPTOOLPY_FLASHSIZE.\+//" sdkconfig # remove all flashsize config
+ echo "CONFIG_ESPTOOLPY_FLASHSIZE_1MB=y" >> sdkconfig # introduce undersize flash
+ make defconfig || failure "Failed to reconfigure with smaller flash"
+ ( make 2>&1 | grep "does not fit in configured flash size 1MB" ) || failure "Build didn't fail with expected flash size failure message"
+ mv sdkconfig.bak sdkconfig
+
print_status "All tests completed"
if [ -n "${FAILURES}" ]; then
echo "Some failures were detected:"