Files
quickjs-prj/yps-quickjs/CMakeLists.txt
2026-02-02 12:48:25 +08:00

214 lines
6.7 KiB
CMake
Raw 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_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
)