diff --git a/CMakeLists.txt b/CMakeLists.txt index e1bdb7e..bf3e226 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,22 +1,72 @@ -cmake_minimum_required(VERSION 3.9 FATAL_ERROR) +cmake_minimum_required(VERSION 3.24 FATAL_ERROR) -project(solanaceae) +# cmake setup begin +project(solanaceae_zox) -add_library(solanaceae_zox - ./solanaceae/zox/ngc.hpp - ./solanaceae/zox/ngc.cpp +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + set(SOLANACEAE_ZOX_STANDALONE ON) +else() + set(SOLANACEAE_ZOX_STANDALONE OFF) +endif() +message("II SOLANACEAE_ZOX_STANDALONE " ${SOLANACEAE_ZOX_STANDALONE}) - ./solanaceae/zox/ngc_hs.hpp - ./solanaceae/zox/ngc_hs.cpp -) +option(SOLANACEAE_ZOX_BUILD_PLUGINS "Build the zox plugins" ${SOLANACEAE_ZOX_STANDALONE}) -target_include_directories(solanaceae_zox PUBLIC .) -target_compile_features(solanaceae_zox PUBLIC cxx_std_17) -target_link_libraries(solanaceae_zox PUBLIC - solanaceae_util - solanaceae_message3 - solanaceae_toxcore - solanaceae_tox_contacts - solanaceae_tox_messages -) +if (SOLANACEAE_ZOX_STANDALONE) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # defaulting to debug mode, if not specified + if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") + endif() + + # setup my vim ycm :D + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + + # more paths + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +endif() + +# external libs +#add_subdirectory(./external EXCLUDE_FROM_ALL) # before increasing warn levels, sad :( + +if (SOLANACEAE_ZOX_STANDALONE) + set(CMAKE_CXX_EXTENSIONS OFF) + + # bump up warning levels appropriately for clang, gcc & msvc + if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + add_compile_options( + -Wall -Wextra # Reasonable and standard + -Wpedantic # Warn if non-standard C++ is used + -Wunused # Warn on anything being unused + #-Wconversion # Warn on type conversions that may lose data + #-Wsign-conversion # Warn on sign conversions + -Wshadow # Warn if a variable declaration shadows one from a parent context + ) + + if (NOT WIN32) + #link_libraries(-fsanitize=address) + #link_libraries(-fsanitize=address,undefined) + #link_libraries(-fsanitize-address-use-after-scope) + #link_libraries(-fsanitize=undefined) + endif() + elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC") + if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + endif() + endif() + +endif() + +# cmake setup end + +add_subdirectory(./src) + +if (SOLANACEAE_ZOX_BUILD_PLUGINS) + add_subdirectory(./plugins) +endif() diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt new file mode 100644 index 0000000..c5bd9a9 --- /dev/null +++ b/plugins/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.14...3.24 FATAL_ERROR) + +add_library(plugin_zox_ngc SHARED + ./plugin_zox_ngc.cpp +) +set_property(TARGET plugin_zox_ngc PROPERTY C_VISIBILITY_PRESET hidden) + +target_link_libraries(plugin_zox_ngc PUBLIC + solanaceae_plugin + solanaceae_zox +) + +######################################## + +add_library(plugin_zox_ngc_hs SHARED + ./plugin_zox_ngc_hs.cpp +) +set_property(TARGET plugin_zox_ngc_hs PROPERTY C_VISIBILITY_PRESET hidden) + +target_link_libraries(plugin_zox_ngc_hs PUBLIC + solanaceae_plugin + solanaceae_zox +) diff --git a/plugins/plugin_zox_ngc.cpp b/plugins/plugin_zox_ngc.cpp new file mode 100644 index 0000000..389b519 --- /dev/null +++ b/plugins/plugin_zox_ngc.cpp @@ -0,0 +1,59 @@ +#include + +#include + +#include +#include +#include + +static std::unique_ptr g_zngc = nullptr; + +constexpr const char* plugin_name = "ZoxNGC"; + +extern "C" { + +SOLANA_PLUGIN_EXPORT const char* solana_plugin_get_name(void) { + return plugin_name; +} + +SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_get_version(void) { + return SOLANA_PLUGIN_VERSION; +} + +SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) { + std::cout << "PLUGIN " << plugin_name << " START()\n"; + + if (solana_api == nullptr) { + return 1; + } + + try { + auto* tox_event_provider_i = PLUG_RESOLVE_INSTANCE(ToxEventProviderI); + + // static store, could be anywhere tho + // construct with fetched dependencies + g_zngc = std::make_unique(*tox_event_provider_i); + + // register types + PLUG_PROVIDE_INSTANCE(ZoxNGCEventProviderI, plugin_name, g_zngc.get()); + } catch (const ResolveException& e) { + std::cerr << "PLUGIN " << plugin_name << " " << e.what << "\n"; + return 2; + } + + return 0; +} + +SOLANA_PLUGIN_EXPORT void solana_plugin_stop(void) { + std::cout << "PLUGIN " << plugin_name << " STOP()\n"; + + g_zngc.reset(); +} + +SOLANA_PLUGIN_EXPORT float solana_plugin_tick(float delta) { + (void)delta; + return std::numeric_limits::max(); +} + +} // extern C + diff --git a/plugins/plugin_zox_ngc_hs.cpp b/plugins/plugin_zox_ngc_hs.cpp new file mode 100644 index 0000000..28e2a8d --- /dev/null +++ b/plugins/plugin_zox_ngc_hs.cpp @@ -0,0 +1,65 @@ +#include + +#include +#include +#include +#include + +#include +#include + +static std::unique_ptr g_zngchs = nullptr; + +constexpr const char* plugin_name = "ZoxNGCHistorySync"; + +extern "C" { + +SOLANA_PLUGIN_EXPORT const char* solana_plugin_get_name(void) { + return plugin_name; +} + +SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_get_version(void) { + return SOLANA_PLUGIN_VERSION; +} + +SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) { + std::cout << "PLUGIN " << plugin_name << " START()\n"; + + if (solana_api == nullptr) { + return 1; + } + + try { + auto* tox_i = PLUG_RESOLVE_INSTANCE(ToxI); + auto* tox_event_provider_i = PLUG_RESOLVE_INSTANCE(ToxEventProviderI); + auto* zox_ngc_event_provider_i = PLUG_RESOLVE_INSTANCE(ZoxNGCEventProviderI); + auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1"); + auto* tcm = PLUG_RESOLVE_INSTANCE(ToxContactModel2); + auto* rmm = PLUG_RESOLVE_INSTANCE(RegistryMessageModel); + + // static store, could be anywhere tho + // construct with fetched dependencies + g_zngchs = std::make_unique(*tox_event_provider_i, *zox_ngc_event_provider_i, *tox_i, *cr, *tcm, *rmm); + + // register types + PLUG_PROVIDE_INSTANCE(ZoxNGCHistorySync, plugin_name, g_zngchs.get()); + } catch (const ResolveException& e) { + std::cerr << "PLUGIN " << plugin_name << " " << e.what << "\n"; + return 2; + } + + return 0; +} + +SOLANA_PLUGIN_EXPORT void solana_plugin_stop(void) { + std::cout << "PLUGIN " << plugin_name << " STOP()\n"; + + g_zngchs.reset(); +} + +SOLANA_PLUGIN_EXPORT float solana_plugin_tick(float delta) { + return g_zngchs->tick(delta); +} + +} // extern C + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..5fbbd95 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,19 @@ +add_library(solanaceae_zox + ./solanaceae/zox/ngc.hpp + ./solanaceae/zox/ngc.cpp + + # TODO: seperate out + ./solanaceae/zox/ngc_hs.hpp + ./solanaceae/zox/ngc_hs.cpp +) + +target_include_directories(solanaceae_zox PUBLIC .) +target_compile_features(solanaceae_zox PUBLIC cxx_std_17) +target_link_libraries(solanaceae_zox PUBLIC + solanaceae_util + solanaceae_message3 + solanaceae_toxcore + solanaceae_tox_contacts + solanaceae_tox_messages +) + diff --git a/solanaceae/zox/ngc.cpp b/src/solanaceae/zox/ngc.cpp similarity index 100% rename from solanaceae/zox/ngc.cpp rename to src/solanaceae/zox/ngc.cpp diff --git a/solanaceae/zox/ngc.hpp b/src/solanaceae/zox/ngc.hpp similarity index 100% rename from solanaceae/zox/ngc.hpp rename to src/solanaceae/zox/ngc.hpp diff --git a/solanaceae/zox/ngc_hs.cpp b/src/solanaceae/zox/ngc_hs.cpp similarity index 100% rename from solanaceae/zox/ngc_hs.cpp rename to src/solanaceae/zox/ngc_hs.cpp diff --git a/solanaceae/zox/ngc_hs.hpp b/src/solanaceae/zox/ngc_hs.hpp similarity index 100% rename from solanaceae/zox/ngc_hs.hpp rename to src/solanaceae/zox/ngc_hs.hpp