feat(build): 添加 CMakeLists.txt 跨平台构建配置

- 自动检测 Windows/POSIX 平台
- Windows 下链接 ws2_32、查找 brotlienc
- POSIX 下使用 pkgconfig 查找 zlib、libbrotlienc
- 支持 MinGW 和 MSVC 编译器
- 包含安装规则
This commit is contained in:
xfy 2026-06-05 00:50:23 +08:00
parent c9693612bd
commit adeeda1fc1

150
CMakeLists.txt Normal file
View File

@ -0,0 +1,150 @@
# 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
)
#
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)
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()