cmake_minimum_required(VERSION 3.16) project(WinoMailQt VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Find Qt components find_package(Qt6 COMPONENTS Core Gui Widgets Network Sql WebEngineWidgets Qml Multimedia REQUIRED) # Optional: DTK Widgets for Deepin look option(USE_DTKWIDGET "Use DTK Widgets for Deepin look" ON) if(USE_DTKWIDGET) find_package(PkgConfig) pkg_check_modules(DTKWIDGET dtkwidget) if(DTKWIDGET_FOUND) message(STATUS "Found DTKWidget: ${DTKWIDGET_VERSION}") add_definitions(-DDTKWIDGET_FOUND) include_directories(${DTKWIDGET_INCLUDE_DIRS}) set(DTKWIDGET_LIBS ${DTKWIDGET_LIBRARIES}) else() message(WARNING "DTKWidget not found, using fallback Qt widgets") set(USE_DTKWIDGET OFF) endif() endif() # Find optional libraries (example: libetpan, gmime) find_package(PkgConfig) pkg_check_modules(GMIME gmime-3.0) # Include directories include_directories(${PROJECT_SOURCE_DIR}/src) if(USE_DTKWIDGET AND DTKWIDGET_FOUND) include_directories(${DTKWIDGET_INCLUDE_DIRS}) endif() if(GMIME_FOUND) include_directories(${GMIME_INCLUDE_DIRS}) endif() # Enable automatic moc, uic, rcc set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) # Source files set(SRC_FILES src/main.cpp src/core/translator.cpp src/core/mailitem.cpp src/core/models/account.cpp src/core/models/folder.cpp src/services/synchronizer.cpp src/services/imap/imapsynchronizer.cpp src/services/outlook/outlooksynchronizer.cpp src/services/gmail/gmailsynchronizer.cpp src/services/request.cpp src/services/concreterequests.cpp src/services/requestprocessor.cpp src/services/changetype.cpp src/services/changprocessor.cpp src/db/databasemanager.cpp src/db/dao/accountdao.cpp src/db/dao/folderdao.cpp src/db/dao/mailitemdao.cpp src/db/dbchangeprocessor.cpp src/core/eventbus.cpp src/utils/notificationmanager.cpp src/core/emailmanager.cpp src/core/emailcomposerbridge.cpp src/core/synchronizerprovider.cpp src/syncscheduler.cpp src/core/accountsetupdialoglauncher.cpp src/ui/dialogs/accountsetupdialog.cpp resources.qrc ) # Executable add_executable(wino-mail-qt ${SRC_FILES}) # Link Qt target_link_libraries(wino-mail-qt PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::Sql Qt6::WebEngineWidgets Qt6::Qml Qt6::Quick Qt6::Multimedia) # Link DTKWidget if found if(USE_DTKWIDGET AND DTKWIDGET_FOUND) target_link_libraries(wino-mail-qt PRIVATE ${DTKWIDGET_LIBS}) endif() # If using external libs target_link_libraries(wino-mail-qt PRIVATE ${GMIME_LIBRARIES}) target_include_directories(wino-mail-qt PRIVATE ${GMIME_INCLUDE_DIRS}) # Install (optional) install(TARGETS wino-mail-qt DESTINATION bin) # Enable testing enable_testing() # Find Qt Test find_package(Qt6 COMPONENTS Test REQUIRED) # Unit tests for DAOs add_executable(tests_dao_unit tests/unit/test_accountdao.cpp tests/unit/test_folderdao.cpp tests/unit/test_mailitemdao.cpp ) target_link_libraries(tests_dao_unit PRIVATE Qt6::Core Qt6::Test ) if(USE_DTKWIDGET AND DTKWIDGET_FOUND) target_link_libraries(tests_dao_unit PRIVATE ${DTKWIDGET_LIBS}) endif() if(GMIME_FOUND) target_link_libraries(tests_dao_unit PRIVATE ${GMIME_LIBRARIES}) target_include_directories(tests_dao_unit PRIVATE ${GMIME_INCLUDE_DIRS}) endif() add_test(NAME dao_unit COMMAND tests_dao_unit) # Unit tests for Translator add_executable(tests_translator_unit tests/unit/test_translator.cpp ) target_link_libraries(tests_translator_unit PRIVATE Qt6::Core Qt6::Test ) if(USE_DTKWIDGET AND DTKWIDGET_FOUND) target_link_libraries(tests_translator_unit PRIVATE ${DTKWIDGET_LIBS}) endif() if(GMIME_FOUND) target_link_libraries(tests_translator_unit PRIVATE ${GMIME_LIBRARIES}) target_include_directories(tests_translator_unit PRIVATE ${GMIME_INCLUDE_DIRS}) endif() add_test(NAME translator_unit COMMAND tests_translator_unit) # Unit tests for EventBus add_executable(tests_eventbus_unit tests/unit/test_eventbus.cpp ) target_link_libraries(tests_eventbus_unit PRIVATE Qt6::Core Qt6::Test ) if(USE_DTKWIDGET AND DTKWIDGET_FOUND) target_link_libraries(tests_eventbus_unit PRIVATE ${DTKWIDGET_LIBS}) endif() if(GMIME_FOUND) target_link_libraries(tests_eventbus_unit PRIVATE ${GMIME_LIBRARIES}) target_include_directories(tests_eventbus_unit PRIVATE ${GMIME_INCLUDE_DIRS}) endif() add_test(NAME eventbus_unit COMMAND tests_eventbus_unit) # Integration tests (require full application context) add_executable(tests_sync_integration tests/integration/test_syncscheduler.cpp tests/integration/test_notificationmanager.cpp ) target_link_libraries(tests_sync_integration PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::Sql Qt6::Test ) if(USE_DTKWIDGET AND DTKWIDGET_FOUND) target_link_libraries(tests_sync_integration PRIVATE ${DTKWIDGET_LIBS}) endif() if(GMIME_FOUND) target_link_libraries(tests_sync_integration PRIVATE ${GMIME_LIBRARIES}) target_include_directories(tests_sync_integration PRIVATE ${GMIME_INCLUDE_DIRS}) endif() add_test(NAME sync_integration COMMAND tests_sync_integration)