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) # Auto-detect: if OLLIE_KF5 not explicitly set, try KF6 first, fall back to KF5. # Note: Gentoo and some distros don't ship a monolithic KF6Config.cmake; check # individual components directly instead of find_package(KF6 COMPONENTS ...). if(NOT DEFINED OLLIE_KF5 OR NOT OLLIE_KF5) find_package(KF6Runner QUIET) find_package(KF6CoreAddons QUIET) if(KF6Runner_FOUND AND KF6CoreAddons_FOUND) set(KF6_FOUND TRUE) else() message(STATUS "KF6 not found, falling back to KF5") set(OLLIE_KF5 ON) endif() endif() # 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) if(OLLIE_KF5) # --- Qt5 / KF5 --- find_package(Qt5 REQUIRED COMPONENTS Core Concurrent Widgets Quick Qml QuickControls2 Network) # 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 Runner CoreAddons Config KIO TextEditor SyntaxHighlighting ) # --- 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::Widgets ) # --- Kate Plugin --- kcoreaddons_add_plugin(ollie_kate SOURCES kate/ollie_kate.cpp kate/ollie_ghost.cpp gui/lib9pclient.cpp INSTALL_NAMESPACE "ktexteditor" ) target_include_directories(ollie_kate PRIVATE ${CMAKE_SOURCE_DIR}/gui $ENV{HOME}/.local/include ) target_link_libraries(ollie_kate KF5::TextEditor KF5::SyntaxHighlighting Qt5::Core Qt5::Widgets $ENV{HOME}/.local/lib/libollie9p.so ) # --- KIO Worker (ollie:// protocol) --- kcoreaddons_add_plugin(kio_ollie SOURCES kio/ollie_kio.cpp gui/lib9pclient.cpp INSTALL_NAMESPACE "kf5/kio" ) target_include_directories(kio_ollie PRIVATE ${CMAKE_SOURCE_DIR}/gui ${CMAKE_SOURCE_DIR}/kio $ENV{HOME}/.local/include ) target_link_libraries(kio_ollie KF5::KIOCore Qt5::Core Qt5::Network $ENV{HOME}/.local/lib/libollie9p.so ) install(FILES kio/ollie.protocol DESTINATION ${KDE_INSTALL_KSERVICESDIR}) # --- GUI App (9P-based) --- # Strip Qt6-only grouped palette syntax (palette.active.*, palette.inactive.*, # palette.disabled.*) — Qt5 QML doesn't support color-group qualifiers. # ThemeManager::applyPalette() sets the application palette which Qt Quick # Controls 2 picks up automatically. file(READ ${CMAKE_CURRENT_SOURCE_DIR}/gui/main.qml _QML_SRC) string(REGEX REPLACE "[ \t]*(//[^\n]*palette[^\n]*\n|palette\\.(active|inactive|disabled)\\.[^\n]*\n)" "" _QML_SRC "${_QML_SRC}") file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/main.qml "${_QML_SRC}") # Copy component QML files (no palette stripping needed - they don't use grouped palette) configure_file(gui/SettingsDialog.qml ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/SettingsDialog.qml COPYONLY) configure_file(gui/NewSessionDialog.qml ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/NewSessionDialog.qml COPYONLY) configure_file(gui/NewAgentDialog.qml ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/NewAgentDialog.qml COPYONLY) configure_file(gui/ChatBlockDelegate.qml ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/ChatBlockDelegate.qml COPYONLY) configure_file(gui/SessionTree.qml ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/SessionTree.qml COPYONLY) configure_file(gui/ChatPane.qml ${CMAKE_CURRENT_BINARY_DIR}/gui-kf5/ChatPane.qml 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/ollie9pclient.cpp gui/sessionmodel.cpp gui/lib9pclient.cpp gui/nativestreamer.cpp gui/chatblockmodel.cpp gui/thememanager.cpp gui/clipboardhelper.cpp ${GUI_KF5_QRC} ) target_include_directories(ollie-gui PRIVATE ${CMAKE_SOURCE_DIR}/gui $ENV{HOME}/.local/include ) target_link_libraries(ollie-gui Qt5::Core Qt5::Widgets Qt5::Quick Qt5::QuickControls2 Qt5::Network KF5::ConfigCore KF5::SyntaxHighlighting $ENV{HOME}/.local/lib/libollie9p.so ) # --- Install --- install(TARGETS ollie-gui DESTINATION ${KDE_INSTALL_BINDIR}) else() # --- Qt6 / KF6 --- find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Network) find_package(KF6 REQUIRED COMPONENTS Runner CoreAddons) find_package(KF6Config REQUIRED) find_package(KF6KIO REQUIRED) # 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::Widgets ) # --- Kate Plugin --- find_package(KF6TextEditor REQUIRED) kcoreaddons_add_plugin(ollie_kate SOURCES kate/ollie_kate.cpp kate/ollie_ghost.cpp gui/lib9pclient.cpp INSTALL_NAMESPACE "kf6/ktexteditor" ) target_include_directories(ollie_kate PRIVATE ${CMAKE_SOURCE_DIR}/gui $ENV{HOME}/.local/include ) target_link_libraries(ollie_kate KF6::TextEditor KF6::SyntaxHighlighting Qt6::Core Qt6::Widgets $ENV{HOME}/.local/lib/libollie9p.so ) # --- KIO Worker (ollie:// protocol) --- kcoreaddons_add_plugin(kio_ollie SOURCES kio/ollie_kio.cpp gui/lib9pclient.cpp INSTALL_NAMESPACE "kf6/kio" ) target_include_directories(kio_ollie PRIVATE ${CMAKE_SOURCE_DIR}/gui ${CMAKE_SOURCE_DIR}/kio $ENV{HOME}/.local/include ) target_link_libraries(kio_ollie KF6::KIOCore Qt6::Core Qt6::Network $ENV{HOME}/.local/lib/libollie9p.so ) # --- GUI App (9P-based, no D-Bus) --- find_package(KF6SyntaxHighlighting REQUIRED) add_executable(ollie-gui gui/main.cpp gui/ollie9pclient.cpp gui/sessionmodel.cpp gui/lib9pclient.cpp gui/nativestreamer.cpp gui/chatblockmodel.cpp gui/thememanager.cpp gui/clipboardhelper.cpp ) target_include_directories(ollie-gui PRIVATE ${CMAKE_SOURCE_DIR}/gui $ENV{HOME}/.local/include ) target_link_libraries(ollie-gui Qt6::Core Qt6::Widgets Qt6::Quick Qt6::QuickControls2 Qt6::Network KF6::ConfigCore KF6::SyntaxHighlighting $ENV{HOME}/.local/lib/libollie9p.so ) qt_add_resources(ollie-gui "gui" PREFIX "/" BASE gui FILES gui/main.qml gui/SettingsDialog.qml gui/NewSessionDialog.qml gui/NewAgentDialog.qml gui/ChatBlockDelegate.qml gui/SessionTree.qml gui/ChatPane.qml ) # --- Install --- install(TARGETS ollie-gui DESTINATION ${KDE_INSTALL_BINDIR}) endif()