From b033e4644f8ea414aa12975b2261c797ccf5619c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Aug 2020 12:44:40 -0700 Subject: [PATCH 01/49] add xlsxio as a submodule --- .gitmodules | 4 ++++ depends/xlsxio | 1 + 2 files changed, 5 insertions(+) create mode 160000 depends/xlsxio diff --git a/.gitmodules b/.gitmodules index 98e06473d..0ccd3810a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,7 @@ [submodule "depends/jsoncpp"] path = depends/jsoncpp-sub url = ../../DFHack/jsoncpp.git +[submodule "depends/xlsxio"] + path = depends/xlsxio + url = ../../brechtsanders/xlsxio.git + shallow = true diff --git a/depends/xlsxio b/depends/xlsxio new file mode 160000 index 000000000..2d12a8844 --- /dev/null +++ b/depends/xlsxio @@ -0,0 +1 @@ +Subproject commit 2d12a88448b6f40594b2b2e0d0ce7207d0efa021 From 1fc800e7652d344a53f988b3977cca37f08fa568 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Fri, 7 Aug 2020 13:08:06 -0700 Subject: [PATCH 02/49] fix xlsxio lib to current commit so it doesn't break us with incompatibile changes. we only need to update this lib if/when we run into a bug with it. no need to introduce instability by tracking HEAD --- depends/xlsxio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/xlsxio b/depends/xlsxio index 2d12a8844..261d56815 160000 --- a/depends/xlsxio +++ b/depends/xlsxio @@ -1 +1 @@ -Subproject commit 2d12a88448b6f40594b2b2e0d0ce7207d0efa021 +Subproject commit 261d56815b29908fc960fecb9cb3143db4b485ad From 89a6309788a6ff2d1a64ba951c5427f9de8f0f79 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 15:24:12 -0700 Subject: [PATCH 03/49] build xlsxio and link it into dfhack, add lua api --- CMakeLists.txt | 19 +++++ depends/CMakeLists.txt | 11 +++ library/CMakeLists.txt | 4 +- library/LuaApi.cpp | 43 ++++++++++ library/include/modules/XlsxReader.h | 45 +++++++++++ library/modules/XlsxReader.cpp | 115 +++++++++++++++++++++++++++ 6 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 library/include/modules/XlsxReader.h create mode 100644 library/modules/XlsxReader.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 44d6a02ce..6a2230721 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -364,6 +364,8 @@ endif() #### expose depends #### +include(ExternalProject) + if(UNIX) # Rescan for pthread and zlib if the build arch changed if(NOT "${DFHACK_BUILD_ARCH}" STREQUAL "${DFHACK_BUILD_ARCH_PREV}") @@ -415,6 +417,23 @@ endif() # build the lib itself if(BUILD_LIBRARY) + ExternalProject_Get_Property(xlsxio_project INSTALL_DIR) + set(XLSXIO_INSTALL_DIR ${INSTALL_DIR}) + include_directories(${XLSXIO_INSTALL_DIR}/include) + add_library(xlsxio_read STATIC IMPORTED) + set_target_properties(xlsxio_read PROPERTIES + IMPORTED_LOCATION ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a) + add_dependencies(xlsxio_read xlsxio_project) + + # just pull from the system until I figure out how to integrate these deps + # into the build + add_library(zip SHARED IMPORTED) + set_target_properties(zip PROPERTIES + IMPORTED_LOCATION /usr/lib64/libzip.so) + add_library(expat SHARED IMPORTED) + set_target_properties(expat PROPERTIES + IMPORTED_LOCATION /usr/lib64/libexpat.so) + add_subdirectory(library) install(FILES LICENSE.rst docs/changelog.txt DESTINATION ${DFHACK_USERDOC_DESTINATION}) endif() diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index aac250c39..e43c80266 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -17,3 +17,14 @@ option(CLSOCKET_SHARED "Build clsocket lib as shared." OFF) option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependency." ON) add_subdirectory(clsocket) ide_folder(clsocket "Depends") + +set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) +ExternalProject_Add(xlsxio_project + PREFIX xlsxio + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio + INSTALL_DIR ${XLSXIO_INSTALL_DIR} + BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} +) + #-DLIBZIP_DIR= + #-DEXPAT_DIR= diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 2de293e15..583c8768f 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -144,6 +144,7 @@ set(MODULE_HEADERS include/modules/Translation.h include/modules/Units.h include/modules/World.h + include/modules/XlsxReader.h ) set(MODULE_SOURCES @@ -172,6 +173,7 @@ set(MODULE_SOURCES modules/Units.cpp modules/Windows.cpp modules/World.cpp + modules/XlsxReader.cpp ) set(STATIC_FIELDS_FILES) @@ -409,7 +411,7 @@ if(APPLE) set_target_properties(dfhack PROPERTIES SOVERSION 1.0.0) endif() -target_link_libraries(dfhack protobuf-lite clsocket lua jsoncpp_lib_static dfhack-version ${PROJECT_LIBS}) +target_link_libraries(dfhack protobuf-lite clsocket lua jsoncpp_lib_static xlsxio_read zip expat dfhack-version ${PROJECT_LIBS}) set_target_properties(dfhack PROPERTIES INTERFACE_LINK_LIBRARIES "") target_link_libraries(dfhack-client protobuf-lite clsocket jsoncpp_lib_static) diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 25843875d..49fdf4c73 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -60,6 +60,7 @@ distribution. #include "modules/Translation.h" #include "modules/Units.h" #include "modules/World.h" +#include "modules/XlsxReader.h" #include "LuaWrapper.h" #include "LuaTools.h" @@ -2474,6 +2475,47 @@ static const LuaWrapper::FunctionReg dfhack_kitchen_module[] = { {NULL, NULL} }; +/***** XlsxReader module *****/ + +static const LuaWrapper::FunctionReg dfhack_xlsxreader_module[] = { + WRAPM(XlsxReader, open_xlsx_file), + WRAPM(XlsxReader, close_xlsx_file), + WRAPM(XlsxReader, list_sheets), + WRAPM(XlsxReader, open_sheet), + WRAPM(XlsxReader, close_sheet), + WRAPM(XlsxReader, get_next_row), + {NULL, NULL} +}; + +// takes the sheet handle and returns a string, or nil if there is no next cell +// in the current row. +static int xlsxreader_get_next_cell(lua_State *L) +{ + if (lua_gettop(L) != 1 || lua_isnil(L, 1)) + { + luaL_error(L, "invalid sheet handle"); + } + luaL_checktype(L, 1, LUA_TUSERDATA); + XlsxReader::xlsx_sheet_handle sheet_handle = lua_touserdata(L, 1); + + std::string value; + bool ok = XlsxReader::get_next_cell(sheet_handle, value); + if (!ok) + { + lua_pushnil(L); + } + else + { + lua_pushstring(L, value.c_str()); + } + return 1; +} + +static const luaL_Reg dfhack_xlsxreader_funcs[] = { + {"get_next_cell", xlsxreader_get_next_cell}, + {NULL, NULL} +}; + /***** Console module *****/ namespace console { @@ -3027,6 +3069,7 @@ void OpenDFHackApi(lua_State *state) OpenModule(state, "filesystem", dfhack_filesystem_module, dfhack_filesystem_funcs); OpenModule(state, "designations", dfhack_designations_module, dfhack_designations_funcs); OpenModule(state, "kitchen", dfhack_kitchen_module); + OpenModule(state, "xlsxreader", dfhack_xlsxreader_module, dfhack_xlsxreader_funcs); OpenModule(state, "console", dfhack_console_module); OpenModule(state, "internal", dfhack_internal_module, dfhack_internal_funcs); } diff --git a/library/include/modules/XlsxReader.h b/library/include/modules/XlsxReader.h new file mode 100644 index 000000000..93ea1cf20 --- /dev/null +++ b/library/include/modules/XlsxReader.h @@ -0,0 +1,45 @@ +/* + * Wrapper for xlsxio_read library functions. + */ + +#pragma once + +#include +#include + +#include "Export.h" + +/** + * \defgroup grp_xlsx_reader Xlsx file reader + * @ingroup grp_modules + */ +namespace DFHack +{ +namespace XlsxReader +{ + +typedef void* xlsx_file_handle; +typedef void* xlsx_sheet_handle; + +// returns NULL on error +DFHACK_EXPORT xlsx_file_handle open_xlsx_file(std::string filename); +DFHACK_EXPORT void close_xlsx_file(xlsx_file_handle file_handle); +DFHACK_EXPORT std::vector list_sheets(xlsx_file_handle file_handle); + +// returns XLSXIOReaderSheet object or NULL on error +DFHACK_EXPORT xlsx_sheet_handle open_sheet( + xlsx_file_handle file_handle, std::string sheet_name); +DFHACK_EXPORT void close_sheet(xlsx_sheet_handle sheet_handle); + +// start reading the next row of data; must be called before GetNextCell . +// returns false if there is no next row to get. +DFHACK_EXPORT bool get_next_row(xlsx_sheet_handle sheet_handle); + +// fills the value param with the contents of the cell in the next column cell +// in the current row. +// returns false if there are no more cells in this row. +DFHACK_EXPORT bool get_next_cell( + xlsx_sheet_handle sheet_handle, std::string& value); + +} +} diff --git a/library/modules/XlsxReader.cpp b/library/modules/XlsxReader.cpp new file mode 100644 index 000000000..d13582450 --- /dev/null +++ b/library/modules/XlsxReader.cpp @@ -0,0 +1,115 @@ +/* + * Wrapper for xlsxio_read library functions. + * + * Sample usage: + * + * std::string filename = "sample_file.xlsx"; + * xlsxioreader xlsxfile = XlsxReader::open_xlsx_file(filename); + * if (xlsxfile == NULL) { + * printf("cannot open file: '%s'", filename.c_str()); + * return false; + * } + * auto sheetNames = XlsxReader::list_sheets(xlsxfile); + * for (auto sheetName = sheetNames.begin(); + * sheetName != sheetNames.end(); + * ++sheetName) { + * printf("reading sheet: %s\n", sheetName->c_str()); + * xlsxioreadersheet xlsxsheet = + * XlsxReader::open_sheet(xlsxfile, *sheetName); + * if (xlsxsheet == NULL) { + * printf("cannot open sheet: '%s'", sheetName->c_str()); + * continue; + * } + * std::string value; + * int row_num = 1; + * while (XlsxReader::GetNextRow(xlsxsheet)) { + * std::string s; + * printf("%d:\t", row_num); + * while (XlsxReader::GetNextCell(xlsxsheet, s)) { + * printf("%s\t", s.c_str()); + * } + * printf("\n"); + * ++row_num; + * } + * XlsxReader::close_sheet(xlsxsheet); + * } + * XlsxReader::close_xlsx_file(xlsxfile); + * return true; + */ + +#include + +#include "modules/XlsxReader.h" + +using namespace DFHack; + + +// returns NULL on error +DFHACK_EXPORT XlsxReader::xlsx_file_handle XlsxReader::open_xlsx_file( + std::string filename) +{ + return xlsxioread_open(filename.c_str()); +} + +DFHACK_EXPORT void XlsxReader::close_xlsx_file( + XlsxReader::xlsx_file_handle file_handle) +{ + xlsxioread_close((xlsxioreader)file_handle); +} + +static int list_callback(const XLSXIOCHAR* name, void* cbdata) +{ + auto sheetNames = (std::vector *)cbdata; + sheetNames->push_back(name); + return 0; +} + +DFHACK_EXPORT std::vector XlsxReader::list_sheets( + XlsxReader::xlsx_file_handle file_handle) +{ + auto sheetNames = std::vector(); + xlsxioread_list_sheets( + (xlsxioreader)file_handle, list_callback, &sheetNames); + return sheetNames; +} + +// returns XLSXIOReaderSheet object or NULL on error +DFHACK_EXPORT XlsxReader::xlsx_sheet_handle XlsxReader::open_sheet( + XlsxReader::xlsx_file_handle file_handle, std::string sheet_name) +{ + if (file_handle == NULL) + return NULL; + return xlsxioread_sheet_open( + (xlsxioreader)file_handle, sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); +} + +DFHACK_EXPORT void XlsxReader::close_sheet( + XlsxReader::xlsx_sheet_handle sheet_handle) +{ + xlsxioread_sheet_close((xlsxioreadersheet)sheet_handle); +} + +// start reading the next row of data; must be called before GetNextCell . +// returns false if there is no next row to get. +DFHACK_EXPORT bool XlsxReader::get_next_row( + XlsxReader::xlsx_sheet_handle sheet_handle) +{ + return xlsxioread_sheet_next_row((xlsxioreadersheet)sheet_handle) != 0; +} + +// fills the value param with the contents of the cell in the next column cell +// in the current row. +// returns false if there are no more cells in this row. +DFHACK_EXPORT bool XlsxReader::get_next_cell( + XlsxReader::xlsx_sheet_handle sheet_handle, std::string& value) +{ + char* result; + if (!xlsxioread_sheet_next_cell_string((xlsxioreadersheet)sheet_handle, + &result)) { + value.clear(); + return false; + } + value.assign(result); + free(result); + return true; +} From 8c7fb808e14f7cbfd0bbb5307f50202947061274 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 17:55:49 -0700 Subject: [PATCH 04/49] get xlsxio Lua API working --- library/LuaApi.cpp | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 30a084635..0265eee20 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -2486,39 +2486,57 @@ static const LuaWrapper::FunctionReg dfhack_kitchen_module[] = { static const LuaWrapper::FunctionReg dfhack_xlsxreader_module[] = { WRAPM(XlsxReader, open_xlsx_file), WRAPM(XlsxReader, close_xlsx_file), - WRAPM(XlsxReader, list_sheets), WRAPM(XlsxReader, open_sheet), WRAPM(XlsxReader, close_sheet), - WRAPM(XlsxReader, get_next_row), {NULL, NULL} }; -// takes the sheet handle and returns a string, or nil if there is no next cell -// in the current row. -static int xlsxreader_get_next_cell(lua_State *L) +// internal function to factor out handle extraction +static void * get_xlsxreader_handle(lua_State *L) { - if (lua_gettop(L) != 1 || lua_isnil(L, 1)) + if (lua_gettop(L) < 1 || lua_isnil(L, 1)) { - luaL_error(L, "invalid sheet handle"); + luaL_error(L, "invalid xlsxreader handle"); } - luaL_checktype(L, 1, LUA_TUSERDATA); - XlsxReader::xlsx_sheet_handle sheet_handle = lua_touserdata(L, 1); + luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); + return lua_touserdata(L, 1); +} + +// takes a file handle and returns a table-list of sheet names +static int xlsxreader_list_sheets(lua_State *L) +{ + XlsxReader::xlsx_file_handle file_handle = get_xlsxreader_handle(L); + Lua::PushVector(L, XlsxReader::list_sheets(file_handle), true); + return 1; +} - std::string value; - bool ok = XlsxReader::get_next_cell(sheet_handle, value); +// takes the sheet handle and returns a table-list of strings, or nil if we +// already processed the last row in the file. +static int xlsxreader_get_row(lua_State *L) +{ + XlsxReader::xlsx_sheet_handle sheet_handle = get_xlsxreader_handle(L); + bool ok = XlsxReader::get_next_row(sheet_handle); if (!ok) { lua_pushnil(L); } else { - lua_pushstring(L, value.c_str()); + std::string value; + auto cells = std::vector(); + while (XlsxReader::get_next_cell(sheet_handle, value)) + { + cells.push_back(value); + } + Lua::PushVector(L, cells, true); } + return 1; } static const luaL_Reg dfhack_xlsxreader_funcs[] = { - {"get_next_cell", xlsxreader_get_next_cell}, + {"list_sheets", xlsxreader_list_sheets}, + {"get_row", xlsxreader_get_row}, {NULL, NULL} }; From 4f0eb4bca6d80fb1d7f1822f509c4082a3e79158 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 19:47:02 -0700 Subject: [PATCH 05/49] add libzip dep --- .gitmodules | 3 +++ depends/libzip | 1 + 2 files changed, 4 insertions(+) create mode 160000 depends/libzip diff --git a/.gitmodules b/.gitmodules index 0ccd3810a..b41fa0437 100644 --- a/.gitmodules +++ b/.gitmodules @@ -20,3 +20,6 @@ path = depends/xlsxio url = ../../brechtsanders/xlsxio.git shallow = true +[submodule "depends/libzip"] + path = depends/libzip + url = ../../nih-at/libzip.git diff --git a/depends/libzip b/depends/libzip new file mode 160000 index 000000000..2134d8c34 --- /dev/null +++ b/depends/libzip @@ -0,0 +1 @@ +Subproject commit 2134d8c34dbb8988076e8f2fc3b8be75fdb780bf From eeeb638c1c5641c94771601558321ccbb0e5f4c3 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 19:48:11 -0700 Subject: [PATCH 06/49] fix libzip at v1.7.3 --- depends/libzip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/libzip b/depends/libzip index 2134d8c34..66e496489 160000 --- a/depends/libzip +++ b/depends/libzip @@ -1 +1 @@ -Subproject commit 2134d8c34dbb8988076e8f2fc3b8be75fdb780bf +Subproject commit 66e496489bdae81bfda8b0088172871d8fda0032 From 28eaf0ae8b6eba53d164d5a642202e16cbd42ff8 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 20:04:46 -0700 Subject: [PATCH 07/49] add libzip to the build --- CMakeLists.txt | 11 ++++++++--- depends/CMakeLists.txt | 9 +++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c9ada74a..490e1bb55 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -425,11 +425,16 @@ if(BUILD_LIBRARY) IMPORTED_LOCATION ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a) add_dependencies(xlsxio_read xlsxio_project) + ExternalProject_Get_Property(libzip_project INSTALL_DIR) + set(LIBZIP_INSTALL_DIR ${INSTALL_DIR}) + include_directories(${LIBZIP_INSTALL_DIR}/include) + add_library(zip STATIC IMPORTED) + set_target_properties(zip PROPERTIES + IMPORTED_LOCATION ${LIBZIP_INSTALL_DIR}/lib64/libzip.a) + add_dependencies(zip libzip_project) + # just pull from the system until I figure out how to integrate these deps # into the build - add_library(zip SHARED IMPORTED) - set_target_properties(zip PROPERTIES - IMPORTED_LOCATION /usr/lib64/libzip.so) add_library(expat SHARED IMPORTED) set_target_properties(expat PROPERTIES IMPORTED_LOCATION /usr/lib64/libexpat.so) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index e43c80266..d5669080e 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -18,6 +18,15 @@ option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependenc add_subdirectory(clsocket) ide_folder(clsocket "Depends") +set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) +ExternalProject_Add(libzip_project + PREFIX libzip + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip + INSTALL_DIR ${LIBZIP_INSTALL_DIR} + BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib64/libzip.a + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON +) + set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) ExternalProject_Add(xlsxio_project PREFIX xlsxio From cffac8ed93078d1d3e22087d3e5f415466b4004a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 20:07:54 -0700 Subject: [PATCH 08/49] fix line endings in XlsxReader.cpp --- library/modules/XlsxReader.cpp | 230 ++++++++++++++++----------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/library/modules/XlsxReader.cpp b/library/modules/XlsxReader.cpp index d13582450..405369c85 100644 --- a/library/modules/XlsxReader.cpp +++ b/library/modules/XlsxReader.cpp @@ -1,115 +1,115 @@ -/* - * Wrapper for xlsxio_read library functions. - * - * Sample usage: - * - * std::string filename = "sample_file.xlsx"; - * xlsxioreader xlsxfile = XlsxReader::open_xlsx_file(filename); - * if (xlsxfile == NULL) { - * printf("cannot open file: '%s'", filename.c_str()); - * return false; - * } - * auto sheetNames = XlsxReader::list_sheets(xlsxfile); - * for (auto sheetName = sheetNames.begin(); - * sheetName != sheetNames.end(); - * ++sheetName) { - * printf("reading sheet: %s\n", sheetName->c_str()); - * xlsxioreadersheet xlsxsheet = - * XlsxReader::open_sheet(xlsxfile, *sheetName); - * if (xlsxsheet == NULL) { - * printf("cannot open sheet: '%s'", sheetName->c_str()); - * continue; - * } - * std::string value; - * int row_num = 1; - * while (XlsxReader::GetNextRow(xlsxsheet)) { - * std::string s; - * printf("%d:\t", row_num); - * while (XlsxReader::GetNextCell(xlsxsheet, s)) { - * printf("%s\t", s.c_str()); - * } - * printf("\n"); - * ++row_num; - * } - * XlsxReader::close_sheet(xlsxsheet); - * } - * XlsxReader::close_xlsx_file(xlsxfile); - * return true; - */ - -#include - -#include "modules/XlsxReader.h" - -using namespace DFHack; - - -// returns NULL on error -DFHACK_EXPORT XlsxReader::xlsx_file_handle XlsxReader::open_xlsx_file( - std::string filename) -{ - return xlsxioread_open(filename.c_str()); -} - -DFHACK_EXPORT void XlsxReader::close_xlsx_file( - XlsxReader::xlsx_file_handle file_handle) -{ - xlsxioread_close((xlsxioreader)file_handle); -} - -static int list_callback(const XLSXIOCHAR* name, void* cbdata) -{ - auto sheetNames = (std::vector *)cbdata; - sheetNames->push_back(name); - return 0; -} - -DFHACK_EXPORT std::vector XlsxReader::list_sheets( - XlsxReader::xlsx_file_handle file_handle) -{ - auto sheetNames = std::vector(); - xlsxioread_list_sheets( - (xlsxioreader)file_handle, list_callback, &sheetNames); - return sheetNames; -} - -// returns XLSXIOReaderSheet object or NULL on error -DFHACK_EXPORT XlsxReader::xlsx_sheet_handle XlsxReader::open_sheet( - XlsxReader::xlsx_file_handle file_handle, std::string sheet_name) -{ - if (file_handle == NULL) - return NULL; - return xlsxioread_sheet_open( - (xlsxioreader)file_handle, sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); -} - -DFHACK_EXPORT void XlsxReader::close_sheet( - XlsxReader::xlsx_sheet_handle sheet_handle) -{ - xlsxioread_sheet_close((xlsxioreadersheet)sheet_handle); -} - -// start reading the next row of data; must be called before GetNextCell . -// returns false if there is no next row to get. -DFHACK_EXPORT bool XlsxReader::get_next_row( - XlsxReader::xlsx_sheet_handle sheet_handle) -{ - return xlsxioread_sheet_next_row((xlsxioreadersheet)sheet_handle) != 0; -} - -// fills the value param with the contents of the cell in the next column cell -// in the current row. -// returns false if there are no more cells in this row. -DFHACK_EXPORT bool XlsxReader::get_next_cell( - XlsxReader::xlsx_sheet_handle sheet_handle, std::string& value) -{ - char* result; - if (!xlsxioread_sheet_next_cell_string((xlsxioreadersheet)sheet_handle, - &result)) { - value.clear(); - return false; - } - value.assign(result); - free(result); - return true; -} +/* + * Wrapper for xlsxio_read library functions. + * + * Sample usage: + * + * std::string filename = "sample_file.xlsx"; + * xlsxioreader xlsxfile = XlsxReader::open_xlsx_file(filename); + * if (xlsxfile == NULL) { + * printf("cannot open file: '%s'", filename.c_str()); + * return false; + * } + * auto sheetNames = XlsxReader::list_sheets(xlsxfile); + * for (auto sheetName = sheetNames.begin(); + * sheetName != sheetNames.end(); + * ++sheetName) { + * printf("reading sheet: %s\n", sheetName->c_str()); + * xlsxioreadersheet xlsxsheet = + * XlsxReader::open_sheet(xlsxfile, *sheetName); + * if (xlsxsheet == NULL) { + * printf("cannot open sheet: '%s'", sheetName->c_str()); + * continue; + * } + * std::string value; + * int row_num = 1; + * while (XlsxReader::GetNextRow(xlsxsheet)) { + * std::string s; + * printf("%d:\t", row_num); + * while (XlsxReader::GetNextCell(xlsxsheet, s)) { + * printf("%s\t", s.c_str()); + * } + * printf("\n"); + * ++row_num; + * } + * XlsxReader::close_sheet(xlsxsheet); + * } + * XlsxReader::close_xlsx_file(xlsxfile); + * return true; + */ + +#include + +#include "modules/XlsxReader.h" + +using namespace DFHack; + + +// returns NULL on error +DFHACK_EXPORT XlsxReader::xlsx_file_handle XlsxReader::open_xlsx_file( + std::string filename) +{ + return xlsxioread_open(filename.c_str()); +} + +DFHACK_EXPORT void XlsxReader::close_xlsx_file( + XlsxReader::xlsx_file_handle file_handle) +{ + xlsxioread_close((xlsxioreader)file_handle); +} + +static int list_callback(const XLSXIOCHAR* name, void* cbdata) +{ + auto sheetNames = (std::vector *)cbdata; + sheetNames->push_back(name); + return 0; +} + +DFHACK_EXPORT std::vector XlsxReader::list_sheets( + XlsxReader::xlsx_file_handle file_handle) +{ + auto sheetNames = std::vector(); + xlsxioread_list_sheets( + (xlsxioreader)file_handle, list_callback, &sheetNames); + return sheetNames; +} + +// returns XLSXIOReaderSheet object or NULL on error +DFHACK_EXPORT XlsxReader::xlsx_sheet_handle XlsxReader::open_sheet( + XlsxReader::xlsx_file_handle file_handle, std::string sheet_name) +{ + if (file_handle == NULL) + return NULL; + return xlsxioread_sheet_open( + (xlsxioreader)file_handle, sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); +} + +DFHACK_EXPORT void XlsxReader::close_sheet( + XlsxReader::xlsx_sheet_handle sheet_handle) +{ + xlsxioread_sheet_close((xlsxioreadersheet)sheet_handle); +} + +// start reading the next row of data; must be called before GetNextCell . +// returns false if there is no next row to get. +DFHACK_EXPORT bool XlsxReader::get_next_row( + XlsxReader::xlsx_sheet_handle sheet_handle) +{ + return xlsxioread_sheet_next_row((xlsxioreadersheet)sheet_handle) != 0; +} + +// fills the value param with the contents of the cell in the next column cell +// in the current row. +// returns false if there are no more cells in this row. +DFHACK_EXPORT bool XlsxReader::get_next_cell( + XlsxReader::xlsx_sheet_handle sheet_handle, std::string& value) +{ + char* result; + if (!xlsxioread_sheet_next_cell_string((xlsxioreadersheet)sheet_handle, + &result)) { + value.clear(); + return false; + } + value.assign(result); + free(result); + return true; +} From 8de39c2d7d1c64631043eab751d0ce4787b65612 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 20:09:29 -0700 Subject: [PATCH 09/49] add libexpat as a submodule --- .gitmodules | 5 +++++ depends/libexpat | 1 + 2 files changed, 6 insertions(+) create mode 160000 depends/libexpat diff --git a/.gitmodules b/.gitmodules index b41fa0437..e24bfb707 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,8 @@ [submodule "depends/libzip"] path = depends/libzip url = ../../nih-at/libzip.git + shallow = true +[submodule "depends/libexpat"] + path = depends/libexpat + url = ../../libexpat/libexpat.git + shallow = true diff --git a/depends/libexpat b/depends/libexpat new file mode 160000 index 000000000..990e3d07e --- /dev/null +++ b/depends/libexpat @@ -0,0 +1 @@ +Subproject commit 990e3d07eaa127007f9d304a9b4c6ffadc61b1fe From e7afc4cfeb6d8c0e4670e7d517b926f2164dbbac Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 20:10:13 -0700 Subject: [PATCH 10/49] fix libexpat at v2.2.9 --- depends/libexpat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/libexpat b/depends/libexpat index 990e3d07e..a7bc26b69 160000 --- a/depends/libexpat +++ b/depends/libexpat @@ -1 +1 @@ -Subproject commit 990e3d07eaa127007f9d304a9b4c6ffadc61b1fe +Subproject commit a7bc26b69768f7fb24f0c7976fae24b157b85b13 From 8a05f09cd612249897c8767d4acc0f6ac956d92b Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 20:18:43 -0700 Subject: [PATCH 11/49] add libexpat to the build --- CMakeLists.txt | 10 ++++++---- depends/CMakeLists.txt | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 490e1bb55..5dcd87b56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -433,11 +433,13 @@ if(BUILD_LIBRARY) IMPORTED_LOCATION ${LIBZIP_INSTALL_DIR}/lib64/libzip.a) add_dependencies(zip libzip_project) - # just pull from the system until I figure out how to integrate these deps - # into the build - add_library(expat SHARED IMPORTED) + ExternalProject_Get_Property(libexpat_project INSTALL_DIR) + set(LIBEXPAT_INSTALL_DIR ${INSTALL_DIR}) + include_directories(${LIBEXPAT_INSTALL_DIR}/include) + add_library(expat STATIC IMPORTED) set_target_properties(expat PROPERTIES - IMPORTED_LOCATION /usr/lib64/libexpat.so) + IMPORTED_LOCATION ${LIBEXPAT_INSTALL_DIR}/lib64/libexpat.a) + add_dependencies(expat libexpat_project) add_subdirectory(library) install(FILES LICENSE.rst docs/changelog.txt DESTINATION ${DFHACK_USERDOC_DESTINATION}) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index d5669080e..9735e7fc7 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -18,6 +18,15 @@ option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependenc add_subdirectory(clsocket) ide_folder(clsocket "Depends") +set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) +ExternalProject_Add(libexpat_project + PREFIX libexpat + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat + INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} + BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib64/libexpat.a + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON +) + set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) ExternalProject_Add(libzip_project PREFIX libzip @@ -33,7 +42,7 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} ) - #-DLIBZIP_DIR= - #-DEXPAT_DIR= +add_dependencies(xlsxio_project libexpat_project) +add_dependencies(xlsxio_project libzip_project) From 8753f9feaff9df8367e6031e2cc299014dac1d55 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 20:42:03 -0700 Subject: [PATCH 12/49] use correct lib dir on 32-bit --- CMakeLists.txt | 15 +++++++++------ depends/CMakeLists.txt | 10 ++++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5dcd87b56..dbd028a36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -419,26 +419,29 @@ endif() if(BUILD_LIBRARY) ExternalProject_Get_Property(xlsxio_project INSTALL_DIR) set(XLSXIO_INSTALL_DIR ${INSTALL_DIR}) + ExternalProject_Get_Property(xlsxio_project BUILD_BYPRODUCTS) + set(XLSXIO_LIB ${BUILD_BYPRODUCTS}) include_directories(${XLSXIO_INSTALL_DIR}/include) add_library(xlsxio_read STATIC IMPORTED) - set_target_properties(xlsxio_read PROPERTIES - IMPORTED_LOCATION ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a) + set_target_properties(xlsxio_read PROPERTIES IMPORTED_LOCATION ${XLSXIO_LIB}) add_dependencies(xlsxio_read xlsxio_project) ExternalProject_Get_Property(libzip_project INSTALL_DIR) set(LIBZIP_INSTALL_DIR ${INSTALL_DIR}) + ExternalProject_Get_Property(libzip_project BUILD_BYPRODUCTS) + set(LIBZIP_LIB ${BUILD_BYPRODUCTS}) include_directories(${LIBZIP_INSTALL_DIR}/include) add_library(zip STATIC IMPORTED) - set_target_properties(zip PROPERTIES - IMPORTED_LOCATION ${LIBZIP_INSTALL_DIR}/lib64/libzip.a) + set_target_properties(zip PROPERTIES IMPORTED_LOCATION ${LIBZIP_LIB}) add_dependencies(zip libzip_project) ExternalProject_Get_Property(libexpat_project INSTALL_DIR) set(LIBEXPAT_INSTALL_DIR ${INSTALL_DIR}) + ExternalProject_Get_Property(libexpat_project BUILD_BYPRODUCTS) + set(LIBEXPAT_LIB ${BUILD_BYPRODUCTS}) include_directories(${LIBEXPAT_INSTALL_DIR}/include) add_library(expat STATIC IMPORTED) - set_target_properties(expat PROPERTIES - IMPORTED_LOCATION ${LIBEXPAT_INSTALL_DIR}/lib64/libexpat.a) + set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) add_dependencies(expat libexpat_project) add_subdirectory(library) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 9735e7fc7..4b11f4110 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -18,12 +18,18 @@ option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependenc add_subdirectory(clsocket) ide_folder(clsocket "Depends") +if("${DFHACK_BUILD_ARCH}" STREQUAL "64") + set(OUTPUT_LIB_DIR "lib64") +else() + set(OUTPUT_LIB_DIR "lib") +endif() + set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) ExternalProject_Add(libexpat_project PREFIX libexpat SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib64/libexpat.a + BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/${OUTPUT_LIB_DIR}/libexpat.a CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON ) @@ -32,7 +38,7 @@ ExternalProject_Add(libzip_project PREFIX libzip SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip INSTALL_DIR ${LIBZIP_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib64/libzip.a + BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/${OUTPUT_LIB_DIR}/libzip.a CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON ) From d65504eb828e76bdff7348c15e3d6a1629942524 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 21:19:38 -0700 Subject: [PATCH 13/49] ensure CFLAGS and CXXFLAGS get propagated to deps --- depends/CMakeLists.txt | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 4b11f4110..2e2872d20 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -18,19 +18,13 @@ option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependenc add_subdirectory(clsocket) ide_folder(clsocket "Depends") -if("${DFHACK_BUILD_ARCH}" STREQUAL "64") - set(OUTPUT_LIB_DIR "lib64") -else() - set(OUTPUT_LIB_DIR "lib") -endif() - set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) ExternalProject_Add(libexpat_project PREFIX libexpat SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/${OUTPUT_LIB_DIR}/libexpat.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib/libexpat.a + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) @@ -38,8 +32,8 @@ ExternalProject_Add(libzip_project PREFIX libzip SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip INSTALL_DIR ${LIBZIP_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/${OUTPUT_LIB_DIR}/libzip.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON + BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib/libzip.a + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ) set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) @@ -48,7 +42,7 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ) add_dependencies(xlsxio_project libexpat_project) add_dependencies(xlsxio_project libzip_project) From 1cfe2735d3eb59a006efb110641954f0fd1e1b9a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 22:03:42 -0700 Subject: [PATCH 14/49] build deps in verbose mode for debugging --- depends/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 2e2872d20..2e5dde062 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -24,7 +24,7 @@ ExternalProject_Add(libexpat_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib/libexpat.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) @@ -33,7 +33,7 @@ ExternalProject_Add(libzip_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip INSTALL_DIR ${LIBZIP_INSTALL_DIR} BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib/libzip.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) @@ -42,7 +42,7 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) add_dependencies(xlsxio_project libexpat_project) add_dependencies(xlsxio_project libzip_project) From 8d157012d0a43c1a2fe0518a274cd28598c50fbf Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 22:04:49 -0700 Subject: [PATCH 15/49] build dfhack with verbosity on too --- library/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 583c8768f..c78f7f58e 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -4,6 +4,8 @@ cmake_minimum_required(VERSION 2.8.12) # prevent CMake warnings about INTERFACE_LINK_LIBRARIES vs LINK_INTERFACE_LIBRARIES cmake_policy(SET CMP0022 NEW) +set(CMAKE_VERBOSE_MAKEFILE ON) + # build options option(BUILD_DEVEL "Install/package files required for development(For SDK)." OFF) if(UNIX) From b0cb40c5ea2941287450c1fd9352a40c2e50a49d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 22:42:50 -0700 Subject: [PATCH 16/49] pass the cmake environment to deps --- depends/CMakeLists.txt | 16 +++++++++++++--- library/CMakeLists.txt | 2 -- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 2e5dde062..87e9d74bf 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -18,13 +18,23 @@ option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependenc add_subdirectory(clsocket) ide_folder(clsocket "Depends") +# assemble environment args to pass on to dependency projects +get_cmake_property(vars CACHE_VARIABLES) +foreach(var ${vars}) + get_property(currentHelpString CACHE "${var}" PROPERTY HELPSTRING) + if("${currentHelpString}" MATCHES "No help, variable specified on the command line." OR "${currentHelpString}" STREQUAL "") + message("${var} = [${${var}}] -- ${currentHelpString}") # uncomment to see the variables being processed + list(APPEND CL_ARGS "-D${var}=${${var}}") + endif() +endforeach() + set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) ExternalProject_Add(libexpat_project PREFIX libexpat SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib/libexpat.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) @@ -33,7 +43,7 @@ ExternalProject_Add(libzip_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip INSTALL_DIR ${LIBZIP_INSTALL_DIR} BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib/libzip.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) @@ -42,7 +52,7 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) add_dependencies(xlsxio_project libexpat_project) add_dependencies(xlsxio_project libzip_project) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index c78f7f58e..583c8768f 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -4,8 +4,6 @@ cmake_minimum_required(VERSION 2.8.12) # prevent CMake warnings about INTERFACE_LINK_LIBRARIES vs LINK_INTERFACE_LIBRARIES cmake_policy(SET CMP0022 NEW) -set(CMAKE_VERBOSE_MAKEFILE ON) - # build options option(BUILD_DEVEL "Install/package files required for development(For SDK)." OFF) if(UNIX) From 51794d91eda59faeadd1190b96a55f922f881b07 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 8 Aug 2020 23:55:24 -0700 Subject: [PATCH 17/49] really get the env vars --- depends/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 87e9d74bf..f2ccff398 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -21,12 +21,12 @@ ide_folder(clsocket "Depends") # assemble environment args to pass on to dependency projects get_cmake_property(vars CACHE_VARIABLES) foreach(var ${vars}) - get_property(currentHelpString CACHE "${var}" PROPERTY HELPSTRING) - if("${currentHelpString}" MATCHES "No help, variable specified on the command line." OR "${currentHelpString}" STREQUAL "") - message("${var} = [${${var}}] -- ${currentHelpString}") # uncomment to see the variables being processed - list(APPEND CL_ARGS "-D${var}=${${var}}") - endif() + if(var MATCHES "^CMAKE_" AND NOT var MATCHES "^CMAKE_CACHE" AND NOT var MATCHES "^CMAKE_HOME" AND NOT var MATCHES "^CMAKE_PROJECT") + message("${var} = [${${var}}]") + list(APPEND CL_ARGS "-D${var}=${${var}}") + endif() endforeach() +message("final CL_ARGS = ${CL_ARGS}") set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) ExternalProject_Add(libexpat_project From bb988d25e674ede1d2fe74af18a0885708d7f156 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 00:24:25 -0700 Subject: [PATCH 18/49] try to get the library suffix right for windows --- depends/CMakeLists.txt | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index f2ccff398..7e0a4027b 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -21,19 +21,31 @@ ide_folder(clsocket "Depends") # assemble environment args to pass on to dependency projects get_cmake_property(vars CACHE_VARIABLES) foreach(var ${vars}) - if(var MATCHES "^CMAKE_" AND NOT var MATCHES "^CMAKE_CACHE" AND NOT var MATCHES "^CMAKE_HOME" AND NOT var MATCHES "^CMAKE_PROJECT") + if(var MATCHES "^CMAKE_" + AND NOT var MATCHES "^CMAKE_CACHE" + AND NOT var MATCHES "^CMAKE_HOME" + AND NOT var MATCHES "^CMAKE_PROJECT") + message("${var} = [${${var}}]") + list(APPEND CL_ARGS "-D${var}=${${var}}") + endif() + if(var MATCHES "^ZLIB") message("${var} = [${${var}}]") list(APPEND CL_ARGS "-D${var}=${${var}}") endif() endforeach() -message("final CL_ARGS = ${CL_ARGS}") + +if(WIN32) + set(LIB_SUFFIX "MD.lib") +else() + set(LIB_SUFFIX ".a") +endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) ExternalProject_Add(libexpat_project PREFIX libexpat SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib/libexpat.a + BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${LIB_SUFFIX} CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) @@ -42,7 +54,7 @@ ExternalProject_Add(libzip_project PREFIX libzip SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip INSTALL_DIR ${LIBZIP_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib/libzip.a + BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib/libzip${LIB_SUFFIX} CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) @@ -51,7 +63,7 @@ ExternalProject_Add(xlsxio_project PREFIX xlsxio SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} - BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read.a + BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read${LIB_SUFFIX} CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) add_dependencies(xlsxio_project libexpat_project) From 43bcec4a57c55ed2cce404013820d378aaf973f1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 00:46:50 -0700 Subject: [PATCH 19/49] move libzip to older version although they declare that they only need cmake 3.0.2, they started using add_compile_definitions(), which was added in cmake 3.12 git checkout 29b881d fixes this --- depends/libzip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/libzip b/depends/libzip index 66e496489..29b881d28 160000 --- a/depends/libzip +++ b/depends/libzip @@ -1 +1 @@ -Subproject commit 66e496489bdae81bfda8b0088172871d8fda0032 +Subproject commit 29b881d286f43189ff7392f609da78daa80c0606 From c7cf7fdd30fc2bef7193464cecc503008a6698c4 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 02:00:06 -0700 Subject: [PATCH 20/49] define EXPAT_LIBRARIES for xlsxio --- depends/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 7e0a4027b..21b244272 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -41,11 +41,12 @@ else() endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) +set(LIBEXPAT_OUTPUT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${LIB_SUFFIX}) ExternalProject_Add(libexpat_project PREFIX libexpat SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${LIB_SUFFIX} + BUILD_BYPRODUCTS ${LIBEXPAT_OUTPUT_LIB} CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) @@ -64,7 +65,7 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read${LIB_SUFFIX} - CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_OUTPUT_LIB} -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) add_dependencies(xlsxio_project libexpat_project) add_dependencies(xlsxio_project libzip_project) From 204240f3e34d0d1522157cf9306117a2c80063e2 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 02:14:37 -0700 Subject: [PATCH 21/49] specify expat include dir for xlsxio --- depends/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 21b244272..9f2e98763 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -35,13 +35,15 @@ foreach(var ${vars}) endforeach() if(WIN32) - set(LIB_SUFFIX "MD.lib") + set(EXPAT_LIB_SUFFIX "MD.lib") + set(LIB_SUFFIX ".lib") else() + set(EXPAT_LIB_SUFFIX ".a") set(LIB_SUFFIX ".a") endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) -set(LIBEXPAT_OUTPUT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${LIB_SUFFIX}) +set(LIBEXPAT_OUTPUT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${EXPAT_LIB_SUFFIX}) ExternalProject_Add(libexpat_project PREFIX libexpat SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat @@ -65,7 +67,7 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read${LIB_SUFFIX} - CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_OUTPUT_LIB} -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_OUTPUT_LIB} -DEXPAT_INCLUDE_DIR=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) add_dependencies(xlsxio_project libexpat_project) add_dependencies(xlsxio_project libzip_project) From 79415cf097b1de8e9b33734d347b44259d47fb11 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 02:24:05 -0700 Subject: [PATCH 22/49] clean up dep lib vars --- CMakeLists.txt | 15 --------------- depends/CMakeLists.txt | 18 +++++++++++++----- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dbd028a36..e5e88ceb3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -417,32 +417,17 @@ endif() # build the lib itself if(BUILD_LIBRARY) - ExternalProject_Get_Property(xlsxio_project INSTALL_DIR) - set(XLSXIO_INSTALL_DIR ${INSTALL_DIR}) - ExternalProject_Get_Property(xlsxio_project BUILD_BYPRODUCTS) - set(XLSXIO_LIB ${BUILD_BYPRODUCTS}) include_directories(${XLSXIO_INSTALL_DIR}/include) add_library(xlsxio_read STATIC IMPORTED) set_target_properties(xlsxio_read PROPERTIES IMPORTED_LOCATION ${XLSXIO_LIB}) - add_dependencies(xlsxio_read xlsxio_project) - ExternalProject_Get_Property(libzip_project INSTALL_DIR) - set(LIBZIP_INSTALL_DIR ${INSTALL_DIR}) - ExternalProject_Get_Property(libzip_project BUILD_BYPRODUCTS) - set(LIBZIP_LIB ${BUILD_BYPRODUCTS}) include_directories(${LIBZIP_INSTALL_DIR}/include) add_library(zip STATIC IMPORTED) set_target_properties(zip PROPERTIES IMPORTED_LOCATION ${LIBZIP_LIB}) - add_dependencies(zip libzip_project) - ExternalProject_Get_Property(libexpat_project INSTALL_DIR) - set(LIBEXPAT_INSTALL_DIR ${INSTALL_DIR}) - ExternalProject_Get_Property(libexpat_project BUILD_BYPRODUCTS) - set(LIBEXPAT_LIB ${BUILD_BYPRODUCTS}) include_directories(${LIBEXPAT_INSTALL_DIR}/include) add_library(expat STATIC IMPORTED) set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) - add_dependencies(expat libexpat_project) add_subdirectory(library) install(FILES LICENSE.rst docs/changelog.txt DESTINATION ${DFHACK_USERDOC_DESTINATION}) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 9f2e98763..475166285 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -43,31 +43,39 @@ else() endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) -set(LIBEXPAT_OUTPUT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${EXPAT_LIB_SUFFIX}) +set(LIBEXPAT_INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} PARENT_SCOPE) +set(LIBEXPAT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${EXPAT_LIB_SUFFIX}) +set(LIBEXPAT_LIB ${LIBEXPAT_LIB} PARENT_SCOPE) ExternalProject_Add(libexpat_project PREFIX libexpat SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBEXPAT_OUTPUT_LIB} + BUILD_BYPRODUCTS ${LIBEXPAT_LIB} CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) +set(LIBZIP_INSTALL_DIR ${LIBZIP_INSTALL_DIR} PARENT_SCOPE) +set(LIBZIP_LIB ${LIBZIP_INSTALL_DIR}/lib/libzip${LIB_SUFFIX}) +set(LIBZIP_LIB ${LIBZIP_LIB} PARENT_SCOPE) ExternalProject_Add(libzip_project PREFIX libzip SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip INSTALL_DIR ${LIBZIP_INSTALL_DIR} - BUILD_BYPRODUCTS ${LIBZIP_INSTALL_DIR}/lib/libzip${LIB_SUFFIX} + BUILD_BYPRODUCTS ${LIBZIP_LIB} CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) +set(XLSXIO_INSTALL_DIR ${XLSXIO_INSTALL_DIR} PARENT_SCOPE) +set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read${LIB_SUFFIX}) +set(XLSXIO_LIB ${XLSXIO_LIB} PARENT_SCOPE) ExternalProject_Add(xlsxio_project PREFIX xlsxio SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} - BUILD_BYPRODUCTS ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read${LIB_SUFFIX} - CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_OUTPUT_LIB} -DEXPAT_INCLUDE_DIR=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + BUILD_BYPRODUCTS ${XLSXIO_LIB} + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_LIB} -DEXPAT_INCLUDE_DIR=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ) add_dependencies(xlsxio_project libexpat_project) add_dependencies(xlsxio_project libzip_project) From f04a9c3180b6a32f77e57a130a0636868a70ee7f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 02:32:31 -0700 Subject: [PATCH 23/49] clean up logging; use xlsxio's misspelling of "DIRS" --- depends/CMakeLists.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 475166285..808bb4304 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -25,11 +25,9 @@ foreach(var ${vars}) AND NOT var MATCHES "^CMAKE_CACHE" AND NOT var MATCHES "^CMAKE_HOME" AND NOT var MATCHES "^CMAKE_PROJECT") - message("${var} = [${${var}}]") list(APPEND CL_ARGS "-D${var}=${${var}}") endif() if(var MATCHES "^ZLIB") - message("${var} = [${${var}}]") list(APPEND CL_ARGS "-D${var}=${${var}}") endif() endforeach() @@ -51,7 +49,7 @@ ExternalProject_Add(libexpat_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libexpat/expat INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} BUILD_BYPRODUCTS ${LIBEXPAT_LIB} - CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBEXPAT_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF -DEXPAT_SHARED_LIBS=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) @@ -63,7 +61,7 @@ ExternalProject_Add(libzip_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libzip INSTALL_DIR ${LIBZIP_INSTALL_DIR} BUILD_BYPRODUCTS ${LIBZIP_LIB} - CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${LIBZIP_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_DOC=OFF -DBUILD_EXAMPLES=OFF -DBUILD_REGRESS=OFF -DBUILD_SHARED_LIBS=OFF -DBUILD_TOOLS=OFF -DENABLE_BZIP2=OFF -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_LZMA=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_POSITION_INDEPENDENT_CODE=ON ) set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) @@ -75,7 +73,7 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_LIB} - CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_LIB} -DEXPAT_INCLUDE_DIR=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_LIB} -DEXPAT_INCLUDE_DIRS=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON ) add_dependencies(xlsxio_project libexpat_project) add_dependencies(xlsxio_project libzip_project) From 8913d43d6f8cfe8d3921ef3f05f7fae4ddce2947 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 02:59:22 -0700 Subject: [PATCH 24/49] ensure xlsxio_project gets built before dfhack --- CMakeLists.txt | 6 ++---- depends/CMakeLists.txt | 2 -- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e5e88ceb3..eeb8c8d12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -420,17 +420,15 @@ if(BUILD_LIBRARY) include_directories(${XLSXIO_INSTALL_DIR}/include) add_library(xlsxio_read STATIC IMPORTED) set_target_properties(xlsxio_read PROPERTIES IMPORTED_LOCATION ${XLSXIO_LIB}) - - include_directories(${LIBZIP_INSTALL_DIR}/include) add_library(zip STATIC IMPORTED) set_target_properties(zip PROPERTIES IMPORTED_LOCATION ${LIBZIP_LIB}) - - include_directories(${LIBEXPAT_INSTALL_DIR}/include) add_library(expat STATIC IMPORTED) set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) add_subdirectory(library) install(FILES LICENSE.rst docs/changelog.txt DESTINATION ${DFHACK_USERDOC_DESTINATION}) + + add_dependencies(dfhack xlsxio_project) endif() file(WRITE "${CMAKE_BINARY_DIR}/dfhack_setarch.txt" ${DFHACK_SETARCH}) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 808bb4304..0b747c157 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -41,7 +41,6 @@ else() endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) -set(LIBEXPAT_INSTALL_DIR ${LIBEXPAT_INSTALL_DIR} PARENT_SCOPE) set(LIBEXPAT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${EXPAT_LIB_SUFFIX}) set(LIBEXPAT_LIB ${LIBEXPAT_LIB} PARENT_SCOPE) ExternalProject_Add(libexpat_project @@ -53,7 +52,6 @@ ExternalProject_Add(libexpat_project ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) -set(LIBZIP_INSTALL_DIR ${LIBZIP_INSTALL_DIR} PARENT_SCOPE) set(LIBZIP_LIB ${LIBZIP_INSTALL_DIR}/lib/libzip${LIB_SUFFIX}) set(LIBZIP_LIB ${LIBZIP_LIB} PARENT_SCOPE) ExternalProject_Add(libzip_project From 7a0853025a0955190b9a53a87c85180d96cd627e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 03:30:59 -0700 Subject: [PATCH 25/49] use non-standard xlsxio lib name on windows --- depends/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 0b747c157..db132a809 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -35,9 +35,11 @@ endforeach() if(WIN32) set(EXPAT_LIB_SUFFIX "MD.lib") set(LIB_SUFFIX ".lib") + set(XLSXIO_LIB_PREFIX "") else() set(EXPAT_LIB_SUFFIX ".a") set(LIB_SUFFIX ".a") + set(XLSXIO_LIB_PREFIX "lib") endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) @@ -64,7 +66,7 @@ ExternalProject_Add(libzip_project set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) set(XLSXIO_INSTALL_DIR ${XLSXIO_INSTALL_DIR} PARENT_SCOPE) -set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/libxlsxio_read${LIB_SUFFIX}) +set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/${XLSXIO_LIB_PREFIX}xlsxio_read${LIB_SUFFIX}) set(XLSXIO_LIB ${XLSXIO_LIB} PARENT_SCOPE) ExternalProject_Add(xlsxio_project PREFIX xlsxio From 5fc627a16f26c7acae4d0bf8b858066440afa9d1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 04:03:04 -0700 Subject: [PATCH 26/49] no lib prefix for libzip on windows too --- depends/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index db132a809..bb5dc72dc 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -35,11 +35,11 @@ endforeach() if(WIN32) set(EXPAT_LIB_SUFFIX "MD.lib") set(LIB_SUFFIX ".lib") - set(XLSXIO_LIB_PREFIX "") + set(LIB_PREFIX "") else() set(EXPAT_LIB_SUFFIX ".a") set(LIB_SUFFIX ".a") - set(XLSXIO_LIB_PREFIX "lib") + set(LIB_PREFIX "lib") endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) @@ -54,7 +54,7 @@ ExternalProject_Add(libexpat_project ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) -set(LIBZIP_LIB ${LIBZIP_INSTALL_DIR}/lib/libzip${LIB_SUFFIX}) +set(LIBZIP_LIB ${LIBZIP_INSTALL_DIR}/lib/${LIB_PREFIX}zip${LIB_SUFFIX}) set(LIBZIP_LIB ${LIBZIP_LIB} PARENT_SCOPE) ExternalProject_Add(libzip_project PREFIX libzip @@ -66,7 +66,7 @@ ExternalProject_Add(libzip_project set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) set(XLSXIO_INSTALL_DIR ${XLSXIO_INSTALL_DIR} PARENT_SCOPE) -set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/${XLSXIO_LIB_PREFIX}xlsxio_read${LIB_SUFFIX}) +set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/${LIB_PREFIX}xlsxio_read${LIB_SUFFIX}) set(XLSXIO_LIB ${XLSXIO_LIB} PARENT_SCOPE) ExternalProject_Add(xlsxio_project PREFIX xlsxio From a41f7c099843d23286857f976ab962b336e679c5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 08:54:42 -0700 Subject: [PATCH 27/49] convert XlsxReader module to xlsxreader plugin --- CMakeLists.txt | 12 -- depends/CMakeLists.txt | 2 + library/CMakeLists.txt | 4 +- library/LuaApi.cpp | 61 ---------- library/include/modules/XlsxReader.h | 45 ------- library/modules/XlsxReader.cpp | 115 ----------------- plugins/CMakeLists.txt | 11 ++ plugins/lua/xlsxreader.lua | 17 +++ plugins/xlsxreader.cpp | 176 +++++++++++++++++++++++++++ 9 files changed, 207 insertions(+), 236 deletions(-) delete mode 100644 library/include/modules/XlsxReader.h delete mode 100644 library/modules/XlsxReader.cpp create mode 100644 plugins/lua/xlsxreader.lua create mode 100644 plugins/xlsxreader.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index eeb8c8d12..cd06587eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -364,8 +364,6 @@ endif() #### expose depends #### -include(ExternalProject) - if(UNIX) # Rescan for pthread and zlib if the build arch changed if(NOT "${DFHACK_BUILD_ARCH}" STREQUAL "${DFHACK_BUILD_ARCH_PREV}") @@ -417,18 +415,8 @@ endif() # build the lib itself if(BUILD_LIBRARY) - include_directories(${XLSXIO_INSTALL_DIR}/include) - add_library(xlsxio_read STATIC IMPORTED) - set_target_properties(xlsxio_read PROPERTIES IMPORTED_LOCATION ${XLSXIO_LIB}) - add_library(zip STATIC IMPORTED) - set_target_properties(zip PROPERTIES IMPORTED_LOCATION ${LIBZIP_LIB}) - add_library(expat STATIC IMPORTED) - set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) - add_subdirectory(library) install(FILES LICENSE.rst docs/changelog.txt DESTINATION ${DFHACK_USERDOC_DESTINATION}) - - add_dependencies(dfhack xlsxio_project) endif() file(WRITE "${CMAKE_BINARY_DIR}/dfhack_setarch.txt" ${DFHACK_SETARCH}) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index bb5dc72dc..69ce40ae3 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -32,6 +32,8 @@ foreach(var ${vars}) endif() endforeach() +include(ExternalProject) + if(WIN32) set(EXPAT_LIB_SUFFIX "MD.lib") set(LIB_SUFFIX ".lib") diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 583c8768f..2de293e15 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -144,7 +144,6 @@ set(MODULE_HEADERS include/modules/Translation.h include/modules/Units.h include/modules/World.h - include/modules/XlsxReader.h ) set(MODULE_SOURCES @@ -173,7 +172,6 @@ set(MODULE_SOURCES modules/Units.cpp modules/Windows.cpp modules/World.cpp - modules/XlsxReader.cpp ) set(STATIC_FIELDS_FILES) @@ -411,7 +409,7 @@ if(APPLE) set_target_properties(dfhack PROPERTIES SOVERSION 1.0.0) endif() -target_link_libraries(dfhack protobuf-lite clsocket lua jsoncpp_lib_static xlsxio_read zip expat dfhack-version ${PROJECT_LIBS}) +target_link_libraries(dfhack protobuf-lite clsocket lua jsoncpp_lib_static dfhack-version ${PROJECT_LIBS}) set_target_properties(dfhack PROPERTIES INTERFACE_LINK_LIBRARIES "") target_link_libraries(dfhack-client protobuf-lite clsocket jsoncpp_lib_static) diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index 0265eee20..78364083f 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -60,7 +60,6 @@ distribution. #include "modules/Translation.h" #include "modules/Units.h" #include "modules/World.h" -#include "modules/XlsxReader.h" #include "LuaWrapper.h" #include "LuaTools.h" @@ -2481,65 +2480,6 @@ static const LuaWrapper::FunctionReg dfhack_kitchen_module[] = { {NULL, NULL} }; -/***** XlsxReader module *****/ - -static const LuaWrapper::FunctionReg dfhack_xlsxreader_module[] = { - WRAPM(XlsxReader, open_xlsx_file), - WRAPM(XlsxReader, close_xlsx_file), - WRAPM(XlsxReader, open_sheet), - WRAPM(XlsxReader, close_sheet), - {NULL, NULL} -}; - -// internal function to factor out handle extraction -static void * get_xlsxreader_handle(lua_State *L) -{ - if (lua_gettop(L) < 1 || lua_isnil(L, 1)) - { - luaL_error(L, "invalid xlsxreader handle"); - } - luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); - return lua_touserdata(L, 1); -} - -// takes a file handle and returns a table-list of sheet names -static int xlsxreader_list_sheets(lua_State *L) -{ - XlsxReader::xlsx_file_handle file_handle = get_xlsxreader_handle(L); - Lua::PushVector(L, XlsxReader::list_sheets(file_handle), true); - return 1; -} - -// takes the sheet handle and returns a table-list of strings, or nil if we -// already processed the last row in the file. -static int xlsxreader_get_row(lua_State *L) -{ - XlsxReader::xlsx_sheet_handle sheet_handle = get_xlsxreader_handle(L); - bool ok = XlsxReader::get_next_row(sheet_handle); - if (!ok) - { - lua_pushnil(L); - } - else - { - std::string value; - auto cells = std::vector(); - while (XlsxReader::get_next_cell(sheet_handle, value)) - { - cells.push_back(value); - } - Lua::PushVector(L, cells, true); - } - - return 1; -} - -static const luaL_Reg dfhack_xlsxreader_funcs[] = { - {"list_sheets", xlsxreader_list_sheets}, - {"get_row", xlsxreader_get_row}, - {NULL, NULL} -}; - /***** Console module *****/ namespace console { @@ -3093,7 +3033,6 @@ void OpenDFHackApi(lua_State *state) OpenModule(state, "filesystem", dfhack_filesystem_module, dfhack_filesystem_funcs); OpenModule(state, "designations", dfhack_designations_module, dfhack_designations_funcs); OpenModule(state, "kitchen", dfhack_kitchen_module); - OpenModule(state, "xlsxreader", dfhack_xlsxreader_module, dfhack_xlsxreader_funcs); OpenModule(state, "console", dfhack_console_module); OpenModule(state, "internal", dfhack_internal_module, dfhack_internal_funcs); } diff --git a/library/include/modules/XlsxReader.h b/library/include/modules/XlsxReader.h deleted file mode 100644 index 93ea1cf20..000000000 --- a/library/include/modules/XlsxReader.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Wrapper for xlsxio_read library functions. - */ - -#pragma once - -#include -#include - -#include "Export.h" - -/** - * \defgroup grp_xlsx_reader Xlsx file reader - * @ingroup grp_modules - */ -namespace DFHack -{ -namespace XlsxReader -{ - -typedef void* xlsx_file_handle; -typedef void* xlsx_sheet_handle; - -// returns NULL on error -DFHACK_EXPORT xlsx_file_handle open_xlsx_file(std::string filename); -DFHACK_EXPORT void close_xlsx_file(xlsx_file_handle file_handle); -DFHACK_EXPORT std::vector list_sheets(xlsx_file_handle file_handle); - -// returns XLSXIOReaderSheet object or NULL on error -DFHACK_EXPORT xlsx_sheet_handle open_sheet( - xlsx_file_handle file_handle, std::string sheet_name); -DFHACK_EXPORT void close_sheet(xlsx_sheet_handle sheet_handle); - -// start reading the next row of data; must be called before GetNextCell . -// returns false if there is no next row to get. -DFHACK_EXPORT bool get_next_row(xlsx_sheet_handle sheet_handle); - -// fills the value param with the contents of the cell in the next column cell -// in the current row. -// returns false if there are no more cells in this row. -DFHACK_EXPORT bool get_next_cell( - xlsx_sheet_handle sheet_handle, std::string& value); - -} -} diff --git a/library/modules/XlsxReader.cpp b/library/modules/XlsxReader.cpp deleted file mode 100644 index 405369c85..000000000 --- a/library/modules/XlsxReader.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Wrapper for xlsxio_read library functions. - * - * Sample usage: - * - * std::string filename = "sample_file.xlsx"; - * xlsxioreader xlsxfile = XlsxReader::open_xlsx_file(filename); - * if (xlsxfile == NULL) { - * printf("cannot open file: '%s'", filename.c_str()); - * return false; - * } - * auto sheetNames = XlsxReader::list_sheets(xlsxfile); - * for (auto sheetName = sheetNames.begin(); - * sheetName != sheetNames.end(); - * ++sheetName) { - * printf("reading sheet: %s\n", sheetName->c_str()); - * xlsxioreadersheet xlsxsheet = - * XlsxReader::open_sheet(xlsxfile, *sheetName); - * if (xlsxsheet == NULL) { - * printf("cannot open sheet: '%s'", sheetName->c_str()); - * continue; - * } - * std::string value; - * int row_num = 1; - * while (XlsxReader::GetNextRow(xlsxsheet)) { - * std::string s; - * printf("%d:\t", row_num); - * while (XlsxReader::GetNextCell(xlsxsheet, s)) { - * printf("%s\t", s.c_str()); - * } - * printf("\n"); - * ++row_num; - * } - * XlsxReader::close_sheet(xlsxsheet); - * } - * XlsxReader::close_xlsx_file(xlsxfile); - * return true; - */ - -#include - -#include "modules/XlsxReader.h" - -using namespace DFHack; - - -// returns NULL on error -DFHACK_EXPORT XlsxReader::xlsx_file_handle XlsxReader::open_xlsx_file( - std::string filename) -{ - return xlsxioread_open(filename.c_str()); -} - -DFHACK_EXPORT void XlsxReader::close_xlsx_file( - XlsxReader::xlsx_file_handle file_handle) -{ - xlsxioread_close((xlsxioreader)file_handle); -} - -static int list_callback(const XLSXIOCHAR* name, void* cbdata) -{ - auto sheetNames = (std::vector *)cbdata; - sheetNames->push_back(name); - return 0; -} - -DFHACK_EXPORT std::vector XlsxReader::list_sheets( - XlsxReader::xlsx_file_handle file_handle) -{ - auto sheetNames = std::vector(); - xlsxioread_list_sheets( - (xlsxioreader)file_handle, list_callback, &sheetNames); - return sheetNames; -} - -// returns XLSXIOReaderSheet object or NULL on error -DFHACK_EXPORT XlsxReader::xlsx_sheet_handle XlsxReader::open_sheet( - XlsxReader::xlsx_file_handle file_handle, std::string sheet_name) -{ - if (file_handle == NULL) - return NULL; - return xlsxioread_sheet_open( - (xlsxioreader)file_handle, sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); -} - -DFHACK_EXPORT void XlsxReader::close_sheet( - XlsxReader::xlsx_sheet_handle sheet_handle) -{ - xlsxioread_sheet_close((xlsxioreadersheet)sheet_handle); -} - -// start reading the next row of data; must be called before GetNextCell . -// returns false if there is no next row to get. -DFHACK_EXPORT bool XlsxReader::get_next_row( - XlsxReader::xlsx_sheet_handle sheet_handle) -{ - return xlsxioread_sheet_next_row((xlsxioreadersheet)sheet_handle) != 0; -} - -// fills the value param with the contents of the cell in the next column cell -// in the current row. -// returns false if there are no more cells in this row. -DFHACK_EXPORT bool XlsxReader::get_next_cell( - XlsxReader::xlsx_sheet_handle sheet_handle, std::string& value) -{ - char* result; - if (!xlsxioread_sheet_next_cell_string((xlsxioreadersheet)sheet_handle, - &result)) { - value.clear(); - return false; - } - value.assign(result); - free(result); - return true; -} diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 678b7eec2..6531165e1 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -77,6 +77,14 @@ set_source_files_properties( Brushes.h PROPERTIES HEADER_FILE_ONLY TRUE ) add_library(buildingplan-lib STATIC buildingplan-lib.cpp) target_link_libraries(buildingplan-lib dfhack) +# xlsxreader deps +add_library(xlsxio_read STATIC IMPORTED) +set_target_properties(xlsxio_read PROPERTIES IMPORTED_LOCATION ${XLSXIO_LIB}) +add_library(zip STATIC IMPORTED) +set_target_properties(zip PROPERTIES IMPORTED_LOCATION ${LIBZIP_LIB}) +add_library(expat STATIC IMPORTED) +set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) + # Plugins option(BUILD_SUPPORTED "Build the supported plugins (reveal, probe, etc.)." ON) if(BUILD_SUPPORTED) @@ -175,8 +183,11 @@ if(BUILD_SUPPORTED) add_subdirectory(tweak) dfhack_plugin(workflow workflow.cpp LINK_LIBRARIES lua) dfhack_plugin(workNow workNow.cpp) + dfhack_plugin(xlsxreader xlsxreader.cpp LINK_LIBRARIES lua xlsxio_read zip expat z) dfhack_plugin(zone zone.cpp LINK_LIBRARIES lua) endif() +target_include_directories(xlsxreader PRIVATE ${XLSXIO_INSTALL_DIR}/include) +add_dependencies(xlsxreader xlsxio_project) # this is the skeleton plugin. If you want to make your own, make a copy and then change it option(BUILD_SKELETON "Build the skeleton plugin." OFF) diff --git a/plugins/lua/xlsxreader.lua b/plugins/lua/xlsxreader.lua new file mode 100644 index 000000000..3dbc1f2d8 --- /dev/null +++ b/plugins/lua/xlsxreader.lua @@ -0,0 +1,17 @@ +local _ENV = mkmodule('plugins.xlsxreader') + +--[[ + + Native functions: + + * file_handle open_xlsx_file(filename) + * close_xlsx_file(file_handle) + * sheet_names list_sheets(file_handle) + + * sheet_handle open_sheet(file_handle, sheet_name) + * close_sheet(sheet_handle) + * cell_strings get_row(sheet_handle) + +--]] + +return _ENV diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp new file mode 100644 index 000000000..9c773718d --- /dev/null +++ b/plugins/xlsxreader.cpp @@ -0,0 +1,176 @@ +/* + * Wrapper for xlsxio_read library functions. + * + * Sample usage: + * + * std::string filename = "sample_file.xlsx"; + * xlsxioreader xlsxfile = XlsxReader::open_xlsx_file(filename); + * if (xlsxfile == NULL) { + * printf("cannot open file: '%s'", filename.c_str()); + * return false; + * } + * auto sheetNames = XlsxReader::list_sheets(xlsxfile); + * for (auto sheetName = sheetNames.begin(); + * sheetName != sheetNames.end(); + * ++sheetName) { + * printf("reading sheet: %s\n", sheetName->c_str()); + * xlsxioreadersheet xlsxsheet = + * XlsxReader::open_sheet(xlsxfile, *sheetName); + * if (xlsxsheet == NULL) { + * printf("cannot open sheet: '%s'", sheetName->c_str()); + * continue; + * } + * std::string value; + * int row_num = 1; + * while (XlsxReader::GetNextRow(xlsxsheet)) { + * std::string s; + * printf("%d:\t", row_num); + * while (XlsxReader::GetNextCell(xlsxsheet, s)) { + * printf("%s\t", s.c_str()); + * } + * printf("\n"); + * ++row_num; + * } + * XlsxReader::close_sheet(xlsxsheet); + * } + * XlsxReader::close_xlsx_file(xlsxfile); + * return true; + */ + +#include + +#include "DataFuncs.h" +#include "LuaTools.h" +#include "PluginManager.h" + +using namespace DFHack; + +DFHACK_PLUGIN("xlsxreader"); + +typedef void* xlsx_file_handle; +typedef void* xlsx_sheet_handle; + +// returns NULL on error +xlsx_file_handle open_xlsx_file(std::string filename) +{ + return xlsxioread_open(filename.c_str()); +} + +void close_xlsx_file(xlsx_file_handle file_handle) +{ + xlsxioread_close((xlsxioreader)file_handle); +} + +// returns XLSXIOReaderSheet object or NULL on error +xlsx_sheet_handle open_sheet(xlsx_file_handle file_handle, std::string sheet_name) +{ + if (file_handle == NULL) + return NULL; + return xlsxioread_sheet_open((xlsxioreader)file_handle, + sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); +} + +void close_sheet(xlsx_sheet_handle sheet_handle) +{ + xlsxioread_sheet_close((xlsxioreadersheet)sheet_handle); +} + +static int list_callback(const XLSXIOCHAR* name, void* cbdata) +{ + auto sheetNames = (std::vector *)cbdata; + sheetNames->push_back(name); + return 0; +} + +// start reading the next row of data; must be called before get_next_cell. +// returns false if there is no next row to get. +static bool get_next_row(xlsx_sheet_handle sheet_handle) +{ + return xlsxioread_sheet_next_row((xlsxioreadersheet)sheet_handle) != 0; +} + +// fills the value param with the contents of the cell in the next column cell +// in the current row. +// returns false if there are no more cells in this row. +static bool get_next_cell(xlsx_sheet_handle sheet_handle, std::string& value) +{ + char* result; + if (!xlsxioread_sheet_next_cell_string( + (xlsxioreadersheet)sheet_handle, &result)) { + value.clear(); + return false; + } + value.assign(result); + free(result); + return true; +} + +// internal function to factor out handle extraction +static void * get_xlsxreader_handle(lua_State *L) +{ + if (lua_gettop(L) < 1 || lua_isnil(L, 1)) + { + luaL_error(L, "invalid xlsxreader handle"); + } + luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); + return lua_touserdata(L, 1); +} + +// takes a file handle and returns a table-list of sheet names +int list_sheets(lua_State *L) +{ + xlsxioreader file_handle = (xlsxioreader)get_xlsxreader_handle(L); + auto sheetNames = std::vector(); + xlsxioread_list_sheets(file_handle, list_callback, &sheetNames); + Lua::PushVector(L, sheetNames, true); + return 1; +} + +// takes the sheet handle and returns a table-list of strings, or nil if we +// already processed the last row in the file. +int get_row(lua_State *L) +{ + xlsxioreadersheet sheet_handle = + (xlsxioreadersheet)get_xlsxreader_handle(L); + bool ok = get_next_row(sheet_handle); + if (!ok) + { + lua_pushnil(L); + } + else + { + std::string value; + auto cells = std::vector(); + while (get_next_cell(sheet_handle, value)) + { + cells.push_back(value); + } + Lua::PushVector(L, cells, true); + } + + return 1; +} + +DFHACK_PLUGIN_LUA_FUNCTIONS { + DFHACK_LUA_FUNCTION(open_xlsx_file), + DFHACK_LUA_FUNCTION(close_xlsx_file), + DFHACK_LUA_FUNCTION(open_sheet), + DFHACK_LUA_FUNCTION(close_sheet), + DFHACK_LUA_END +}; + +DFHACK_PLUGIN_LUA_COMMANDS{ + DFHACK_LUA_COMMAND(list_sheets), + DFHACK_LUA_COMMAND(get_row), + DFHACK_LUA_END +}; + +DFhackCExport command_result plugin_init(color_ostream &, std::vector &) +{ + return CR_OK; +} + +DFhackCExport command_result plugin_shutdown(color_ostream &) +{ + return CR_OK; +} From 4a04273fae91ff7aaa9c3bb2cb2bebed65220f3f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 09:28:19 -0700 Subject: [PATCH 28/49] document xlsxreader functions --- docs/Lua API.rst | 31 +++++++++++++++++++++++++++++++ docs/Plugins.rst | 3 ++- plugins/lua/xlsxreader.lua | 18 ++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/docs/Lua API.rst b/docs/Lua API.rst index 45ccd46a9..e66989e35 100644 --- a/docs/Lua API.rst +++ b/docs/Lua API.rst @@ -4102,6 +4102,37 @@ Lua plugin classes - ``shuffle()``: shuffles the sequence of numbers - ``next()``: returns next number in the sequence +xlsxreader +========== + +Utility functions to facilitate reading .xlsx spreadsheets. It provides the +following API methods: + + - ``file_handle open_xlsx_file(filename)`` + - ``close_xlsx_file(file_handle)`` + - ``sheet_names list_sheets(file_handle)`` + - ``sheet_handle open_sheet(file_handle, sheet_name)`` + - ``close_sheet(sheet_handle)`` + - ``cell_strings get_row(sheet_handle)`` + + Example:: + + local xlsxreader = require('plugins.xlsxreader') + + local filepath = "path/to/some_file.xlsx" + local xlsx_file = xlsxreader.open_xlsx_file(filepath) + for _, sheet_name in ipairs(xlsxreader.list_sheets(xlsx_file)) do + print('reading sheet: '..sheet_name) + local xlsx_sheet = xlsxreader.open_sheet(xlsx_file, sheet_name) + local row_cells = xlsxreader.get_row(xlsx_sheet) + while row_cells do + printall(row_cells) + row_cells = xlsxreader.get_row(xlsx_sheet) + end + xlsxreader.close_sheet(xlsx_sheet) + end + xlsxreader.close_xlsx_file(xlsx_file) + ======= Scripts ======= diff --git a/docs/Plugins.rst b/docs/Plugins.rst index 6699163c2..9b5569e62 100644 --- a/docs/Plugins.rst +++ b/docs/Plugins.rst @@ -2939,10 +2939,11 @@ Lua API ======= Some plugins consist solely of native libraries exposed to Lua. They are listed -in the `lua-api` file under `lua-plugins`: +in the `lua-api` file under `lua-plugins`:: * `eventful` * `building-hacks` * `luasocket` * `map-render` * `cxxrandom` +* `xlsxreader` diff --git a/plugins/lua/xlsxreader.lua b/plugins/lua/xlsxreader.lua index 3dbc1f2d8..09ba01978 100644 --- a/plugins/lua/xlsxreader.lua +++ b/plugins/lua/xlsxreader.lua @@ -12,6 +12,24 @@ local _ENV = mkmodule('plugins.xlsxreader') * close_sheet(sheet_handle) * cell_strings get_row(sheet_handle) +Sample usage: + + local xlsxreader = require('plugins.xlsxreader') + + local filepath = "path/to/some_file.xlsx" + local xlsx_file = xlsxreader.open_xlsx_file(filepath) + for _, sheet_name in ipairs(xlsxreader.list_sheets(xlsx_file)) do + print('reading sheet: '..sheet_name) + local xlsx_sheet = xlsxreader.open_sheet(xlsx_file, sheet_name) + local row_cells = xlsxreader.get_row(xlsx_sheet) + while row_cells do + printall(row_cells) + row_cells = xlsxreader.get_row(xlsx_sheet) + end + xlsxreader.close_sheet(xlsx_sheet) + end + xlsxreader.close_xlsx_file(xlsx_file) + --]] return _ENV From 5294360908c462ea24a613230df18dc336f55d75 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 09:46:54 -0700 Subject: [PATCH 29/49] more windows library naming shenanigans --- plugins/CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 6531165e1..2bc135d33 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -85,6 +85,12 @@ set_target_properties(zip PROPERTIES IMPORTED_LOCATION ${LIBZIP_LIB}) add_library(expat STATIC IMPORTED) set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) +if(WIN32) + set(LIB_Z_LIB "zlib.lib") +else() + set(LIB_Z_LIB "z") +endif() + # Plugins option(BUILD_SUPPORTED "Build the supported plugins (reveal, probe, etc.)." ON) if(BUILD_SUPPORTED) @@ -183,7 +189,7 @@ if(BUILD_SUPPORTED) add_subdirectory(tweak) dfhack_plugin(workflow workflow.cpp LINK_LIBRARIES lua) dfhack_plugin(workNow workNow.cpp) - dfhack_plugin(xlsxreader xlsxreader.cpp LINK_LIBRARIES lua xlsxio_read zip expat z) + dfhack_plugin(xlsxreader xlsxreader.cpp LINK_LIBRARIES lua xlsxio_read zip expat ${LIB_Z_LIB}) dfhack_plugin(zone zone.cpp LINK_LIBRARIES lua) endif() target_include_directories(xlsxreader PRIVATE ${XLSXIO_INSTALL_DIR}/include) From e2129673c12750a89b5939d0d353cfc597fc8c46 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 10:11:24 -0700 Subject: [PATCH 30/49] fix zlib path on windows --- plugins/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 2bc135d33..c2798cd7d 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -86,7 +86,7 @@ add_library(expat STATIC IMPORTED) set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) if(WIN32) - set(LIB_Z_LIB "zlib.lib") + set(LIB_Z_LIB "depends/zlib/lib/zlib.lib") else() set(LIB_Z_LIB "z") endif() From 06e3f77e39d106fdc1633e3e6bfc207447a1d805 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 10:47:15 -0700 Subject: [PATCH 31/49] fix windows zlib path, hopefully for the last time --- plugins/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index c2798cd7d..bc897ba7d 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -86,7 +86,7 @@ add_library(expat STATIC IMPORTED) set_target_properties(expat PROPERTIES IMPORTED_LOCATION ${LIBEXPAT_LIB}) if(WIN32) - set(LIB_Z_LIB "depends/zlib/lib/zlib.lib") + set(LIB_Z_LIB "depends/zlib/lib/zlib") else() set(LIB_Z_LIB "z") endif() From 679ca41da8739aad216fd28735b30ef08903011d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sun, 9 Aug 2020 21:22:17 -0700 Subject: [PATCH 32/49] make sure xlsxio knows to link statically --- depends/CMakeLists.txt | 3 +-- plugins/xlsxreader.cpp | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 69ce40ae3..a2eafb052 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -72,10 +72,9 @@ set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/${LIB_PREFIX}xlsxio_read${LIB_SUFFIX}) set(XLSXIO_LIB ${XLSXIO_LIB} PARENT_SCOPE) ExternalProject_Add(xlsxio_project PREFIX xlsxio + DEPENDS libexpat_project libzip_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_LIB} CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_LIB} -DEXPAT_INCLUDE_DIRS=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON ) -add_dependencies(xlsxio_project libexpat_project) -add_dependencies(xlsxio_project libzip_project) diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index 9c773718d..fb5039465 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -37,6 +37,7 @@ * return true; */ +#define BUILD_XLSXIO_STATIC #include #include "DataFuncs.h" From 6da364a60b628a078c45bea1870ca3991561e404 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 00:01:47 -0700 Subject: [PATCH 33/49] ensure libexpat is used as a static lib --- depends/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index a2eafb052..9d63f3c37 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -38,10 +38,12 @@ if(WIN32) set(EXPAT_LIB_SUFFIX "MD.lib") set(LIB_SUFFIX ".lib") set(LIB_PREFIX "") + set(XLSXIO_C_FLAGS "${CMAKE_C_FLAGS} /DXML_STATIC") else() set(EXPAT_LIB_SUFFIX ".a") set(LIB_SUFFIX ".a") set(LIB_PREFIX "lib") + set(XLSXIO_C_FLAGS "${CMAKE_C_FLAGS} -DXML_STATIC") endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) @@ -76,5 +78,5 @@ ExternalProject_Add(xlsxio_project SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xlsxio INSTALL_DIR ${XLSXIO_INSTALL_DIR} BUILD_BYPRODUCTS ${XLSXIO_LIB} - CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_LIB} -DEXPAT_INCLUDE_DIRS=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON + CMAKE_ARGS ${CL_ARGS} -DCMAKE_INSTALL_PREFIX=${XLSXIO_INSTALL_DIR} -DCMAKE_BUILD_TYPE=Release -DBUILD_STATIC=ON -DBUILD_SHARED=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_TOOLS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_DOCUMENTATION=OFF -DWITH_LIBZIP=ON -DZLIB_DIR=${ZLIB_DIR} -DLIBZIP_DIR=${LIBZIP_INSTALL_DIR} -DEXPAT_DIR=${LIBEXPAT_INSTALL_DIR} -DEXPAT_LIBRARIES=${LIBEXPAT_LIB} -DEXPAT_INCLUDE_DIRS=${LIBEXPAT_INSTALL_DIR}/include -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_C_FLAGS=${XLSXIO_C_FLAGS} ) From 702228bf124ad656153c65eb17e2d9b93a107082 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 01:01:13 -0700 Subject: [PATCH 34/49] use standard CMAKE vars for prefixes and suffixes --- depends/CMakeLists.txt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt index 9d63f3c37..2437794bb 100644 --- a/depends/CMakeLists.txt +++ b/depends/CMakeLists.txt @@ -35,19 +35,15 @@ endforeach() include(ExternalProject) if(WIN32) - set(EXPAT_LIB_SUFFIX "MD.lib") - set(LIB_SUFFIX ".lib") - set(LIB_PREFIX "") + set(EXPAT_LIB_NAME_SUFFIX "MD") set(XLSXIO_C_FLAGS "${CMAKE_C_FLAGS} /DXML_STATIC") else() - set(EXPAT_LIB_SUFFIX ".a") - set(LIB_SUFFIX ".a") - set(LIB_PREFIX "lib") + set(EXPAT_LIB_NAME_SUFFIX "") set(XLSXIO_C_FLAGS "${CMAKE_C_FLAGS} -DXML_STATIC") endif() set(LIBEXPAT_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libexpat) -set(LIBEXPAT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${EXPAT_LIB_SUFFIX}) +set(LIBEXPAT_LIB ${LIBEXPAT_INSTALL_DIR}/lib/libexpat${EXPAT_LIB_NAME_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}) set(LIBEXPAT_LIB ${LIBEXPAT_LIB} PARENT_SCOPE) ExternalProject_Add(libexpat_project PREFIX libexpat @@ -58,7 +54,7 @@ ExternalProject_Add(libexpat_project ) set(LIBZIP_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzip) -set(LIBZIP_LIB ${LIBZIP_INSTALL_DIR}/lib/${LIB_PREFIX}zip${LIB_SUFFIX}) +set(LIBZIP_LIB ${LIBZIP_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zip${CMAKE_STATIC_LIBRARY_SUFFIX}) set(LIBZIP_LIB ${LIBZIP_LIB} PARENT_SCOPE) ExternalProject_Add(libzip_project PREFIX libzip @@ -70,7 +66,7 @@ ExternalProject_Add(libzip_project set(XLSXIO_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/xlsxio) set(XLSXIO_INSTALL_DIR ${XLSXIO_INSTALL_DIR} PARENT_SCOPE) -set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/${LIB_PREFIX}xlsxio_read${LIB_SUFFIX}) +set(XLSXIO_LIB ${XLSXIO_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}xlsxio_read${CMAKE_STATIC_LIBRARY_SUFFIX}) set(XLSXIO_LIB ${XLSXIO_LIB} PARENT_SCOPE) ExternalProject_Add(xlsxio_project PREFIX xlsxio From 69322ec4299e09c19d0581654d933cd29a75d4b1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 01:13:16 -0700 Subject: [PATCH 35/49] use proper USERDATA instead of LIGHTUSERDATA --- plugins/xlsxreader.cpp | 108 +++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index fb5039465..02b83127d 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -48,36 +48,53 @@ using namespace DFHack; DFHACK_PLUGIN("xlsxreader"); -typedef void* xlsx_file_handle; -typedef void* xlsx_sheet_handle; +struct handle_identity : public compound_identity { + handle_identity(): compound_identity(0, nullptr, nullptr, "handle") {}; + DFHack::identity_type type() override { return IDTYPE_OPAQUE; } +}; + +struct xlsx_file_handle { + const xlsxioreader handle; + xlsx_file_handle(xlsxioreader handle): handle(handle) {} + static handle_identity _identity; +}; + +struct xlsx_sheet_handle { + const xlsxioreadersheet handle; + xlsx_sheet_handle(xlsxioreadersheet handle): handle(handle) {} + static handle_identity _identity; +}; + +handle_identity xlsx_file_handle::_identity; +handle_identity xlsx_sheet_handle::_identity; // returns NULL on error -xlsx_file_handle open_xlsx_file(std::string filename) -{ - return xlsxioread_open(filename.c_str()); +xlsx_file_handle* open_xlsx_file(std::string filename) { + return new xlsx_file_handle(xlsxioread_open(filename.c_str())); } -void close_xlsx_file(xlsx_file_handle file_handle) -{ - xlsxioread_close((xlsxioreader)file_handle); +void close_xlsx_file(xlsx_file_handle *file_handle) { + CHECK_NULL_POINTER(file_handle); + xlsxioread_close(file_handle->handle); + delete(file_handle); } // returns XLSXIOReaderSheet object or NULL on error -xlsx_sheet_handle open_sheet(xlsx_file_handle file_handle, std::string sheet_name) -{ - if (file_handle == NULL) - return NULL; - return xlsxioread_sheet_open((xlsxioreader)file_handle, - sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); +xlsx_sheet_handle* open_sheet(xlsx_file_handle *file_handle, + std::string sheet_name) { + CHECK_NULL_POINTER(file_handle); + return new xlsx_sheet_handle( + xlsxioread_sheet_open(file_handle->handle, + sheet_name.c_str(), XLSXIOREAD_SKIP_NONE)); } -void close_sheet(xlsx_sheet_handle sheet_handle) -{ - xlsxioread_sheet_close((xlsxioreadersheet)sheet_handle); +void close_sheet(xlsx_sheet_handle *sheet_handle) { + CHECK_NULL_POINTER(sheet_handle); + xlsxioread_sheet_close(sheet_handle->handle); + delete(sheet_handle); } -static int list_callback(const XLSXIOCHAR* name, void* cbdata) -{ +static int list_callback(const XLSXIOCHAR* name, void* cbdata) { auto sheetNames = (std::vector *)cbdata; sheetNames->push_back(name); return 0; @@ -85,19 +102,16 @@ static int list_callback(const XLSXIOCHAR* name, void* cbdata) // start reading the next row of data; must be called before get_next_cell. // returns false if there is no next row to get. -static bool get_next_row(xlsx_sheet_handle sheet_handle) -{ - return xlsxioread_sheet_next_row((xlsxioreadersheet)sheet_handle) != 0; +static bool get_next_row(xlsx_sheet_handle *sheet_handle) { + return xlsxioread_sheet_next_row(sheet_handle->handle) != 0; } // fills the value param with the contents of the cell in the next column cell // in the current row. // returns false if there are no more cells in this row. -static bool get_next_cell(xlsx_sheet_handle sheet_handle, std::string& value) -{ +static bool get_next_cell(xlsx_sheet_handle *sheet_handle, std::string& value) { char* result; - if (!xlsxioread_sheet_next_cell_string( - (xlsxioreadersheet)sheet_handle, &result)) { + if (!xlsxioread_sheet_next_cell_string(sheet_handle->handle, &result)) { value.clear(); return false; } @@ -106,44 +120,35 @@ static bool get_next_cell(xlsx_sheet_handle sheet_handle, std::string& value) return true; } -// internal function to factor out handle extraction -static void * get_xlsxreader_handle(lua_State *L) -{ - if (lua_gettop(L) < 1 || lua_isnil(L, 1)) - { +// internal function to extract a handle from the first stack param +static void * get_xlsxreader_handle(lua_State *L) { + if (lua_gettop(L) < 1 || lua_isnil(L, 1)) { luaL_error(L, "invalid xlsxreader handle"); } - luaL_checktype(L, 1, LUA_TLIGHTUSERDATA); - return lua_touserdata(L, 1); + luaL_checktype(L, 1, LUA_TUSERDATA); + return LuaWrapper::get_object_ref(L, 1); } // takes a file handle and returns a table-list of sheet names -int list_sheets(lua_State *L) -{ - xlsxioreader file_handle = (xlsxioreader)get_xlsxreader_handle(L); +int list_sheets(lua_State *L) { + auto file_handle = (xlsx_file_handle *)get_xlsxreader_handle(L); auto sheetNames = std::vector(); - xlsxioread_list_sheets(file_handle, list_callback, &sheetNames); + xlsxioread_list_sheets(file_handle->handle, list_callback, &sheetNames); Lua::PushVector(L, sheetNames, true); return 1; } // takes the sheet handle and returns a table-list of strings, or nil if we // already processed the last row in the file. -int get_row(lua_State *L) -{ - xlsxioreadersheet sheet_handle = - (xlsxioreadersheet)get_xlsxreader_handle(L); +int get_row(lua_State *L) { + auto sheet_handle = (xlsx_sheet_handle *)get_xlsxreader_handle(L); bool ok = get_next_row(sheet_handle); - if (!ok) - { + if (!ok) { lua_pushnil(L); - } - else - { + } else { std::string value; auto cells = std::vector(); - while (get_next_cell(sheet_handle, value)) - { + while (get_next_cell(sheet_handle, value)) { cells.push_back(value); } Lua::PushVector(L, cells, true); @@ -166,12 +171,11 @@ DFHACK_PLUGIN_LUA_COMMANDS{ DFHACK_LUA_END }; -DFhackCExport command_result plugin_init(color_ostream &, std::vector &) -{ +DFhackCExport command_result plugin_init(color_ostream &, + std::vector &) { return CR_OK; } -DFhackCExport command_result plugin_shutdown(color_ostream &) -{ +DFhackCExport command_result plugin_shutdown(color_ostream &) { return CR_OK; } From 17c509a5961def16be02a4d1279944e89418a9b4 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 09:18:49 -0700 Subject: [PATCH 36/49] update sample code for xlsxreader to use finalize --- plugins/lua/xlsxreader.lua | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/plugins/lua/xlsxreader.lua b/plugins/lua/xlsxreader.lua index 09ba01978..323231915 100644 --- a/plugins/lua/xlsxreader.lua +++ b/plugins/lua/xlsxreader.lua @@ -16,19 +16,31 @@ Sample usage: local xlsxreader = require('plugins.xlsxreader') - local filepath = "path/to/some_file.xlsx" - local xlsx_file = xlsxreader.open_xlsx_file(filepath) - for _, sheet_name in ipairs(xlsxreader.list_sheets(xlsx_file)) do + local function dump_sheet(xlsx_file, sheet_name) print('reading sheet: '..sheet_name) local xlsx_sheet = xlsxreader.open_sheet(xlsx_file, sheet_name) - local row_cells = xlsxreader.get_row(xlsx_sheet) - while row_cells do - printall(row_cells) - row_cells = xlsxreader.get_row(xlsx_sheet) - end - xlsxreader.close_sheet(xlsx_sheet) + dfhack.with_finalize( + function () xlsxreader.close_sheet(xlsx_sheet) end, + function () + local row_cells = xlsxreader.get_row(xlsx_sheet) + while row_cells do + printall(row_cells) + row_cells = xlsxreader.get_row(xlsx_sheet) + end + end + ) end - xlsxreader.close_xlsx_file(xlsx_file) + + local filepath = "path/to/some_file.xlsx" + local xlsx_file = xlsxreader.open_xlsx_file(filepath) + dfhack.with_finalize( + function () xlsxreader.close_xlsx_file(xlsx_file) end, + function () + for _, sheet_name in ipairs(xlsxreader.list_sheets(xlsx_file)) do + dump_sheet(xlsx_file, sheet_name) + end + end + ) --]] From a2279cc9a72b567812856f6e606bba38c55e6c2f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 14:37:59 -0700 Subject: [PATCH 37/49] update docs in Lua API.rst too --- docs/Lua API.rst | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/Lua API.rst b/docs/Lua API.rst index e66989e35..45eeca78e 100644 --- a/docs/Lua API.rst +++ b/docs/Lua API.rst @@ -4119,19 +4119,31 @@ following API methods: local xlsxreader = require('plugins.xlsxreader') - local filepath = "path/to/some_file.xlsx" - local xlsx_file = xlsxreader.open_xlsx_file(filepath) - for _, sheet_name in ipairs(xlsxreader.list_sheets(xlsx_file)) do + local function dump_sheet(xlsx_file, sheet_name) print('reading sheet: '..sheet_name) local xlsx_sheet = xlsxreader.open_sheet(xlsx_file, sheet_name) - local row_cells = xlsxreader.get_row(xlsx_sheet) - while row_cells do - printall(row_cells) - row_cells = xlsxreader.get_row(xlsx_sheet) - end - xlsxreader.close_sheet(xlsx_sheet) + dfhack.with_finalize( + function () xlsxreader.close_sheet(xlsx_sheet) end, + function () + local row_cells = xlsxreader.get_row(xlsx_sheet) + while row_cells do + printall(row_cells) + row_cells = xlsxreader.get_row(xlsx_sheet) + end + end + ) end - xlsxreader.close_xlsx_file(xlsx_file) + + local filepath = "path/to/some_file.xlsx" + local xlsx_file = xlsxreader.open_xlsx_file(filepath) + dfhack.with_finalize( + function () xlsxreader.close_xlsx_file(xlsx_file) end, + function () + for _, sheet_name in ipairs(xlsxreader.list_sheets(xlsx_file)) do + dump_sheet(xlsx_file, sheet_name) + end + end + ) ======= Scripts From 0d9614154f1f85e508549941a7519b59e21135bf Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 23:04:05 -0700 Subject: [PATCH 38/49] don't turn a rst list into code --- docs/Plugins.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Plugins.rst b/docs/Plugins.rst index 9b5569e62..e98e46073 100644 --- a/docs/Plugins.rst +++ b/docs/Plugins.rst @@ -2939,7 +2939,7 @@ Lua API ======= Some plugins consist solely of native libraries exposed to Lua. They are listed -in the `lua-api` file under `lua-plugins`:: +in the `lua-api` file under `lua-plugins`: * `eventful` * `building-hacks` From 438d264b3154cb95fbf6c66d0146202b8347016c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 23:09:03 -0700 Subject: [PATCH 39/49] use separate identity classes for each handle type --- plugins/xlsxreader.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index 02b83127d..58321705d 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -48,25 +48,32 @@ using namespace DFHack; DFHACK_PLUGIN("xlsxreader"); -struct handle_identity : public compound_identity { - handle_identity(): compound_identity(0, nullptr, nullptr, "handle") {}; +struct xlsx_file_handle_identity : public compound_identity { + xlsx_file_handle_identity() + :compound_identity(0, nullptr, nullptr, "handle") {}; + DFHack::identity_type type() override { return IDTYPE_OPAQUE; } +}; + +struct xlsx_sheet_handle_identity : public compound_identity { + xlsx_sheet_handle_identity() + :compound_identity(0, nullptr, nullptr, "handle") {}; DFHack::identity_type type() override { return IDTYPE_OPAQUE; } }; struct xlsx_file_handle { const xlsxioreader handle; xlsx_file_handle(xlsxioreader handle): handle(handle) {} - static handle_identity _identity; + static xlsx_file_handle_identity _identity; }; struct xlsx_sheet_handle { const xlsxioreadersheet handle; xlsx_sheet_handle(xlsxioreadersheet handle): handle(handle) {} - static handle_identity _identity; + static xlsx_sheet_handle_identity _identity; }; -handle_identity xlsx_file_handle::_identity; -handle_identity xlsx_sheet_handle::_identity; +xlsx_file_handle_identity xlsx_file_handle::_identity; +xlsx_sheet_handle_identity xlsx_sheet_handle::_identity; // returns NULL on error xlsx_file_handle* open_xlsx_file(std::string filename) { From 1e9562bd76a83557ed4af7ac574e445f801366f8 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Mon, 10 Aug 2020 23:35:38 -0700 Subject: [PATCH 40/49] add target label for xlsxreader --- docs/Lua API.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Lua API.rst b/docs/Lua API.rst index 45eeca78e..5cecfb7f2 100644 --- a/docs/Lua API.rst +++ b/docs/Lua API.rst @@ -4102,6 +4102,8 @@ Lua plugin classes - ``shuffle()``: shuffles the sequence of numbers - ``next()``: returns next number in the sequence +.. _xlsxreader: + xlsxreader ========== From c6f9eb519a166c49d6bb37aecf3948689a71788f Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Aug 2020 13:44:07 -0700 Subject: [PATCH 41/49] remove outdated example code in xlsxreader.cpp there is already good example code in Lua API.rst and in xlsxreader.lua, so just remove this one --- plugins/xlsxreader.cpp | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index 58321705d..560d3cc2e 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -1,40 +1,5 @@ /* * Wrapper for xlsxio_read library functions. - * - * Sample usage: - * - * std::string filename = "sample_file.xlsx"; - * xlsxioreader xlsxfile = XlsxReader::open_xlsx_file(filename); - * if (xlsxfile == NULL) { - * printf("cannot open file: '%s'", filename.c_str()); - * return false; - * } - * auto sheetNames = XlsxReader::list_sheets(xlsxfile); - * for (auto sheetName = sheetNames.begin(); - * sheetName != sheetNames.end(); - * ++sheetName) { - * printf("reading sheet: %s\n", sheetName->c_str()); - * xlsxioreadersheet xlsxsheet = - * XlsxReader::open_sheet(xlsxfile, *sheetName); - * if (xlsxsheet == NULL) { - * printf("cannot open sheet: '%s'", sheetName->c_str()); - * continue; - * } - * std::string value; - * int row_num = 1; - * while (XlsxReader::GetNextRow(xlsxsheet)) { - * std::string s; - * printf("%d:\t", row_num); - * while (XlsxReader::GetNextCell(xlsxsheet, s)) { - * printf("%s\t", s.c_str()); - * } - * printf("\n"); - * ++row_num; - * } - * XlsxReader::close_sheet(xlsxsheet); - * } - * XlsxReader::close_xlsx_file(xlsxfile); - * return true; */ #define BUILD_XLSXIO_STATIC From cfc736caa1d627c800cee49221d30945bfc8567d Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Aug 2020 14:18:09 -0700 Subject: [PATCH 42/49] give the identity classes distinctive name fields both would have been represented as "handle" to Lua --- plugins/xlsxreader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index 560d3cc2e..d8e6264f7 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -15,13 +15,13 @@ DFHACK_PLUGIN("xlsxreader"); struct xlsx_file_handle_identity : public compound_identity { xlsx_file_handle_identity() - :compound_identity(0, nullptr, nullptr, "handle") {}; + :compound_identity(0, nullptr, nullptr, "xlsx_file_handle") {}; DFHack::identity_type type() override { return IDTYPE_OPAQUE; } }; struct xlsx_sheet_handle_identity : public compound_identity { xlsx_sheet_handle_identity() - :compound_identity(0, nullptr, nullptr, "handle") {}; + :compound_identity(0, nullptr, nullptr, "xlsx_sheet_handle") {}; DFHack::identity_type type() override { return IDTYPE_OPAQUE; } }; From 0bda289b1769429fa17e12862626502498440529 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Aug 2020 14:51:17 -0700 Subject: [PATCH 43/49] move xlsxreader identity statics to dfhack lib --- library/CMakeLists.txt | 3 +++ library/PluginStatics.cpp | 9 +++++++++ library/include/PluginStatics.h | 34 +++++++++++++++++++++++++++++++++ plugins/xlsxreader.cpp | 28 +-------------------------- 4 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 library/PluginStatics.cpp create mode 100644 library/include/PluginStatics.h diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 2de293e15..b551c03f9 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -40,6 +40,8 @@ set(MAIN_HEADERS include/Module.h include/Pragma.h include/MemAccess.h + include/PluginManager.h + include/PluginStatics.h include/Signal.hpp include/TileTypes.h include/Types.h @@ -72,6 +74,7 @@ set(MAIN_SOURCES MiscUtils.cpp Types.cpp PluginManager.cpp + PluginStatics.cpp TileTypes.cpp VersionInfoFactory.cpp RemoteClient.cpp diff --git a/library/PluginStatics.cpp b/library/PluginStatics.cpp new file mode 100644 index 000000000..d5abdb840 --- /dev/null +++ b/library/PluginStatics.cpp @@ -0,0 +1,9 @@ +#include "PluginStatics.h" + +namespace DFHack { + +// xlsxreader statics +DFHACK_EXPORT xlsx_file_handle_identity xlsx_file_handle::_identity; +DFHACK_EXPORT xlsx_sheet_handle_identity xlsx_sheet_handle::_identity; + +} diff --git a/library/include/PluginStatics.h b/library/include/PluginStatics.h new file mode 100644 index 000000000..b5ca4b468 --- /dev/null +++ b/library/include/PluginStatics.h @@ -0,0 +1,34 @@ +#pragma once + +#include "DataIdentity.h" + +namespace DFHack { + +// xlsxreader definitions +struct xlsx_file_handle_identity : public compound_identity { + xlsx_file_handle_identity() + :compound_identity(0, nullptr, nullptr, "xlsx_file_handle") {}; + DFHack::identity_type type() override { return IDTYPE_OPAQUE; } +}; + +struct xlsx_sheet_handle_identity : public compound_identity { + xlsx_sheet_handle_identity() + :compound_identity(0, nullptr, nullptr, "xlsx_sheet_handle") {}; + DFHack::identity_type type() override { return IDTYPE_OPAQUE; } +}; + +struct xlsx_file_handle { + typedef struct xlsxio_read_struct* xlsxioreader; + const xlsxioreader handle; + xlsx_file_handle(xlsxioreader handle): handle(handle) {} + static xlsx_file_handle_identity _identity; +}; + +struct xlsx_sheet_handle { + typedef struct xlsxio_read_sheet_struct* xlsxioreadersheet; + const xlsxioreadersheet handle; + xlsx_sheet_handle(xlsxioreadersheet handle): handle(handle) {} + static xlsx_sheet_handle_identity _identity; +}; + +} diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index d8e6264f7..6f76f5e97 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -8,38 +8,12 @@ #include "DataFuncs.h" #include "LuaTools.h" #include "PluginManager.h" +#include "PluginStatics.h" using namespace DFHack; DFHACK_PLUGIN("xlsxreader"); -struct xlsx_file_handle_identity : public compound_identity { - xlsx_file_handle_identity() - :compound_identity(0, nullptr, nullptr, "xlsx_file_handle") {}; - DFHack::identity_type type() override { return IDTYPE_OPAQUE; } -}; - -struct xlsx_sheet_handle_identity : public compound_identity { - xlsx_sheet_handle_identity() - :compound_identity(0, nullptr, nullptr, "xlsx_sheet_handle") {}; - DFHack::identity_type type() override { return IDTYPE_OPAQUE; } -}; - -struct xlsx_file_handle { - const xlsxioreader handle; - xlsx_file_handle(xlsxioreader handle): handle(handle) {} - static xlsx_file_handle_identity _identity; -}; - -struct xlsx_sheet_handle { - const xlsxioreadersheet handle; - xlsx_sheet_handle(xlsxioreadersheet handle): handle(handle) {} - static xlsx_sheet_handle_identity _identity; -}; - -xlsx_file_handle_identity xlsx_file_handle::_identity; -xlsx_sheet_handle_identity xlsx_sheet_handle::_identity; - // returns NULL on error xlsx_file_handle* open_xlsx_file(std::string filename) { return new xlsx_file_handle(xlsxioread_open(filename.c_str())); From 4f88bb4c3d3f33e44990778d41d1167bacba39fd Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Aug 2020 16:54:53 -0700 Subject: [PATCH 44/49] attempt to solve compilation error on windows --- library/include/PluginStatics.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/include/PluginStatics.h b/library/include/PluginStatics.h index b5ca4b468..a88249eae 100644 --- a/library/include/PluginStatics.h +++ b/library/include/PluginStatics.h @@ -21,14 +21,14 @@ struct xlsx_file_handle { typedef struct xlsxio_read_struct* xlsxioreader; const xlsxioreader handle; xlsx_file_handle(xlsxioreader handle): handle(handle) {} - static xlsx_file_handle_identity _identity; + DFHACK_IMPORT static xlsx_file_handle_identity _identity; }; struct xlsx_sheet_handle { typedef struct xlsxio_read_sheet_struct* xlsxioreadersheet; const xlsxioreadersheet handle; xlsx_sheet_handle(xlsxioreadersheet handle): handle(handle) {} - static xlsx_sheet_handle_identity _identity; + DFHACK_IMPORT static xlsx_sheet_handle_identity _identity; }; } From 39ae2d95fc78d547dd84002d77770a862b794ea1 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Aug 2020 17:06:28 -0700 Subject: [PATCH 45/49] 2nd attempt to solve compilation errors on windows --- library/include/PluginStatics.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/library/include/PluginStatics.h b/library/include/PluginStatics.h index a88249eae..d0835e90f 100644 --- a/library/include/PluginStatics.h +++ b/library/include/PluginStatics.h @@ -5,30 +5,30 @@ namespace DFHack { // xlsxreader definitions -struct xlsx_file_handle_identity : public compound_identity { +struct DFHACK_EXPORT xlsx_file_handle_identity : public compound_identity { xlsx_file_handle_identity() :compound_identity(0, nullptr, nullptr, "xlsx_file_handle") {}; DFHack::identity_type type() override { return IDTYPE_OPAQUE; } }; -struct xlsx_sheet_handle_identity : public compound_identity { +struct DFHACK_EXPORT xlsx_sheet_handle_identity : public compound_identity { xlsx_sheet_handle_identity() :compound_identity(0, nullptr, nullptr, "xlsx_sheet_handle") {}; DFHack::identity_type type() override { return IDTYPE_OPAQUE; } }; -struct xlsx_file_handle { +struct DFHACK_EXPORT xlsx_file_handle { typedef struct xlsxio_read_struct* xlsxioreader; const xlsxioreader handle; xlsx_file_handle(xlsxioreader handle): handle(handle) {} - DFHACK_IMPORT static xlsx_file_handle_identity _identity; + static xlsx_file_handle_identity _identity; }; -struct xlsx_sheet_handle { +struct DFHACK_EXPORT xlsx_sheet_handle { typedef struct xlsxio_read_sheet_struct* xlsxioreadersheet; const xlsxioreadersheet handle; xlsx_sheet_handle(xlsxioreadersheet handle): handle(handle) {} - DFHACK_IMPORT static xlsx_sheet_handle_identity _identity; + static xlsx_sheet_handle_identity _identity; }; } From bda678bcd4d1ca609b296bcf8effc6364ae88fa2 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 11 Aug 2020 19:47:04 -0700 Subject: [PATCH 46/49] add some explanatory text to the top of the header --- library/include/PluginStatics.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/include/PluginStatics.h b/library/include/PluginStatics.h index d0835e90f..061fd3a21 100644 --- a/library/include/PluginStatics.h +++ b/library/include/PluginStatics.h @@ -1,3 +1,11 @@ +/* + * This file and the companion PluginStatics.cpp contain static structures used + * by DFHack plugins. Linking them here, into the dfhack library, instead of + * into the plugins themselves allows the plugins to be freely unloaded and + * reloaded without fear of causing cached references to static data becoming + * corrupted. + */ + #pragma once #include "DataIdentity.h" From 1e068ef247af48f358bdc7c3bfbf7b17029bd295 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 15 Aug 2020 22:34:43 -0700 Subject: [PATCH 47/49] output useful error if new deps are not found --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cd06587eb..83eca71af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -178,7 +178,7 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") endif() # make sure all the necessary submodules have been set up -if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/clsocket/CMakeLists.txt) +if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/clsocket/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/libexpat/expat/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/libzip/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/xlsxio/CMakeLists.txt) message(SEND_ERROR "One or more required submodules could not be found! Run 'git submodule update --init' from the root DFHack directory. (See the section 'Getting the Code' in docs/Compile.rst)") endif() From 4e331ce4ce200d34ef2b8353ab03e06751c70170 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 15 Aug 2020 22:35:20 -0700 Subject: [PATCH 48/49] much better NULL handling/detection for xlsxreader --- plugins/xlsxreader.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index 6f76f5e97..dd5355a6a 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -14,13 +14,18 @@ using namespace DFHack; DFHACK_PLUGIN("xlsxreader"); -// returns NULL on error +// returns NULL if the file failed to open xlsx_file_handle* open_xlsx_file(std::string filename) { - return new xlsx_file_handle(xlsxioread_open(filename.c_str())); + xlsxioreader opaque_file_handle = xlsxioread_open(filename.c_str()); + if (!opaque_file_handle) { + return NULL; + } + return new xlsx_file_handle(opaque_file_handle); } void close_xlsx_file(xlsx_file_handle *file_handle) { CHECK_NULL_POINTER(file_handle); + CHECK_NULL_POINTER(file_handle->handle); xlsxioread_close(file_handle->handle); delete(file_handle); } @@ -29,13 +34,18 @@ void close_xlsx_file(xlsx_file_handle *file_handle) { xlsx_sheet_handle* open_sheet(xlsx_file_handle *file_handle, std::string sheet_name) { CHECK_NULL_POINTER(file_handle); - return new xlsx_sheet_handle( - xlsxioread_sheet_open(file_handle->handle, - sheet_name.c_str(), XLSXIOREAD_SKIP_NONE)); + CHECK_NULL_POINTER(file_handle->handle); + xlsxioreadersheet opaque_sheet_handle = xlsxioread_sheet_open( + file_handle->handle, sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); + if (!opaque_sheet_handle) { + return NULL; + } + return new xlsx_sheet_handle(opaque_sheet_handle); } void close_sheet(xlsx_sheet_handle *sheet_handle) { CHECK_NULL_POINTER(sheet_handle); + CHECK_NULL_POINTER(sheet_handle->handle); xlsxioread_sheet_close(sheet_handle->handle); delete(sheet_handle); } @@ -78,6 +88,7 @@ static void * get_xlsxreader_handle(lua_State *L) { // takes a file handle and returns a table-list of sheet names int list_sheets(lua_State *L) { auto file_handle = (xlsx_file_handle *)get_xlsxreader_handle(L); + CHECK_NULL_POINTER(file_handle->handle); auto sheetNames = std::vector(); xlsxioread_list_sheets(file_handle->handle, list_callback, &sheetNames); Lua::PushVector(L, sheetNames, true); @@ -88,6 +99,7 @@ int list_sheets(lua_State *L) { // already processed the last row in the file. int get_row(lua_State *L) { auto sheet_handle = (xlsx_sheet_handle *)get_xlsxreader_handle(L); + CHECK_NULL_POINTER(sheet_handle->handle); bool ok = get_next_row(sheet_handle); if (!ok) { lua_pushnil(L); From 7a7aff77454b5775ceeade08bd24da8ec6fffe5c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 15 Aug 2020 23:37:21 -0700 Subject: [PATCH 49/49] closing NULL pointers is ok --- plugins/xlsxreader.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/plugins/xlsxreader.cpp b/plugins/xlsxreader.cpp index dd5355a6a..7f61d6ff5 100644 --- a/plugins/xlsxreader.cpp +++ b/plugins/xlsxreader.cpp @@ -24,9 +24,12 @@ xlsx_file_handle* open_xlsx_file(std::string filename) { } void close_xlsx_file(xlsx_file_handle *file_handle) { - CHECK_NULL_POINTER(file_handle); - CHECK_NULL_POINTER(file_handle->handle); - xlsxioread_close(file_handle->handle); + if (!file_handle) { + return; + } + if (file_handle->handle) { + xlsxioread_close(file_handle->handle); + } delete(file_handle); } @@ -44,9 +47,12 @@ xlsx_sheet_handle* open_sheet(xlsx_file_handle *file_handle, } void close_sheet(xlsx_sheet_handle *sheet_handle) { - CHECK_NULL_POINTER(sheet_handle); - CHECK_NULL_POINTER(sheet_handle->handle); - xlsxioread_sheet_close(sheet_handle->handle); + if (!sheet_handle) { + return; + } + if (sheet_handle->handle) { + xlsxioread_sheet_close(sheet_handle->handle); + } delete(sheet_handle); }