# Building the toolchain for LuaJIT VM preprocessing.

# FIXME: Both minilua and buildvm need to be build with the HOST_*
# toolchain.

# --- Build minilua ------------------------------------------------------------

# If left blank, minilua is built and used. You can supply an installed
# copy of (plain) Lua 5.1 or 5.2, plus Lua BitOp. E.g. with: HOST_LUA=lua.
if(NOT HOST_LUA)
  set(MINILUA minilua)
  add_executable(${MINILUA} minilua.c)
  target_link_libraries(${MINILUA} m)
  set(HOST_LUA $<TARGET_FILE:${MINILUA}>)
else()
  separate_arguments(HOST_LUA UNIX_COMMAND ${HOST_LUA})
endif()

# --- Prepare dasm-ed VM description -------------------------------------------

set(DYNASM_DIR ${PROJECT_SOURCE_DIR}/dynasm)
set(DYNASM_DASC "${LUAJIT_SOURCE_DIR}/vm_${DYNASM_ARCH}.dasc")
set(DYNASM ${HOST_LUA} ${DYNASM_DIR}/dynasm.lua)

file(GLOB DYNASM_LUA ${DYNASM_DIR}/*.lua)
add_custom_command(
  COMMENT "Generating buildvm_arch.h"
  OUTPUT buildvm_arch.h
  COMMAND ${DYNASM} ${DYNASM_FLAGS} -o buildvm_arch.h ${DYNASM_DASC}
  DEPENDS ${MINILUA} ${DYNASM_DASC} ${DYNASM_LUA}
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

# --- Build buildvm ------------------------------------------------------------

add_executable(buildvm EXCLUDE_FROM_ALL
  buildvm.c
  buildvm_asm.c
  buildvm_fold.c
  buildvm_lib.c
  buildvm_peobj.c
  # XXX: Unfortunately, there is no convenient way to specify
  # autogenerated host/buildvm_arch.h as a dependency for
  # host/buildvm.c, so I simply explicitly mentioned it in this
  # *sources* list.
  buildvm_arch.h
)
file(GLOB DASM_HEADERS ${DYNASM_DIR}/dasm_*.h)
set_source_files_properties(buildvm.c PROPERTIES
  OBJECT_DEPENDS "${DASM_HEADERS}"
)
set_target_properties(buildvm PROPERTIES
  COMPILE_FLAGS "${HOST_C_FLAGS} ${TARGET_C_FLAGS}"
)
target_include_directories(buildvm PRIVATE
  ${LUAJIT_BINARY_DIR}
  ${CMAKE_CURRENT_BINARY_DIR}
)
