cmake_minimum_required(VERSION 3.16) project(kde-ollie VERSION 0.1.0 LANGUAGES CXX) option(OLLIE_KF5 "Build against KF5/Qt5 (Plasma 5.27)" OFF) # Suppress CMP0160 warnings from KF5 cmake files (read-only IMPORTED property) if(OLLIE_KF5) cmake_policy(SET CMP0160 OLD) endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # --- Find libkateprivate for Kate's built-in diff viewer --- file(GLOB _KATEPRIVATE_CANDIDATES "/usr/lib64/libkateprivate.so*" "/usr/lib/libkateprivate.so*" "/usr/lib/x86_64-linux-gnu/libkateprivate.so*" "/usr/lib/aarch64-linux-gnu/libkateprivate.so*") if(_KATEPRIVATE_CANDIDATES) list(GET _KATEPRIVATE_CANDIDATES 0 KATEPRIVATE_LIB) message(STATUS "Found libkateprivate: ${KATEPRIVATE_LIB}") set(HAVE_KATE_DIFF TRUE) else() set(KATEPRIVATE_LIB "") set(HAVE_KATE_DIFF FALSE) message(STATUS "libkateprivate not found -- diffs will render inline") endif() if(OLLIE_KF5) # --- Qt5 / KF5 --- find_package(Qt5 REQUIRED COMPONENTS Core DBus Widgets Quick Qml QuickControls2) # Override KDE_INSTALL_PLUGINDIR so kcoreaddons_add_plugin installs under # CMAKE_INSTALL_PREFIX (e.g. ~/.local/lib/qt5/plugins), not the system dir. set(KDE_INSTALL_PLUGINDIR "lib/qt5/plugins" CACHE PATH "" FORCE) find_package(KF5 REQUIRED COMPONENTS Notifications Runner CoreAddons Config Plasma TextEditor SyntaxHighlighting ) # --- System Tray --- add_executable(ollie-tray tray/main.cpp tray/ollie_tray.cpp ) target_include_directories(ollie-tray PRIVATE ${CMAKE_SOURCE_DIR} ) target_link_libraries(ollie-tray Qt5::Core Qt5::DBus Qt5::Widgets KF5::Notifications ) # --- KRunner Plugin --- kcoreaddons_add_plugin(krunner_ollie SOURCES krunner/ollie_runner.cpp INSTALL_NAMESPACE "kf5/krunner") target_link_libraries(krunner_ollie KF5::Runner Qt5::Core Qt5::DBus Qt5::Widgets ) # --- Kate Plugin --- kcoreaddons_add_plugin(ollie_kate SOURCES kate/ollie_kate.cpp kate/ollie_ghost.cpp kate/chat_renderer.cpp INSTALL_NAMESPACE "ktexteditor") target_link_libraries(ollie_kate KF5::TextEditor KF5::SyntaxHighlighting Qt5::Core Qt5::DBus Qt5::Widgets ) if(HAVE_KATE_DIFF) target_compile_definitions(ollie_kate PRIVATE HAVE_KATE_DIFF) target_include_directories(ollie_kate PRIVATE ${CMAKE_SOURCE_DIR}/kate) target_link_libraries(ollie_kate ${KATEPRIVATE_LIB}) endif() # --- Plasmoid QML Plugin (manual for Qt5) --- add_library(ollie-plasmoid-plugin SHARED plasmoid/plugin/olliedbusclient.cpp plasmoid/plugin/qmlplugin.cpp ) target_link_libraries(ollie-plasmoid-plugin Qt5::Core Qt5::DBus Qt5::Quick Qt5::Qml ) target_include_directories(ollie-plasmoid-plugin PRIVATE ${CMAKE_SOURCE_DIR}/plasmoid/plugin ) set_target_properties(ollie-plasmoid-plugin PROPERTIES OUTPUT_NAME "ollieprivateplugin" ) # --- Plasmoid Package --- plasma_install_package(plasmoid org.ollie.plasmoid) # --- GUI App --- configure_file(gui/main-kf5.qml ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/main.qml COPYONLY) configure_file(gui/emojis.js ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/emojis.js COPYONLY) configure_file(gui/qml.qrc ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/qml.qrc COPYONLY) qt5_add_resources(GUI_KF5_QRC ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/qml.qrc) add_executable(ollie-gui gui/main.cpp gui/thememanager.cpp gui/chatblockmodel.cpp plasmoid/plugin/olliedbusclient.cpp ${GUI_KF5_QRC} ) target_include_directories(ollie-gui PRIVATE ${CMAKE_SOURCE_DIR}/plasmoid/plugin ${CMAKE_SOURCE_DIR}/gui ) target_link_libraries(ollie-gui Qt5::Core Qt5::DBus Qt5::Widgets Qt5::Quick Qt5::Qml Qt5::QuickControls2 KF5::ConfigCore KF5::SyntaxHighlighting ) # --- Install --- install(TARGETS ollie-tray ollie-gui DESTINATION ${KDE_INSTALL_BINDIR}) install(TARGETS ollie-plasmoid-plugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/ollie/private) install(FILES plasmoid/plugin/qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/ollie/private) else() # --- Qt6 / KF6 --- find_package(Qt6 REQUIRED COMPONENTS Core DBus Widgets Quick QuickControls2 Multimedia) find_package(KF6StatusNotifierItem REQUIRED) find_package(KF6 REQUIRED COMPONENTS Runner Notifications CoreAddons Config) find_package(Plasma REQUIRED) # --- System Tray --- add_executable(ollie-tray tray/main.cpp tray/ollie_tray.cpp ) target_include_directories(ollie-tray PRIVATE ${CMAKE_SOURCE_DIR} ) target_link_libraries(ollie-tray Qt6::Core Qt6::DBus Qt6::Widgets KF6::StatusNotifierItem ) # KDE's KDE_INSTALL_PLUGINDIR defaults to lib64/plugins/ but Qt6 plugins # live under lib64/qt6/plugins/. Override so kcoreaddons_add_plugin installs # to the correct location. set(KDE_INSTALL_PLUGINDIR "${QT6_INSTALL_PLUGINS}" CACHE PATH "" FORCE) # --- KRunner Plugin --- kcoreaddons_add_plugin(krunner_ollie SOURCES krunner/ollie_runner.cpp INSTALL_NAMESPACE "kf6/krunner") target_link_libraries(krunner_ollie KF6::Runner Qt6::Core Qt6::DBus Qt6::Widgets ) # --- Kate Plugin --- find_package(KF6TextEditor REQUIRED) find_package(KF6SyntaxHighlighting REQUIRED) kcoreaddons_add_plugin(ollie_kate SOURCES kate/ollie_kate.cpp kate/ollie_ghost.cpp kate/chat_renderer.cpp INSTALL_NAMESPACE "kf6/ktexteditor") target_link_libraries(ollie_kate KF6::TextEditor KF6::SyntaxHighlighting Qt6::Core Qt6::DBus Qt6::Widgets ) if(HAVE_KATE_DIFF) target_compile_definitions(ollie_kate PRIVATE HAVE_KATE_DIFF) target_include_directories(ollie_kate PRIVATE ${CMAKE_SOURCE_DIR}/kate) target_link_libraries(ollie_kate ${KATEPRIVATE_LIB}) endif() # --- Plasmoid QML Plugin --- qt6_add_qml_module(ollie-plasmoid-plugin URI org.ollie.private VERSION 1.0 SOURCES plasmoid/plugin/olliedbusclient.h plasmoid/plugin/olliedbusclient.cpp OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/org/ollie/private ) target_link_libraries(ollie-plasmoid-plugin PRIVATE Qt6::Core Qt6::DBus Qt6::Quick ) target_include_directories(ollie-plasmoid-plugin PRIVATE ${CMAKE_SOURCE_DIR}/plasmoid/plugin ) # --- Plasmoid Package --- plasma_install_package(plasmoid org.ollie.plasmoid) # --- GUI App --- add_executable(ollie-gui gui/main.cpp gui/thememanager.cpp gui/chatblockmodel.cpp plasmoid/plugin/olliedbusclient.cpp ) target_include_directories(ollie-gui PRIVATE ${CMAKE_SOURCE_DIR}/plasmoid/plugin ${CMAKE_SOURCE_DIR}/gui ) target_link_libraries(ollie-gui Qt6::Core Qt6::DBus Qt6::Widgets Qt6::Quick Qt6::QuickControls2 Qt6::Multimedia KF6::ConfigCore KF6::SyntaxHighlighting ) qt_add_resources(ollie-gui "gui" PREFIX "/" FILES gui/main.qml gui/ChatPane.qml gui/SessionGraph.qml gui/emojis.js ) # --- Install --- install(TARGETS ollie-tray ollie-gui DESTINATION ${KDE_INSTALL_BINDIR}) install(TARGETS ollie-plasmoid-plugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/ollie/private) endif()