Add optional Lua scripting module, examples, and validation
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
add_library(faset_build_service STATIC ${PROJECT_SOURCE_DIR}/src/editor/build_service.cpp)
|
||||
target_include_directories(faset_build_service PUBLIC ${PROJECT_SOURCE_DIR}/include)
|
||||
target_compile_features(faset_build_service PUBLIC cxx_std_20)
|
||||
target_link_libraries(faset_build_service PUBLIC faset_core PRIVATE faset_assets faset_authoring Threads::Threads)
|
||||
target_link_libraries(faset_build_service PUBLIC faset_core faset_scripting_project PRIVATE faset_assets faset_authoring Threads::Threads)
|
||||
if(BUILD_TESTING)
|
||||
add_executable(faset_build_service_tests ${PROJECT_SOURCE_DIR}/tests/build_service_tests.cpp)
|
||||
target_link_libraries(faset_build_service_tests PRIVATE faset_build_service faset_assets)
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
# Official Lua sources are checksum-pinned in dependencies.lock.json. Build only
|
||||
# the VM and libraries, never the standalone lua/luac executables or a system ABI.
|
||||
faset_dependency(lua)
|
||||
set(lua_src "${FASET_lua_SOURCE_DIR}/src")
|
||||
add_library(faset_lua_vendor STATIC
|
||||
${lua_src}/lapi.c ${lua_src}/lcode.c ${lua_src}/lctype.c
|
||||
${lua_src}/ldebug.c ${lua_src}/ldo.c ${lua_src}/ldump.c
|
||||
${lua_src}/lfunc.c ${lua_src}/lgc.c ${lua_src}/llex.c
|
||||
${lua_src}/lmem.c ${lua_src}/lobject.c ${lua_src}/lopcodes.c
|
||||
${lua_src}/lparser.c ${lua_src}/lstate.c ${lua_src}/lstring.c
|
||||
${lua_src}/ltable.c ${lua_src}/ltm.c ${lua_src}/lundump.c
|
||||
${lua_src}/lvm.c ${lua_src}/lzio.c ${lua_src}/lauxlib.c
|
||||
${lua_src}/lbaselib.c ${lua_src}/lmathlib.c ${lua_src}/lstrlib.c
|
||||
${lua_src}/ltablib.c ${lua_src}/lutf8lib.c)
|
||||
target_include_directories(faset_lua_vendor SYSTEM PUBLIC "${lua_src}")
|
||||
if(NOT MSVC)
|
||||
# Upstream intentionally uses compiler-supported computed gotos in the VM.
|
||||
target_compile_options(faset_lua_vendor PRIVATE -Wno-pedantic)
|
||||
endif()
|
||||
if(UNIX)
|
||||
target_link_libraries(faset_lua_vendor PUBLIC m)
|
||||
endif()
|
||||
add_library(faset_lua STATIC ${PROJECT_SOURCE_DIR}/src/scripting/LuaModule.cpp)
|
||||
add_library(Faset::Lua ALIAS faset_lua)
|
||||
target_include_directories(faset_lua PUBLIC ${PROJECT_SOURCE_DIR}/include)
|
||||
target_link_libraries(faset_lua PUBLIC faset_runtime faset_scripting_project PRIVATE faset_lua_vendor)
|
||||
|
||||
if(BUILD_TESTING)
|
||||
add_executable(faset_lua_tests ${PROJECT_SOURCE_DIR}/tests/lua_tests.cpp)
|
||||
target_link_libraries(faset_lua_tests PRIVATE faset_lua)
|
||||
target_compile_definitions(faset_lua_tests PRIVATE FASET_SOURCE_DIR="${PROJECT_SOURCE_DIR}")
|
||||
add_test(NAME lua_contracts COMMAND faset_lua_tests)
|
||||
set_tests_properties(lua_contracts PROPERTIES TIMEOUT 30)
|
||||
add_executable(faset_lua_safety_tests ${PROJECT_SOURCE_DIR}/tests/lua_safety_tests.cpp)
|
||||
target_link_libraries(faset_lua_safety_tests PRIVATE faset_lua)
|
||||
add_test(NAME lua_safety_contracts COMMAND faset_lua_safety_tests)
|
||||
set_tests_properties(lua_safety_contracts PROPERTIES TIMEOUT 30)
|
||||
endif()
|
||||
+34
-3
@@ -1,6 +1,10 @@
|
||||
if(TARGET faset_gameplay)
|
||||
add_executable(faset_schema_exporter ${PROJECT_SOURCE_DIR}/apps/schema_exporter_main.cpp)
|
||||
target_link_libraries(faset_schema_exporter PRIVATE faset_core faset_gameplay)
|
||||
target_link_libraries(faset_schema_exporter PRIVATE faset_core faset_gameplay faset_scripting_project)
|
||||
if(TARGET faset_lua)
|
||||
target_link_libraries(faset_schema_exporter PRIVATE faset_lua)
|
||||
target_compile_definitions(faset_schema_exporter PRIVATE FASET_HAS_LUA=1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(TARGET faset_runtime AND TARGET faset_render AND TARGET faset_assets)
|
||||
@@ -14,7 +18,11 @@ if(TARGET faset_runtime AND TARGET faset_render AND TARGET faset_assets)
|
||||
target_compile_definitions(faset_scene_view PRIVATE FASET_HAS_STB=1)
|
||||
endif()
|
||||
add_executable(faset_player ${PROJECT_SOURCE_DIR}/apps/player_main.cpp)
|
||||
target_link_libraries(faset_player PRIVATE faset_scene_view faset_runtime faset_gameplay)
|
||||
target_link_libraries(faset_player PRIVATE faset_scene_view faset_runtime faset_gameplay faset_scripting_project)
|
||||
if(TARGET faset_lua)
|
||||
target_link_libraries(faset_player PRIVATE faset_lua)
|
||||
target_compile_definitions(faset_player PRIVATE FASET_HAS_LUA=1)
|
||||
endif()
|
||||
install(TARGETS faset_player RUNTIME DESTINATION .)
|
||||
if(BUILD_TESTING)
|
||||
add_executable(faset_player_tests ${PROJECT_SOURCE_DIR}/tests/runtime_player_tests.cpp)
|
||||
@@ -28,7 +36,11 @@ if(TARGET faset_runtime AND TARGET faset_render AND TARGET faset_assets)
|
||||
${PROJECT_SOURCE_DIR}/tests/player_diagnostics/Gameplay.cpp)
|
||||
target_include_directories(faset_player_diagnostics PRIVATE
|
||||
${PROJECT_SOURCE_DIR}/tests/player_diagnostics)
|
||||
target_link_libraries(faset_player_diagnostics PRIVATE faset_scene_view faset_runtime)
|
||||
target_link_libraries(faset_player_diagnostics PRIVATE faset_scene_view faset_runtime faset_scripting_project)
|
||||
if(TARGET faset_lua)
|
||||
target_link_libraries(faset_player_diagnostics PRIVATE faset_lua)
|
||||
target_compile_definitions(faset_player_diagnostics PRIVATE FASET_HAS_LUA=1)
|
||||
endif()
|
||||
find_package(Python3 COMPONENTS Interpreter REQUIRED)
|
||||
add_test(NAME player_shutdown_diagnostics COMMAND ${Python3_EXECUTABLE}
|
||||
${PROJECT_SOURCE_DIR}/tests/player_diagnostics_test.py
|
||||
@@ -36,3 +48,22 @@ if(TARGET faset_runtime AND TARGET faset_render AND TARGET faset_assets)
|
||||
set_tests_properties(player_shutdown_diagnostics PROPERTIES LABELS "gpu" TIMEOUT 60)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(BUILD_TESTING AND TARGET faset_schema_exporter)
|
||||
find_package(Python3 COMPONENTS Interpreter REQUIRED)
|
||||
set(FASET_LUA_CLI_TEST_ARGS --exporter $<TARGET_FILE:faset_schema_exporter>)
|
||||
if(TARGET faset_player)
|
||||
list(APPEND FASET_LUA_CLI_TEST_ARGS --player $<TARGET_FILE:faset_player>)
|
||||
endif()
|
||||
if(NOT TARGET faset_lua)
|
||||
list(APPEND FASET_LUA_CLI_TEST_ARGS --disabled)
|
||||
endif()
|
||||
add_test(NAME lua_cli_contracts COMMAND ${Python3_EXECUTABLE}
|
||||
${PROJECT_SOURCE_DIR}/tests/lua_cli_test.py ${FASET_LUA_CLI_TEST_ARGS})
|
||||
set_tests_properties(lua_cli_contracts PROPERTIES TIMEOUT 90)
|
||||
if(TARGET faset_lua AND TARGET faset_player)
|
||||
add_test(NAME lua_player_reload COMMAND ${Python3_EXECUTABLE}
|
||||
${PROJECT_SOURCE_DIR}/tests/lua_player_reload_test.py $<TARGET_FILE:faset_player>)
|
||||
set_tests_properties(lua_player_reload PROPERTIES LABELS "gpu" TIMEOUT 90)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
+5
-2
@@ -7,8 +7,11 @@ target_include_directories(faset_runtime PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../inc
|
||||
target_link_libraries(faset_runtime PUBLIC nlohmann_json::nlohmann_json PRIVATE EnTT::EnTT box2d box3d)
|
||||
|
||||
set(FASET_GAMEPLAY_SOURCE_DIR "${PROJECT_SOURCE_DIR}/examples/gameplay" CACHE PATH "Directory containing the game's Gameplay.cpp and Gameplay.hpp")
|
||||
if(NOT EXISTS "${FASET_GAMEPLAY_SOURCE_DIR}/Gameplay.cpp" OR NOT EXISTS "${FASET_GAMEPLAY_SOURCE_DIR}/Gameplay.hpp")
|
||||
message(FATAL_ERROR "FASET_GAMEPLAY_SOURCE_DIR must contain Gameplay.cpp and Gameplay.hpp")
|
||||
if(NOT EXISTS "${FASET_GAMEPLAY_SOURCE_DIR}/Gameplay.cpp" AND NOT EXISTS "${FASET_GAMEPLAY_SOURCE_DIR}/Gameplay.hpp" AND FASET_ENABLE_LUA)
|
||||
# A Lua-only game needs the same stable native entry points, but no user C++.
|
||||
set(FASET_GAMEPLAY_SOURCE_DIR "${PROJECT_SOURCE_DIR}/src/scripting/empty_gameplay")
|
||||
elseif(NOT EXISTS "${FASET_GAMEPLAY_SOURCE_DIR}/Gameplay.cpp" OR NOT EXISTS "${FASET_GAMEPLAY_SOURCE_DIR}/Gameplay.hpp")
|
||||
message(FATAL_ERROR "Provide both Gameplay.cpp and Gameplay.hpp, or enable Lua for a Lua-only project")
|
||||
endif()
|
||||
add_library(faset_gameplay STATIC "${FASET_GAMEPLAY_SOURCE_DIR}/Gameplay.cpp")
|
||||
add_library(Faset::Gameplay ALIAS faset_gameplay)
|
||||
|
||||
Reference in New Issue
Block a user