cmake_minimum_required(VERSION 3.12)
set(CMAKE_CXX_STANDARD 17)

# 检测目标平台 - 通过编译器名称检测
set(TARGET_WINDOWS FALSE)
if(CMAKE_C_COMPILER MATCHES "mingw" OR CMAKE_SYSTEM_NAME STREQUAL "Windows")
    set(TARGET_WINDOWS TRUE)
endif()

project(LuaCJAPILib)

if(TARGET_WINDOWS)
    # Windows 平台配置
    list(APPEND EXTRA_LIBS "")
else()
    # Linux/macOS 配置
    list(APPEND EXTRA_LIBS dl)
endif()

set(ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

include_directories(${ROOT_PATH} ${ROOT_PATH}/lua ${ROOT_PATH}/lua/src)
add_subdirectory(lua)

# LuaJIT 子目录通过 PARENT_SCOPE 变量暴露头文件与静态库路径
if(LUAJIT_INCLUDE_DIR)
    include_directories(${LUAJIT_INCLUDE_DIR})
endif()

# 方案：使用 OBJECT 库
add_library(luarunner OBJECT lua_runner.cpp)
target_include_directories(luarunner PRIVATE ${ROOT_PATH}/lua/src)

# Windows 特定编译定义
if(TARGET_WINDOWS)
    target_compile_definitions(luarunner PRIVATE LUA_USE_WINDOWS)
endif()

add_library(luacjapi SHARED lua_cj_api.cpp)
add_dependencies(luacjapi lua)   # 确保 LuaJIT 静态库先构建

# 链接阶段 - 根据平台选择不同的链接选项
if(TARGET_WINDOWS)
    # Windows: 使用 Windows 兼容的链接选项
    target_link_libraries(luacjapi PRIVATE
        luarunner
        "-Wl,--whole-archive"
        lua
        "-Wl,--no-whole-archive"
        m
    )
else()
    # Linux/macOS: 使用 Unix 链接选项
    # LuaJIT: 静态库路径由 lib/lua/CMakeLists.txt 的自定义目标产出
    set(LUAJIT_LIB_PATH ${ROOT_PATH}/lua/src/libluajit.a)
    if(LUAJIT_STATIC_LIB)
        set(LUAJIT_LIB_PATH ${LUAJIT_STATIC_LIB})
    endif()
    target_link_libraries(luacjapi PRIVATE
        luarunner
        ${LUAJIT_LIB_PATH}   # LuaJIT 静态库(替代原 liblua.a)
        m
        ${EXTRA_LIBS}
    )
    # 静态链接 LuaJIT 必须导出符号(-Wl,-E), 否则 lua_yield 等报错
    target_link_options(luacjapi PRIVATE -Wl,-E)
endif()
