blob: c54f5a54032269e2dc84d42edadd6bcb73a567fc [file] [log] [blame]
Angus Gratton043ba452024-10-22 16:01:01 +11001# This is the common ESP-IDF "main component" CMakeLists.txt contents for MicroPython.
2#
3# This file is included directly from a main_${IDF_TARGET}/CMakeLists.txt file
4# (or included from an out-of-tree main component CMakeLists.txt for out-of-tree
5# builds.)
6
Damien George9b908822020-09-23 15:55:55 +10007# Set location of base MicroPython directory.
Damien George0009a7d2021-06-24 16:03:25 +10008if(NOT MICROPY_DIR)
Damien Georgee4650122023-05-09 09:52:54 +10009 get_filename_component(MICROPY_DIR ${CMAKE_CURRENT_LIST_DIR}/../.. ABSOLUTE)
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -070010endif()
11
Damien Georgee4650122023-05-09 09:52:54 +100012# Set location of the ESP32 port directory.
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -070013if(NOT MICROPY_PORT_DIR)
14 get_filename_component(MICROPY_PORT_DIR ${MICROPY_DIR}/ports/esp32 ABSOLUTE)
Damien George0009a7d2021-06-24 16:03:25 +100015endif()
Damien George9b908822020-09-23 15:55:55 +100016
Angus Gratton4b1c6662025-03-04 12:20:02 +110017# RISC-V specific inclusions
18if(CONFIG_IDF_TARGET_ARCH_RISCV)
Alessandro Gatti9ab69062025-03-22 02:35:32 +010019 list(APPEND MICROPY_SOURCE_LIB
20 ${MICROPY_DIR}/shared/runtime/gchelper_native.c
21 ${MICROPY_DIR}/shared/runtime/gchelper_rv32i.s
22 )
Angus Gratton4b1c6662025-03-04 12:20:02 +110023endif()
24
25if(NOT DEFINED MICROPY_PY_TINYUSB)
26 if(CONFIG_IDF_TARGET_ESP32S2 OR CONFIG_IDF_TARGET_ESP32S3)
27 set(MICROPY_PY_TINYUSB ON)
28 endif()
29endif()
30
Damien Georgebfe16ef2025-03-13 15:19:08 +110031# Enable error text compression by default.
32if(NOT MICROPY_ROM_TEXT_COMPRESSION)
33 set(MICROPY_ROM_TEXT_COMPRESSION ON)
34endif()
35
Damien George9b908822020-09-23 15:55:55 +100036# Include core source components.
37include(${MICROPY_DIR}/py/py.cmake)
Damien George9b908822020-09-23 15:55:55 +100038
Jim Mussaredad123ed2023-07-31 17:24:38 +100039# CMAKE_BUILD_EARLY_EXPANSION is set during the component-discovery phase of
40# `idf.py build`, so none of the extmod/usermod (and in reality, most of the
41# micropython) rules need to happen. Specifically, you cannot invoke add_library.
Michael O'Cleirigh0ccd9e02021-03-27 17:10:39 -040042if(NOT CMAKE_BUILD_EARLY_EXPANSION)
Damien Georgebd375df2022-06-08 12:21:51 +100043 # Enable extmod components that will be configured by extmod.cmake.
44 # A board may also have enabled additional components.
Alessandro Gattie3c2cf72025-03-21 02:12:31 +010045 if (NOT DEFINED MICROPY_PY_BTREE)
46 set(MICROPY_PY_BTREE ON)
47 endif()
Damien Georgebd375df2022-06-08 12:21:51 +100048
Michael O'Cleirigh0ccd9e02021-03-27 17:10:39 -040049 include(${MICROPY_DIR}/py/usermod.cmake)
Damien George212fe7f2021-04-08 23:45:28 +100050 include(${MICROPY_DIR}/extmod/extmod.cmake)
Michael O'Cleirigh0ccd9e02021-03-27 17:10:39 -040051endif()
52
Damien Georgee4650122023-05-09 09:52:54 +100053list(APPEND MICROPY_QSTRDEFS_PORT
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -070054 ${MICROPY_PORT_DIR}/qstrdefsport.h
Damien George75db0b92021-02-21 11:33:15 +110055)
56
Damien Georgee4650122023-05-09 09:52:54 +100057list(APPEND MICROPY_SOURCE_SHARED
Damien George136369d2021-07-09 14:19:15 +100058 ${MICROPY_DIR}/shared/readline/readline.c
59 ${MICROPY_DIR}/shared/netutils/netutils.c
60 ${MICROPY_DIR}/shared/timeutils/timeutils.c
61 ${MICROPY_DIR}/shared/runtime/interrupt_char.c
robert-hha04a1412024-03-10 15:14:20 +010062 ${MICROPY_DIR}/shared/runtime/mpirq.c
Damien George136369d2021-07-09 14:19:15 +100063 ${MICROPY_DIR}/shared/runtime/stdout_helpers.c
64 ${MICROPY_DIR}/shared/runtime/sys_stdio_mphal.c
65 ${MICROPY_DIR}/shared/runtime/pyexec.c
66)
67
Damien Georgee4650122023-05-09 09:52:54 +100068list(APPEND MICROPY_SOURCE_LIB
Damien George9b908822020-09-23 15:55:55 +100069 ${MICROPY_DIR}/lib/littlefs/lfs1.c
70 ${MICROPY_DIR}/lib/littlefs/lfs1_util.c
71 ${MICROPY_DIR}/lib/littlefs/lfs2.c
72 ${MICROPY_DIR}/lib/littlefs/lfs2_util.c
Damien Georgec9eb6bc2023-12-12 16:05:03 +110073 ${MICROPY_DIR}/lib/mbedtls_errors/esp32_mbedtls_errors.c
Damien George9b908822020-09-23 15:55:55 +100074 ${MICROPY_DIR}/lib/oofatfs/ff.c
75 ${MICROPY_DIR}/lib/oofatfs/ffunicode.c
Damien George9b908822020-09-23 15:55:55 +100076)
77
Damien Georgee4650122023-05-09 09:52:54 +100078list(APPEND MICROPY_SOURCE_DRIVERS
Damien George9b908822020-09-23 15:55:55 +100079 ${MICROPY_DIR}/drivers/bus/softspi.c
80 ${MICROPY_DIR}/drivers/dht/dht.c
81)
82
Angus Grattoncccac2c2025-03-11 17:17:39 +110083list(APPEND GIT_SUBMODULES lib/tinyusb)
84if(MICROPY_PY_TINYUSB)
Andrew Leech42479212024-05-23 17:23:41 +100085 set(TINYUSB_SRC "${MICROPY_DIR}/lib/tinyusb/src")
86 string(TOUPPER OPT_MCU_${IDF_TARGET} tusb_mcu)
87
88 list(APPEND MICROPY_DEF_TINYUSB
89 CFG_TUSB_MCU=${tusb_mcu}
90 )
91
92 list(APPEND MICROPY_SOURCE_TINYUSB
93 ${TINYUSB_SRC}/tusb.c
94 ${TINYUSB_SRC}/common/tusb_fifo.c
95 ${TINYUSB_SRC}/device/usbd.c
96 ${TINYUSB_SRC}/device/usbd_control.c
97 ${TINYUSB_SRC}/class/cdc/cdc_device.c
98 ${TINYUSB_SRC}/portable/synopsys/dwc2/dcd_dwc2.c
99 ${MICROPY_DIR}/shared/tinyusb/mp_usbd.c
100 ${MICROPY_DIR}/shared/tinyusb/mp_usbd_cdc.c
101 ${MICROPY_DIR}/shared/tinyusb/mp_usbd_descriptor.c
Sebastian Romero5f2d05d2024-12-04 16:30:56 +0100102 ${MICROPY_DIR}/shared/tinyusb/mp_usbd_runtime.c
Andrew Leech42479212024-05-23 17:23:41 +1000103 )
104
105 list(APPEND MICROPY_INC_TINYUSB
106 ${TINYUSB_SRC}
107 ${MICROPY_DIR}/shared/tinyusb/
108 )
109
110 list(APPEND MICROPY_LINK_TINYUSB
111 -Wl,--wrap=dcd_event_handler
112 )
113endif()
114
Damien Georgee4650122023-05-09 09:52:54 +1000115list(APPEND MICROPY_SOURCE_PORT
Daniël van de Giessenc10a74b2024-03-13 18:23:17 +0100116 panichandler.c
Damien George03eae482023-10-25 19:13:11 +1100117 adc.c
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -0700118 main.c
Damien George1db40ed2023-06-21 15:09:26 +1000119 ppp_set_auth.c
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -0700120 uart.c
121 usb.c
122 usb_serial_jtag.c
123 gccollect.c
124 mphalport.c
125 fatfs_port.c
126 help.c
127 machine_bitstream.c
128 machine_timer.c
129 machine_pin.c
130 machine_touchpad.c
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -0700131 machine_dac.c
132 machine_i2c.c
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -0700133 network_common.c
134 network_lan.c
135 network_ppp.c
136 network_wlan.c
137 mpnimbleport.c
138 modsocket.c
Angus Gratton82e69df2024-10-02 14:49:49 +1000139 lwip_patch.c
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -0700140 modesp.c
141 esp32_nvs.c
142 esp32_partition.c
143 esp32_rmt.c
144 esp32_ulp.c
145 modesp32.c
146 machine_hw_spi.c
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -0700147 mpthreadport.c
148 machine_rtc.c
149 machine_sdcard.c
150 modespnow.c
Damien George9b908822020-09-23 15:55:55 +1000151)
Brian 'redbeard' Harrington5fe2a3f2023-06-12 13:02:10 -0700152list(TRANSFORM MICROPY_SOURCE_PORT PREPEND ${MICROPY_PORT_DIR}/)
Damien Georgecb31c0a2023-07-15 00:03:59 +1000153list(APPEND MICROPY_SOURCE_PORT ${CMAKE_BINARY_DIR}/pins.c)
Damien George9b908822020-09-23 15:55:55 +1000154
Damien Georgee4650122023-05-09 09:52:54 +1000155list(APPEND MICROPY_SOURCE_QSTR
Damien George9b908822020-09-23 15:55:55 +1000156 ${MICROPY_SOURCE_PY}
157 ${MICROPY_SOURCE_EXTMOD}
Michael O'Cleirigh0ccd9e02021-03-27 17:10:39 -0400158 ${MICROPY_SOURCE_USERMOD}
Damien George136369d2021-07-09 14:19:15 +1000159 ${MICROPY_SOURCE_SHARED}
Damien George9b908822020-09-23 15:55:55 +1000160 ${MICROPY_SOURCE_LIB}
161 ${MICROPY_SOURCE_PORT}
Damien Georgef046b502021-09-22 00:00:26 +1000162 ${MICROPY_SOURCE_BOARD}
Andrew Leech42479212024-05-23 17:23:41 +1000163 ${MICROPY_SOURCE_TINYUSB}
Damien George9b908822020-09-23 15:55:55 +1000164)
165
Damien Georgee4650122023-05-09 09:52:54 +1000166list(APPEND IDF_COMPONENTS
Damien George9b908822020-09-23 15:55:55 +1000167 app_update
168 bootloader_support
Damien Georgeda2b5fa2021-02-14 01:36:30 +1100169 bt
Damien George9b908822020-09-23 15:55:55 +1000170 driver
Damien Georgee4650122023-05-09 09:52:54 +1000171 esp_adc
172 esp_app_format
Damien George9b908822020-09-23 15:55:55 +1000173 esp_common
174 esp_eth
175 esp_event
Damien Georgee4650122023-05-09 09:52:54 +1000176 esp_hw_support
177 esp_netif
178 esp_partition
179 esp_pm
180 esp_psram
Damien George9b908822020-09-23 15:55:55 +1000181 esp_ringbuf
182 esp_rom
Damien Georgee4650122023-05-09 09:52:54 +1000183 esp_system
184 esp_timer
Damien George9b908822020-09-23 15:55:55 +1000185 esp_wifi
186 freertos
Damien Georgee4650122023-05-09 09:52:54 +1000187 hal
Damien George9b908822020-09-23 15:55:55 +1000188 heap
189 log
190 lwip
191 mbedtls
Damien George9b908822020-09-23 15:55:55 +1000192 newlib
193 nvs_flash
194 sdmmc
195 soc
196 spi_flash
Damien George9b908822020-09-23 15:55:55 +1000197 ulp
Andrew Leech42479212024-05-23 17:23:41 +1000198 usb
Damien George9b908822020-09-23 15:55:55 +1000199 vfs
Damien George9b908822020-09-23 15:55:55 +1000200)
201
Karl Palssoncbd21b32025-01-27 16:05:07 +0000202# Provide the default LD fragment if not set
203if (MICROPY_USER_LDFRAGMENTS)
204 set(MICROPY_LDFRAGMENTS ${MICROPY_USER_LDFRAGMENTS})
Karl Palssoncbd21b32025-01-27 16:05:07 +0000205endif()
206
Angus Grattoncccac2c2025-03-11 17:17:39 +1100207if (UPDATE_SUBMODULES)
208 # ESP-IDF checks if some paths exist before CMake does. Some paths don't
209 # yet exist if this is an UPDATE_SUBMODULES pass on a brand new checkout, so remove
210 # any path which might not exist yet. A "real" build will not set UPDATE_SUBMODULES.
211 unset(MICROPY_SOURCE_TINYUSB)
212 unset(MICROPY_SOURCE_EXTMOD)
213 unset(MICROPY_SOURCE_LIB)
214 unset(MICROPY_INC_TINYUSB)
215 unset(MICROPY_INC_CORE)
216endif()
217
Damien George9b908822020-09-23 15:55:55 +1000218# Register the main IDF component.
219idf_component_register(
220 SRCS
221 ${MICROPY_SOURCE_PY}
222 ${MICROPY_SOURCE_EXTMOD}
Damien George136369d2021-07-09 14:19:15 +1000223 ${MICROPY_SOURCE_SHARED}
Damien George9b908822020-09-23 15:55:55 +1000224 ${MICROPY_SOURCE_LIB}
225 ${MICROPY_SOURCE_DRIVERS}
226 ${MICROPY_SOURCE_PORT}
Damien Georgef046b502021-09-22 00:00:26 +1000227 ${MICROPY_SOURCE_BOARD}
Andrew Leech42479212024-05-23 17:23:41 +1000228 ${MICROPY_SOURCE_TINYUSB}
Damien George9b908822020-09-23 15:55:55 +1000229 INCLUDE_DIRS
Damien George5dcc9b32021-04-09 00:59:16 +1000230 ${MICROPY_INC_CORE}
Michael O'Cleirigh0ccd9e02021-03-27 17:10:39 -0400231 ${MICROPY_INC_USERMOD}
Andrew Leech42479212024-05-23 17:23:41 +1000232 ${MICROPY_INC_TINYUSB}
Damien George9b908822020-09-23 15:55:55 +1000233 ${MICROPY_PORT_DIR}
234 ${MICROPY_BOARD_DIR}
235 ${CMAKE_BINARY_DIR}
Jim Mussaredacbdbcd2024-03-21 15:46:41 +1100236 LDFRAGMENTS
Karl Palssoncbd21b32025-01-27 16:05:07 +0000237 ${MICROPY_LDFRAGMENTS}
Damien George9b908822020-09-23 15:55:55 +1000238 REQUIRES
239 ${IDF_COMPONENTS}
240)
241
242# Set the MicroPython target as the current (main) IDF component target.
243set(MICROPY_TARGET ${COMPONENT_TARGET})
244
245# Define mpy-cross flags, for use with frozen code.
Alessandro Gattifda9bf42025-03-22 02:40:59 +0100246if(CONFIG_IDF_TARGET_ARCH_XTENSA)
247 set(MICROPY_CROSS_FLAGS -march=xtensawin)
248elseif(CONFIG_IDF_TARGET_ARCH_RISCV)
249 set(MICROPY_CROSS_FLAGS -march=rv32imc)
Alessandro Gatti95ce61d2023-10-31 13:28:25 +0100250endif()
Damien George9b908822020-09-23 15:55:55 +1000251
252# Set compile options for this port.
253target_compile_definitions(${MICROPY_TARGET} PUBLIC
Damien Georgeab9d47e2021-04-08 23:56:28 +1000254 ${MICROPY_DEF_CORE}
Jim Mussared2fbf42d2023-07-25 15:03:30 +1000255 ${MICROPY_DEF_BOARD}
Andrew Leech42479212024-05-23 17:23:41 +1000256 ${MICROPY_DEF_TINYUSB}
Damien George9b908822020-09-23 15:55:55 +1000257 MICROPY_VFS_FAT=1
258 MICROPY_VFS_LFS2=1
259 FFCONF_H=\"${MICROPY_OOFATFS_DIR}/ffconf.h\"
260 LFS1_NO_MALLOC LFS1_NO_DEBUG LFS1_NO_WARN LFS1_NO_ERROR LFS1_NO_ASSERT
261 LFS2_NO_MALLOC LFS2_NO_DEBUG LFS2_NO_WARN LFS2_NO_ERROR LFS2_NO_ASSERT
262)
263
264# Disable some warnings to keep the build output clean.
265target_compile_options(${MICROPY_TARGET} PUBLIC
266 -Wno-clobbered
267 -Wno-deprecated-declarations
268 -Wno-missing-field-initializers
269)
270
Andrew Leech42479212024-05-23 17:23:41 +1000271target_link_options(${MICROPY_TARGET} PUBLIC
272 ${MICROPY_LINK_TINYUSB}
273)
274
Damien George5dbb8222021-03-17 12:35:59 +1100275# Additional include directories needed for private NimBLE headers.
276target_include_directories(${MICROPY_TARGET} PUBLIC
277 ${IDF_PATH}/components/bt/host/nimble/nimble
278)
279
Damien Georgeab9d47e2021-04-08 23:56:28 +1000280# Add additional extmod and usermod components.
Alessandro Gattie3c2cf72025-03-21 02:12:31 +0100281if (MICROPY_PY_BTREE)
282 target_link_libraries(${MICROPY_TARGET} micropy_extmod_btree)
283endif()
Michael O'Cleirigh0ccd9e02021-03-27 17:10:39 -0400284target_link_libraries(${MICROPY_TARGET} usermod)
285
Angus Grattonb20687d2024-12-03 10:02:46 +1100286# Extra linker options
287# (when wrap symbols are in standalone files, --undefined ensures
288# the linker doesn't skip that file.)
289target_link_options(${MICROPY_TARGET} PUBLIC
290 # Patch LWIP memory pool allocators (see lwip_patch.c)
291 -Wl,--undefined=memp_malloc
292 -Wl,--wrap=memp_malloc
293 -Wl,--wrap=memp_free
Angus Grattonff70a912024-10-22 15:02:32 +1100294
Angus Grattonb20687d2024-12-03 10:02:46 +1100295 # Enable the panic handler wrapper
296 -Wl,--undefined=esp_panic_handler
297 -Wl,--wrap=esp_panic_handler
298)
Angus Grattonff70a912024-10-22 15:02:32 +1100299
Luca Burelli31ef7c12023-07-05 18:03:11 +0200300# Collect all of the include directories and compile definitions for the IDF components,
301# including those added by the IDF Component Manager via idf_components.yaml.
302foreach(comp ${__COMPONENT_NAMES_RESOLVED})
Damien George0fabda32021-04-08 23:42:22 +1000303 micropy_gather_target_properties(__idf_${comp})
Damien Georgee4650122023-05-09 09:52:54 +1000304 micropy_gather_target_properties(${comp})
Damien George9b908822020-09-23 15:55:55 +1000305endforeach()
306
Damien George9b908822020-09-23 15:55:55 +1000307# Include the main MicroPython cmake rules.
308include(${MICROPY_DIR}/py/mkrules.cmake)
Damien Georgecb31c0a2023-07-15 00:03:59 +1000309
310# Generate source files for named pins (requires mkrules.cmake for MICROPY_GENHDR_DIR).
311
312set(GEN_PINS_PREFIX "${MICROPY_PORT_DIR}/boards/pins_prefix.c")
313set(GEN_PINS_MKPINS "${MICROPY_PORT_DIR}/boards/make-pins.py")
314set(GEN_PINS_SRC "${CMAKE_BINARY_DIR}/pins.c")
315set(GEN_PINS_HDR "${MICROPY_GENHDR_DIR}/pins.h")
316
317if(EXISTS "${MICROPY_BOARD_DIR}/pins.csv")
318 set(GEN_PINS_BOARD_CSV "${MICROPY_BOARD_DIR}/pins.csv")
319 set(GEN_PINS_BOARD_CSV_ARG --board-csv "${GEN_PINS_BOARD_CSV}")
320endif()
321
322target_sources(${MICROPY_TARGET} PRIVATE ${GEN_PINS_HDR})
323
324add_custom_command(
325 OUTPUT ${GEN_PINS_SRC} ${GEN_PINS_HDR}
326 COMMAND ${Python3_EXECUTABLE} ${GEN_PINS_MKPINS} ${GEN_PINS_BOARD_CSV_ARG}
327 --prefix ${GEN_PINS_PREFIX} --output-source ${GEN_PINS_SRC} --output-header ${GEN_PINS_HDR}
328 DEPENDS
329 ${MICROPY_MPVERSION}
330 ${GEN_PINS_MKPINS}
331 ${GEN_PINS_BOARD_CSV}
332 ${GEN_PINS_PREFIX}
333 VERBATIM
334 COMMAND_EXPAND_LISTS
335)