diff --git a/ports/esp32/main/CMakeLists.txt b/ports/esp32/main/CMakeLists.txt
index d7d08ea663..1f4bb3175b 100644
--- a/ports/esp32/main/CMakeLists.txt
+++ b/ports/esp32/main/CMakeLists.txt
@@ -170,22 +170,7 @@ target_link_libraries(${MICROPY_TARGET} usermod)
 
 # Collect all of the include directories and compile definitions for the IDF components.
 foreach(comp ${IDF_COMPONENTS})
-    get_target_property(type __idf_${comp} TYPE)
-    set(_inc OFF)
-    set(_def OFF)
-    if(${type} STREQUAL STATIC_LIBRARY)
-        get_target_property(_inc __idf_${comp} INCLUDE_DIRECTORIES)
-        get_target_property(_def __idf_${comp} COMPILE_DEFINITIONS)
-    elseif(${type} STREQUAL INTERFACE_LIBRARY)
-        get_target_property(_inc __idf_${comp} INTERFACE_INCLUDE_DIRECTORIES)
-        get_target_property(_def __idf_${comp} INTERFACE_COMPILE_DEFINITIONS)
-    endif()
-    if(_inc)
-        list(APPEND MICROPY_CPP_INC_EXTRA ${_inc})
-    endif()
-    if(_def)
-        list(APPEND MICROPY_CPP_DEF_EXTRA ${_def})
-    endif()
+    micropy_gather_target_properties(__idf_${comp})
 endforeach()
 
 if(IDF_VERSION_MINOR GREATER_EQUAL 2)
diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt
index 37b041279f..5f3cdebd87 100644
--- a/ports/rp2/CMakeLists.txt
+++ b/ports/rp2/CMakeLists.txt
@@ -193,29 +193,9 @@ add_custom_command(TARGET ${MICROPY_TARGET}
 )
 
 # Collect all the include directories and compile definitions for the pico-sdk components.
-macro(_process_target targ)
-    if(TARGET ${targ})
-        get_target_property(type ${targ} TYPE)
-        set(_inc OFF)
-        set(_def OFF)
-        if(${type} STREQUAL STATIC_LIBRARY)
-            get_target_property(_inc ${targ} INCLUDE_DIRECTORIES)
-            get_target_property(_def ${targ} COMPILE_DEFINITIONS)
-        elseif(${type} STREQUAL INTERFACE_LIBRARY)
-            get_target_property(_inc ${targ} INTERFACE_INCLUDE_DIRECTORIES)
-            get_target_property(_def ${targ} INTERFACE_COMPILE_DEFINITIONS)
-        endif()
-        if(_inc)
-            list(APPEND MICROPY_CPP_INC_EXTRA ${_inc})
-        endif()
-        if(_def)
-            list(APPEND MICROPY_CPP_DEF_EXTRA ${_def})
-        endif()
-    endif()
-endmacro()
 foreach(comp ${PICO_SDK_COMPONENTS})
-    _process_target(${comp})
-    _process_target(${comp}_headers)
+    micropy_gather_target_properties(${comp})
+    micropy_gather_target_properties(${comp}_headers)
 endforeach()
 
 # Include the main MicroPython cmake rules.
diff --git a/py/py.cmake b/py/py.cmake
index 52baaa8efc..be5deca251 100644
--- a/py/py.cmake
+++ b/py/py.cmake
@@ -122,3 +122,25 @@ set(MICROPY_SOURCE_PY
     ${MICROPY_PY_DIR}/vstr.c
     ${MICROPY_PY_DIR}/warning.c
 )
+
+# Helper macro to collect include directories and compile definitions for qstr processing.
+macro(micropy_gather_target_properties targ)
+    if(TARGET ${targ})
+        get_target_property(type ${targ} TYPE)
+        set(_inc OFF)
+        set(_def OFF)
+        if(${type} STREQUAL STATIC_LIBRARY)
+            get_target_property(_inc ${targ} INCLUDE_DIRECTORIES)
+            get_target_property(_def ${targ} COMPILE_DEFINITIONS)
+        elseif(${type} STREQUAL INTERFACE_LIBRARY)
+            get_target_property(_inc ${targ} INTERFACE_INCLUDE_DIRECTORIES)
+            get_target_property(_def ${targ} INTERFACE_COMPILE_DEFINITIONS)
+        endif()
+        if(_inc)
+            list(APPEND MICROPY_CPP_INC_EXTRA ${_inc})
+        endif()
+        if(_def)
+            list(APPEND MICROPY_CPP_DEF_EXTRA ${_def})
+        endif()
+    endif()
+endmacro()