mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-21 09:28:17 +00:00
feat: 适配 LuaJIT 2.1 (luajit_2.1 分支)
- lib/lua 替换为完整 LuaJIT 2.1 仓库(Makefile+src+dynasm, 官方结构)
- 构建系统改造: lib/lua/CMakeLists.txt 改为调用 LuaJIT 自带 make
(BUILDMODE=static CFLAGS=-fPIC) 产出 libluajit.a; 顶层链接该静态库
并加 -Wl,-E 导出符号(静态链 LuaJIT 必需)
- 补充 lua.hpp 转发头兼容桥接层 'lua/lua.hpp' include 路径
- 桥接层沿用 5.1 方案: Registry 存 iopath / luaL_tolstring 兜底 /
typed interop 无 integer 子类型(LUA_VERSION_NUM=501)
- [关键修复] lua_remove 栈越界 bug(各版本共有, LuaJIT 下显性崩溃):
* unload_lib: ref 记录的是 gettop+1, 实际移除应用 ref-1
* clean(): 原逐个 remove 循环恒越界且多次移除后索引偏移,
属死代码(末尾 settop(L,0) 已清栈), 直接删除
该 bug 在 Lua 5.4 中被隐式容忍, 在 LuaJIT 的 GC finalizer 中
表现为 lj_gc_finalize_cdata 段错误
- 测试跨版本断言同步(自 5.1.5)
- 验证: GTest 44/44 通过
This commit is contained in:
100
lib/lua/CMakeLists.txt
Executable file → Normal file
100
lib/lua/CMakeLists.txt
Executable file → Normal file
@ -1,81 +1,35 @@
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
project(lua VERSION 5.4.6 LANGUAGES C)
|
||||
project(luajit LANGUAGES C)
|
||||
|
||||
# 基础配置
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -Wall -Wextra")
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
# ==================== LuaJIT 2.1 构建策略 ====================
|
||||
# LuaJIT 仓库结构: Makefile 在根, src/ 子目录, dynasm/ 兄弟目录。
|
||||
# 必须从根目录执行 make。配置期调用 make 产出 src/libluajit.a。
|
||||
# 头文件 lua.h/lauxlib.h/lualib.h 在 src/ 下。
|
||||
|
||||
# 检测目标系统 - 通过编译器名称检测
|
||||
set(IS_WINDOWS FALSE)
|
||||
if(CMAKE_C_COMPILER MATCHES "mingw" OR CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
set(IS_WINDOWS TRUE)
|
||||
set(LJ_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(LJ_SRC ${LJ_ROOT}/src)
|
||||
set(LJ_LIB ${LJ_SRC}/libluajit.a)
|
||||
|
||||
# 确保 dynasm 目录存在(LuaJIT 构建依赖)
|
||||
if(NOT EXISTS ${LJ_ROOT}/dynasm)
|
||||
message(FATAL_ERROR "LuaJIT dynasm directory missing at ${LJ_ROOT}/dynasm")
|
||||
endif()
|
||||
|
||||
# 根据目标系统配置
|
||||
if(IS_WINDOWS)
|
||||
message(STATUS "Configuring for Windows/MinGW")
|
||||
add_compile_definitions(LUA_USE_WINDOWS LUA_COMPAT_5_3)
|
||||
list(APPEND EXTRA_LIBS "")
|
||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
message(STATUS "Configuring for Linux/HarmonyOS")
|
||||
add_compile_definitions(LUA_USE_LINUX LUA_COMPAT_5_3)
|
||||
list(APPEND EXTRA_LIBS dl)
|
||||
else()
|
||||
message(STATUS "Configuring for generic Unix")
|
||||
add_compile_definitions(LUA_USE_POSIX LUA_COMPAT_5_3)
|
||||
list(APPEND EXTRA_LIBS dl)
|
||||
endif()
|
||||
|
||||
# Lua 核心文件列表
|
||||
file(GLOB LUA_CORE_SOURCES
|
||||
lapi.c
|
||||
lcode.c
|
||||
lctype.c
|
||||
ldebug.c
|
||||
ldo.c
|
||||
ldump.c
|
||||
lfunc.c
|
||||
lgc.c
|
||||
llex.c
|
||||
lmem.c
|
||||
lobject.c
|
||||
lopcodes.c
|
||||
lparser.c
|
||||
lstate.c
|
||||
lstring.c
|
||||
ltable.c
|
||||
ltm.c
|
||||
lundump.c
|
||||
lvm.c
|
||||
lzio.c
|
||||
# 清理旧构建产物后重新构建(保证产物一致性)
|
||||
add_custom_command(
|
||||
OUTPUT ${LJ_LIB}
|
||||
COMMAND ${CMAKE_COMMAND} -E chdir ${LJ_ROOT} make clean
|
||||
COMMAND ${CMAKE_COMMAND} -E chdir ${LJ_ROOT}
|
||||
make CC=${CMAKE_C_COMPILER} BUILDMODE=static
|
||||
CFLAGS=-fPIC TARGET_DYLD_CC=${CMAKE_C_COMPILER} Q=
|
||||
DEPENDS ${LJ_ROOT}/Makefile ${LJ_SRC}/lj_arch.h
|
||||
WORKING_DIRECTORY ${LJ_ROOT}
|
||||
COMMENT "Building LuaJIT 2.1 static library (libluajit.a)"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
# Lua 库文件列表
|
||||
file(GLOB LUA_LIB_SOURCES
|
||||
lauxlib.c
|
||||
lbaselib.c
|
||||
lcorolib.c
|
||||
ldblib.c
|
||||
liolib.c
|
||||
lmathlib.c
|
||||
loadlib.c
|
||||
loslib.c
|
||||
lstrlib.c
|
||||
ltablib.c
|
||||
lutf8lib.c
|
||||
linit.c
|
||||
)
|
||||
add_custom_target(lua ALL DEPENDS ${LJ_LIB})
|
||||
|
||||
# 特殊源文件的编译器优化
|
||||
set_source_files_properties(
|
||||
llex.c
|
||||
lparser.c
|
||||
lcode.c
|
||||
PROPERTIES COMPILE_FLAGS "-Os"
|
||||
)
|
||||
|
||||
add_library(lua STATIC
|
||||
${LUA_CORE_SOURCES}
|
||||
${LUA_LIB_SOURCES}
|
||||
)
|
||||
# 向上层暴露 LuaJIT 头文件目录与静态库路径(供 lib/CMakeLists.txt 引用)
|
||||
set(LUAJIT_INCLUDE_DIR ${LJ_SRC} PARENT_SCOPE)
|
||||
set(LUAJIT_STATIC_LIB ${LJ_LIB} PARENT_SCOPE)
|
||||
|
||||
Reference in New Issue
Block a user