cmake_minimum_required(VERSION 3.10)
project(exercises)

set(CMAKE_CXX_STANDARD 17)

file(GLOB_RECURSE SOURCES "*.cpp")

foreach (source ${SOURCES})
    # 获取源文件所在目录（绝对路径）
    get_filename_component(dir ${source} DIRECTORY)
    # 计算相对于源码根目录的路径
    file(RELATIVE_PATH rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${dir})
    # 获取文件名（不带扩展名）
    get_filename_component(name ${source} NAME_WE)

    # 构造带相对路径的目标名，例如 src_utils_foo
    if (rel_dir STREQUAL "")
        set(target_name "${name}")
    else ()
        string(REPLACE "/" "__" rel_dir_flat "${rel_dir}")
        set(target_name "${rel_dir_flat}__${name}")
    endif ()

    add_executable(${target_name} ${source})
    # 顺便把可执行文件输出到与源文件对应的目录中（可选）
    set_target_properties(${target_name} PROPERTIES
            RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${rel_dir}"
    )
endforeach ()