| # This is the common ESP-IDF "main component" CMakeLists.txt contents for MicroPython. |
| # |
| # This file is included directly from a main_${IDF_TARGET}/CMakeLists.txt file |
| # (or included from an out-of-tree main component CMakeLists.txt for out-of-tree |
| # builds.) |
| |
| # 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() |
| |
| # RISC-V specific inclusions |
| if(CONFIG_IDF_TARGET_ARCH_RISCV) |
| list(APPEND MICROPY_SOURCE_LIB ${MICROPY_DIR}/shared/runtime/gchelper_generic.c) |
| list(APPEND IDF_COMPONENTS riscv) |
| endif() |
| |
| if(NOT DEFINED MICROPY_PY_TINYUSB) |
| if(CONFIG_IDF_TARGET_ESP32S2 OR CONFIG_IDF_TARGET_ESP32S3) |
| set(MICROPY_PY_TINYUSB ON) |
| endif() |
| 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 |
| ) |
| |
| list(APPEND 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 |
| ${MICROPY_DIR}/shared/tinyusb/mp_usbd_runtime.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 |
| ) |
| |
| # Provide the default LD fragment if not set |
| if (MICROPY_USER_LDFRAGMENTS) |
| set(MICROPY_LDFRAGMENTS ${MICROPY_USER_LDFRAGMENTS}) |
| endif() |
| |
| if (UPDATE_SUBMODULES) |
| # ESP-IDF checks if some paths exist before CMake does. Some paths don't |
| # yet exist if this is an UPDATE_SUBMODULES pass on a brand new checkout, so remove |
| # any path which might not exist yet. A "real" build will not set UPDATE_SUBMODULES. |
| unset(MICROPY_SOURCE_TINYUSB) |
| unset(MICROPY_SOURCE_EXTMOD) |
| unset(MICROPY_SOURCE_LIB) |
| unset(MICROPY_INC_TINYUSB) |
| unset(MICROPY_INC_CORE) |
| endif() |
| |
| # 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 |
| ${MICROPY_LDFRAGMENTS} |
| 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) |
| |
| # Extra linker options |
| # (when wrap symbols are in standalone files, --undefined ensures |
| # the linker doesn't skip that file.) |
| target_link_options(${MICROPY_TARGET} PUBLIC |
| # Patch LWIP memory pool allocators (see lwip_patch.c) |
| -Wl,--undefined=memp_malloc |
| -Wl,--wrap=memp_malloc |
| -Wl,--wrap=memp_free |
| |
| # Enable the panic handler wrapper |
| -Wl,--undefined=esp_panic_handler |
| -Wl,--wrap=esp_panic_handler |
| ) |
| |
| # 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 |
| ) |