It turned out I need to compile all modules as separate library and link that library to executables. With such modifications i don't get errors as above.
function(get_file_range output_var)
set(result "")
foreach(path IN LISTS ARGN)
file(GLOB_RECURSE temp CONFIGURE_DEPENDS ${path})
list(APPEND result ${temp})
endforeach()
set(${output_var} ${result} PARENT_SCOPE)
endfunction()
# =============================================
# Build modules
# =============================================
get_file_range(ISPA_MODULES
${CONVERTERS_DIR}/*.cppm
${SRC_DIR}/*.cppm
)
add_library(ispa-modules STATIC)
target_sources(ispa-modules
PUBLIC
FILE_SET cxx_modules TYPE CXX_MODULES FILES
${ISPA_MODULES}
)
target_include_directories(ispa-modules PRIVATE ${INCLUDE_DIRS})
# =============================================
# Link Dependencies
# =============================================
target_link_libraries(ispa PRIVATE
ispa-converter-cpp
ispa-modules
)
target_link_libraries(ispa-converter-cpp PRIVATE
ispa-converter
ispa-modules
)