blob: bdff385815a440eba3dd76099460e3b4cf94f8ae [file] [log] [blame]
Damien George66098c02020-09-23 15:53:46 +10001# CMake fragment for MicroPython rules
2
3set(MICROPY_PY_QSTRDEFS "${MICROPY_PY_DIR}/qstrdefs.h")
4set(MICROPY_GENHDR_DIR "${CMAKE_BINARY_DIR}/genhdr")
5set(MICROPY_MPVERSION "${MICROPY_GENHDR_DIR}/mpversion.h")
6set(MICROPY_MODULEDEFS "${MICROPY_GENHDR_DIR}/moduledefs.h")
7set(MICROPY_QSTR_DEFS_LAST "${MICROPY_GENHDR_DIR}/qstr.i.last")
8set(MICROPY_QSTR_DEFS_SPLIT "${MICROPY_GENHDR_DIR}/qstr.split")
9set(MICROPY_QSTR_DEFS_COLLECTED "${MICROPY_GENHDR_DIR}/qstrdefs.collected.h")
10set(MICROPY_QSTR_DEFS_PREPROCESSED "${MICROPY_GENHDR_DIR}/qstrdefs.preprocessed.h")
11set(MICROPY_QSTR_DEFS_GENERATED "${MICROPY_GENHDR_DIR}/qstrdefs.generated.h")
12
13# Provide defaults for preprocessor flags if not already defined
14if(NOT MICROPY_CPP_FLAGS)
15 get_target_property(MICROPY_CPP_INC ${MICROPY_TARGET} INCLUDE_DIRECTORIES)
16 get_target_property(MICROPY_CPP_DEF ${MICROPY_TARGET} COMPILE_DEFINITIONS)
17endif()
18
19# Compute MICROPY_CPP_FLAGS for preprocessor
20list(APPEND MICROPY_CPP_INC ${MICROPY_CPP_INC_EXTRA})
21list(APPEND MICROPY_CPP_DEF ${MICROPY_CPP_DEF_EXTRA})
22set(_prefix "-I")
23foreach(_arg ${MICROPY_CPP_INC})
24 list(APPEND MICROPY_CPP_FLAGS ${_prefix}${_arg})
25endforeach()
26set(_prefix "-D")
27foreach(_arg ${MICROPY_CPP_DEF})
28 list(APPEND MICROPY_CPP_FLAGS ${_prefix}${_arg})
29endforeach()
30list(APPEND MICROPY_CPP_FLAGS ${MICROPY_CPP_FLAGS_EXTRA})
31
32find_package(Python3 REQUIRED COMPONENTS Interpreter)
33
34target_sources(${MICROPY_TARGET} PRIVATE
35 ${MICROPY_MPVERSION}
36 ${MICROPY_QSTR_DEFS_GENERATED}
37)
38
39# Command to force the build of another command
40
41add_custom_command(
42 OUTPUT MICROPY_FORCE_BUILD
43 COMMENT ""
44 COMMAND echo -n
45)
46
47# Generate mpversion.h
48
49add_custom_command(
50 OUTPUT ${MICROPY_MPVERSION}
51 COMMAND ${CMAKE_COMMAND} -E make_directory ${MICROPY_GENHDR_DIR}
52 COMMAND ${Python3_EXECUTABLE} ${MICROPY_DIR}/py/makeversionhdr.py ${MICROPY_MPVERSION}
53 DEPENDS MICROPY_FORCE_BUILD
54)
55
56# Generate moduledefs.h
57
58add_custom_command(
59 OUTPUT ${MICROPY_MODULEDEFS}
60 COMMAND ${Python3_EXECUTABLE} ${MICROPY_PY_DIR}/makemoduledefs.py --vpath="/" ${MICROPY_SOURCE_QSTR} > ${MICROPY_MODULEDEFS}
61 DEPENDS ${MICROPY_MPVERSION}
62 ${MICROPY_SOURCE_QSTR}
63)
64
65# Generate qstrs
66
67# If any of the dependencies in this rule change then the C-preprocessor step must be run.
68# It only needs to be passed the list of MICROPY_SOURCE_QSTR files that have changed since
69# it was last run, but it looks like it's not possible to specify that with cmake.
70add_custom_command(
71 OUTPUT ${MICROPY_QSTR_DEFS_LAST}
72 COMMAND ${Python3_EXECUTABLE} ${MICROPY_PY_DIR}/makeqstrdefs.py pp ${CMAKE_C_COMPILER} -E output ${MICROPY_GENHDR_DIR}/qstr.i.last cflags ${MICROPY_CPP_FLAGS} -DNO_QSTR sources ${MICROPY_SOURCE_QSTR}
73 DEPENDS ${MICROPY_MODULEDEFS}
74 ${MICROPY_SOURCE_QSTR}
75 VERBATIM
76)
77
78add_custom_command(
79 OUTPUT ${MICROPY_QSTR_DEFS_SPLIT}
80 COMMAND ${Python3_EXECUTABLE} ${MICROPY_PY_DIR}/makeqstrdefs.py split qstr ${MICROPY_GENHDR_DIR}/qstr.i.last ${MICROPY_GENHDR_DIR}/qstr _
81 COMMAND touch ${MICROPY_QSTR_DEFS_SPLIT}
82 DEPENDS ${MICROPY_QSTR_DEFS_LAST}
83 VERBATIM
84)
85
86add_custom_command(
87 OUTPUT ${MICROPY_QSTR_DEFS_COLLECTED}
88 COMMAND ${Python3_EXECUTABLE} ${MICROPY_PY_DIR}/makeqstrdefs.py cat qstr _ ${MICROPY_GENHDR_DIR}/qstr ${MICROPY_QSTR_DEFS_COLLECTED}
89 DEPENDS ${MICROPY_QSTR_DEFS_SPLIT}
90 VERBATIM
91)
92
93add_custom_command(
94 OUTPUT ${MICROPY_QSTR_DEFS_PREPROCESSED}
95 COMMAND cat ${MICROPY_PY_QSTRDEFS} ${MICROPY_QSTR_DEFS_COLLECTED} | sed "s/^Q(.*)/\"&\"/" | ${CMAKE_C_COMPILER} -E ${MICROPY_CPP_FLAGS} - | sed "s/^\\\"\\(Q(.*)\\)\\\"/\\1/" > ${MICROPY_QSTR_DEFS_PREPROCESSED}
96 DEPENDS ${MICROPY_QSTR_DEFS_COLLECTED}
97 VERBATIM
98)
99
100add_custom_command(
101 OUTPUT ${MICROPY_QSTR_DEFS_GENERATED}
102 COMMAND ${Python3_EXECUTABLE} ${MICROPY_PY_DIR}/makeqstrdata.py ${MICROPY_QSTR_DEFS_PREPROCESSED} > ${MICROPY_QSTR_DEFS_GENERATED}
103 DEPENDS ${MICROPY_QSTR_DEFS_PREPROCESSED}
104 VERBATIM
105)
106
107# Build frozen code if enabled
108
109if(MICROPY_FROZEN_MANIFEST)
110 set(MICROPY_FROZEN_CONTENT "${CMAKE_BINARY_DIR}/frozen_content.c")
111
112 target_sources(${MICROPY_TARGET} PRIVATE
113 ${MICROPY_FROZEN_CONTENT}
114 )
115
116 target_compile_definitions(${MICROPY_TARGET} PUBLIC
117 MICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool
118 MICROPY_MODULE_FROZEN_MPY=\(1\)
119 )
120
121 add_custom_command(
122 OUTPUT ${MICROPY_FROZEN_CONTENT}
123 COMMAND ${Python3_EXECUTABLE} ${MICROPY_DIR}/tools/makemanifest.py -o ${MICROPY_FROZEN_CONTENT} -v "MPY_DIR=${MICROPY_DIR}" -v "PORT_DIR=${MICROPY_PORT_DIR}" -b "${CMAKE_BINARY_DIR}" -f${MICROPY_CROSS_FLAGS} ${MICROPY_FROZEN_MANIFEST}
124 DEPENDS MICROPY_FORCE_BUILD
125 ${MICROPY_QSTR_DEFS_GENERATED}
126 VERBATIM
127 )
128endif()