blob: ac0c57cda19de1c97f350f075692a98d8c05d6fc [file] [log] [blame] [edit]
# A convenience helper cmake function that can be used to collect the sources and include
# paths needed for the Memfault SDK based on the components used
#
# USAGE
# If you are using a Cmake build system, to pick up the Memfault include paths & source
# files needed for a project, you can just add the following lines:
#
# set(MEMFAULT_SDK_ROOT <The path to the root of the memfault-firmware-sdk repo>)
# list(APPEND MEMFAULT_COMPONENTS <The SDK components to be used, i.e "core util">)
# include(${MEMFAULT_SDK_ROOT}/cmake/Memfault.cmake)
# memfault_library(${MEMFAULT_SDK_ROOT} MEMFAULT_COMPONENTS
# MEMFAULT_COMPONENTS_SRCS MEMFAULT_COMPONENTS_INC_FOLDERS)
#
# NOTE: By default, the list of sources returned will be for ARM Cortex-M targets but ARCH_XTENSA can be
# passed as an optional final argument to return sources expected for ARCH_XTENSA architectures
#
# After invoking the function ${MEMFAULT_COMPONENTS_SRCS} will contain the sources
# needed for the library and ${MEMFAULT_COMPONENTS_INC_FOLDERS} will contain the include
# paths
# Explicitly enable IN_LIST use inside if()
# https://cmake.org/cmake/help/v3.3/policy/CMP0057.html
cmake_policy(SET CMP0057 NEW)
function(memfault_library sdk_root components src_var_name inc_var_name)
if(NOT IS_ABSOLUTE ${sdk_root})
set(sdk_root "${CMAKE_CURRENT_SOURCE_DIR}/${sdk_root}")
endif()
if ("demo" IN_LIST ${components})
# The demo component is enabled so let's pick up component specific cli commands
# If the component is not enabled a weak implementation of the CLI command will get
# picked up from "demo/src/memfault_demo_shell_commands.c"
foreach(component IN LISTS ${components})
file(GLOB MEMFAULT_COMPONENT_DEMO_${component} ${sdk_root}/components/demo/src/${component}/*.c)
list(APPEND SDK_SRC ${MEMFAULT_COMPONENT_DEMO_${component}})
endforeach()
endif()
list(APPEND SDK_INC
${sdk_root}/components/include
)
foreach(component IN LISTS ${components})
file(GLOB MEMFAULT_COMPONENT_${component} ${sdk_root}/components/${component}/src/*.c)
list(APPEND SDK_SRC ${MEMFAULT_COMPONENT_${component}})
endforeach()
set(arch ${ARGN})
if(NOT arch)
set(arch ARCH_ARM_CORTEX_M)
endif()
if(arch STREQUAL "ARCH_XTENSA")
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/core/src/arch_arm_cortex_m.c)
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_coredump_regions_armv7.c)
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_fault_handling_arm.c)
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_fault_handling_riscv.c)
elseif(arch STREQUAL "ARCH_RISCV")
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/core/src/arch_arm_cortex_m.c)
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_coredump_regions_armv7.c)
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_fault_handling_arm.c)
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_fault_handling_xtensa.c)
elseif(arch STREQUAL "ARCH_ARM_CORTEX_M")
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_fault_handling_riscv.c)
list(REMOVE_ITEM SDK_SRC ${sdk_root}/components/panics/src/memfault_fault_handling_xtensa.c)
else()
message(FATAL_ERROR "Unsupported Arch: ${arch}")
endif()
set(${src_var_name} ${SDK_SRC} PARENT_SCOPE)
set(${inc_var_name} ${SDK_INC} PARENT_SCOPE)
endfunction()