This question is analog to Compile part of application as static library but related to a Matter application. In this case, I'd like to separate the compilation of all Matter/CHIP related application parts from my own application code, e.g., to use strict compiler flags for my own code which fail for the Matter/CHIP application parts.
My CMakeLists.txt looks as follows:
cmake_minimum_required(VERSION 3.20.0) set(CHIP_CFLAGS -DDUMMY_VALUE=0xDEADBEEF ) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project( Empty VERSION 0.1 DESCRIPTION "empty matter application." ) include(${ZEPHYR_CONNECTEDHOMEIP_MODULE_DIR}/config/nrfconnect/app/enable-gnu-std.cmake) include(${ZEPHYR_CONNECTEDHOMEIP_MODULE_DIR}/src/app/chip_data_model.cmake) set(zap_file "${CMAKE_CURRENT_SOURCE_DIR}/src/zap/template.zap") set(zap_gen_dir "${CMAKE_CURRENT_SOURCE_DIR}/src/zap-generated") target_sources( app PRIVATE <my-sources> ) target_include_directories( app PRIVATE include src ) chip_configure_data_model( app INCLUDE_SERVER BYPASS_IDL GEN_DIR ${zap_gen_dir} ZAP_FILE ${zap_file} )
The last part is the relevant bit: chip_configure_data_model adds files from the Matter/CHIP repository to the given target, in this case still "app". What I'd like to do is the following (only repeating the relevant bits):
<...> target_sources( app PRIVATE <my-sources> ) <...> add_library(app-chip STATIC "") target_link_libraries(app-chip PUBLIC zephyr_interface) target_link_libraries(app PUBLIC app-chip) chip_configure_data_model( app-chip INCLUDE_SERVER BYPASS_IDL GEN_DIR ${zap_gen_dir} ZAP_FILE ${zap_file} )
CMake detects the files and adds them to the library "app-chip", but it doesn't find the include paths for the Zephyr module Matter/CHIP. I can resolve it by copying the corresponding part from the "kernel.cmake", but I was wondering if there's a cleaner way to provide the required paths for a module to an application library:
<...> target_sources( app PRIVATE <my-sources> ) <...> add_library(app-chip STATIC "") target_link_libraries(app-chip PUBLIC zephyr_interface) target_link_libraries(app PUBLIC app-chip) get_property(ZEPHYR_INTERFACE_LIBS_PROPERTY GLOBAL PROPERTY ZEPHYR_INTERFACE_LIBS) foreach(boilerplate_lib ${ZEPHYR_INTERFACE_LIBS_PROPERTY}) string(TOUPPER ${boilerplate_lib} boilerplate_lib_upper_case) target_link_libraries_ifdef( CONFIG_APP_LINK_WITH_${boilerplate_lib_upper_case} app-chip PUBLIC ${boilerplate_lib} ) endforeach() chip_configure_data_model( app-chip INCLUDE_SERVER BYPASS_IDL GEN_DIR ${zap_gen_dir} ZAP_FILE ${zap_file} )
This isn't very clean since it breaks immediately if "kernel.cmake" or some module setup in Zephyr breaks. Is there something like "target_link_libraries(app-chip PUBLIC zephyr_interface)" for Zephyr modules?