cmake_minimum_required(VERSION 3.16) project(kde-ollie VERSION 0.1.0 LANGUAGES CXX) # Default to user-local install if no prefix specified if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Install prefix" FORCE) endif() # Ensure Qt6 is used set(QT_DEFAULT_MAJOR_VERSION 6) # Build lib9p (Go shared library) as part of the cmake build. set(OLLIE9P_LIBRARY "${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.so") set(OLLIE9P_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.h") set(OLLIE9P_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib9p") add_custom_command( OUTPUT "${OLLIE9P_LIBRARY}" "${OLLIE9P_HEADER}" COMMAND go build -buildmode=c-shared -o "${OLLIE9P_LIBRARY}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib9p" COMMENT "Building lib9p (Go shared library)" VERBATIM ) add_custom_target(lib9p_build DEPENDS "${OLLIE9P_LIBRARY}" "${OLLIE9P_HEADER}") # The native clients link against the bundled C ABI library. Install it as a # normal runtime library beside the executable, not in the Qt plugin tree. # CMAKE_INSTALL_LIBDIR is relative to the install prefix (normally lib). add_library(ollie9p SHARED IMPORTED GLOBAL) set_target_properties(ollie9p PROPERTIES IMPORTED_LOCATION "${OLLIE9P_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${OLLIE9P_INCLUDE_DIR}" ) 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(GNUInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) install(FILES "${OLLIE9P_LIBRARY}" DESTINATION "${CMAKE_INSTALL_LIBDIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # --- Qt6 / KF6 --- find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Network) find_package(KF6CoreAddons REQUIRED) find_package(KF6Config REQUIRED) find_package(KF6SyntaxHighlighting REQUIRED) find_package(KF6Runner REQUIRED) find_package(KF6KIO REQUIRED) find_package(KF6TextEditor 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 --- kcoreaddons_add_plugin(ollie_kate SOURCES kate/ollie_kate.cpp kate/ollie_ghost.cpp gui/lib9pclient.cpp INSTALL_NAMESPACE "kf6/ktexteditor" ) add_dependencies(ollie_kate lib9p_build) 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 ${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.so ) # --- KIO Worker --- kcoreaddons_add_plugin(kio_ollie SOURCES kio/ollie_kio.cpp gui/lib9pclient.cpp INSTALL_NAMESPACE "kf6/kio" ) add_dependencies(kio_ollie lib9p_build) 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 ${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.so ) # --- GUI App --- add_executable(ollie-gui gui/main.cpp gui/ollie9pclient.cpp gui/sessionmodel.cpp gui/lib9pclient.cpp gui/lib9pstreamer.cpp gui/chatblockmodel.cpp gui/thememanager.cpp gui/clipboardhelper.cpp gui/plumber.cpp gui/ninep.cpp gui/plumbmsg.cpp ) add_dependencies(ollie-gui lib9p_build) 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 ${CMAKE_CURRENT_SOURCE_DIR}/lib9p/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/GoalDialog.qml gui/ProcManagerWindow.qml gui/PeerManagerWindow.qml gui/ChatBlockDelegate.qml gui/SessionTree.qml gui/ChatPane.qml gui/TextSelection.js gui/ollie.svg ) # --- Install --- install(TARGETS ollie-gui DESTINATION ${KDE_INSTALL_BINDIR}) # Note: KIO protocol is defined via ollie.json embedded in the plugin (KF6 style) # The ollie.protocol file is not needed for KF6