cmake_minimum_required(VERSION 3.12)
project(luajit LANGUAGES C)

# ==================== LuaJIT 2.1 构建策略 ====================
# LuaJIT 仓库结构: Makefile 在根, src/ 子目录, dynasm/ 兄弟目录。
# 必须从根目录执行 make。配置期调用 make 产出 src/libluajit.a。
# 头文件 lua.h/lauxlib.h/lualib.h 在 src/ 下。

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()

# 清理旧构建产物后重新构建（保证产物一致性）
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
)

add_custom_target(lua ALL DEPENDS ${LJ_LIB})

# 向上层暴露 LuaJIT 头文件目录与静态库路径（供 lib/CMakeLists.txt 引用）
set(LUAJIT_INCLUDE_DIR ${LJ_SRC} PARENT_SCOPE)
set(LUAJIT_STATIC_LIB   ${LJ_LIB} PARENT_SCOPE)
