/ components / micropython / CMakeLists.txt
CMakeLists.txt
  1  if(CONFIG_COMPONENT_MICROPYTHON_ENABLE)
  2      set(mpy_component_name "micropython")
  3      get_filename_component(mpy_dir ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
  4      set(mpy_core_dir "${mpy_dir}/core")
  5      set(mpy_core_src_dir "${mpy_core_dir}/py")
  6      set(mpy_port_dir "${mpy_dir}/port")
  7      set(mpy_build_dir "${CMAKE_BINARY_DIR}/micropython")
  8      set(mpy_build_gen_header_dir "${mpy_build_dir}/genhdr")
  9  
 10      if(IS_DIRECTORY ${CONFIG_BUILTIN_PY_DIR})
 11          set(mpy_frozen_py_dir ${CONFIG_BUILTIN_PY_DIR})
 12      else()
 13          set(mpy_frozen_py_dir "${mpy_port_dir}/builtin_py")
 14      endif()
 15      message(STATUS "builtin py dir: ${mpy_frozen_py_dir}")
 16      set(mpy_build_mpy_dir "${mpy_build_dir}/mpy")
 17      set(lvgl_build_dir "${mpy_build_dir}/port/lvgl")
 18      set(lodepng_build_dir "${mpy_build_dir}/port/lodepng")
 19      set(components_requirements kendryte_sdk drivers boards utils spiffs)
 20  
 21      ################# Add include #################
 22      list(APPEND ADD_INCLUDE "${mpy_core_dir}"
 23                              "${mpy_core_src_dir}"
 24                              "${mpy_core_dir}/lib/oofatfs"
 25                              "${mpy_core_dir}/lib/mp-readline"
 26                              "${mpy_core_dir}/lib/utils"
 27                              "${mpy_core_dir}/lib/netutils"
 28                              "${mpy_core_dir}/lib/timeutils"
 29                              "${mpy_port_dir}/include"
 30                              "${mpy_port_dir}/src/audio/include"
 31                              "${mpy_port_dir}/src/audio/wav/include"
 32                              "${mpy_port_dir}/src/Maix/include"
 33                              "${mpy_port_dir}/src/modules/include"
 34                              "${mpy_port_dir}/src/modules/ultrasonic/include"
 35                              "${mpy_port_dir}/src/speech/include"
 36                              "${mpy_port_dir}/src/speech/maix_asr/include"
 37                              "${mpy_port_dir}/src/speech/isolated_word/include"
 38                              "${mpy_port_dir}/src/omv/include"
 39                              "${mpy_port_dir}/src/omv/boards/MAIX"
 40                              "${mpy_port_dir}/src/omv/img/include"
 41                              "${mpy_port_dir}/src/omv/py/include"
 42                              "${mpy_port_dir}/src/standard_lib/include"
 43                              "${mpy_build_dir}"
 44          )
 45      list(APPEND ADD_PRIVATE_INCLUDE "${mpy_port_dir}/src/nes/mapper")
 46      ###############################################
 47  
 48      
 49  
 50      ############## Add source files ###############
 51      append_srcs_dir(MPY_PORT_SRCS "port/src")
 52      append_srcs_dir(MPY_PORT_SRCS "port/src/audio")
 53      append_srcs_dir(MPY_PORT_SRCS "port/src/audio/wav")
 54      append_srcs_dir(MPY_PORT_SRCS "port/src/Maix")
 55      if(NOT CONFIG_MAIXPY_MIC_ARRAY_ENABLE)
 56          list(REMOVE_ITEM MPY_PORT_SRCS "port/src/Maix/Maix_mic_array.c")
 57      endif()
 58      append_srcs_dir(MPY_PORT_SRCS "port/src/modules")
 59      append_srcs_dir(MPY_PORT_SRCS "port/src/modules/ultrasonic/src")
 60      append_srcs_dir(MPY_PORT_SRCS "port/src/modules/onewire")
 61      append_srcs_dir(MPY_PORT_SRCS "port/src/speech/")
 62      append_srcs_dir(MPY_PORT_SRCS "port/src/speech/maix_asr")
 63      list(APPEND ADD_STATIC_LIB "port/src/speech/maix_asr/libmaix_asr.a") # append_srcs_dir(MPY_PORT_SRCS "port/src/speech/maix_asr/src")
 64      append_srcs_dir(MPY_PORT_SRCS "port/src/speech/isolated_word")
 65      append_srcs_dir(MPY_PORT_SRCS "port/src/modules/ws2812/src")
 66      append_srcs_dir(MPY_PORT_SRCS "port/src/modules/htpa/src")
 67      append_srcs_dir(MPY_PORT_SRCS "port/src/modules/amg88xx/src")
 68      append_srcs_dir(MPY_PORT_SRCS "port/src/omv")
 69      append_srcs_dir(MPY_PORT_SRCS "port/src/omv/img")
 70      append_srcs_dir(MPY_PORT_SRCS "port/src/omv/py")
 71      append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/machine")
 72      append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/network")
 73      append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/network/esp32")
 74      append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/network/esp8285")
 75      if(CONFIG_MAIXPY_WIZNET5K_ENABLE)
 76          append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/network/wiznet5k")
 77          append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/network/wiznet5k/w5500")
 78          append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/network/wiznet5k/dns")
 79          append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/network/wiznet5k/dhcp")
 80      endif()
 81      append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/socket")
 82      append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/uos")
 83      append_srcs_dir(MPY_PORT_SRCS "port/src/standard_lib/utime")
 84  
 85      list(APPEND MPY_SRCS    
 86                      "core/py/mpstate.c"
 87                      "core/py/nlr.c"
 88                      "core/py/nlrx86.c"
 89                      "core/py/nlrx64.c"
 90                      "core/py/nlrthumb.c"
 91                      "core/py/nlrxtensa.c"
 92                      "core/py/nlrsetjmp.c"
 93                      "core/py/malloc.c"
 94                      "core/py/gc.c"
 95                      "core/py/pystack.c"
 96                      "core/py/qstr.c"
 97                      "core/py/vstr.c"
 98                      "core/py/mpprint.c"
 99                      "core/py/unicode.c"
100                      "core/py/mpz.c"
101                      "core/py/reader.c"
102                      "core/py/lexer.c"
103                      "core/py/parse.c"
104                      "core/py/scope.c"
105                      "core/py/compile.c"
106                      "core/py/emitcommon.c"
107                      "core/py/emitbc.c"
108                      "core/py/asmbase.c"
109                      "core/py/asmx64.c"
110                      "core/py/emitnx64.c"
111                      "core/py/asmx86.c"
112                      "core/py/emitnx86.c"
113                      "core/py/asmthumb.c"
114                      "core/py/emitnthumb.c"
115                      "core/py/emitinlinethumb.c"
116                      "core/py/asmarm.c"
117                      "core/py/emitnarm.c"
118                      "core/py/asmxtensa.c"
119                      "core/py/emitnxtensa.c"
120                      "core/py/emitinlinextensa.c"
121                      "core/py/formatfloat.c"
122                      "core/py/parsenumbase.c"
123                      "core/py/parsenum.c"
124                      "core/py/emitglue.c"
125                      "core/py/persistentcode.c"
126                      "core/py/runtime.c"
127                      "core/py/runtime_utils.c"
128                      "core/py/scheduler.c"
129                      "core/py/nativeglue.c"
130                      "core/py/stackctrl.c"
131                      "core/py/argcheck.c"
132                      "core/py/warning.c"
133                      "core/py/map.c"
134                      "core/py/obj.c"
135                      "core/py/objarray.c"
136                      "core/py/objattrtuple.c"
137                      "core/py/objbool.c"
138                      "core/py/objboundmeth.c"
139                      "core/py/objcell.c"
140                      "core/py/objclosure.c"
141                      "core/py/objcomplex.c"
142                      "core/py/objdeque.c"
143                      "core/py/objdict.c"
144                      "core/py/objenumerate.c"
145                      "core/py/objexcept.c"
146                      "core/py/objfilter.c"
147                      "core/py/objfloat.c"
148                      "core/py/objfun.c"
149                      "core/py/objgenerator.c"
150                      "core/py/objgetitemiter.c"
151                      "core/py/objint.c"
152                      "core/py/objint_longlong.c"
153                      "core/py/objint_mpz.c"
154                      "core/py/objlist.c"
155                      "core/py/objmap.c"
156                      "core/py/objmodule.c"
157                      "core/py/objobject.c"
158                      "core/py/objpolyiter.c"
159                      "core/py/objproperty.c"
160                      "core/py/objnone.c"
161                      "core/py/objnamedtuple.c"
162                      "core/py/objrange.c"
163                      "core/py/objreversed.c"
164                      "core/py/objset.c"
165                      "core/py/objsingleton.c"
166                      "core/py/objslice.c"
167                      "core/py/objstr.c"
168                      "core/py/objstrunicode.c"
169                      "core/py/objstringio.c"
170                      "core/py/objtuple.c"
171                      "core/py/objtype.c"
172                      "core/py/objzip.c"
173                      "core/py/opmethods.c"
174                      "core/py/sequence.c"
175                      "core/py/stream.c"
176                      "core/py/binary.c"
177                      "core/py/builtinimport.c"
178                      "core/py/builtinevex.c"
179                      "core/py/builtinhelp.c"
180                      "core/py/modarray.c"
181                      "core/py/modbuiltins.c"
182                      "core/py/modcollections.c"
183                      "core/py/modgc.c"
184                      "core/py/modio.c"
185                      "core/py/modmath.c"
186                      "core/py/modcmath.c"
187                      "core/py/modmicropython.c"
188                      "core/py/modstruct.c"
189                      "core/py/modsys.c"
190                      "core/py/moduerrno.c"
191                      "core/py/modthread.c"
192                      "core/py/vm.c"
193                      "core/py/bc.c"
194                      "core/py/showbc.c"
195                      "core/py/repl.c"
196                      "core/py/smallint.c"
197                      "core/py/frozenmod.c"
198              )
199  
200      list(APPEND MPY_EXTMOD_SRCS 
201                          "core/extmod/moductypes.c"
202                          "core/extmod/modujson.c"
203                          "core/extmod/modure.c"
204                          "core/extmod/moduzlib.c"
205                          "core/extmod/moduheapq.c"
206                          "core/extmod/modutimeq.c"
207                          "core/extmod/moduhashlib.c"
208                          "core/extmod/moducryptolib.c"
209                          "core/extmod/modubinascii.c"
210                          "core/extmod/virtpin.c"
211                          "core/extmod/machine_mem.c"
212                          "core/extmod/machine_pinbase.c"
213                          "core/extmod/machine_signal.c"
214                          "core/extmod/machine_pulse.c"
215                          "core/extmod/machine_i2c.c"
216                          "core/extmod/machine_spi.c"
217                          "core/extmod/modurandom.c"
218                          "core/extmod/moduselect.c"
219                          "core/extmod/moduwebsocket.c"
220                          "core/extmod/modwebrepl.c"
221                          "core/extmod/modframebuf.c"
222                          "core/extmod/vfs.c"
223                          "core/extmod/vfs_reader.c"
224                          "core/extmod/vfs_posix.c"
225                          "core/extmod/vfs_posix_file.c"
226                          "core/extmod/vfs_fat.c"
227                          "core/extmod/vfs_fat_diskio.c"
228                          "core/extmod/vfs_fat_file.c"
229                          "core/extmod/utime_mphal.c"
230                          "core/extmod/uos_dupterm.c"
231                          "core/lib/embed/abort_.c"
232                          "core/lib/utils/printf.c"
233                          "core/lib/utils/stdout_helpers.c"
234                          "core/lib/utils/interrupt_char.c"
235                          "core/lib/utils/pyexec.c"
236                          "core/lib/libc/string0.c"
237                          "core/lib/mp-readline/readline.c"
238                          "core/lib/netutils/netutils.c"
239                          "core/lib/timeutils/timeutils.c"
240                          "core/lib/utils/sys_stdio_mphal.c"
241                          "core/lib/oofatfs/ff.c"
242                          "core/lib/oofatfs/ffunicode.c"
243                      )
244      set(MPY_FROZEN_SRC "${mpy_build_dir}/frozen_mpy.c")
245  
246      if(CONFIG_MICROPY_SSL_ENABLE)
247          list(APPEND MPY_EXTMOD_SRCS
248          "core/extmod/modussl_axtls.c"
249          "core/extmod/modussl_mbedtls.c"
250          )
251      endif()
252  
253      list(APPEND ADD_SRCS    ${MPY_SRCS}
254                              ${MPY_PORT_SRCS}
255                              ${MPY_EXTMOD_SRCS}
256                              ${MPY_FROZEN_SRC}
257                              )
258      # list(APPEND ADD_SRCS_GENERATED ${MPY_FROZEN_SRC})
259      set_property(SOURCE ${MPY_FROZEN_SRC} PROPERTY GENERATED 1)
260      ###############################################
261  
262  
263      ############# OPTIONAL MODULES PART 1 ##############
264      # nes emulator
265      if(CONFIG_MAIXPY_NES_ENABLE)
266          list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/nes/include")
267          append_srcs_dir(ADD_SRCS "port/src/nes")
268      endif()
269      # video support
270      if(CONFIG_MAIXPY_VIDEO_ENABLE)
271          list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/video/include"
272                                  "${mpy_port_dir}/src/video/avi/include"
273                                  )
274          append_srcs_dir(ADD_SRCS "port/src/video")
275          append_srcs_dir(ADD_SRCS "port/src/video/avi")
276      endif()
277      # touch screen
278      if(CONFIG_MAIXPY_TOUCH_SCREEN_ENABLE)
279          list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/touchscreen/include"
280                                  )
281          append_srcs_dir(ADD_SRCS "port/src/touchscreen")
282          if(CONFIG_MAIXPY_TOUCH_SCREEN_DRIVER_NS2009)
283              list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/touchscreen/ns2009/include")
284              append_srcs_dir(ADD_SRCS "port/src/touchscreen/ns2009")
285          endif()
286          if(CONFIG_MAIXPY_TOUCH_SCREEN_DRIVER_FT52XX)
287              list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/touchscreen/ft52xx"
288                                      "${mpy_port_dir}/src/touchscreen/ns2009/include")
289              append_srcs_dir(ADD_SRCS "port/src/touchscreen/ft52xx")
290              append_srcs_dir(ADD_SRCS "port/src/touchscreen/ns2009")
291          endif()
292      endif()
293      # omv minimum
294      if(CONFIG_MAIXPY_OMV_MINIMUM)
295          # TODO:
296          message(STATUS "OMV minimum enabled")
297      endif()
298      # LVGL
299      if(CONFIG_MAIXPY_LVGL_ENABLE)
300          list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/lvgl/include"
301                                  "${mpy_port_dir}/src/lvgl/lv_bindings/include"
302                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl"
303                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src"
304                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src/lv_core"
305                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src/lv_draw"
306                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src/lv_font"
307                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src/lv_hal"
308                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src/lv_misc"
309                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src/lv_objx"
310                                  "${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/src/lv_themes"
311                                  "${mpy_port_dir}/src/lvgl/lv_bindings"
312                                  )
313          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl/lv_bindings/lvgl/src/lv_core")
314          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl/lv_bindings/lvgl/src/lv_draw")
315          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl/lv_bindings/lvgl/src/lv_font")
316          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl/lv_bindings/lvgl/src/lv_hal")
317          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl/lv_bindings/lvgl/src/lv_misc")
318          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl/lv_bindings/lvgl/src/lv_objx")
319          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl/lv_bindings/lvgl/src/lv_themes")
320          append_srcs_dir(LVGL_MPY_SRCS "port/src/lvgl")
321          set(LVGL_MPY_GEN_SRC "${lvgl_build_dir}/lv_mpy.c")
322          # add relative path for  ${mpy_build_gen_header_dir}/qstr.i.last need
323          file(RELATIVE_PATH LVGL_MPY_GEN_SRC_REL ${CMAKE_CURRENT_LIST_DIR} ${LVGL_MPY_GEN_SRC})
324          list(APPEND ADD_SRCS ${LVGL_MPY_SRCS} ${LVGL_MPY_GEN_SRC_REL})
325          set_property(SOURCE ${LVGL_MPY_GEN_SRC} PROPERTY GENERATED 1)
326          
327          set(lvgl_gen_py_tool ${mpy_port_dir}/src/lvgl/lv_bindings/gen/gen_mpy.py)
328          set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DLV_CONF_H=1 -DLV_CONF_INCLUDE_SIMPLE")
329      else()
330          set(LVGL_MPY_GEN_SRC "")
331      endif()
332      # lodepng
333      if(CONFIG_MAIXPY_LODEPNG_ENABLE)
334          list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/lvgl/lv_bindings/driver/png/lodepng")
335          set(LODEPNG_SRC "${mpy_port_dir}/src/lvgl/lv_bindings/driver/png/lodepng/lodepng.cpp")
336          set(LODEPNG_SRC_C "${lodepng_build_dir}/lodepng.c")
337          set_property(SOURCE ${LODEPNG_SRC_C} PROPERTY GENERATED 1)
338          # add relative path for  ${mpy_build_gen_header_dir}/qstr.i.last need
339          file(RELATIVE_PATH LODEPNG_SRC_C_REL ${CMAKE_CURRENT_LIST_DIR} ${LODEPNG_SRC_C})
340          list(APPEND ADD_SRCS ${LODEPNG_SRC_C_REL})
341          set(LODEPNG_MPY_GEN_SRC "${lodepng_build_dir}/lodepng_mpy.c")
342          set_property(SOURCE ${LODEPNG_MPY_GEN_SRC} PROPERTY GENERATED 1)
343          # add relative path for  ${mpy_build_gen_header_dir}/qstr.i.last need
344          file(RELATIVE_PATH LODEPNG_MPY_GEN_SRC_REL ${CMAKE_CURRENT_LIST_DIR} ${LODEPNG_MPY_GEN_SRC})
345          list(APPEND ADD_SRCS ${LODEPNG_MPY_GEN_SRC_REL})
346          add_custom_command(OUTPUT ${LODEPNG_SRC_C}
347              COMMAND mkdir -p ${lodepng_build_dir}
348              COMMAND cp ${LODEPNG_SRC} ${LODEPNG_SRC_C}
349              DEPENDS ${LODEPNG_SRC}
350              )
351          set(lvgl_gen_py_tool ${mpy_port_dir}/src/lvgl/lv_bindings/gen/gen_mpy.py)
352      else()
353          set(LODEPNG_MPY_GEN_SRC "")
354      endif()
355      # ulab
356      if(CONFIG_MICROPYTHON_ULAB_ENALBE)
357          list(APPEND ADD_INCLUDE "${mpy_port_dir}/src/ulab/micropython-ulab/code")
358          append_srcs_dir(ADD_SRCS "port/src/ulab/micropython-ulab/code")
359      endif()
360  
361      if(CONFIG_MICROPY_SSL_ENABLE)
362          list(APPEND ADD_INCLUDE "${mpy_core_dir}/lib/mbedtls/include")
363          set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMBEDTLS_CONFIG_FILE='\"${mpy_port_dir}/src/mbedtls/include/mbedtls_config.h\"'")
364          # message(${CMAKE_C_FLAGS})
365          append_srcs_dir(ADD_SRCS "port/src/mbedtls")
366          append_srcs_dir(ADD_SRCS "core/lib/mbedtls/library")
367          list(REMOVE_ITEM ADD_SRCS "${mpy_core_dir}/lib/mbedtls/library/net_sockets.c")
368      endif()
369  
370      #############################################
371  
372      ################## FLAGS ####################
373      # find requirements include  //TODO: maybe cmake have functio or variable can do this
374      set(include_dir_flags ${ADD_INCLUDE})
375      prepend(include_dir_flags "-I" ${include_dir_flags})
376      foreach(component ${components_requirements})
377          get_target_property(include_dir ${component} INTERFACE_INCLUDE_DIRECTORIES)    
378          prepend(include_dir "-I" ${include_dir})
379          list(APPEND include_dir_flags ${include_dir})
380      endforeach()
381      string(REPLACE ";" " " include_dir_flags "${include_dir_flags}")
382      separate_arguments(cmd_param_cflag NATIVE_COMMAND ${CMAKE_C_FLAGS})
383      separate_arguments(cmd_param_cinclude NATIVE_COMMAND ${include_dir_flags})
384      #############################################
385  
386      ########### OPTIONAL MODULES PART 2 #########
387  
388      # lvgl
389      if(CONFIG_MAIXPY_LVGL_ENABLE)
390          separate_arguments(cmd_param_lvgl_fake_libc_inc NATIVE_COMMAND ${mpy_port_dir}/src/lvgl/lv_bindings/pycparser/utils/fake_libc_include)
391          set(lvgl_core_header ${mpy_port_dir}/src/lvgl/lv_bindings/lvgl/lvgl.h)
392          set(LVGL_MPY_GEN_SRC_PP ${lvgl_build_dir}/lvgl.pp.c)
393          set(LVGL_MPY_METADATA ${lvgl_build_dir}/lv_mpy.json)
394          add_custom_command(OUTPUT ${LVGL_MPY_GEN_SRC_PP}
395                      COMMAND mkdir -p ${lvgl_build_dir}
396                      COMMAND ${CMAKE_C_COMPILER} -E ${cmd_param_cflag} ${cmd_param_cinclude} -I${cmd_param_lvgl_fake_libc_inc} ${lvgl_core_header} > ${LVGL_MPY_GEN_SRC_PP}
397                      DEPENDS ${lvgl_core_header}
398                      )
399          add_custom_command(OUTPUT ${LVGL_MPY_GEN_SRC}
400                      COMMAND ${python} ${lvgl_gen_py_tool} ${cmd_param_cinclude} -M lvgl -MP lv -MD ${LVGL_MPY_METADATA} -E ${LVGL_MPY_GEN_SRC_PP} ${lvgl_core_header} > ${LVGL_MPY_GEN_SRC}
401                      DEPENDS ${LVGL_MPY_GEN_SRC_PP}
402                  )
403      endif()
404      # lodepng
405      if(CONFIG_MAIXPY_LODEPNG_ENABLE)
406          separate_arguments(cmd_param_lvgl_fake_libc_inc NATIVE_COMMAND ${mpy_port_dir}/src/lvgl/lv_bindings/pycparser/utils/fake_libc_include)
407          set(lodepng_core_header ${mpy_port_dir}/src/lvgl/lv_bindings/driver/png/lodepng/lodepng.h)
408          set(LODEPNG_MPY_GEN_SRC_PP ${lodepng_build_dir}/lodepng.pp.c)
409          set(LODEPNG_MPY_METADATA ${lodepng_build_dir}/lodepng_mpy.json)
410          add_custom_command(OUTPUT ${LODEPNG_MPY_GEN_SRC_PP}
411                      COMMAND mkdir -p ${lodepng_build_dir}
412                      COMMAND ${CMAKE_C_COMPILER} -E ${cmd_param_cflag} ${cmd_param_cinclude} -I${cmd_param_lvgl_fake_libc_inc} ${lodepng_core_header} > ${LODEPNG_MPY_GEN_SRC_PP}
413                      DEPENDS ${lodepng_core_header}
414                      )
415          add_custom_command(OUTPUT ${LODEPNG_MPY_GEN_SRC}
416                      COMMAND ${python} ${lvgl_gen_py_tool} ${cmd_param_cinclude} -M lodepng -MP lodepng -MD ${LODEPNG_MPY_METADATA} -E ${LODEPNG_MPY_GEN_SRC_PP} ${lodepng_core_header} > ${LODEPNG_MPY_GEN_SRC}
417                      DEPENDS ${LODEPNG_MPY_GEN_SRC_PP}
418                  )
419      endif()
420      #############################################
421  
422  
423      ############ QSTR(SRC_QSTR) ##############
424      set(QSTR_SRCS ${ADD_SRCS})
425      list(REMOVE_ITEM QSTR_SRCS  "core/py/nlr.c"
426                                  "core/py/nlrsetjmp.c"
427                                  "core/py/nlrthumb.c"
428                                  "core/py/nlrx64.c"
429                                  "core/py/nlrx86.c"
430                                  "core/py/nlrxtensa.c"
431                                  ${MPY_FROZEN_SRC}
432                          )
433  
434      # add version header
435      set(version_header ${mpy_build_gen_header_dir}/mpversion.h)
436      add_custom_target(gen_version_header
437                              COMMAND mkdir -p ${mpy_build_gen_header_dir}
438                              COMMAND ${python} ${mpy_core_src_dir}/makeversionhdr.py ${version_header}
439                              DEPENDS ${LVGL_MPY_GEN_SRC} ${LODEPNG_SRC_C} ${LODEPNG_MPY_GEN_SRC}
440                              VERBATIM
441                          )
442  
443  
444      # add qstr header
445      set(qstr_header ${mpy_build_gen_header_dir}/qstrdefs.generated.h)
446      # set_property(SOURCE ${qstr_header} PROPERTY GENERATED 1)
447      set(PY_QSTR_DEFS ${mpy_core_src_dir}/qstrdefs.h)
448      set(QSTR_DEFS    ${mpy_port_dir}/include/qstrdefsport.h)
449      set(MODULE_DEFS ${mpy_build_gen_header_dir}/moduledefs.h)
450      set(QSTR_DEFS_COLLECTED ${mpy_build_gen_header_dir}/qstrdefs.collected.h)
451      set(QSTR_GEN_EXTRA_CFLAGS -DNO_QSTR -I${mpy_build_dir}/tmp)
452      set(QSTR_GLOBAL_DEPENDENCIES ${mpy_core_src_dir}/mpconfig.h ${mpy_port_dir}/include/mpconfigport.h ${global_config_dir}/global_config.h)
453  
454      add_custom_target(gen_module_defs
455              COMMAND ${python} ${mpy_core_src_dir}/makemoduledefs.py --vpath=${mpy_dir}, ${mpy_dir},  ${QSTR_SRCS} > ${MODULE_DEFS}
456              DEPENDS gen_version_header
457              VERBATIM
458          )
459  
460      abspath(QSTR_SRCS_FULL_PATH ${QSTR_SRCS})
461      add_custom_target(gen_qstr_i_last 
462              COMMAND ${CMAKE_C_COMPILER} -E ${QSTR_GEN_EXTRA_CFLAGS} ${cmd_param_cflag} ${cmd_param_cinclude} -DFFCONF_H="${mpy_core_dir}/lib/oofatfs/ffconf.h" ${QSTR_SRCS_FULL_PATH} ${QSTR_GLOBAL_DEPENDENCIES} > ${mpy_build_gen_header_dir}/qstr.i.last
463              DEPENDS gen_module_defs ${QSTR_GLOBAL_DEPENDENCIES} ${QSTR_SRCS}
464              VERBATIM
465          )
466      add_custom_target(gen_collected_h
467              COMMAND ${python} ${mpy_core_src_dir}/makeqstrdefs.py split ${mpy_build_gen_header_dir}/qstr.i.last ${mpy_build_gen_header_dir}/qstr ${QSTR_DEFS_COLLECTED}
468              COMMAND touch ${mpy_build_gen_header_dir}/qstr.split
469              COMMAND ${python} ${mpy_core_src_dir}/makeqstrdefs.py cat ${mpy_build_gen_header_dir}/qstr.i.last ${mpy_build_gen_header_dir}/qstr ${QSTR_DEFS_COLLECTED}
470              DEPENDS gen_qstr_i_last
471              VERBATIM
472          )
473      add_custom_target(gen_mpy_cross  
474              COMMAND ${CMAKE_MAKE_PROGRAM} -C ${mpy_core_dir}/mpy-cross
475              COMMENT "Generate mpy-cross ..."
476          )
477      separate_arguments(cmd_sed0 NATIVE_COMMAND "s/^Q(.*)/\"&\"/")
478      separate_arguments(cmd_sed1 NATIVE_COMMAND "s/^\"\\(Q(.*)\\)\"/\\1/")
479      
480      add_custom_command(OUTPUT ${mpy_build_gen_header_dir}/qstrdefs.preprocessed.h
481                      COMMAND cat ${PY_QSTR_DEFS} ${QSTR_DEFS} ${QSTR_DEFS_COLLECTED} | sed '${cmd_sed0}' | ${CMAKE_C_COMPILER} -E ${cmd_param_cflag} ${cmd_param_cinclude} - | sed '${cmd_sed1}' > ${mpy_build_gen_header_dir}/qstrdefs.preprocessed.h
482                      DEPENDS gen_mpy_cross gen_version_header gen_module_defs gen_collected_h gen_qstr_i_last ${QSTR_DEFS_COLLECTED}
483                  )
484      add_custom_command(OUTPUT ${qstr_header}
485                      COMMAND ${python} ${mpy_core_src_dir}/makeqstrdata.py ${mpy_build_gen_header_dir}/qstrdefs.preprocessed.h > ${qstr_header}
486                      DEPENDS ${mpy_build_gen_header_dir}/qstrdefs.preprocessed.h gen_qstr_i_last
487                  )
488      
489      file(GLOB frozen_py "${mpy_frozen_py_dir}/*.py")
490      if(NOT CONFIG_MAIXPY_BUILTIN_PY_PYE)
491          list(REMOVE_ITEM frozen_py "${mpy_frozen_py_dir}/pye_mp.py")
492      endif()
493      if(NOT CONFIG_MAIXPY_BUILTIN_PY_BOARD)
494          list(REMOVE_ITEM frozen_py "${mpy_frozen_py_dir}/board.py")
495      endif()
496      if(NOT CONFIG_MAIXPY_BUILTIN_PY_FPIOA_MANAGER)
497          list(REMOVE_ITEM frozen_py "${mpy_frozen_py_dir}/fpioa_manager.py")
498      endif()
499      foreach(py ${frozen_py})
500          get_filename_component(py_name ${py} NAME)
501          string(REPLACE ".py" "" py_name ${py_name})
502          string(REPLACE ".py" ".mpy" mpy ${py})
503          set(mpy_path ${mpy_build_mpy_dir}/${py_name}.mpy)
504          list(APPEND frozen_mpy ${mpy_path})
505          add_custom_command(OUTPUT ${mpy_path} 
506                              COMMAND mkdir -p ${mpy_build_mpy_dir}
507                              DEPENDS ${py}
508                              COMMAND ${mpy_core_dir}/mpy-cross/mpy-cross -o ${mpy_path} -s ${py_name}.py ${py}
509                      )
510          # add_custom_target("mpy_${py_name}_target" DEPENDS ${mpy})
511      endforeach()
512      add_custom_command(OUTPUT ${MPY_FROZEN_SRC}
513                  COMMAND ${python} ${mpy_core_dir}/tools/mpy-tool.py -f -q ${mpy_build_gen_header_dir}/qstrdefs.preprocessed.h ${frozen_mpy} > ${MPY_FROZEN_SRC}
514                  DEPENDS ${qstr_header} ${frozen_mpy} 
515              )
516  
517      ################################
518  
519      if(CONFIG_COMPONENT_LIB_SIPEED_KPU_SRC_ENABLE)
520          include("lib_sipeed_kpu/compile.cmake")
521      endif()
522  
523  
524      ###### Add required/dependent components ######
525      list(APPEND ADD_REQUIREMENTS ${components_requirements})
526      ###############################################
527  
528      ############ Add static libs ##################
529      # list(APPEND ADD_STATIC_LIB "lib/libtest.a")
530      ###############################################
531      add_definitions(-DFFCONF_H=\"${mpy_core_dir}/lib/oofatfs/ffconf.h\"
532                      -DNOT_GEN_MPY_CROSS=1
533                      )
534  
535      register_component()
536  
537  endif()
538