aboutsummaryrefslogtreecommitdiff
path: root/py/usermod.cmake
diff options
context:
space:
mode:
authorPhil Howard <phil@gadgetoid.com>2021-02-23 22:57:14 +0000
committerDamien George <damien@micropython.org>2021-03-31 00:26:01 +1100
commit0cf12dd59c9ddddbd602d4267410033cb5a9d265 (patch)
treeec069371e2773c95b498e712f2fe35d37cdc9c93 /py/usermod.cmake
parentccc388f157eacfea6b5c44e1b6049a2bbeb44734 (diff)
rp2: Add support for USER_C_MODULES to CMake build system.
The parts that are generic are added to py/ so they can be used by other ports that use CMake. py/usermod.cmake: * Creates a usermod target to hang user C/CXX modules from. * Gathers sources from user C/CXX modules and libs for QSTR scan. ports/rp2/CMakeLists.txt: * Includes py/usermod.cmake. * Links the resulting usermod library to the MicroPython target. py/mkrules.cmake: Add cxxflags to qstr.i.last custom command for CXX modules: * MICROPY_CPP_FLAGS so CXX modules will find includes. * -DNO_QSTR to fix fatal error missing "genhdr/qstrdefs.generated.h". Usage: The rp2 port can be linked against user C modules by running: make USER_C_MODULES=/path/to/module/micropython.cmake CMake will print a list of included modules. Co-authored-by: Graham Sanderson <graham.sanderson@raspberrypi.org> Co-authored-by: Michael O'Cleirigh <michael.ocleirigh@rivulet.ca> Signed-off-by: Phil Howard <phil@pimoroni.com>
Diffstat (limited to 'py/usermod.cmake')
-rw-r--r--py/usermod.cmake52
1 files changed, 52 insertions, 0 deletions
diff --git a/py/usermod.cmake b/py/usermod.cmake
new file mode 100644
index 000000000..853276283
--- /dev/null
+++ b/py/usermod.cmake
@@ -0,0 +1,52 @@
+# Create a target for all user modules to link against.
+add_library(usermod INTERFACE)
+
+function(usermod_gather_sources SOURCES_VARNAME INCLUDE_DIRECTORIES_VARNAME INCLUDED_VARNAME LIB)
+ if (NOT ${LIB} IN_LIST ${INCLUDED_VARNAME})
+ list(APPEND ${INCLUDED_VARNAME} ${LIB})
+
+ # Gather library sources
+ get_target_property(lib_sources ${LIB} INTERFACE_SOURCES)
+ if (lib_sources)
+ list(APPEND ${SOURCES_VARNAME} ${lib_sources})
+ endif()
+
+ # Gather library includes
+ get_target_property(lib_include_directories ${LIB} INTERFACE_INCLUDE_DIRECTORIES)
+ if (lib_include_directories)
+ list(APPEND ${INCLUDE_DIRECTORIES_VARNAME} ${lib_include_directories})
+ endif()
+
+ # Recurse linked libraries
+ get_target_property(trans_depend ${LIB} INTERFACE_LINK_LIBRARIES)
+ if (trans_depend)
+ foreach(SUB_LIB ${trans_depend})
+ usermod_gather_sources(
+ ${SOURCES_VARNAME}
+ ${INCLUDE_DIRECTORIES_VARNAME}
+ ${INCLUDED_VARNAME}
+ ${SUB_LIB})
+ endforeach()
+ endif()
+
+ set(${SOURCES_VARNAME} ${${SOURCES_VARNAME}} PARENT_SCOPE)
+ set(${INCLUDE_DIRECTORIES_VARNAME} ${${INCLUDE_DIRECTORIES_VARNAME}} PARENT_SCOPE)
+ set(${INCLUDED_VARNAME} ${${INCLUDED_VARNAME}} PARENT_SCOPE)
+ endif()
+endfunction()
+
+# Include CMake files for user modules.
+if (USER_C_MODULES)
+ foreach(USER_C_MODULE_PATH ${USER_C_MODULES})
+ message("Including User C Module(s) from ${USER_C_MODULE_PATH}")
+ include(${USER_C_MODULE_PATH})
+ endforeach()
+endif()
+
+# Recursively gather sources for QSTR scanning - doesn't support generator expressions.
+usermod_gather_sources(MICROPY_SOURCE_USERMOD MICROPY_INC_USERMOD found_modules usermod)
+
+# Report found modules.
+list(REMOVE_ITEM found_modules "usermod")
+list(JOIN found_modules ", " found_modules)
+message("Found User C Module(s): ${found_modules}")