summaryrefslogtreecommitdiff
path: root/libs/luajit-cmake/LuaJIT.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'libs/luajit-cmake/LuaJIT.cmake')
-rw-r--r--libs/luajit-cmake/LuaJIT.cmake595
1 files changed, 595 insertions, 0 deletions
diff --git a/libs/luajit-cmake/LuaJIT.cmake b/libs/luajit-cmake/LuaJIT.cmake
new file mode 100644
index 0000000..7b3e590
--- /dev/null
+++ b/libs/luajit-cmake/LuaJIT.cmake
@@ -0,0 +1,595 @@
+cmake_minimum_required(VERSION 3.0)
+
+project(luajit C)
+set(can_use_assembler TRUE)
+enable_language(ASM)
+
+if(NOT LUAJIT_DIR)
+ message(FATAL_ERROR "Must set LUAJIT_DIR to build luajit with CMake")
+endif()
+
+set(LJ_DIR ${LUAJIT_DIR}/src)
+
+list(APPEND CMAKE_MODULE_PATH
+ "${CMAKE_CURRENT_LIST_DIR}/Modules"
+)
+
+if (NOT WIN32)
+ include(GNUInstallDirs)
+endif ()
+
+set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE STRING "Minimum version of macOS/iOS)")
+set(LUAJIT_BUILD_EXE OFF CACHE BOOL "Enable luajit exe build")
+set(LUAJIT_BUILD_ALAMG OFF CACHE BOOL "Enable alamg build mode")
+set(LUAJIT_DISABLE_GC64 OFF CACHE BOOL "Disable GC64 mode for x64")
+set(LUA_MULTILIB "lib" CACHE PATH "The name of lib directory.")
+set(LUAJIT_DISABLE_FFI OFF CACHE BOOL "Permanently disable the FFI extension")
+set(LUAJIT_DISABLE_JIT OFF CACHE BOOL "Disable the JIT compiler")
+set(LUAJIT_NO_UNWIND OFF CACHE BOOL "Disable the UNWIND")
+set(LUAJIT_NUMMODE 0 CACHE STRING
+"Specify the number mode to use. Possible values:
+ 0 - Default mode
+ 1 - Single number mode
+ 2 - Dual number mode
+")
+
+message(STATUS "${CMAKE_CROSSCOMPILING} ${CMAKE_HOST_SYSTEM_NAME}")
+message(STATUS "${CMAKE_SIZEOF_VOID_P} ${CMAKE_SYSTEM_NAME}")
+if(CMAKE_CROSSCOMPILING)
+ if(${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES 64)
+ set(HOST_64 TRUE)
+ else()
+ set(HOST_64 FALSE)
+ endif()
+ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(TARGET_64 TRUE)
+ else()
+ set(TARGET_64 FALSE)
+ endif()
+ message(STATUS "HOST_64 is ${HOST_64}")
+ message(STATUS "TARGET_64 is ${TARGET_64}")
+
+ if(HOST_64 AND NOT TARGET_64)
+ if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL Darwin)
+ if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
+ set(HOST_WINE wine)
+ set(TOOLCHAIN "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
+ if(TARGET_SYS)
+ set(TARGET_SYS "-DTARGET_SYS=${TARGET_SYS}")
+ endif()
+ include(${CMAKE_CURRENT_LIST_DIR}/Utils/Darwin.wine.cmake)
+ else()
+ include(${CMAKE_CURRENT_LIST_DIR}/Utils/Darwin.wine.cmake)
+ endif()
+ else()
+ message(FATAL_ERROR
+ "NYI build ${CMAKE_SYSTEM_NAME} for on ${CMAKE_HOST_SYSTEM_NAME}")
+ endif()
+ else()
+ set(TOOLCHAIN "-UCMAKE_TOOLCHAIN_FILE")
+ if(DEFINED ENV{CMAKE_TOOLCHAIN_FILE})
+ message(STATUS "Check CMAKE_TOOLCHAIN_FILE in environment variable, found")
+ unset(ENV{CMAKE_TOOLCHAIN_FILE})
+ message(WARNING "unset Environment Variables CMAKE_TOOLCHAIN_FILE")
+ else()
+ message(STATUS "Check CMAKE_TOOLCHAIN_FILE in environment variable, not found")
+ endif()
+ endif()
+endif()
+
+set(MINILUA_EXE minilua)
+if(HOST_WINE)
+ set(MINILUA_EXE minilua.exe)
+endif()
+set(MINILUA_PATH ${CMAKE_CURRENT_BINARY_DIR}/minilua/${MINILUA_EXE})
+
+include(CheckTypeSize)
+include(TestBigEndian)
+test_big_endian(LJ_BIG_ENDIAN)
+
+include(${CMAKE_CURRENT_LIST_DIR}/Modules/DetectArchitecture.cmake)
+detect_architecture(LJ_DETECTED_ARCH)
+
+include(${CMAKE_CURRENT_LIST_DIR}/Modules/DetectFPUApi.cmake)
+detect_fpu_mode(LJ_DETECTED_FPU_MODE)
+detect_fpu_abi(LJ_DETECTED_FPU_ABI)
+
+find_library(LIBM_LIBRARIES NAMES m)
+find_library(LIBDL_LIBRARIES NAMES dl)
+
+if($ENV{LUA_TARGET_SHARED})
+ add_definitions(-fPIC)
+endif()
+
+set(TARGET_ARCH "")
+set(DASM_FLAGS "")
+
+set(LJ_TARGET_ARCH "")
+if("${LJ_DETECTED_ARCH}" STREQUAL "x86")
+ set(LJ_TARGET_ARCH "x86")
+elseif("${LJ_DETECTED_ARCH}" STREQUAL "x86_64")
+ set(LJ_TARGET_ARCH "x64")
+elseif("${LJ_DETECTED_ARCH}" STREQUAL "AArch64")
+ set(LJ_TARGET_ARCH "arm64")
+ if(LJ_BIG_ENDIAN)
+ set(TARGET_ARCH -D__AARCH64EB__=1)
+ endif()
+elseif("${LJ_DETECTED_ARCH}" STREQUAL "ARM")
+ set(LJ_TARGET_ARCH "arm")
+elseif("${LJ_DETECTED_ARCH}" STREQUAL "Mips64")
+ set(LJ_TARGET_ARCH "mips64")
+ if(NOT LJ_BIG_ENDIAN)
+ set(TARGET_ARCH -D__MIPSEL__=1)
+ endif()
+elseif("${LJ_DETECTED_ARCH}" STREQUAL "Mips")
+ set(LJ_TARGET_ARCH "mips")
+ if(NOT LJ_BIG_ENDIAN)
+ set(TARGET_ARCH -D__MIPSEL__=1)
+ endif()
+elseif("${LJ_DETECTED_ARCH}" STREQUAL "PowerPC")
+ if(LJ_64)
+ set(LJ_TARGET_ARCH "ppc64")
+ else()
+ set(LJ_TARGET_ARCH "ppc")
+ endif()
+ if(LJ_BIG_ENDIAN)
+ set(TARGET_ARCH -DLJ_ARCH_ENDIAN=LUAJIT_BE)
+ else()
+ set(TARGET_ARCH -DLJ_ARCH_ENDIAN=LUAJIT_LE)
+ endif()
+else()
+ message(FATAL_ERROR "Unsupported target architecture: '${LJ_DETECTED_ARCH}'")
+endif()
+
+if("${LJ_DETECTED_FPU_MODE}" STREQUAL "Hard")
+ set(LJ_HAS_FPU 1)
+ set(DASM_FLAGS ${DASM_FLAGS} -D FPU)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLJ_ARCH_HASFPU=1)
+else()
+ set(LJ_HAS_FPU 0)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLJ_ARCH_HASFPU=0)
+endif()
+
+if("${LJ_DETECTED_FPU_ABI}" STREQUAL "Hard")
+ set(LJ_ABI_SOFTFP 0)
+ set(DASM_FLAGS ${DASM_FLAGS} -D HFABI)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLJ_ABI_SOFTFP=0)
+else()
+ set(LJ_ABI_SOFTFP 1)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLJ_ABI_SOFTFP=1)
+endif()
+
+set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_TARGET=LUAJIT_ARCH_${LJ_TARGET_ARCH})
+
+if(WIN32 OR MINGW)
+ set(DASM_FLAGS ${DASM_FLAGS} -D WIN)
+endif()
+
+include(${CMAKE_CURRENT_LIST_DIR}/Modules/FindUnwind.cmake)
+if (NOT unwind_FOUND)
+ set(LUAJIT_NO_UNWIND ON)
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL mips64 OR
+ CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64 OR
+ CMAKE_SYSTEM_NAME STREQUAL Windows)
+ if(NOT IOS)
+ set(LUAJIT_NO_UNWIND IGNORE)
+ endif()
+ endif()
+endif()
+
+message(STATUS "#### CMAKE_SYSTEM_NAME is ${CMAKE_SYSTEM_NAME}")
+message(STATUS "#### CMAKE_SYSTEM_PROCESSOR is ${CMAKE_SYSTEM_PROCESSOR}")
+message(STATUS "#### ARCH is ${ARCH}")
+message(STATUS "#### unwind_FOUND is ${unwind_FOUND}")
+message(STATUS "#### HAVE_UNWIND_H is ${HAVE_UNWIND_H}")
+message(STATUS "#### HAVE_UNWIND_LIB is ${HAVE_UNWIND_LIB}")
+message(STATUS "#### UNWIND_LIBRARY is ${UNWIND_LIBRARY}")
+
+message(STATUS "#### LUAJIT_NO_UNWIND is ${LUAJIT_NO_UNWIND}")
+
+set(LJ_DEFINITIONS "")
+if(LUAJIT_NO_UNWIND STREQUAL ON)
+ # LUAJIT_NO_UNWIND is ON
+ set(DASM_FLAGS ${DASM_FLAGS} -D NO_UNWIND)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_NO_UNWIND)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUAJIT_NO_UNWIND)
+elseif(${LUAJIT_NO_UNWIND} STREQUAL OFF)
+ # LUAJIT_NO_UNWIND is OFF
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUAJIT_UNWIND_EXTERNAL)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_UNWIND_EXTERNAL)
+endif()
+
+if(ANDROID)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLJ_NO_SYSTEM=1)
+endif()
+
+if(IOS)
+ set(LUAJIT_DISABLE_JIT ON)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLJ_NO_SYSTEM=1)
+endif()
+
+set(LJ_ENABLE_LARGEFILE 1)
+if(ANDROID AND (CMAKE_SYSTEM_VERSION LESS 21))
+ set(LJ_ENABLE_LARGEFILE 0)
+elseif(WIN32 OR MINGW)
+ set(LJ_ENABLE_LARGEFILE 0)
+endif()
+
+if(LJ_ENABLE_LARGEFILE)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS}
+ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE)
+endif()
+
+set(LJ_FFI 1)
+if(LUAJIT_DISABLE_FFI)
+ set(LJ_FFI 0)
+endif()
+
+set(LJ_JIT 1)
+if(LUAJIT_DISABLE_JIT)
+ set(LJ_JIT 0)
+endif()
+
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(LJ_64 1)
+endif()
+
+set(LJ_GC64 ${LJ_64})
+
+if(LJ_64 AND LUAJIT_DISABLE_GC64 AND ("${LJ_TARGET_ARCH}" STREQUAL "x64"))
+ set(LJ_GC64 0)
+endif()
+
+set(LJ_FR2 ${LJ_GC64})
+
+set(LJ_NUMMODE_SINGLE 0) # Single-number mode only.
+set(LJ_NUMMODE_SINGLE_DUAL 1) # Default to single-number mode.
+set(LJ_NUMMODE_DUAL 2) # Dual-number mode only.
+set(LJ_NUMMODE_DUAL_SINGLE 3) # Default to dual-number mode.
+
+set(LJ_ARCH_NUMMODE ${LJ_NUMMODE_DUAL})
+if(LJ_HAS_FPU)
+ set(LJ_ARCH_NUMMODE ${LJ_NUMMODE_DUAL_SINGLE})
+endif()
+
+if(("${LJ_TARGET_ARCH}" STREQUAL "x86") OR
+ ("${LJ_TARGET_ARCH}" STREQUAL "x64"))
+ set(LJ_ARCH_NUMMODE ${LJ_NUMMODE_SINGLE_DUAL})
+endif()
+
+if(("${LJ_TARGET_ARCH}" STREQUAL "arm") OR
+ ("${LJ_TARGET_ARCH}" STREQUAL "arm64") OR
+ ("${LJ_TARGET_ARCH}" STREQUAL "mips") OR
+ ("${LJ_TARGET_ARCH}" STREQUAL "mips64"))
+ set(LJ_ARCH_NUMMODE ${LJ_NUMMODE_DUAL})
+endif()
+
+# Enable or disable the dual-number mode for the VM.
+if(((LJ_ARCH_NUMMODE EQUAL LJ_NUMMODE_SINGLE) AND (LUAJIT_NUMMODE EQUAL 2)) OR
+ ((LJ_ARCH_NUMMODE EQUAL LJ_NUMMODE_DUAL) AND (LUAJIT_NUMMODE EQUAL 1)))
+ message(FATAL_ERROR "No support for this number mode on this architecture")
+endif()
+if(
+ (LJ_ARCH_NUMMODE EQUAL LJ_NUMMODE_DUAL) OR
+ ( (LJ_ARCH_NUMMODE EQUAL LJ_NUMMODE_DUAL_SINGLE) AND NOT
+ (LUAJIT_NUMMODE EQUAL 1) ) OR
+ ( (LJ_ARCH_NUMMODE EQUAL LJ_NUMMODE_SINGLE_DUAL) AND
+ (LUAJIT_NUMMODE EQUAL 2) )
+ )
+ set(LJ_DUALNUM 1)
+else()
+ set(LJ_DUALNUM 0)
+endif()
+
+set(BUILDVM_ARCH_H ${CMAKE_CURRENT_BINARY_DIR}/buildvm_arch.h)
+set(DASM_PATH ${LUAJIT_DIR}/dynasm/dynasm.lua)
+
+if(NOT LJ_BIG_ENDIAN)
+ set(DASM_FLAGS ${DASM_FLAGS} -D ENDIAN_LE)
+else()
+ set(DASM_FLAGS ${DASM_FLAGS} -D ENDIAN_BE)
+endif()
+
+if(LJ_64)
+ set(DASM_FLAGS ${DASM_FLAGS} -D P64)
+endif()
+
+if(LJ_FFI)
+ set(DASM_FLAGS ${DASM_FLAGS} -D FFI)
+endif()
+
+if(LJ_JIT)
+ set(DASM_FLAGS ${DASM_FLAGS} -D JIT)
+endif()
+
+if(LJ_DUALNUM)
+ set(DASM_FLAGS ${DASM_FLAGS} -D DUALNUM)
+endif()
+
+set(DASM_ARCH ${LJ_TARGET_ARCH})
+
+if("${LJ_TARGET_ARCH}" STREQUAL "x64")
+ if(NOT LJ_FR2)
+ set(DASM_ARCH "x86")
+ endif()
+endif()
+
+set(DASM_FLAGS ${DASM_FLAGS} -D VER=)
+
+set(TARGET_OS_FLAGS "")
+if(${CMAKE_SYSTEM_NAME} STREQUAL Android)
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_LINUX)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_WINDOWS)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_OSX)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_LINUX)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL Haiku)
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_POSIX)
+elseif(${CMAKE_SYSTEM_NAME} MATCHES "(Open|Free|Net)BSD")
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_BSD)
+elseif(${CMAKE_SYSTEM_NAME} STREQUAL iOS)
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_OSX -DTARGET_OS_IPHONE=1)
+else()
+ set(TARGET_OS_FLAGS ${TARGET_OS_FLAGS} -DLUAJIT_OS=LUAJIT_OS_OTHER)
+endif()
+
+if(LUAJIT_DISABLE_GC64)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUAJIT_DISABLE_GC64)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_DISABLE_GC64)
+endif()
+
+set(TARGET_ARCH ${TARGET_ARCH} ${TARGET_OS_FLAGS})
+set(LJ_DEFINITIONS ${LJ_DEFINITIONS} ${TARGET_OS_FLAGS})
+
+if(LUAJIT_DISABLE_FFI)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUAJIT_DISABLE_FFI)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_DISABLE_FFI)
+endif()
+if(LUAJIT_DISABLE_JIT)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUAJIT_DISABLE_JIT)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_DISABLE_JIT)
+endif()
+
+if(("${LUAJIT_NUMMODE}" STREQUAL "1") OR
+ ("${LUAJIT_NUMMODE}" STREQUAL "2"))
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUAJIT_NUMMODE=${LUAJIT_NUMMODE})
+ set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_NUMMODE=${LUAJIT_NUMMODE})
+endif()
+
+if(LUAJIT_ENABLE_GDBJIT)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUAJIT_ENABLE_GDBJIT)
+ set(TARGET_ARCH ${TARGET_ARCH} -DLUAJIT_ENABLE_GDBJIT)
+endif()
+
+set(VM_DASC_PATH ${LJ_DIR}/vm_${DASM_ARCH}.dasc)
+
+# Build the minilua for host platform
+if(NOT CMAKE_CROSSCOMPILING)
+ add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/host/minilua)
+ set(MINILUA_PATH $<TARGET_FILE:minilua>)
+else()
+ make_directory(${CMAKE_CURRENT_BINARY_DIR}/minilua)
+
+ add_custom_command(OUTPUT ${MINILUA_PATH}
+ COMMAND ${CMAKE_COMMAND} ${TOOLCHAIN} ${TARGET_SYS} -DLUAJIT_DIR=${LUAJIT_DIR}
+ -DCMAKE_SIZEOF_VOID_P=${CMAKE_SIZEOF_VOID_P}
+ ${CMAKE_CURRENT_LIST_DIR}/host/minilua
+ COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/minilua
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/minilua)
+
+ add_custom_target(minilua ALL
+ DEPENDS ${MINILUA_PATH}
+ )
+endif()
+
+# Generate buildvm_arch.h
+add_custom_command(OUTPUT ${BUILDVM_ARCH_H}
+ COMMAND ${HOST_WINE} ${MINILUA_PATH} ${DASM_PATH} ${DASM_FLAGS}
+ -o ${BUILDVM_ARCH_H} ${VM_DASC_PATH}
+ DEPENDS minilua)
+add_custom_target(buildvm_arch_h ALL
+ DEPENDS ${BUILDVM_ARCH_H}
+)
+
+# Build the buildvm for host platform
+set(BUILDVM_COMPILER_FLAGS "${TARGET_ARCH}")
+
+set(BUILDVM_COMPILER_FLAGS_PATH
+ "${CMAKE_CURRENT_BINARY_DIR}/buildvm_flags.config")
+file(WRITE ${BUILDVM_COMPILER_FLAGS_PATH} "${BUILDVM_COMPILER_FLAGS}")
+
+set(BUILDVM_EXE buildvm)
+if(HOST_WINE)
+ set(BUILDVM_EXE buildvm.exe)
+endif()
+
+if(NOT CMAKE_CROSSCOMPILING)
+ add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/host/buildvm)
+ set(BUILDVM_PATH $<TARGET_FILE:buildvm>)
+ add_dependencies(buildvm buildvm_arch_h)
+else()
+ set(BUILDVM_PATH ${CMAKE_CURRENT_BINARY_DIR}/buildvm/${BUILDVM_EXE})
+
+ make_directory(${CMAKE_CURRENT_BINARY_DIR}/buildvm)
+
+ add_custom_command(OUTPUT ${BUILDVM_PATH}
+ COMMAND ${CMAKE_COMMAND} ${TOOLCHAIN} ${TARGET_SYS}
+ ${CMAKE_CURRENT_LIST_DIR}/host/buildvm
+ -DCMAKE_SIZEOF_VOID_P=${CMAKE_SIZEOF_VOID_P}
+ -DLUAJIT_DIR=${LUAJIT_DIR}
+ -DEXTRA_COMPILER_FLAGS_FILE=${BUILDVM_COMPILER_FLAGS_PATH}
+ COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/buildvm
+ DEPENDS ${CMAKE_CURRENT_LIST_DIR}/host/buildvm/CMakeLists.txt
+ DEPENDS buildvm_arch_h
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/buildvm)
+
+ add_custom_target(buildvm ALL
+ DEPENDS ${BUILDVM_PATH}
+ )
+endif()
+
+set(LJVM_MODE elfasm)
+if(APPLE)
+ set(LJVM_MODE machasm)
+elseif(WIN32 OR MINGW)
+ set(LJVM_MODE peobj)
+endif()
+
+set(LJ_VM_NAME lj_vm.S)
+if("${LJVM_MODE}" STREQUAL "peobj")
+ set(LJ_VM_NAME lj_vm.obj)
+endif()
+if(IOS)
+ set_source_files_properties(${LJ_VM_NAME} PROPERTIES
+ COMPILE_FLAGS "-arch ${ARCHS} -isysroot ${CMAKE_OSX_SYSROOT} ${BITCODE}")
+endif()
+
+
+set(LJ_VM_S_PATH ${CMAKE_CURRENT_BINARY_DIR}/${LJ_VM_NAME})
+add_custom_command(OUTPUT ${LJ_VM_S_PATH}
+ COMMAND ${HOST_WINE} ${BUILDVM_PATH} -m ${LJVM_MODE} -o ${LJ_VM_S_PATH}
+ DEPENDS buildvm
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/)
+
+if(APPLE AND CMAKE_OSX_DEPLOYMENT_TARGET AND NOT(CMAKE_CROSSCOMPILING))
+ set_source_files_properties(${LJ_VM_NAME} PROPERTIES
+ COMPILE_FLAGS -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET})
+endif()
+
+make_directory(${CMAKE_CURRENT_BINARY_DIR}/jit)
+set(LJ_LIBDEF_PATH ${CMAKE_CURRENT_BINARY_DIR}/lj_libdef.h)
+set(LJ_RECDEF_PATH ${CMAKE_CURRENT_BINARY_DIR}/lj_recdef.h)
+set(LJ_FFDEF_PATH ${CMAKE_CURRENT_BINARY_DIR}/lj_ffdef.h)
+set(LJ_BCDEF_PATH ${CMAKE_CURRENT_BINARY_DIR}/lj_bcdef.h)
+set(LJ_VMDEF_PATH ${CMAKE_CURRENT_BINARY_DIR}/jit/vmdef.lua)
+
+set(LJ_LIB_SOURCES
+ ${LJ_DIR}/lib_base.c ${LJ_DIR}/lib_math.c ${LJ_DIR}/lib_bit.c
+ ${LJ_DIR}/lib_string.c ${LJ_DIR}/lib_table.c ${LJ_DIR}/lib_io.c
+ ${LJ_DIR}/lib_os.c ${LJ_DIR}/lib_package.c ${LJ_DIR}/lib_debug.c
+ ${LJ_DIR}/lib_jit.c ${LJ_DIR}/lib_ffi.c ${LJ_DIR}/lib_buffer.c)
+add_custom_command(
+ OUTPUT ${LJ_LIBDEF_PATH} ${LJ_VMDEF_PATH} ${LJ_RECDEF_PATH} ${LJ_FFDEF_PATH}
+ OUTPUT ${LJ_BCDEF_PATH}
+ COMMAND ${HOST_WINE}
+ ${BUILDVM_PATH} -m libdef -o ${LJ_LIBDEF_PATH} ${LJ_LIB_SOURCES}
+ COMMAND ${HOST_WINE}
+ ${BUILDVM_PATH} -m recdef -o ${LJ_RECDEF_PATH} ${LJ_LIB_SOURCES}
+ COMMAND ${HOST_WINE}
+ ${BUILDVM_PATH} -m ffdef -o ${LJ_FFDEF_PATH} ${LJ_LIB_SOURCES}
+ COMMAND ${HOST_WINE}
+ ${BUILDVM_PATH} -m bcdef -o ${LJ_BCDEF_PATH} ${LJ_LIB_SOURCES}
+ COMMAND ${HOST_WINE}
+ ${BUILDVM_PATH} -m vmdef -o ${LJ_VMDEF_PATH} ${LJ_LIB_SOURCES}
+ DEPENDS buildvm ${LJ_LIB_SOURCE}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/)
+
+add_custom_target(lj_gen_headers ALL
+ DEPENDS ${LJ_LIBDEF_PATH} ${LJ_RECDEF_PATH} ${LJ_VMDEF_PATH}
+ DEPENDS ${LJ_FFDEF_PATH} ${LJ_BCDEF_PATH}
+)
+
+set(LJ_FOLDDEF_PATH ${CMAKE_CURRENT_BINARY_DIR}/lj_folddef.h)
+
+set(LJ_FOLDDEF_SOURCE ${LJ_DIR}/lj_opt_fold.c)
+add_custom_command(
+ OUTPUT ${LJ_FOLDDEF_PATH}
+ COMMAND ${HOST_WINE}
+ ${BUILDVM_PATH} -m folddef -o ${LJ_FOLDDEF_PATH} ${LJ_FOLDDEF_SOURCE}
+ DEPENDS ${BUILDVM_PATH}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/)
+
+add_custom_target(lj_gen_folddef ALL
+ DEPENDS ${LJ_FOLDDEF_PATH}
+)
+
+file(GLOB_RECURSE SRC_LJCORE "${LJ_DIR}/lj_*.c")
+file(GLOB_RECURSE SRC_LIBCORE "${LJ_DIR}/lib_*.c")
+
+if(LUAJIT_BUILD_ALAMG)
+ set(luajit_sources ${LJ_DIR}/ljamalg.c ${LJ_VM_NAME})
+else()
+ set(luajit_sources ${SRC_LIBCORE} ${SRC_LJCORE} ${LJ_VM_NAME})
+endif()
+
+# Build the luajit static library
+add_library(libluajit ${luajit_sources})
+set_target_properties(libluajit PROPERTIES OUTPUT_NAME luajit)
+add_dependencies(libluajit
+ buildvm_arch_h
+ buildvm
+ lj_gen_headers
+ lj_gen_folddef)
+target_include_directories(libluajit PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR})
+if(BUILD_SHARED_LIBS)
+ if(WIN32 OR MINGW)
+ set(LJ_DEFINITIONS ${LJ_DEFINITIONS}
+ -DLUA_BUILD_AS_DLL -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_WARNINGS)
+ endif()
+endif()
+
+if(LIBM_LIBRARIES)
+ target_link_libraries(libluajit ${LIBM_LIBRARIES})
+endif()
+
+if(LIBDL_LIBRARIES)
+ target_link_libraries(libluajit ${LIBDL_LIBRARIES})
+endif()
+
+set(LJ_DEFINITIONS ${LJ_DEFINITIONS} -DLUA_MULTILIB="${LUA_MULTILIB}")
+target_compile_definitions(libluajit PRIVATE ${LJ_DEFINITIONS})
+if(IOS)
+ set_xcode_property(libluajit IPHONEOS_DEPLOYMENT_TARGET "9.0" "all")
+endif()
+
+if("${LJ_TARGET_ARCH}" STREQUAL "x86")
+ if(CMAKE_COMPILER_IS_CLANGXX OR CMAKE_COMPILER_IS_GNUCXX)
+ target_compile_options(libluajit PRIVATE
+ -march=i686 -msse -msse2 -mfpmath=sse)
+ endif()
+endif()
+
+set(LJ_COMPILE_OPTIONS -U_FORTIFY_SOURCE)
+if(NO_STACK_PROTECTOR_FLAG)
+ set(LJ_COMPILE_OPTIONS ${LJ_COMPILE_OPTIONS} -fno-stack-protector)
+endif()
+if(IOS AND ("${LJ_TARGET_ARCH}" STREQUAL "arm64"))
+ set(LJ_COMPILE_OPTIONS ${LJ_COMPILE_OPTIONS} -fno-omit-frame-pointer)
+endif()
+
+target_compile_options(libluajit PRIVATE ${LJ_COMPILE_OPTIONS})
+
+set(luajit_headers
+ ${LJ_DIR}/lauxlib.h
+ ${LJ_DIR}/lua.h
+ ${LJ_DIR}/luaconf.h
+ ${LJ_DIR}/luajit.h
+ ${LJ_DIR}/lualib.h)
+install(FILES ${luajit_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/luajit)
+install(TARGETS libluajit
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
+# Build the luajit binary
+if (LUAJIT_BUILD_EXE)
+ add_executable(luajit ${LJ_DIR}/luajit.c)
+ target_link_libraries(luajit libluajit)
+ if(APPLE AND ${CMAKE_C_COMPILER_ID} STREQUAL "zig")
+ target_link_libraries(luajit c pthread)
+ set_target_properties(minilua PROPERTIES
+ LINK_FLAGS "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
+ endif()
+ if(HAVE_UNWIND_LIB AND (NOT LUAJIT_NO_UNWIND STREQUAL ON))
+ target_link_libraries(luajit ${UNWIND_LIBRARY})
+ endif()
+
+ target_compile_definitions(luajit PRIVATE ${LJ_DEFINITIONS})
+ file(COPY ${LJ_DIR}/jit DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+
+ install(TARGETS luajit DESTINATION "${CMAKE_INSTALL_BINDIR}")
+endif()
+