From 16bbcddf5094fef7d36550ab45d04fa44b8f680c Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 22 Jul 2020 22:20:54 +0300 Subject: [PATCH] PIP Lua Module --- CMakeLists.txt | 19 ++++++-- cmake/FindPIP.cmake | 14 +++++- .../lua => lib/lua/3rd}/LuaBridge/List.h | 0 .../lua => lib/lua/3rd}/LuaBridge/LuaBridge.h | 0 .../lua => lib/lua/3rd}/LuaBridge/Map.h | 0 .../lua/3rd}/LuaBridge/RefCountedObject.h | 0 .../lua/3rd}/LuaBridge/RefCountedPtr.h | 0 .../lua/3rd}/LuaBridge/UnorderedMap.h | 0 .../lua => lib/lua/3rd}/LuaBridge/Vector.h | 0 .../lua/3rd}/LuaBridge/detail/CFunctions.h | 0 .../lua/3rd}/LuaBridge/detail/ClassInfo.h | 0 .../lua/3rd}/LuaBridge/detail/Config.h | 0 .../lua/3rd}/LuaBridge/detail/Constructor.h | 0 .../lua/3rd}/LuaBridge/detail/FuncTraits.h | 0 .../lua/3rd}/LuaBridge/detail/Iterator.h | 0 .../lua/3rd}/LuaBridge/detail/LuaException.h | 0 .../lua/3rd}/LuaBridge/detail/LuaHelpers.h | 0 .../lua/3rd}/LuaBridge/detail/LuaRef.h | 0 .../lua/3rd}/LuaBridge/detail/Namespace.h | 0 .../lua/3rd}/LuaBridge/detail/Security.h | 0 .../lua/3rd}/LuaBridge/detail/Stack.h | 0 .../lua/3rd}/LuaBridge/detail/TypeList.h | 0 .../lua/3rd}/LuaBridge/detail/TypeTraits.h | 0 .../lua/3rd}/LuaBridge/detail/Userdata.h | 0 .../lua/3rd}/LuaBridge/detail/dump.h | 0 lib/main/lua/piluaprogram.h | 12 +++++ lib/main/lua/pip_lua.h | 39 +++++++++++++++ main.cpp | 47 +------------------ 28 files changed, 82 insertions(+), 49 deletions(-) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/List.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/LuaBridge.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/Map.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/RefCountedObject.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/RefCountedPtr.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/UnorderedMap.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/Vector.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/CFunctions.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/ClassInfo.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/Config.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/Constructor.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/FuncTraits.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/Iterator.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/LuaException.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/LuaHelpers.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/LuaRef.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/Namespace.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/Security.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/Stack.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/TypeList.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/TypeTraits.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/Userdata.h (100%) rename {3rd_party/lua => lib/lua/3rd}/LuaBridge/detail/dump.h (100%) create mode 100644 lib/main/lua/piluaprogram.h create mode 100644 lib/main/lua/pip_lua.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e66837a8..145b35c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,6 +67,7 @@ set(PIP_SRC_OPENCL "lib/opencl") set(PIP_SRC_IO_UTILS "lib/io_utils") set(PIP_SRC_CONCURRENT "lib/concurrent") set(PIP_SRC_CLOUD "lib/cloud") +set(PIP_SRC_LUA "lib/lua") set(PIP_SRC_DIRS ${PIP_SRC_MAIN} ${PIP_SRC_CONSOLE} ${PIP_SRC_CRYPT} @@ -83,6 +84,7 @@ set(LIBS_MAIN) set(LIBS_STATUS) set(HDRS) set(PHDRS) +set(HDR_DIRS) if (TESTS) include(DownloadGTest) @@ -178,7 +180,7 @@ get_filename_component(C_COMPILER "${CMAKE_C_COMPILER}" NAME) # Sources # Main lib -set(PIP_FOLDERS "." "core" "containers" "thread" "system" "io_devices" "io_utils" "console" "math" "code" "geo" "resources" "opencl" "crypt" "introspection" "concurrent" "cloud") +set(PIP_FOLDERS "." "core" "containers" "thread" "system" "io_devices" "io_utils" "console" "math" "code" "geo" "resources" "opencl" "crypt" "introspection" "concurrent" "cloud" "lua") include_directories("${PIP_SRC_MAIN}") set(PIP_MAIN_FOLDERS) foreach(F ${PIP_FOLDERS}) @@ -215,6 +217,9 @@ gather_src("${PIP_CONCURRENT_TEST}" CPP_CONCURRENT_TEST HDRS PHDRS) # Cloud lib gather_src("${PIP_SRC_CLOUD}" CPP_LIB_CLOUD HDRS PHDRS) +# LUA lib +gather_src("${PIP_SRC_LUA}" CPP_LIB_LUA HDRS PHDRS) + if(PIP_FREERTOS) add_definitions(-DPIP_FREERTOS) set(ICU OFF) @@ -621,7 +626,11 @@ if (NOT CROSSTOOLS) if (LUA_FOUND) message(STATUS "Building PIP with Lua support") add_definitions(-DPIP_LUA) - include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/lua) + include_directories(${LUA_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/lib/lua/3rd) + list(APPEND HDR_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/lib/lua/3rd/LuaBridge") + add_library(pip_lua ${PIP_LIB_TYPE} ${CPP_LIB_LUA} ${_RC}) + target_link_libraries(pip_lua pip ${LUA_LIBRARIES}) + list(APPEND PIP_LIBS_TARGETS pip_lua) endif() # Test program @@ -629,7 +638,7 @@ if (NOT CROSSTOOLS) add_executable(pip_test "main.cpp") target_link_libraries(pip_test pip) if (LUA_FOUND) - target_link_libraries(pip_test ${LUA_LIBRARIES}) + target_link_libraries(pip_test pip_lua ${LUA_LIBRARIES}) endif() endif() @@ -662,6 +671,8 @@ if(LIB) if(MINGW) if (NOT CROSSTOOLS) install(FILES ${HDRS} DESTINATION ${MINGW_INCLUDE}/pip) + install(FILES ${HDRS} DESTINATION ${MINGW_INCLUDE}/pip) + install(DIRECTORY ${HDR_DIRS} DESTINATION ${MINGW_INCLUDE}/pip) install(TARGETS ${PIP_LIBS_TARGETS} ARCHIVE DESTINATION ${MINGW_LIB}) endif() install(TARGETS ${PIP_LIBS_TARGETS} RUNTIME DESTINATION ${MINGW_BIN}) @@ -680,6 +691,7 @@ if(LIB) else() if (NOT CROSSTOOLS) install(FILES ${HDRS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/pip) + install(DIRECTORY ${HDR_DIRS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/pip) endif() install(TARGETS ${PIP_LIBS_TARGETS} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) endif() @@ -695,6 +707,7 @@ else() install(TARGETS ${PIP_LIBS_TARGETS} DESTINATION lib) endif() install(FILES ${HDRS} DESTINATION include/pip) + install(DIRECTORY ${HDR_DIRS} DESTINATION include/pip) message(STATUS "Install ${PROJECT_NAME} to local \"bin\", \"lib\" and \"include\"") endif() endif() diff --git a/cmake/FindPIP.cmake b/cmake/FindPIP.cmake index 5b21dc6b..aa662695 100644 --- a/cmake/FindPIP.cmake +++ b/cmake/FindPIP.cmake @@ -10,6 +10,7 @@ Also create imported targets: * PIP::IOUtils * PIP::Concurrent * PIP::Cloud + * PIP::Lua These targets include directories and depends on main library @@ -66,6 +67,7 @@ find_library(PIP_COMPRESS_LIBRARY pip_compress${_pip_suffix} HINTS ${_PIP_LIBDIR find_library(PIP_IO_UTILS_LIBRARY pip_io_utils${_pip_suffix} HINTS ${_PIP_LIBDIR}) find_library(PIP_CONCURRENT_LIBRARY pip_concurrent${_pip_suffix} HINTS ${_PIP_LIBDIR}) find_library(PIP_CLOUD_LIBRARY pip_cloud HINTS${_pip_suffix} ${_PIP_LIBDIR}) +find_library(PIP_LUA_LIBRARY pip_lua HINTS${_pip_suffix} ${_PIP_LIBDIR}) find_file(PIP_H_INCLUDE "pip.h" HINTS ${_PIP_INCDIR} $ENV{SMSDK_DIR}/include/pip) get_filename_component(PIP_INCLUDES ${PIP_H_INCLUDE} PATH) set(__ext "") @@ -94,6 +96,12 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") list(APPEND PIP_LIBRARY ${_PIP_ADD_LIBS_}) endif() endif() +if(PIP_LUA_LIBRARY) + if(MINGW) + set(LUA_INCLUDE_DIR ${MINGW_INCLUDE}) + endif() + find_package(Lua QUIET) +endif() if(NOT PIP_VERSION) include(CheckSymbolExists) @@ -117,7 +125,7 @@ if(PIP_FIND_VERSION VERSION_GREATER PIP_VERSION) message(FATAL_ERROR "PIP version ${PIP_VERSION} is available, but ${PIP_FIND_VERSION} requested!") endif() -set(__modules "USB;Crypt;Console;FFTW;Compress;IOUtils;Concurrent;Cloud") +set(__modules "USB;Crypt;Console;FFTW;Compress;IOUtils;Concurrent;Cloud;Lua") set(__module_USB "${PIP_USB_LIBRARY}" ) set(__module_Console "${PIP_CONSOLE_LIBRARY}" ) set(__module_Crypt "${PIP_CRYPT_LIBRARY}" ) @@ -126,6 +134,7 @@ set(__module_Compress "${PIP_COMPRESS_LIBRARY}" ) set(__module_IOUtils "${PIP_IO_UTILS_LIBRARY}" ) set(__module_Concurrent "${PIP_CONCURRENT_LIBRARY}") set(__module_Cloud "${PIP_CLOUD_LIBRARY}" ) +set(__module_Lua "${PIP_LUA_LIBRARY}" ) if((NOT TARGET PIP) AND PIP_LIBRARY) add_library(PIP UNKNOWN IMPORTED) set_target_properties(PIP PROPERTIES @@ -147,6 +156,9 @@ endif() if(__module_Cloud AND __module_IOUtils) set_target_properties(PIP::Cloud PROPERTIES INTERFACE_LINK_LIBRARIES "PIP::IOUtils") endif() +if(__module_Lua ) + set_target_properties(PIP::Lua PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${LUA_INCLUDE_DIR} INTERFACE_LINK_LIBRARIES "PIP::Lua" ${LUA_LIBRARIES}) +endif() include(PIPMacros) diff --git a/3rd_party/lua/LuaBridge/List.h b/lib/lua/3rd/LuaBridge/List.h similarity index 100% rename from 3rd_party/lua/LuaBridge/List.h rename to lib/lua/3rd/LuaBridge/List.h diff --git a/3rd_party/lua/LuaBridge/LuaBridge.h b/lib/lua/3rd/LuaBridge/LuaBridge.h similarity index 100% rename from 3rd_party/lua/LuaBridge/LuaBridge.h rename to lib/lua/3rd/LuaBridge/LuaBridge.h diff --git a/3rd_party/lua/LuaBridge/Map.h b/lib/lua/3rd/LuaBridge/Map.h similarity index 100% rename from 3rd_party/lua/LuaBridge/Map.h rename to lib/lua/3rd/LuaBridge/Map.h diff --git a/3rd_party/lua/LuaBridge/RefCountedObject.h b/lib/lua/3rd/LuaBridge/RefCountedObject.h similarity index 100% rename from 3rd_party/lua/LuaBridge/RefCountedObject.h rename to lib/lua/3rd/LuaBridge/RefCountedObject.h diff --git a/3rd_party/lua/LuaBridge/RefCountedPtr.h b/lib/lua/3rd/LuaBridge/RefCountedPtr.h similarity index 100% rename from 3rd_party/lua/LuaBridge/RefCountedPtr.h rename to lib/lua/3rd/LuaBridge/RefCountedPtr.h diff --git a/3rd_party/lua/LuaBridge/UnorderedMap.h b/lib/lua/3rd/LuaBridge/UnorderedMap.h similarity index 100% rename from 3rd_party/lua/LuaBridge/UnorderedMap.h rename to lib/lua/3rd/LuaBridge/UnorderedMap.h diff --git a/3rd_party/lua/LuaBridge/Vector.h b/lib/lua/3rd/LuaBridge/Vector.h similarity index 100% rename from 3rd_party/lua/LuaBridge/Vector.h rename to lib/lua/3rd/LuaBridge/Vector.h diff --git a/3rd_party/lua/LuaBridge/detail/CFunctions.h b/lib/lua/3rd/LuaBridge/detail/CFunctions.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/CFunctions.h rename to lib/lua/3rd/LuaBridge/detail/CFunctions.h diff --git a/3rd_party/lua/LuaBridge/detail/ClassInfo.h b/lib/lua/3rd/LuaBridge/detail/ClassInfo.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/ClassInfo.h rename to lib/lua/3rd/LuaBridge/detail/ClassInfo.h diff --git a/3rd_party/lua/LuaBridge/detail/Config.h b/lib/lua/3rd/LuaBridge/detail/Config.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/Config.h rename to lib/lua/3rd/LuaBridge/detail/Config.h diff --git a/3rd_party/lua/LuaBridge/detail/Constructor.h b/lib/lua/3rd/LuaBridge/detail/Constructor.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/Constructor.h rename to lib/lua/3rd/LuaBridge/detail/Constructor.h diff --git a/3rd_party/lua/LuaBridge/detail/FuncTraits.h b/lib/lua/3rd/LuaBridge/detail/FuncTraits.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/FuncTraits.h rename to lib/lua/3rd/LuaBridge/detail/FuncTraits.h diff --git a/3rd_party/lua/LuaBridge/detail/Iterator.h b/lib/lua/3rd/LuaBridge/detail/Iterator.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/Iterator.h rename to lib/lua/3rd/LuaBridge/detail/Iterator.h diff --git a/3rd_party/lua/LuaBridge/detail/LuaException.h b/lib/lua/3rd/LuaBridge/detail/LuaException.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/LuaException.h rename to lib/lua/3rd/LuaBridge/detail/LuaException.h diff --git a/3rd_party/lua/LuaBridge/detail/LuaHelpers.h b/lib/lua/3rd/LuaBridge/detail/LuaHelpers.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/LuaHelpers.h rename to lib/lua/3rd/LuaBridge/detail/LuaHelpers.h diff --git a/3rd_party/lua/LuaBridge/detail/LuaRef.h b/lib/lua/3rd/LuaBridge/detail/LuaRef.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/LuaRef.h rename to lib/lua/3rd/LuaBridge/detail/LuaRef.h diff --git a/3rd_party/lua/LuaBridge/detail/Namespace.h b/lib/lua/3rd/LuaBridge/detail/Namespace.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/Namespace.h rename to lib/lua/3rd/LuaBridge/detail/Namespace.h diff --git a/3rd_party/lua/LuaBridge/detail/Security.h b/lib/lua/3rd/LuaBridge/detail/Security.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/Security.h rename to lib/lua/3rd/LuaBridge/detail/Security.h diff --git a/3rd_party/lua/LuaBridge/detail/Stack.h b/lib/lua/3rd/LuaBridge/detail/Stack.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/Stack.h rename to lib/lua/3rd/LuaBridge/detail/Stack.h diff --git a/3rd_party/lua/LuaBridge/detail/TypeList.h b/lib/lua/3rd/LuaBridge/detail/TypeList.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/TypeList.h rename to lib/lua/3rd/LuaBridge/detail/TypeList.h diff --git a/3rd_party/lua/LuaBridge/detail/TypeTraits.h b/lib/lua/3rd/LuaBridge/detail/TypeTraits.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/TypeTraits.h rename to lib/lua/3rd/LuaBridge/detail/TypeTraits.h diff --git a/3rd_party/lua/LuaBridge/detail/Userdata.h b/lib/lua/3rd/LuaBridge/detail/Userdata.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/Userdata.h rename to lib/lua/3rd/LuaBridge/detail/Userdata.h diff --git a/3rd_party/lua/LuaBridge/detail/dump.h b/lib/lua/3rd/LuaBridge/detail/dump.h similarity index 100% rename from 3rd_party/lua/LuaBridge/detail/dump.h rename to lib/lua/3rd/LuaBridge/detail/dump.h diff --git a/lib/main/lua/piluaprogram.h b/lib/main/lua/piluaprogram.h new file mode 100644 index 00000000..ef80bbf7 --- /dev/null +++ b/lib/main/lua/piluaprogram.h @@ -0,0 +1,12 @@ +#ifndef PILUAPROGRAM_H +#define PILUAPROGRAM_H + +#include "pip_lua.h" + +class PILuaProgram +{ +public: + PILuaProgram(); +}; + +#endif // PILUAPROGRAM_H diff --git a/lib/main/lua/pip_lua.h b/lib/main/lua/pip_lua.h new file mode 100644 index 00000000..8830d081 --- /dev/null +++ b/lib/main/lua/pip_lua.h @@ -0,0 +1,39 @@ +#ifndef PIP_LUA_H +#define PIP_LUA_H + +extern "C" { +# include "lua.h" +# include "lauxlib.h" +# include "lualib.h" +} +#include +#include "pistring.h" + +namespace luabridge { + +template <> +struct Stack { + static void push (lua_State* L, PIString const& str) { + lua_pushstring(L, str.dataUTF8()); + } + + static PIString get (lua_State* L, int index) { + if (lua_type(L, index) == LUA_TSTRING) { + const char* str = lua_tostring(L, index); + return PIString::fromUTF8(str); + } + + lua_pushvalue(L, index); + const char* str = lua_tostring(L, -1); + PIString string = PIString::fromUTF8(str); + lua_pop(L, 1); + return string; + } + + static bool isInstance (lua_State* L, int index) { + return lua_type(L, index) == LUA_TSTRING; + } +}; + +} +#endif // PIP_LUA_H diff --git a/main.cpp b/main.cpp index 518d390a..5b32984f 100644 --- a/main.cpp +++ b/main.cpp @@ -1,55 +1,12 @@ #include "pip.h" #ifdef PIP_LUA -extern "C" { -# include "lua.h" -# include "lauxlib.h" -# include "lualib.h" -} -#include -#include "pistring_std.h" +#include "piluaprogram.h" static const char * script = "-- script.lua \n" - "testString = \"LuaBridge works!\" \n" + "testString = \"LuaBridge works ававава!\" \n" "number = 42 \n"; -namespace luabridge { - -template <> -struct Stack -{ - static void push (lua_State* L, PIString const& str) - { - lua_pushstring(L, str.dataAscii()); - } - - static PIString get (lua_State* L, int index) - { - size_t len; - if (lua_type (L, index) == LUA_TSTRING) - { - const char* str = lua_tolstring(L, index, &len); - return PIString(str, len); - } - - // Lua reference manual: - // If the value is a number, then lua_tolstring also changes the actual value in the stack to a string. - // (This change confuses lua_next when lua_tolstring is applied to keys during a table traversal.) - lua_pushvalue (L, index); - const char* str = lua_tolstring(L, -1, &len); - PIString string (str, len); - lua_pop (L, 1); // Pop the temporary string - return string; - } - - static bool isInstance (lua_State* L, int index) - { - return lua_type (L, index) == LUA_TSTRING; - } -}; - -} - using namespace luabridge;