Project reorganization

This commit is contained in:
Blue 2025-04-20 20:13:05 +03:00
parent d6f95d89fa
commit a1ec9f731d
Signed by: blue
GPG Key ID: 9B203B252A63EE38
38 changed files with 182 additions and 87 deletions

View File

@ -1,12 +1,84 @@
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.10)
project(jay project(jay
VERSION 0.0.1 VERSION 0.0.1
LANGUAGES CXX LANGUAGES CXX
) )
# Build type options
option(JAY_ENABLE_ASAN "Enable Address Sanitizer" OFF)
option(JAY_ENABLE_UBSAN "Enable Undefined Behavior Sanitizer" OFF)
option(JAY_ENABLE_TSAN "Enable Thread Sanitizer" OFF)
option(JAY_ENABLE_STRICT "Enable strict compiler warnings" OFF)
option(JAY_ENABLE_LTO "Enable Link Time Optimization" OFF)
# Set default build type if not specified
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build (Debug/Release)" FORCE)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID}")
set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
add_compile_options(
-Wall
-Wextra
-Wpedantic
)
if(JAY_ENABLE_STRICT)
add_compile_options(
-Werror
-Wconversion
-Wnon-virtual-dtor
-Wold-style-cast
-Wcast-align
-Wunused
-Woverloaded-virtual
-Wsign-conversion
-Wnull-dereference
)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_options(-O0 -g3 -ggdb)
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_options(-O3 -DNDEBUG)
endif()
if(JAY_ENABLE_ASAN)
add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
add_link_options(-fsanitize=address)
endif()
if(JAY_ENABLE_UBSAN)
add_compile_options(-fsanitize=undefined)
add_link_options(-fsanitize=undefined)
endif()
if(JAY_ENABLE_TSAN)
add_compile_options(-fsanitize=thread)
add_link_options(-fsanitize=thread)
endif()
endif()
# Link Time Optimization
if(JAY_ENABLE_LTO)
include(CheckIPOSupported)
check_ipo_supported(RESULT supported OUTPUT error)
if(supported)
message(STATUS "IPO / LTO enabled")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(STATUS "IPO / LTO not supported: <${error}>")
endif()
endif()
cmake_policy(SET CMP0076 NEW) cmake_policy(SET CMP0076 NEW)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
@ -18,20 +90,4 @@ pkg_check_modules(UUID REQUIRED uuid)
set(EXEC_NAME "jay") set(EXEC_NAME "jay")
add_executable(${EXEC_NAME} main.cpp jay.cpp) add_subdirectory(src)
add_subdirectory(component)
add_subdirectory(connection)
add_subdirectory(module)
add_subdirectory(shared)
target_include_directories(${EXEC_NAME} PRIVATE ${GLOOX_INCLUDE_DIRS})
target_include_directories(${EXEC_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(${EXEC_NAME} PRIVATE ${UUID_INCLUDE_DIRS})
target_link_libraries(${EXEC_NAME} PRIVATE
${GLOOX_LIBRARIES}
yaml-cpp
${UUID_LIBRARIES}
)
install(TARGETS ${EXEC_NAME} RUNTIME DESTINATION bin)

View File

@ -1,17 +0,0 @@
set(SOURCES
config.cpp
actor.cpp
router.cpp
core.cpp
loop.cpp
)
set(HEADERS
config.h
actor.h
router.h
core.h
loop.h
)
target_sources(${EXEC_NAME} PRIVATE ${SOURCES})

View File

@ -1,13 +0,0 @@
set(SOURCES
module.cpp
actor.cpp
publish.cpp
)
set(HEADERS
module.h
actor.h
publish.h
)
target_sources(${EXEC_NAME} PRIVATE ${SOURCES})

View File

@ -1,15 +0,0 @@
set(SOURCES
logger.cpp
loggable.cpp
utils.cpp
)
set(HEADERS
logger.h
loggable.h
definitions.h
result.h
utils.h
)
target_sources(${EXEC_NAME} PRIVATE ${SOURCES})

28
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,28 @@
set(SOURCES
main.cpp
jay.cpp
)
set(HEADERS
jay.h
)
add_executable(${EXEC_NAME} main.cpp jay.cpp)
add_subdirectory(component)
add_subdirectory(connection)
add_subdirectory(module)
add_subdirectory(shared)
target_sources(${EXEC_NAME} PRIVATE ${SOURCES})
target_include_directories(${EXEC_NAME} PRIVATE ${GLOOX_INCLUDE_DIRS})
target_include_directories(${EXEC_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(${EXEC_NAME} PRIVATE ${UUID_INCLUDE_DIRS})
target_link_libraries(${EXEC_NAME} PRIVATE
${GLOOX_LIBRARIES}
yaml-cpp
${UUID_LIBRARIES}
)
install(TARGETS ${EXEC_NAME} RUNTIME DESTINATION bin)

View File

@ -0,0 +1,17 @@
set(SOURCES
config.cpp
actor.cpp
router.cpp
core.cpp
loop.cpp
)
set(HEADERS
config.h
actor.h
router.h
core.h
loop.h
)
target_sources(${EXEC_NAME} PRIVATE ${SOURCES})

View File

@ -3,9 +3,9 @@
#include "actor.h" #include "actor.h"
Actor::Actor(const std::string& jid, const std::string& group) : Actor::Actor(const std::string& _jid, const std::string& _group) :
jid(jid), jid(_jid),
group(group) group(_group)
{} {}
void Actor::setGroup(const std::string& newGroup) { void Actor::setGroup(const std::string& newGroup) {

View File

@ -70,6 +70,6 @@ void Core::initializeActors() {
} }
void Core::initializeResponses() { void Core::initializeResponses() {
for (const std::pair<Shared::Result, Shared::Strings>& pair : config.getResponses()) for (const std::pair<const Shared::Result, Shared::Strings>& pair : config.getResponses())
router.setResponses(pair.first, pair.second); router.setResponses(pair.first, pair.second);
} }

View File

@ -5,9 +5,12 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <stdio.h>
#include <string.h> #include <cstring>
#include <csignal> #include <csignal>
#include <stdexcept>
#include "shared/definitions.h"
Loop::Loop(const Shared::Logger& logger): Loop::Loop(const Shared::Logger& logger):
Shared::Loggable(logger, {"Loop"}), Shared::Loggable(logger, {"Loop"}),
@ -19,8 +22,9 @@ Loop::Loop(const Shared::Logger& logger):
running(false) running(false)
{ {
if (pipe(wakePipe) < 0) { if (pipe(wakePipe) < 0) {
fatal(std::string("pipe: ") + strerror(errno)); std::string message(strerror(errno));
std::exit(1); fatal("could not create Loop: " + message);
throw std::runtime_error(message);
} }
fcntl(wakePipe[0], F_SETFL, O_NONBLOCK); fcntl(wakePipe[0], F_SETFL, O_NONBLOCK);
@ -203,6 +207,9 @@ void Loop::unregisterInstance(Loop* loop) {
} }
void Loop::signalHandler(int signum) { void Loop::signalHandler(int signum) {
UNUSED(signum);
std::lock_guard lock(instanceMutex);
for (Loop* loop : instances) for (Loop* loop : instances)
loop->stop(); loop->stop();
} }

View File

@ -19,7 +19,7 @@ public:
typedef std::function<void()> Callback; typedef std::function<void()> Callback;
typedef std::map<int, Callback> Handlers; typedef std::map<int, Callback> Handlers;
Loop(const Shared::Logger& logger); explicit Loop(const Shared::Logger& logger);
~Loop(); ~Loop();
void run(); void run();
@ -35,7 +35,6 @@ private:
void syncHandlers(); void syncHandlers();
private: private:
int wakePipe[2]; int wakePipe[2];
Handlers handlers; Handlers handlers;
Handlers handlersToAdd; Handlers handlersToAdd;

View File

@ -1,9 +1,9 @@
set(SOURCES set(SOURCES
connection.cpp connection.cpp
) )
set(HEADERS set(HEADERS
connection.h connection.h
) )
target_sources(${EXEC_NAME} PRIVATE ${SOURCES}) target_sources(${EXEC_NAME} PRIVATE ${SOURCES})

View File

@ -70,7 +70,7 @@ int Connection::connect() {
} }
void Connection::disconnect() { void Connection::disconnect() {
if (state != connecting || state != connected) if (state != connecting && state != connected)
return; return;
gloox->disconnect(); gloox->disconnect();
@ -125,6 +125,8 @@ std::string Connection::errorTypeToString(gloox::StanzaErrorType err) {
} }
void Connection::handleMessage(const gloox::Message& message, gloox::MessageSession* session) { void Connection::handleMessage(const gloox::Message& message, gloox::MessageSession* session) {
UNUSED(session);
if (message.subtype() != gloox::Message::Chat) if (message.subtype() != gloox::Message::Chat)
return; return;
@ -138,6 +140,9 @@ void Connection::handleMessage(const gloox::Message& message, gloox::MessageSess
} }
void Connection::handleItemPublication(const std::string& id, const gloox::JID& service, const std::string& node, const gloox::PubSub::ItemList& itemList, const gloox::Error* err) { void Connection::handleItemPublication(const std::string& id, const gloox::JID& service, const std::string& node, const gloox::PubSub::ItemList& itemList, const gloox::Error* err) {
UNUSED(itemList);
UNUSED(err);
std::string srv(node + "@" + service.full()); std::string srv(node + "@" + service.full());
if (err) { if (err) {

View File

View File

@ -4,13 +4,11 @@
#include "jay.h" #include "jay.h"
#include <string> #include <string>
#include <sstream>
#include <iostream> #include <iostream>
std::string readEnv(const std::string& key, const std::string& defaultValue = "") { std::string readEnv(const std::string& key, const std::string& defaultValue = "") {
const char* val = std::getenv(key.data()); if (const char* val = std::getenv(key.data()))
if (val) return {val};
return std::string(val);
return defaultValue; return defaultValue;
} }

13
src/module/CMakeLists.txt Normal file
View File

@ -0,0 +1,13 @@
set(SOURCES
module.cpp
actor.cpp
publish.cpp
)
set(HEADERS
module.h
actor.h
publish.h
)
target_sources(${EXEC_NAME} PRIVATE ${SOURCES})

15
src/shared/CMakeLists.txt Normal file
View File

@ -0,0 +1,15 @@
set(SOURCES
logger.cpp
loggable.cpp
utils.cpp
)
set(HEADERS
logger.h
loggable.h
definitions.h
result.h
utils.h
)
target_sources(${EXEC_NAME} PRIVATE ${SOURCES})

View File

@ -7,6 +7,8 @@
#include <vector> #include <vector>
#include <map> #include <map>
#define UNUSED(x) (void)(x)
namespace Shared { namespace Shared {
typedef std::vector<std::string> Strings; typedef std::vector<std::string> Strings;
typedef std::map<std::string, Strings> Permissions; typedef std::map<std::string, Strings> Permissions;

View File

@ -3,9 +3,9 @@
#include "loggable.h" #include "loggable.h"
Shared::Loggable::Loggable(const Logger& logger, const std::vector<std::string>& domain) : Shared::Loggable::Loggable(const Logger& _logger, const std::vector<std::string>& _domain) :
logger(logger), logger(_logger),
domain(domain) domain(_domain)
{} {}
void Shared::Loggable::trace(const std::string& message) const { void Shared::Loggable::trace(const std::string& message) const {

View File

@ -120,7 +120,7 @@ Shared::Logger::Logger(Level level):
level(level) level(level)
{} {}
Shared::Logger::~Logger() {} Shared::Logger::~Logger() = default;
void Shared::Logger::handleLog(gloox::LogLevel level, gloox::LogArea area, const std::string& message) { void Shared::Logger::handleLog(gloox::LogLevel level, gloox::LogArea area, const std::string& message) {
writeTimestamp(); writeTimestamp();

View File

@ -22,8 +22,8 @@ public:
}; };
public: public:
Logger(Level level = info); explicit Logger(Level level = info);
~Logger(); ~Logger() override;
void handleLog(gloox::LogLevel level, gloox::LogArea area, const std::string& message) override; void handleLog(gloox::LogLevel level, gloox::LogArea area, const std::string& message) override;