function(retrieve_files_custom path extension out_files)
    message(STATUS "Retrieving files in ${path}")
    set(EXTENSIONS "")
    foreach(ext ${extension})
        list(APPEND EXTENSIONS "${path}/*.${ext}")
    endforeach ()

    # 递归查找文件夹下的 .h .hpp. ini 文件保存到 HEAD_FILES
    file(GLOB_RECURSE FIND_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS ${EXTENSIONS})
    # 将 HEDADER_FILES 和 SRC_FILES 保存到 ALL_FILES 变量
    set(ALL_FILES ${FIND_FILES})

    set(RESULT "")

    # 对 ALL_FILES 变量里面的所有文件分类(保留资源管理器的目录结构)
    foreach(fileItem ${ALL_FILES})
        # Get the directory of the source file
        get_filename_component(PARENT_DIR "${fileItem}" DIRECTORY)

        # 用于检查平台的条件
        if(PARENT_DIR STREQUAL "windows")
            if(WIN32)
                set(RESULT "${RESULT};${fileItem}")
            else()
                continue()
            endif()
        elseif(PARENT_DIR STREQUAL "linux")
            if(UNIX AND NOT APPLE)
                set(RESULT "${RESULT};${fileItem}")
            else()
                continue()
            endif()
        elseif(PARENT_DIR STREQUAL "mac")
            if(APPLE)
                set(RESULT "${RESULT};${fileItem}")
            else()
                continue()
            endif()
        else()
            # 如果文件夹名称不是平台,则始终包含
            set(RESULT "${RESULT};${fileItem}")
        endif()

        # Remove common directory prefix to make the group
        string(REPLACE "${path}" "" GROUP "${PARENT_DIR}")
        # Make sure we are using windows slashes
        string(REPLACE "/" "\\" GROUP "${GROUP}")
        # Group into "Source Files" and "Header Files"
        set(GROUP "${GROUP}")
        source_group("${GROUP}" FILES "${fileItem}")
    endforeach()

    set(${out_files} ${RESULT} PARENT_SCOPE)
endfunction()

function(retrieve_files path out_files)
    set(temp_files "")
    retrieve_files_custom(${path} "h;hpp;ini;cpp;c;ixx" temp_files)
    set(${out_files} ${${out_files}} ${temp_files} PARENT_SCOPE)
endfunction()