subroutine filter_modules(targets, list)
type(build_target_ptr), intent(in) :: targets(:)
type(string_t), allocatable, intent(out) :: list(:)
integer :: i, j, n
n = 0
call resize(list)
do i = 1, size(targets)
associate(target => targets(i)%ptr)
if (.not.allocated(target%source)) cycle
if (target%source%unit_type == FPM_UNIT_SUBMODULE) cycle
if (n + size(target%source%modules_provided) >= size(list)) call resize(list)
do j = 1, size(target%source%modules_provided)
n = n + 1
list(n)%s = join_path(target%output_dir, &
target%source%modules_provided(j)%s)
end do
end associate
end do
call resize(list, n)
end subroutine filter_modules