cocoon/CMakeLists.txt
xfy911 87bae245d2 build(phase4): 更新构建系统与文档,集成 Phase 4 模块
- CMakeLists.txt: 新增 middleware_ext.c、load_balance.c、grpc.c、
  http3.c 到源文件列表和单元测试列表
- Makefile: 更新 SRCS,新增 4 个模块的单元测试编译规则
- README.md: 新增 Phase 4 特性(JWT Auth、负载均衡、gRPC、HTTP/3)、
  模块说明表、路线图标记全部完成、测试统计(451 单元测试)
- .cocoon-plan.md: Phase 4 全部标记为完成,更新当前状态与行动记录
2026-06-10 11:36:59 +08:00

160 lines
4.0 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.

# Cocoon - 跨平台构建配置
#
# 支持 Linux 和 Windows 构建。
# 自动检测平台并选择正确的编译选项和链接库。
#
# 使用方式:
# mkdir build && cd build
# cmake ..
# make # Linux
# cmake --build . # Windows (MSBuild / Ninja)
#
# @author xfy
cmake_minimum_required(VERSION 3.10)
project(cocoon C)
# 设置 C 标准
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
# 源文件列表
set(COCOON_SOURCES
main.c
server.c
http.c
static.c
log.c
config.c
multipart.c
platform.c
tls.c
http2.c
access_log.c
websocket.c
middleware.c
middleware_ext.c
load_balance.c
grpc.c
http3.c
)
# 头文件路径
set(COCOON_INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/coco/include
)
# === 平台检测 ===
if(WIN32)
# Windows 构建
message(STATUS "平台: Windows")
add_definitions(-DWIN32_LEAN_AND_MEAN)
# 编译选项
add_compile_options(
/W4
/O2
$<$<CONFIG:Debug>:/Zi>
)
# 链接库
set(COCOON_LIBS ws2_32)
# 静态运行时(可选,避免 MSVC 运行时依赖)
# set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else()
# Linux / macOS 构建
message(STATUS "平台: POSIX (Linux/macOS)")
# 编译选项
add_compile_options(
-Wall
-Wextra
-O2
-D_GNU_SOURCE
)
# 调试模式
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_options(-g -O0 -DCOCOON_DEBUG)
endif()
# 链接库
find_package(Threads REQUIRED)
set(COCOON_LIBS
Threads::Threads
m
z
)
# 可选liburingLinux 5.1+
find_library(URING_LIB uring)
if(URING_LIB)
message(STATUS "找到 liburing启用 io_uring 支持")
list(APPEND COCOON_LIBS ${URING_LIB})
else()
message(STATUS "未找到 liburing跳过 io_uring 支持")
endif()
# Brotli 压缩库
find_library(BROTLI_LIB brotlienc)
if(BROTLI_LIB)
list(APPEND COCOON_LIBS ${BROTLI_LIB})
else()
message(WARNING "未找到 brotlienc 库Brotli 压缩将不可用")
endif()
endif()
# === 目标定义 ===
add_executable(cocoon ${COCOON_SOURCES})
target_include_directories(cocoon PRIVATE ${COCOON_INCLUDE_DIRS})
# coco 库依赖(优先使用 submodule
set(COCO_DIR "${CMAKE_CURRENT_SOURCE_DIR}/coco" CACHE PATH "coco 库路径")
if(EXISTS "${COCO_DIR}/CMakeLists.txt")
message(STATUS "使用 coco submodule: ${COCO_DIR}")
add_subdirectory(${COCO_DIR} ${CMAKE_BINARY_DIR}/coco)
target_link_libraries(cocoon PRIVATE coco ${COCOON_LIBS})
else()
message(STATUS "未找到 coco 子模块,假设已预编译")
# 假设 coco 已预编译并可通过 find_library 找到
# target_link_libraries(cocoon PRIVATE ${COCOON_LIBS})
endif()
# === 安装规则 ===
install(TARGETS cocoon DESTINATION bin)
# === 测试支持 ===
enable_testing()
# 集成测试
find_program(BASH_EXECUTABLE bash)
if(BASH_EXECUTABLE)
add_test(
NAME integration_test
COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/integration_test.sh
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endif()
# 单元测试Unity 框架)
set(UNIT_TESTS test_server test_http test_static test_log test_config test_multipart test_middleware_ext test_load_balance test_grpc test_http3)
foreach(test_name ${UNIT_TESTS})
set(test_src "${CMAKE_CURRENT_SOURCE_DIR}/tests/unit/${test_name}.c")
if(EXISTS ${test_src})
add_executable(${test_name} ${test_src} ${COCOON_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/tests/unity/unity.c)
target_include_directories(${test_name} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/tests/unity
)
target_link_libraries(${test_name} PRIVATE ${COCOON_LIBS})
add_test(NAME ${test_name} COMMAND ${test_name})
endif()
endforeach()