# Set location of base MicroPython directory. if(NOT MICROPY_DIR) get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../.. ABSOLUTE) endif() # Set location of the ESP32 port directory. if(NOT MICROPY_PORT_DIR) get_filename_component(MICROPY_PORT_DIR ${MICROPY_DIR}/ports/esp32 ABSOLUTE) endif() # Include core source components. include(${MICROPY_DIR}/py/py.cmake) # CMAKE_BUILD_EARLY_EXPANSION is set during the component-discovery phase of # `idf.py build`, so none of the extmod/usermod (and in reality, most of the # micropython) rules need to happen. Specifically, you cannot invoke add_library. if(NOT CMAKE_BUILD_EARLY_EXPANSION) # Enable extmod components that will be configured by extmod.cmake. # A board may also have enabled additional components. set(MICROPY_PY_BTREE ON) include(${MICROPY_DIR}/py/usermod.cmake) include(${MICROPY_DIR}/extmod/extmod.cmake) endif() list(APPEND MICROPY_QSTRDEFS_PORT ${MICROPY_PORT_DIR}/qstrdefsport.h ) list(APPEND MICROPY_SOURCE_SHARED ${MICROPY_DIR}/shared/readline/readline.c ${MICROPY_DIR}/shared/netutils/netutils.c ${MICROPY_DIR}/shared/timeutils/timeutils.c ${MICROPY_DIR}/shared/runtime/interrupt_char.c ${MICROPY_DIR}/shared/runtime/mpirq.c ${MICROPY_DIR}/shared/runtime/stdout_helpers.c ${MICROPY_DIR}/shared/runtime/sys_stdio_mphal.c ${MICROPY_DIR}/shared/runtime/pyexec.c ) list(APPEND MICROPY_SOURCE_LIB ${MICROPY_DIR}/lib/littlefs/lfs1.c ${MICROPY_DIR}/lib/littlefs/lfs1_util.c ${MICROPY_DIR}/lib/littlefs/lfs2.c ${MICROPY_DIR}/lib/littlefs/lfs2_util.c ${MICROPY_DIR}/lib/mbedtls_errors/esp32_mbedtls_errors.c ${MICROPY_DIR}/lib/oofatfs/ff.c ${MICROPY_DIR}/lib/oofatfs/ffunicode.c ) list(APPEND MICROPY_SOURCE_DRIVERS ${MICROPY_DIR}/drivers/bus/softspi.c ${MICROPY_DIR}/drivers/dht/dht.c ) string(CONCAT GIT_SUBMODULES "${GIT_SUBMODULES} " lib/tinyusb) if(MICROPY_PY_TINYUSB) set(TINYUSB_SRC "${MICROPY_DIR}/lib/tinyusb/src") string(TOUPPER OPT_MCU_${IDF_TARGET} tusb_mcu) list(APPEND MICROPY_DEF_TINYUSB CFG_TUSB_MCU=${tusb_mcu} ) list(APPEND MICROPY_SOURCE_TINYUSB ${TINYUSB_SRC}/tusb.c ${TINYUSB_SRC}/common/tusb_fifo.c ${TINYUSB_SRC}/device/usbd.c ${TINYUSB_SRC}/device/usbd_control.c ${TINYUSB_SRC}/class/cdc/cdc_device.c ${TINYUSB_SRC}/portable/synopsys/dwc2/dcd_dwc2.c ${MICROPY_DIR}/shared/tinyusb/mp_usbd.c ${MICROPY_DIR}/shared/tinyusb/mp_usbd_cdc.c ${MICROPY_DIR}/shared/tinyusb/mp_usbd_descriptor.c ) list(APPEND MICROPY_INC_TINYUSB ${TINYUSB_SRC} ${MICROPY_DIR}/shared/tinyusb/ ) list(APPEND MICROPY_LINK_TINYUSB -Wl,--wrap=dcd_event_handler ) endif() list(APPEND MICROPY_SOURCE_PORT panichandler.c adc.c main.c ppp_set_auth.c uart.c usb.c usb_serial_jtag.c gccollect.c mphalport.c fatfs_port.c help.c machine_bitstream.c machine_timer.c machine_pin.c machine_touchpad.c machine_dac.c machine_i2c.c network_common.c network_lan.c network_ppp.c network_wlan.c mpnimbleport.c modsocket.c lwip_patch.c modesp.c esp32_nvs.c esp32_partition.c esp32_rmt.c esp32_ulp.c modesp32.c machine_hw_spi.c mpthreadport.c machine_rtc.c machine_sdcard.c modespnow.c ) list(TRANSFORM MICROPY_SOURCE_PORT PREPEND ${MICROPY_PORT_DIR}/) list(APPEND MICROPY_SOURCE_PORT ${CMAKE_BINARY_DIR}/pins.c) list(APPEND MICROPY_SOURCE_QSTR ${MICROPY_SOURCE_PY} ${MICROPY_SOURCE_EXTMOD} ${MICROPY_SOURCE_USERMOD} ${MICROPY_SOURCE_SHARED} ${MICROPY_SOURCE_LIB} ${MICROPY_SOURCE_PORT} ${MICROPY_SOURCE_BOARD} ${MICROPY_SOURCE_TINYUSB} ) list(APPEND IDF_COMPONENTS app_update bootloader_support bt driver esp_adc esp_app_format esp_common esp_eth esp_event esp_hw_support esp_netif esp_partition esp_pm esp_psram esp_ringbuf esp_rom esp_system esp_timer esp_wifi freertos hal heap log lwip mbedtls newlib nvs_flash sdmmc soc spi_flash ulp usb vfs ) # Register the main IDF component. idf_component_register( SRCS ${MICROPY_SOURCE_PY} ${MICROPY_SOURCE_EXTMOD} ${MICROPY_SOURCE_SHARED} ${MICROPY_SOURCE_LIB} ${MICROPY_SOURCE_DRIVERS} ${MICROPY_SOURCE_PORT} ${MICROPY_SOURCE_BOARD} ${MICROPY_SOURCE_TINYUSB} INCLUDE_DIRS ${MICROPY_INC_CORE} ${MICROPY_INC_USERMOD} ${MICROPY_INC_TINYUSB} ${MICROPY_PORT_DIR} ${MICROPY_BOARD_DIR} ${CMAKE_BINARY_DIR} LDFRAGMENTS linker.lf REQUIRES ${IDF_COMPONENTS} ) # Set the MicroPython target as the current (main) IDF component target. set(MICROPY_TARGET ${COMPONENT_TARGET}) # Define mpy-cross flags, for use with frozen code. if(CONFIG_IDF_TARGET_ARCH STREQUAL "xtensa") set(MICROPY_CROSS_FLAGS -march=xtensawin) endif() # Set compile options for this port. target_compile_definitions(${MICROPY_TARGET} PUBLIC ${MICROPY_DEF_CORE} ${MICROPY_DEF_BOARD} ${MICROPY_DEF_TINYUSB} MICROPY_ESP_IDF_4=1 MICROPY_VFS_FAT=1 MICROPY_VFS_LFS2=1 FFCONF_H=\"${MICROPY_OOFATFS_DIR}/ffconf.h\" LFS1_NO_MALLOC LFS1_NO_DEBUG LFS1_NO_WARN LFS1_NO_ERROR LFS1_NO_ASSERT LFS2_NO_MALLOC LFS2_NO_DEBUG LFS2_NO_WARN LFS2_NO_ERROR LFS2_NO_ASSERT ) # Disable some warnings to keep the build output clean. target_compile_options(${MICROPY_TARGET} PUBLIC -Wno-clobbered -Wno-deprecated-declarations -Wno-missing-field-initializers ) target_link_options(${MICROPY_TARGET} PUBLIC ${MICROPY_LINK_TINYUSB} ) # Additional include directories needed for private NimBLE headers. target_include_directories(${MICROPY_TARGET} PUBLIC ${IDF_PATH}/components/bt/host/nimble/nimble ) # Add additional extmod and usermod components. target_link_libraries(${MICROPY_TARGET} micropy_extmod_btree) target_link_libraries(${MICROPY_TARGET} usermod) # Collect all of the include directories and compile definitions for the IDF components, # including those added by the IDF Component Manager via idf_components.yaml. foreach(comp ${__COMPONENT_NAMES_RESOLVED}) micropy_gather_target_properties(__idf_${comp}) micropy_gather_target_properties(${comp}) endforeach() # Include the main MicroPython cmake rules. include(${MICROPY_DIR}/py/mkrules.cmake) # Generate source files for named pins (requires mkrules.cmake for MICROPY_GENHDR_DIR). set(GEN_PINS_PREFIX "${MICROPY_PORT_DIR}/boards/pins_prefix.c") set(GEN_PINS_MKPINS "${MICROPY_PORT_DIR}/boards/make-pins.py") set(GEN_PINS_SRC "${CMAKE_BINARY_DIR}/pins.c") set(GEN_PINS_HDR "${MICROPY_GENHDR_DIR}/pins.h") if(EXISTS "${MICROPY_BOARD_DIR}/pins.csv") set(GEN_PINS_BOARD_CSV "${MICROPY_BOARD_DIR}/pins.csv") set(GEN_PINS_BOARD_CSV_ARG --board-csv "${GEN_PINS_BOARD_CSV}") endif() target_sources(${MICROPY_TARGET} PRIVATE ${GEN_PINS_HDR}) add_custom_command( OUTPUT ${GEN_PINS_SRC} ${GEN_PINS_HDR} COMMAND ${Python3_EXECUTABLE} ${GEN_PINS_MKPINS} ${GEN_PINS_BOARD_CSV_ARG} --prefix ${GEN_PINS_PREFIX} --output-source ${GEN_PINS_SRC} --output-header ${GEN_PINS_HDR} DEPENDS ${MICROPY_MPVERSION} ${GEN_PINS_MKPINS} ${GEN_PINS_BOARD_CSV} ${GEN_PINS_PREFIX} VERBATIM COMMAND_EXPAND_LISTS )