完成迁移

This commit is contained in:
2026-02-02 12:48:25 +08:00
commit 4600cb0957
28 changed files with 79587 additions and 0 deletions

214
yps-quickjs/CMakeLists.txt Normal file
View File

@@ -0,0 +1,214 @@
cmake_minimum_required(VERSION 3.10)
project(yps-quickjs LANGUAGES C)
# 设置 C 标准
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)
# 库版本号
set(YPQJS_VERSION_MAJOR 0)
set(YPQJS_VERSION_MINOR 1)
set(YPQJS_VERSION_PATCH 0)
# 构建类型默认为 Release
if(NOT CMAKE_BUILD_TYPE)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release")
endif()
message(STATUS "Building yps-quickjs in ${CMAKE_BUILD_TYPE} mode")
message(STATUS "Building with ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION} on ${CMAKE_SYSTEM_NAME}")
# 包含编译器检查模块
include(CheckCCompilerFlag)
include(GNUInstallDirs)
# 平台检测
if(MINGW OR CMAKE_C_COMPILER MATCHES "mingw")
set(MINGW TRUE)
else()
set(MINGW FALSE)
endif()
# 添加编译器标志的宏
macro(xcheck_add_c_compiler_flag FLAG)
string(REPLACE "-" "" FLAG_NO_HYPHEN ${FLAG})
check_c_compiler_flag(${FLAG} COMPILER_SUPPORTS_${FLAG_NO_HYPHEN})
if(COMPILER_SUPPORTS_${FLAG_NO_HYPHEN})
add_compile_options(${FLAG})
endif()
endmacro()
# 通用编译器警告标志
xcheck_add_c_compiler_flag(-Wall)
if(NOT MSVC AND NOT IOS)
xcheck_add_c_compiler_flag(-Werror)
xcheck_add_c_compiler_flag(-Wextra)
endif()
xcheck_add_c_compiler_flag(-Wformat=2)
xcheck_add_c_compiler_flag(-Wno-implicit-fallthrough)
xcheck_add_c_compiler_flag(-Wno-sign-compare)
xcheck_add_c_compiler_flag(-Wno-missing-field-initializers)
xcheck_add_c_compiler_flag(-Wno-unused-parameter)
xcheck_add_c_compiler_flag(-Wno-unused-but-set-variable)
xcheck_add_c_compiler_flag(-Wno-unused-result)
xcheck_add_c_compiler_flag(-Wno-stringop-truncation)
xcheck_add_c_compiler_flag(-Wno-array-bounds)
xcheck_add_c_compiler_flag(-funsigned-char)
# MSVC 特定标志
if(MSVC)
xcheck_add_c_compiler_flag(-Wno-unsafe-buffer-usage)
xcheck_add_c_compiler_flag(-Wno-sign-conversion)
xcheck_add_c_compiler_flag(-Wno-nonportable-system-include-path)
xcheck_add_c_compiler_flag(-Wno-implicit-int-conversion)
xcheck_add_c_compiler_flag(-Wno-shorten-64-to-32)
xcheck_add_c_compiler_flag(-Wno-reserved-macro-identifier)
xcheck_add_c_compiler_flag(-Wno-reserved-identifier)
xcheck_add_c_compiler_flag(-Wdeprecated-declarations)
xcheck_add_c_compiler_flag(/experimental:c11atomics)
xcheck_add_c_compiler_flag(/wd4018)
xcheck_add_c_compiler_flag(/wd4061)
xcheck_add_c_compiler_flag(/wd4100)
xcheck_add_c_compiler_flag(/wd4200)
xcheck_add_c_compiler_flag(/wd4242)
xcheck_add_c_compiler_flag(/wd4244)
xcheck_add_c_compiler_flag(/wd4245)
xcheck_add_c_compiler_flag(/wd4267)
xcheck_add_c_compiler_flag(/wd4388)
xcheck_add_c_compiler_flag(/wd4389)
xcheck_add_c_compiler_flag(/wd4456)
xcheck_add_c_compiler_flag(/wd4457)
xcheck_add_c_compiler_flag(/wd4710)
xcheck_add_c_compiler_flag(/wd4711)
xcheck_add_c_compiler_flag(/wd4820)
xcheck_add_c_compiler_flag(/wd4996)
xcheck_add_c_compiler_flag(/wd5045)
endif()
# Windows 特定配置
if(WIN32)
# 设置 8MB 默认栈大小Windows 默认为 1MB会导致栈溢出
if(MSVC)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:8388608")
else()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--stack,8388608")
endif()
endif()
# macOS 和 GCC 11+ 特定配置
if(APPLE AND CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 11)
xcheck_add_c_compiler_flag(-Wno-maybe-uninitialized)
endif()
# Debug 模式特定标志
if(CMAKE_BUILD_TYPE MATCHES "Debug")
xcheck_add_c_compiler_flag(/Od)
xcheck_add_c_compiler_flag(-O0)
xcheck_add_c_compiler_flag(-ggdb)
xcheck_add_c_compiler_flag(-fno-omit-frame-pointer)
endif()
# 构建选项
option(YPQJS_BUILD_SHARED_LIBS "Build shared library instead of static" OFF)
option(YPQJS_ENABLE_LIBC "Build libc extension as part of the library" ON)
message(STATUS " YPQJS_BUILD_SHARED_LIBS: ${YPQJS_BUILD_SHARED_LIBS}")
message(STATUS " YPQJS_ENABLE_LIBC: ${YPQJS_ENABLE_LIBC}")
# QuickJS 核心源文件
set(ypqjs_core_sources
cutils.c
dtoa.c
libregexp.c
libunicode.c
quickjs.c
)
# 添加 libc 扩展(如果启用)
if(YPQJS_ENABLE_LIBC)
list(APPEND ypqjs_core_sources quickjs-libc.c)
endif()
# 编译定义
list(APPEND ypqjs_defines _GNU_SOURCE)
if(WIN32)
list(APPEND ypqjs_defines WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0601)
endif()
# 链接库
list(APPEND ypqjs_libs ${CMAKE_DL_LIBS})
# 查找线程库
find_package(Threads)
if(NOT CMAKE_SYSTEM_NAME STREQUAL "WASI")
list(APPEND ypqjs_libs ${CMAKE_THREAD_LIBS_INIT})
endif()
# 查找数学库
find_library(M_LIBRARIES m)
if(M_LIBRARIES OR CMAKE_C_COMPILER_ID STREQUAL "TinyCC")
list(APPEND ypqjs_libs m)
endif()
# 创建 yps-quickjs 库
if(YPQJS_BUILD_SHARED_LIBS)
add_library(ypqjs SHARED ${ypqjs_core_sources})
message(STATUS "Building shared library: ypqjs")
else()
add_library(ypqjs STATIC ${ypqjs_core_sources})
message(STATUS "Building static library: ypqjs")
endif()
# 设置库属性
target_compile_definitions(ypqjs PRIVATE ${ypqjs_defines})
target_include_directories(ypqjs PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
target_link_libraries(ypqjs PUBLIC ${ypqjs_libs})
# 设置库版本
set_target_properties(ypqjs PROPERTIES
VERSION ${YPQJS_VERSION_MAJOR}.${YPQJS_VERSION_MINOR}.${YPQJS_VERSION_PATCH}
SOVERSION ${YPQJS_VERSION_MAJOR}
OUTPUT_NAME "ypqjs"
)
# 安装配置
install(FILES quickjs.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
if(YPQJS_ENABLE_LIBC)
install(FILES quickjs-libc.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(TARGETS ypqjs EXPORT ypqjsConfig
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(EXPORT ypqjsConfig DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/yps-quickjs)
# 导出 CMake 配置供其他项目使用
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/yps-quickjs-config-version.cmake"
VERSION ${YPQJS_VERSION_MAJOR}.${YPQJS_VERSION_MINOR}.${YPQJS_VERSION_PATCH}
COMPATIBILITY SameMajorVersion
)
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/yps-quickjs-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/yps-quickjs-config.cmake"
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/yps-quickjs
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/yps-quickjs-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/yps-quickjs-config-version.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/yps-quickjs
)