aissia/CMakeLists.txt
StillHammer d17ee5fbdc feat: AISSIA rename and codebase updates
- Renamed project from Celuna to AISSIA
- Updated all documentation and configuration files
- Codebase improvements and fixes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 18:37:13 +07:00

398 lines
13 KiB
CMake

cmake_minimum_required(VERSION 3.20)
project(Celuna VERSION 0.2.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Export compile commands for IDE support
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# ============================================================================
# GroveEngine Integration
# ============================================================================
set(GROVE_BUILD_TESTS OFF CACHE BOOL "Disable GroveEngine tests" FORCE)
add_subdirectory(external/GroveEngine)
# ============================================================================
# Dependencies
# ============================================================================
# SQLite3 - Use bundled amalgamation for MinGW compatibility
enable_language(C) # SQLite is C code
add_library(sqlite3 STATIC
${CMAKE_CURRENT_SOURCE_DIR}/deps/sqlite/sqlite3.c
)
set_target_properties(sqlite3 PROPERTIES LINKER_LANGUAGE C)
target_include_directories(sqlite3 PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/deps/sqlite
)
target_compile_definitions(sqlite3 PRIVATE
SQLITE_THREADSAFE=1
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_JSON1
)
# Create alias to match find_package naming
add_library(SQLite::SQLite3 ALIAS sqlite3)
# OpenSSL for HTTPS (optional for MinGW)
find_package(OpenSSL QUIET)
if(NOT OPENSSL_FOUND)
message(STATUS "OpenSSL not found - HTTPS features will be disabled")
endif()
# cpp-httplib (header-only HTTP client)
include(FetchContent)
# Disable OpenSSL auto-detection in httplib if OpenSSL is not available
if(NOT OPENSSL_FOUND)
set(HTTPLIB_USE_OPENSSL_IF_AVAILABLE OFF CACHE BOOL "Disable OpenSSL in httplib" FORCE)
endif()
FetchContent_Declare(
httplib
GIT_REPOSITORY https://github.com/yhirose/cpp-httplib.git
GIT_TAG v0.14.1
)
FetchContent_MakeAvailable(httplib)
# ============================================================================
# Shared Libraries (used by services in main)
# ============================================================================
# LLM Providers Library
add_library(CelunaLLM STATIC
src/shared/llm/LLMProviderFactory.cpp
src/shared/llm/ClaudeProvider.cpp
src/shared/llm/OpenAIProvider.cpp
src/shared/llm/ToolRegistry.cpp
)
target_include_directories(CelunaLLM PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
${httplib_SOURCE_DIR}
)
target_link_libraries(CelunaLLM PUBLIC
GroveEngine::impl
spdlog::spdlog
)
# Link Winsock for httplib on Windows
if(WIN32)
target_link_libraries(CelunaLLM PUBLIC ws2_32)
endif()
if(OPENSSL_FOUND)
target_link_libraries(CelunaLLM PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(CelunaLLM PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
endif()
# Tools Library (Internal tools + FileSystem tools + MCP client + MCP server + MCP Server Tools)
add_library(CelunaTools STATIC
src/shared/tools/InternalTools.cpp
src/shared/tools/FileSystemTools.cpp
src/shared/tools/MCPServerTools.cpp
src/shared/mcp/StdioTransport.cpp
src/shared/mcp/MCPClient.cpp
src/shared/mcp/MCPServer.cpp
)
target_include_directories(CelunaTools PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(CelunaTools PUBLIC
GroveEngine::impl
spdlog::spdlog
)
# Platform Library (window tracking)
add_library(CelunaPlatform STATIC
src/shared/platform/WindowTrackerFactory.cpp
)
target_include_directories(CelunaPlatform PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(CelunaPlatform PUBLIC
spdlog::spdlog
)
if(WIN32)
target_link_libraries(CelunaPlatform PUBLIC psapi)
endif()
# Audio Library (TTS/STT)
add_library(CelunaAudio STATIC
src/shared/audio/TTSEngineFactory.cpp
src/shared/audio/STTEngineFactory.cpp
src/shared/audio/VoskSTTEngine.cpp
src/shared/audio/PocketSphinxEngine.cpp
src/shared/audio/WhisperCppEngine.cpp
)
target_include_directories(CelunaAudio PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
${httplib_SOURCE_DIR}
${nlohmann_json_SOURCE_DIR}/include
)
target_link_libraries(CelunaAudio PUBLIC
spdlog::spdlog
)
# Link Winsock for httplib on Windows
if(WIN32)
target_link_libraries(CelunaAudio PUBLIC ws2_32 sapi ole32)
endif()
if(OPENSSL_FOUND)
target_link_libraries(CelunaAudio PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(CelunaAudio PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
endif()
# Note: Si OpenSSL n'est pas trouvé, on ne définit PAS CPPHTTPLIB_OPENSSL_SUPPORT
# httplib utilisera HTTP simple sans SSL
# Optional: Link Vosk if available (Phase 7 STT)
find_library(VOSK_LIBRARY vosk)
if(VOSK_LIBRARY)
message(STATUS "Vosk found: ${VOSK_LIBRARY}")
target_link_libraries(CelunaAudio PUBLIC ${VOSK_LIBRARY})
target_compile_definitions(CelunaAudio PRIVATE HAS_VOSK)
else()
message(STATUS "Vosk not found - STT will use fallback engines only")
endif()
# Optional: Link PocketSphinx if available (Phase 7 STT)
find_library(POCKETSPHINX_LIBRARY pocketsphinx)
find_library(SPHINXBASE_LIBRARY sphinxbase)
if(POCKETSPHINX_LIBRARY AND SPHINXBASE_LIBRARY)
message(STATUS "PocketSphinx found: ${POCKETSPHINX_LIBRARY}")
target_link_libraries(CelunaAudio PUBLIC ${POCKETSPHINX_LIBRARY} ${SPHINXBASE_LIBRARY})
target_compile_definitions(CelunaAudio PRIVATE HAVE_POCKETSPHINX)
target_include_directories(CelunaAudio PRIVATE /usr/include/pocketsphinx /usr/include/sphinxbase)
else()
message(STATUS "PocketSphinx not found - keyword spotting unavailable")
endif()
# Optional: Link Whisper.cpp if available (Phase 7 STT)
find_library(WHISPER_LIBRARY whisper PATHS ${CMAKE_SOURCE_DIR}/external/whisper.cpp/build/src)
if(WHISPER_LIBRARY)
message(STATUS "Whisper.cpp found: ${WHISPER_LIBRARY}")
target_link_libraries(CelunaAudio PUBLIC ${WHISPER_LIBRARY})
target_compile_definitions(CelunaAudio PRIVATE HAVE_WHISPER_CPP)
target_include_directories(CelunaAudio PRIVATE
${CMAKE_SOURCE_DIR}/external/whisper.cpp/include
${CMAKE_SOURCE_DIR}/external/whisper.cpp/ggml/include)
else()
message(STATUS "Whisper.cpp not found - high-quality local STT unavailable")
endif()
# ============================================================================
# Infrastructure Services Library (linked into main)
# ============================================================================
add_library(CelunaServices STATIC
src/services/LLMService.cpp
src/services/StorageService.cpp
src/services/PlatformService.cpp
src/services/VoiceService.cpp
src/services/STTService.cpp
)
target_include_directories(CelunaServices PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(CelunaServices PUBLIC
GroveEngine::impl
spdlog::spdlog
CelunaLLM
CelunaTools
CelunaPlatform
CelunaAudio
SQLite::SQLite3
)
# ============================================================================
# Main Executable (with services)
# ============================================================================
add_executable(celuna
src/main.cpp
)
target_link_libraries(celuna PRIVATE
GroveEngine::impl
spdlog::spdlog
CelunaServices
)
target_include_directories(celuna PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
# ============================================================================
# Hot-Reloadable Modules (.so) - Pure business logic only
# ============================================================================
# SchedulerModule - Gestion du temps et detection hyperfocus
add_library(SchedulerModule SHARED
src/modules/SchedulerModule.cpp
)
target_link_libraries(SchedulerModule PRIVATE
GroveEngine::impl
spdlog::spdlog
)
set_target_properties(SchedulerModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
# NotificationModule - Alertes systeme
add_library(NotificationModule SHARED
src/modules/NotificationModule.cpp
)
target_link_libraries(NotificationModule PRIVATE
GroveEngine::impl
spdlog::spdlog
)
set_target_properties(NotificationModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
# StorageModule - Pure logic, no SQLite (uses StorageService via IIO)
add_library(StorageModule SHARED
src/modules/StorageModule.cpp
)
target_include_directories(StorageModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(StorageModule PRIVATE
GroveEngine::impl
spdlog::spdlog
)
set_target_properties(StorageModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
# MonitoringModule - Pure logic, no Win32 (uses PlatformService via IIO)
add_library(MonitoringModule SHARED
src/modules/MonitoringModule.cpp
)
target_include_directories(MonitoringModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(MonitoringModule PRIVATE
GroveEngine::impl
spdlog::spdlog
)
set_target_properties(MonitoringModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
# AIModule - Pure logic, no HTTP (uses LLMService via IIO)
add_library(AIModule SHARED
src/modules/AIModule.cpp
)
target_include_directories(AIModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(AIModule PRIVATE
GroveEngine::impl
spdlog::spdlog
)
set_target_properties(AIModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
# VoiceModule - Pure logic, no TTS (uses VoiceService via IIO)
add_library(VoiceModule SHARED
src/modules/VoiceModule.cpp
)
target_include_directories(VoiceModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(VoiceModule PRIVATE
GroveEngine::impl
spdlog::spdlog
)
set_target_properties(VoiceModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
# WebModule - HTTP requests via HttpClient
add_library(WebModule SHARED
src/modules/WebModule.cpp
)
target_include_directories(WebModule PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
${httplib_SOURCE_DIR}
)
target_link_libraries(WebModule PRIVATE
GroveEngine::impl
spdlog::spdlog
)
# Link Winsock for httplib on Windows
if(WIN32)
target_link_libraries(WebModule PRIVATE ws2_32)
endif()
if(OPENSSL_FOUND)
target_link_libraries(WebModule PRIVATE OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(WebModule PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
endif()
set_target_properties(WebModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
# ============================================================================
# Copy config files to build directory
# ============================================================================
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/config/
DESTINATION ${CMAKE_BINARY_DIR}/config)
# ============================================================================
# Development targets
# ============================================================================
# TestRunnerModule - Orchestrator for integration tests (Unix only - uses dlfcn.h)
if(UNIX)
add_library(TestRunnerModule SHARED
src/modules/TestRunnerModule.cpp
)
target_include_directories(TestRunnerModule PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)
target_link_libraries(TestRunnerModule PRIVATE
GroveEngine::impl
spdlog::spdlog
${CMAKE_DL_LIBS}
)
set_target_properties(TestRunnerModule PROPERTIES
PREFIX "lib"
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
)
endif()
# Quick rebuild of modules only (for hot-reload workflow)
if(UNIX)
add_custom_target(modules
DEPENDS SchedulerModule NotificationModule StorageModule MonitoringModule AIModule VoiceModule WebModule TestRunnerModule
COMMENT "Building hot-reloadable modules only"
)
else()
add_custom_target(modules
DEPENDS SchedulerModule NotificationModule StorageModule MonitoringModule AIModule VoiceModule WebModule
COMMENT "Building hot-reloadable modules only"
)
endif()
# Create data directory
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/data)
# Run Celuna
add_custom_target(run
COMMAND $<TARGET_FILE:celuna>
DEPENDS celuna modules
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Running Celuna"
)
# ============================================================================
# Tests (optional, enabled with BUILD_TESTING=ON)
# ============================================================================
option(BUILD_TESTING "Build integration tests" OFF)
if(BUILD_TESTING)
add_subdirectory(tests)
endif()
# Manual STT test executable
add_executable(test_stt_engines
tests/manual/test_stt_engines.cpp
)
target_link_libraries(test_stt_engines
CelunaAudio
spdlog::spdlog
)
# Link Winsock for httplib on Windows (already linked via CelunaLLM PUBLIC dependency)