From f077a29cf06d32e720bb688db0da5ccc7c6c12c4 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Tue, 25 Jul 2023 01:11:30 +0200 Subject: [PATCH] partial setup --- .gitmodules | 18 ++++ external/CMakeLists.txt | 14 +++ external/entt/CMakeLists.txt | 4 + external/solanaceae_contact | 1 + external/solanaceae_message3 | 1 + external/solanaceae_plugin | 1 + external/solanaceae_tox | 1 + external/solanaceae_toxcore | 1 + external/solanaceae_util | 1 + external/toxcore/.gitignore | 1 + external/toxcore/CMakeLists.txt | 186 ++++++++++++++++++++++++++++++++ res/icon/tomato_v1.svg | 77 +++++++++++++ res/icon/tomato_v1_256.png | Bin 0 -> 8500 bytes 13 files changed, 306 insertions(+) create mode 100644 .gitmodules create mode 100644 external/CMakeLists.txt create mode 100644 external/entt/CMakeLists.txt create mode 160000 external/solanaceae_contact create mode 160000 external/solanaceae_message3 create mode 160000 external/solanaceae_plugin create mode 160000 external/solanaceae_tox create mode 160000 external/solanaceae_toxcore create mode 160000 external/solanaceae_util create mode 100644 external/toxcore/.gitignore create mode 100644 external/toxcore/CMakeLists.txt create mode 100644 res/icon/tomato_v1.svg create mode 100644 res/icon/tomato_v1_256.png diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..6d6c3c34 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "external/solanaceae_toxcore"] + path = external/solanaceae_toxcore + url = https://github.com/Green-Sky/solanaceae_toxcore.git +[submodule "external/solanaceae_util"] + path = external/solanaceae_util + url = https://github.com/Green-Sky/solanaceae_util.git +[submodule "external/solanaceae_contact"] + path = external/solanaceae_contact + url = https://github.com/Green-Sky/solanaceae_contact.git +[submodule "external/solanaceae_message3"] + path = external/solanaceae_message3 + url = https://github.com/Green-Sky/solanaceae_message3.git +[submodule "external/solanaceae_tox"] + path = external/solanaceae_tox + url = https://github.com/Green-Sky/solanaceae_tox.git +[submodule "external/solanaceae_plugin"] + path = external/solanaceae_plugin + url = https://github.com/Green-Sky/solanaceae_plugin.git diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt new file mode 100644 index 00000000..dfde6314 --- /dev/null +++ b/external/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.9 FATAL_ERROR) + +add_subdirectory(./entt) + +add_subdirectory(./solanaceae_util) +add_subdirectory(./solanaceae_contact) +add_subdirectory(./solanaceae_message3) + +add_subdirectory(./solanaceae_plugin) + +add_subdirectory(./toxcore) +add_subdirectory(./solanaceae_toxcore) +add_subdirectory(./solanaceae_tox) + diff --git a/external/entt/CMakeLists.txt b/external/entt/CMakeLists.txt new file mode 100644 index 00000000..abbae8d2 --- /dev/null +++ b/external/entt/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.9 FATAL_ERROR) + +add_subdirectory(./entt EXCLUDE_FROM_ALL) + diff --git a/external/solanaceae_contact b/external/solanaceae_contact new file mode 160000 index 00000000..5397fcc5 --- /dev/null +++ b/external/solanaceae_contact @@ -0,0 +1 @@ +Subproject commit 5397fcc5c24ae7d485fe16311c52703e01f5d69c diff --git a/external/solanaceae_message3 b/external/solanaceae_message3 new file mode 160000 index 00000000..9d9a3539 --- /dev/null +++ b/external/solanaceae_message3 @@ -0,0 +1 @@ +Subproject commit 9d9a3539bdef5cebff166dc25df2379cf99053c0 diff --git a/external/solanaceae_plugin b/external/solanaceae_plugin new file mode 160000 index 00000000..614f14eb --- /dev/null +++ b/external/solanaceae_plugin @@ -0,0 +1 @@ +Subproject commit 614f14eb0a5af0324cc7940a8550f7572c54033d diff --git a/external/solanaceae_tox b/external/solanaceae_tox new file mode 160000 index 00000000..b68ef51d --- /dev/null +++ b/external/solanaceae_tox @@ -0,0 +1 @@ +Subproject commit b68ef51d641501763b59c7d8d42296c6aa927aaa diff --git a/external/solanaceae_toxcore b/external/solanaceae_toxcore new file mode 160000 index 00000000..76fbeb95 --- /dev/null +++ b/external/solanaceae_toxcore @@ -0,0 +1 @@ +Subproject commit 76fbeb9500a54cd20c333432d9b810ab0d353c70 diff --git a/external/solanaceae_util b/external/solanaceae_util new file mode 160000 index 00000000..6f2bc75b --- /dev/null +++ b/external/solanaceae_util @@ -0,0 +1 @@ +Subproject commit 6f2bc75bfa5e24ccedc9f94581dc9edccb6448f3 diff --git a/external/toxcore/.gitignore b/external/toxcore/.gitignore new file mode 100644 index 00000000..0d9d95d3 --- /dev/null +++ b/external/toxcore/.gitignore @@ -0,0 +1 @@ +c-toxcore/tox diff --git a/external/toxcore/CMakeLists.txt b/external/toxcore/CMakeLists.txt new file mode 100644 index 00000000..181f4726 --- /dev/null +++ b/external/toxcore/CMakeLists.txt @@ -0,0 +1,186 @@ +cmake_minimum_required(VERSION 3.9 FATAL_ERROR) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +set(TOX_DIR "${CMAKE_CURRENT_SOURCE_DIR}/c-toxcore/") + +# TODO: shared +add_library(toxcore STATIC + ${TOX_DIR}third_party/cmp/cmp.c + ${TOX_DIR}third_party/cmp/cmp.h + + ${TOX_DIR}toxcore/announce.c + ${TOX_DIR}toxcore/announce.h + ${TOX_DIR}toxcore/bin_pack.c + ${TOX_DIR}toxcore/bin_pack.h + ${TOX_DIR}toxcore/bin_unpack.c + ${TOX_DIR}toxcore/bin_unpack.h + ${TOX_DIR}toxcore/ccompat.c + ${TOX_DIR}toxcore/ccompat.h + ${TOX_DIR}toxcore/crypto_core.c + ${TOX_DIR}toxcore/crypto_core.h + ${TOX_DIR}toxcore/DHT.c + ${TOX_DIR}toxcore/DHT.h + ${TOX_DIR}toxcore/events/conference_connected.c + ${TOX_DIR}toxcore/events/conference_invite.c + ${TOX_DIR}toxcore/events/conference_message.c + ${TOX_DIR}toxcore/events/conference_peer_list_changed.c + ${TOX_DIR}toxcore/events/conference_peer_name.c + ${TOX_DIR}toxcore/events/conference_title.c + ${TOX_DIR}toxcore/events/events_alloc.c + ${TOX_DIR}toxcore/events/events_alloc.h + ${TOX_DIR}toxcore/events/file_chunk_request.c + ${TOX_DIR}toxcore/events/file_recv.c + ${TOX_DIR}toxcore/events/file_recv_chunk.c + ${TOX_DIR}toxcore/events/file_recv_control.c + ${TOX_DIR}toxcore/events/friend_connection_status.c + ${TOX_DIR}toxcore/events/friend_lossless_packet.c + ${TOX_DIR}toxcore/events/friend_lossy_packet.c + ${TOX_DIR}toxcore/events/friend_message.c + ${TOX_DIR}toxcore/events/friend_name.c + ${TOX_DIR}toxcore/events/friend_read_receipt.c + ${TOX_DIR}toxcore/events/friend_request.c + ${TOX_DIR}toxcore/events/friend_status.c + ${TOX_DIR}toxcore/events/friend_status_message.c + ${TOX_DIR}toxcore/events/friend_typing.c + ${TOX_DIR}toxcore/events/self_connection_status.c + ${TOX_DIR}toxcore/events/group_custom_packet.c + ${TOX_DIR}toxcore/events/group_custom_private_packet.c + ${TOX_DIR}toxcore/events/group_invite.c + ${TOX_DIR}toxcore/events/group_join_fail.c + ${TOX_DIR}toxcore/events/group_message.c + ${TOX_DIR}toxcore/events/group_moderation.c + ${TOX_DIR}toxcore/events/group_password.c + ${TOX_DIR}toxcore/events/group_peer_exit.c + ${TOX_DIR}toxcore/events/group_peer_join.c + ${TOX_DIR}toxcore/events/group_peer_limit.c + ${TOX_DIR}toxcore/events/group_peer_name.c + ${TOX_DIR}toxcore/events/group_peer_status.c + ${TOX_DIR}toxcore/events/group_privacy_state.c + ${TOX_DIR}toxcore/events/group_private_message.c + ${TOX_DIR}toxcore/events/group_self_join.c + ${TOX_DIR}toxcore/events/group_topic.c + ${TOX_DIR}toxcore/events/group_topic_lock.c + ${TOX_DIR}toxcore/events/group_voice_state.c + ${TOX_DIR}toxcore/forwarding.c + ${TOX_DIR}toxcore/forwarding.h + ${TOX_DIR}toxcore/friend_connection.c + ${TOX_DIR}toxcore/friend_connection.h + ${TOX_DIR}toxcore/friend_requests.c + ${TOX_DIR}toxcore/friend_requests.h + ${TOX_DIR}toxcore/group.c + ${TOX_DIR}toxcore/group.h + ${TOX_DIR}toxcore/group_announce.c + ${TOX_DIR}toxcore/group_announce.h + ${TOX_DIR}toxcore/group_moderation.c + ${TOX_DIR}toxcore/group_moderation.h + ${TOX_DIR}toxcore/group_chats.c + ${TOX_DIR}toxcore/group_chats.h + ${TOX_DIR}toxcore/group_common.h + ${TOX_DIR}toxcore/group_connection.c + ${TOX_DIR}toxcore/group_connection.h + ${TOX_DIR}toxcore/group_onion_announce.c + ${TOX_DIR}toxcore/group_onion_announce.h + ${TOX_DIR}toxcore/group_pack.c + ${TOX_DIR}toxcore/group_pack.h + ${TOX_DIR}toxcore/LAN_discovery.c + ${TOX_DIR}toxcore/LAN_discovery.h + ${TOX_DIR}toxcore/list.c + ${TOX_DIR}toxcore/list.h + ${TOX_DIR}toxcore/logger.c + ${TOX_DIR}toxcore/logger.h + ${TOX_DIR}toxcore/Messenger.c + ${TOX_DIR}toxcore/Messenger.h + ${TOX_DIR}toxcore/mono_time.c + ${TOX_DIR}toxcore/mono_time.h + ${TOX_DIR}toxcore/net_crypto.c + ${TOX_DIR}toxcore/net_crypto.h + ${TOX_DIR}toxcore/network.c + ${TOX_DIR}toxcore/network.h + ${TOX_DIR}toxcore/onion_announce.c + ${TOX_DIR}toxcore/onion_announce.h + ${TOX_DIR}toxcore/onion.c + ${TOX_DIR}toxcore/onion_client.c + ${TOX_DIR}toxcore/onion_client.h + ${TOX_DIR}toxcore/onion.h + ${TOX_DIR}toxcore/ping_array.c + ${TOX_DIR}toxcore/ping_array.h + ${TOX_DIR}toxcore/ping.c + ${TOX_DIR}toxcore/ping.h + ${TOX_DIR}toxcore/shared_key_cache.c + ${TOX_DIR}toxcore/shared_key_cache.h + ${TOX_DIR}toxcore/state.c + ${TOX_DIR}toxcore/state.h + ${TOX_DIR}toxcore/TCP_client.c + ${TOX_DIR}toxcore/TCP_client.h + ${TOX_DIR}toxcore/TCP_common.c + ${TOX_DIR}toxcore/TCP_common.h + ${TOX_DIR}toxcore/TCP_connection.c + ${TOX_DIR}toxcore/TCP_connection.h + ${TOX_DIR}toxcore/TCP_server.c + ${TOX_DIR}toxcore/TCP_server.h + ${TOX_DIR}toxcore/timed_auth.c + ${TOX_DIR}toxcore/timed_auth.h + ${TOX_DIR}toxcore/tox_api.c + ${TOX_DIR}toxcore/tox.c + ${TOX_DIR}toxcore/tox_dispatch.c + ${TOX_DIR}toxcore/tox_dispatch.h + ${TOX_DIR}toxcore/tox_events.c + ${TOX_DIR}toxcore/tox_events.h + ${TOX_DIR}toxcore/tox.h + ${TOX_DIR}toxcore/tox_private.c + ${TOX_DIR}toxcore/tox_private.h + ${TOX_DIR}toxcore/tox_unpack.c + ${TOX_DIR}toxcore/tox_unpack.h + ${TOX_DIR}toxcore/util.c + ${TOX_DIR}toxcore/util.h +) + +# HACK: "install" api headers into self +# this is dirty, should be binary dir +# TODO: add the others +configure_file( + ${TOX_DIR}toxcore/tox.h + ${TOX_DIR}tox/tox.h + @ONLY +) +configure_file( + ${TOX_DIR}toxcore/tox_events.h + ${TOX_DIR}tox/tox_events.h + @ONLY +) + +target_include_directories(toxcore PRIVATE "${TOX_DIR}toxcore") +target_include_directories(toxcore PUBLIC "${TOX_DIR}") + +target_compile_definitions(toxcore PUBLIC USE_IPV6=1) +#target_compile_definitions(toxcore PUBLIC MIN_LOGGER_LEVEL=LOGGER_LEVEL_DEBUG) +target_compile_definitions(toxcore PUBLIC MIN_LOGGER_LEVEL=LOGGER_LEVEL_INFO) + +find_package(unofficial-sodium CONFIG QUIET) +find_package(sodium QUIET) +if(unofficial-sodium_FOUND) # vcpkg + target_link_libraries(toxcore unofficial-sodium::sodium unofficial-sodium::sodium_config_public) +elseif(sodium_FOUND) + target_link_libraries(toxcore sodium) +else() + message(SEND_ERROR "missing libsodium") +endif() + +if(WIN32) + target_link_libraries(toxcore ws2_32 iphlpapi) +endif() + +find_package(Threads REQUIRED) +target_link_libraries(toxcore Threads::Threads) + +add_executable(DHT_Bootstrap EXCLUDE_FROM_ALL + ${TOX_DIR}other/DHT_bootstrap.c + ${TOX_DIR}other/bootstrap_node_packets.h + ${TOX_DIR}other/bootstrap_node_packets.c + ${TOX_DIR}testing/misc_tools.h + ${TOX_DIR}testing/misc_tools.c +) + +target_link_libraries(DHT_Bootstrap toxcore) + diff --git a/res/icon/tomato_v1.svg b/res/icon/tomato_v1.svg new file mode 100644 index 00000000..5f6fa386 --- /dev/null +++ b/res/icon/tomato_v1.svg @@ -0,0 +1,77 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/res/icon/tomato_v1_256.png b/res/icon/tomato_v1_256.png new file mode 100644 index 0000000000000000000000000000000000000000..39dd93881d2dabb88d8a2c9908c56448090d208e GIT binary patch literal 8500 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 MFEy1a6`-O21EHxPpa1{> literal 0 HcmV?d00001