Files
CMake_SingleRun/CMakeLists.txt
Steven Hobs d1f8114c3d init
2026-03-04 12:45:47 +08:00

71 lines
2.4 KiB
CMake
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 指定CMake最低版本为3.16
cmake_minimum_required(VERSION 3.16)
# 项目名称singlefile_practice支持C和C++两种语言
project(singlefile_practice LANGUAGES C CXX)
# ========== C语言标准设置 ==========
# 使用C11标准
set(CMAKE_C_STANDARD 11)
# 要求严格遵循C标准不允许编译器扩展
set(CMAKE_C_STANDARD_REQUIRED ON)
# 禁用编译器特定的扩展
set(CMAKE_C_EXTENSIONS OFF)
# ========== C++语言标准设置 ==========
# 使用C++17标准
set(CMAKE_CXX_STANDARD 17)
# 要求严格遵循C++标准,不允许编译器扩展
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 禁用编译器特定的扩展
# 禁用编译器特定的扩展
set(CMAKE_CXX_EXTENSIONS OFF)
# ========== 包含目录设置 ==========
# 添加include目录到编译器的头文件搜索路径
include_directories("./include")
# ========== 源文件自动发现 ==========
# 定义源代码根目录
# 定义源代码根目录
set(SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src")
# 递归搜索src目录下所有C/C++源文件(.c .cc .cpp .cxx
# CONFIGURE_DEPENDS: 如果文件列表变化自动重新运行CMake配置
file(GLOB_RECURSE PRACTICE_SOURCES CONFIGURE_DEPENDS
"${SOURCE_ROOT}/*.c"
"${SOURCE_ROOT}/*.cc"
"${SOURCE_ROOT}/*.cpp"
"${SOURCE_ROOT}/*.cxx"
)
# 如果没有找到源文件,输出警告信息
if(NOT PRACTICE_SOURCES)
message(WARNING "No C/C++ source files found under ${SOURCE_ROOT}")
endif()
# ========== 自动为每个源文件创建可执行文件目标 ==========
# 遍历所有找到的源文件
foreach(SOURCE_FILE IN LISTS PRACTICE_SOURCES)
# 计算源文件相对于src目录的相对路径
file(RELATIVE_PATH REL_PATH "${SOURCE_ROOT}" "${SOURCE_FILE}")
# 将路径中的反斜杠和正斜杠替换为下划线
string(REPLACE "\\" "_" TARGET_NAME "${REL_PATH}")
string(REPLACE "/" "_" TARGET_NAME "${TARGET_NAME}")
# 将文件名中的点替换为下划线例如hello.c -> hello_c
string(REPLACE "." "_" TARGET_NAME "${TARGET_NAME}")
# 为该源文件创建可执行文件目标
add_executable(${TARGET_NAME} "${SOURCE_FILE}")
# 设置可执行文件的输出目录为 build/bin
set_target_properties(${TARGET_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
# 输出编译日志信息
message(STATUS "Add target: ${TARGET_NAME} <- ${REL_PATH}")
endforeach()