From 0ef3671e90c12153453eeeb73bd70f417796db2b Mon Sep 17 00:00:00 2001 From: Iuri Matias Date: Thu, 9 Oct 2025 09:26:12 -0400 Subject: [PATCH] feat: add nix flake --- .gitignore | 1 + CMakeLists.txt | 193 ++++++++++++++++++++++++++---------- README.md | 40 ++++++++ flake.lock | 132 ++++++++++++++++++++++++ flake.nix | 84 ++++++++++++++++ package_manager_interface.h | 2 +- package_manager_plugin.cpp | 8 +- package_manager_plugin.h | 4 +- 8 files changed, 406 insertions(+), 58 deletions(-) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b2be92b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +result diff --git a/CMakeLists.txt b/CMakeLists.txt index acb582c..5932866 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,28 +7,64 @@ set(CMAKE_AUTOMOC ON) option(LOGOS_PACKAGE_MANAGER_USE_VENDOR "Force use of vendored Logos dependencies" OFF) -set(_parent_liblogos "${CMAKE_SOURCE_DIR}/../logos-liblogos") -set(_parent_cpp_sdk "${CMAKE_SOURCE_DIR}/../logos-cpp-sdk") -set(_use_vendor ${LOGOS_PACKAGE_MANAGER_USE_VENDOR}) -if(NOT _use_vendor) - if(NOT EXISTS "${_parent_liblogos}/interface.h" OR NOT EXISTS "${_parent_cpp_sdk}/cpp/logos_api.h") - set(_use_vendor ON) +# Allow override from environment or command line +if(NOT DEFINED LOGOS_LIBLOGOS_ROOT) + set(_parent_liblogos "${CMAKE_SOURCE_DIR}/../logos-liblogos") + set(_use_vendor ${LOGOS_PACKAGE_MANAGER_USE_VENDOR}) + if(NOT _use_vendor) + if(NOT EXISTS "${_parent_liblogos}/interface.h") + set(_use_vendor ON) + endif() + endif() + if(_use_vendor) + set(LOGOS_LIBLOGOS_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-liblogos") + else() + set(LOGOS_LIBLOGOS_ROOT "${_parent_liblogos}") endif() endif() -if(_use_vendor) - set(LOGOS_LIBLOGOS_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-liblogos") - set(LOGOS_CPP_SDK_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-cpp-sdk") -else() - set(LOGOS_LIBLOGOS_ROOT "${_parent_liblogos}") - set(LOGOS_CPP_SDK_ROOT "${_parent_cpp_sdk}") + +if(NOT DEFINED LOGOS_CPP_SDK_ROOT) + set(_parent_cpp_sdk "${CMAKE_SOURCE_DIR}/../logos-cpp-sdk") + set(_use_vendor ${LOGOS_PACKAGE_MANAGER_USE_VENDOR}) + if(NOT _use_vendor) + if(NOT EXISTS "${_parent_cpp_sdk}/cpp/logos_api.h") + set(_use_vendor ON) + endif() + endif() + if(_use_vendor) + set(LOGOS_CPP_SDK_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-cpp-sdk") + else() + set(LOGOS_CPP_SDK_ROOT "${_parent_cpp_sdk}") + endif() endif() -if(NOT EXISTS "${LOGOS_LIBLOGOS_ROOT}/interface.h") - message(FATAL_ERROR "logos-liblogos not found. Run git submodule update --init --recursive.") +# Check if dependencies are available (support both source and installed layouts) +set(_liblogos_found FALSE) +if(EXISTS "${LOGOS_LIBLOGOS_ROOT}/interface.h") + set(_liblogos_found TRUE) + set(_liblogos_is_source TRUE) +elseif(EXISTS "${LOGOS_LIBLOGOS_ROOT}/include/interface.h") + set(_liblogos_found TRUE) + set(_liblogos_is_source FALSE) endif() -if(NOT EXISTS "${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h") - message(FATAL_ERROR "logos-cpp-sdk not found. Run git submodule update --init --recursive.") +set(_cpp_sdk_found FALSE) +if(EXISTS "${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h") + set(_cpp_sdk_found TRUE) + set(_cpp_sdk_is_source TRUE) +elseif(EXISTS "${LOGOS_CPP_SDK_ROOT}/include/logos_api.h") + set(_cpp_sdk_found TRUE) + set(_cpp_sdk_is_source FALSE) +endif() + +if(NOT _liblogos_found) + message(FATAL_ERROR "logos-liblogos not found at ${LOGOS_LIBLOGOS_ROOT}. " + "Set LOGOS_LIBLOGOS_ROOT or run git submodule update --init --recursive.") +endif() + +if(NOT _cpp_sdk_found) + message(FATAL_ERROR "logos-cpp-sdk not found at ${LOGOS_CPP_SDK_ROOT}. " + "Set LOGOS_CPP_SDK_ROOT or run git submodule update --init --recursive.") endif() # Root that contains the vendored dependencies (logos-core checkout or script vendor directory) @@ -46,55 +82,78 @@ endif() find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core RemoteObjects) # Run Logos C++ generator on metadata before compilation -set(CPP_GENERATOR_BUILD_DIR "${LOGOS_DEPS_ROOT}/build/cpp-generator") -set(CPP_GENERATOR "${CPP_GENERATOR_BUILD_DIR}/bin/logos-cpp-generator") set(METADATA_JSON "${CMAKE_CURRENT_SOURCE_DIR}/metadata.json") set(PLUGINS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/modules") -if(NOT TARGET cpp_generator_build) - add_custom_target(cpp_generator_build - COMMAND bash "${LOGOS_CPP_SDK_ROOT}/cpp-generator/compile.sh" +# Try to find the generator binary +if(_cpp_sdk_is_source) + # Source layout: build the generator + set(CPP_GENERATOR_BUILD_DIR "${LOGOS_DEPS_ROOT}/build/cpp-generator") + set(CPP_GENERATOR "${CPP_GENERATOR_BUILD_DIR}/bin/logos-cpp-generator") + + if(NOT TARGET cpp_generator_build) + add_custom_target(cpp_generator_build + COMMAND bash "${LOGOS_CPP_SDK_ROOT}/cpp-generator/compile.sh" + WORKING_DIRECTORY "${LOGOS_DEPS_ROOT}" + COMMENT "Building logos-cpp-generator via ${LOGOS_CPP_SDK_ROOT}/cpp-generator/compile.sh" + VERBATIM + ) + endif() + + add_custom_target(run_cpp_generator_package_manager + COMMAND "${CPP_GENERATOR}" --metadata "${METADATA_JSON}" --module-dir "${PLUGINS_OUTPUT_DIR}" WORKING_DIRECTORY "${LOGOS_DEPS_ROOT}" - COMMENT "Building logos-cpp-generator via ${LOGOS_CPP_SDK_ROOT}/cpp-generator/compile.sh" + COMMENT "Running logos-cpp-generator on ${METADATA_JSON} with module-dir ${PLUGINS_OUTPUT_DIR}" + VERBATIM + ) + add_dependencies(run_cpp_generator_package_manager cpp_generator_build) +else() + # Installed layout: use the generator from the install path + find_program(CPP_GENERATOR logos-cpp-generator PATHS ${LOGOS_CPP_SDK_ROOT}/bin NO_DEFAULT_PATH REQUIRED) + + add_custom_target(run_cpp_generator_package_manager + COMMAND "${CPP_GENERATOR}" --metadata "${METADATA_JSON}" --module-dir "${PLUGINS_OUTPUT_DIR}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + COMMENT "Running logos-cpp-generator on ${METADATA_JSON} with module-dir ${PLUGINS_OUTPUT_DIR}" VERBATIM ) endif() -add_custom_target(run_cpp_generator_package_manager - COMMAND "${CPP_GENERATOR}" --metadata "${METADATA_JSON}" --module-dir "${PLUGINS_OUTPUT_DIR}" - WORKING_DIRECTORY "${LOGOS_DEPS_ROOT}" - COMMENT "Running logos-cpp-generator on ${METADATA_JSON} with module-dir ${PLUGINS_OUTPUT_DIR}" - VERBATIM -) -add_dependencies(run_cpp_generator_package_manager cpp_generator_build) - # Plugin sources set(PLUGIN_SOURCES package_manager_plugin.cpp package_manager_plugin.h package_manager_interface.h - ${LOGOS_LIBLOGOS_ROOT}/interface.h - ${LOGOS_CPP_SDK_ROOT}/cpp/generated/logos_sdk.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.h - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.h - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.h - ${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.h - ${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.h ) +# Add liblogos interface header +if(_liblogos_is_source) + list(APPEND PLUGIN_SOURCES ${LOGOS_LIBLOGOS_ROOT}/interface.h) +else() + list(APPEND PLUGIN_SOURCES ${LOGOS_LIBLOGOS_ROOT}/include/interface.h) +endif() + +# Add SDK sources (only if source layout, installed layout uses the library) +if(_cpp_sdk_is_source) + list(APPEND PLUGIN_SOURCES + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.cpp + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.cpp + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.h + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.cpp + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.h + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.cpp + ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.h + ${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.cpp + ${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.h + ${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.cpp + ${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.h + ) +endif() + # Create the plugin library add_library(package_manager_plugin SHARED ${PLUGIN_SOURCES}) -# Mark generated source -set_source_files_properties(${LOGOS_CPP_SDK_ROOT}/cpp/generated/logos_sdk.cpp PROPERTIES GENERATED TRUE) - # Set output name without lib prefix set_target_properties(package_manager_plugin PROPERTIES PREFIX "") @@ -107,14 +166,33 @@ target_link_libraries(package_manager_plugin PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::RemoteObjects) +# Link SDK library if using installed layout +if(NOT _cpp_sdk_is_source) + find_library(LOGOS_SDK_LIB logos_sdk PATHS ${LOGOS_CPP_SDK_ROOT}/lib NO_DEFAULT_PATH REQUIRED) + target_link_libraries(package_manager_plugin PRIVATE ${LOGOS_SDK_LIB}) +endif() + # Include directories target_include_directories(package_manager_plugin PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${LOGOS_LIBLOGOS_ROOT} - ${LOGOS_CPP_SDK_ROOT}/cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/generated ) +# Add include directories based on layout type +if(_liblogos_is_source) + target_include_directories(package_manager_plugin PRIVATE ${LOGOS_LIBLOGOS_ROOT}) +else() + target_include_directories(package_manager_plugin PRIVATE ${LOGOS_LIBLOGOS_ROOT}/include) +endif() + +if(_cpp_sdk_is_source) + target_include_directories(package_manager_plugin PRIVATE + ${LOGOS_CPP_SDK_ROOT}/cpp + ${LOGOS_CPP_SDK_ROOT}/cpp/generated + ) +else() + target_include_directories(package_manager_plugin PRIVATE ${LOGOS_CPP_SDK_ROOT}/include) +endif() + # Set common properties for both platforms set_target_properties(package_manager_plugin PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/modules" @@ -139,3 +217,18 @@ else() INSTALL_RPATH "$ORIGIN" INSTALL_RPATH_USE_LINK_PATH FALSE) endif() + +install(TARGETS package_manager_plugin + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules + RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules +) + +install(FILES ${METADATA_JSON} + DESTINATION ${CMAKE_INSTALL_DATADIR}/logos-package-manager +) + +install(DIRECTORY "${PLUGINS_OUTPUT_DIR}/" + DESTINATION ${CMAKE_INSTALL_DATADIR}/logos-package-manager/generated + OPTIONAL +) diff --git a/README.md b/README.md new file mode 100644 index 0000000..3d30cbd --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# Logos Package Manager Module + +## Building with Nix (Recommended) + +### Build the module +```bash +nix build +``` + +### Enter development shell +```bash +nix develop +``` + +### Build manually in development shell +```bash +nix develop +mkdir build && cd build +cmake -GNinja .. +ninja +``` + +## Building with CMake + +If you don't want to use Nix, you can build directly with CMake: + +```bash +mkdir build && cd build +cmake -GNinja \ + -DLOGOS_CPP_SDK_ROOT=/path/to/logos-cpp-sdk \ + -DLOGOS_LIBLOGOS_ROOT=/path/to/logos-liblogos \ + .. +ninja +``` + +## Dependencies + +- [logos-cpp-sdk](https://github.com/logos-co/logos-cpp-sdk) - Logos C++ SDK and code generator +- [logos-liblogos](https://github.com/logos-co/logos-liblogos) - Logos core library +- Qt6 (Core and RemoteObjects) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..d6bad4c --- /dev/null +++ b/flake.lock @@ -0,0 +1,132 @@ +{ + "nodes": { + "logos-cpp-sdk": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1759953016, + "narHash": "sha256-ehhV4GqVHkjwjJmqmymwrLsrODvmaxyeJS4bCfs9Spo=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "84d4b24daed4aadf7109706f8ca546ce7604e76c", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_2": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1759953016, + "narHash": "sha256-ehhV4GqVHkjwjJmqmymwrLsrODvmaxyeJS4bCfs9Spo=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "84d4b24daed4aadf7109706f8ca546ce7604e76c", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-liblogos": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_2", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1759956013, + "narHash": "sha256-s0M81l6XS9qKvqx7XMejeG2s4o+cd6SeTxG3uX61/qs=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "84b4feb72e3c304b7288fab58d0e4d222c535934", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1759831965, + "narHash": "sha256-vgPm2xjOmKdZ0xKA6yLXPJpjOtQPHfaZDRtH+47XEBo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c9b6fb798541223bbb396d287d16f43520250518", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk", + "logos-liblogos": "logos-liblogos", + "nixpkgs": "nixpkgs_4" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..6246137 --- /dev/null +++ b/flake.nix @@ -0,0 +1,84 @@ +{ + description = "Logos Package Manager Module - Plugin manager for the Logos system"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + logos-cpp-sdk.url = "github:logos-co/logos-cpp-sdk"; + logos-liblogos.url = "github:logos-co/logos-liblogos"; + }; + + outputs = { self, nixpkgs, logos-cpp-sdk, logos-liblogos }: + let + systems = [ "aarch64-darwin" "x86_64-darwin" "aarch64-linux" "x86_64-linux" ]; + forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f { + pkgs = import nixpkgs { inherit system; }; + logosSdk = logos-cpp-sdk.packages.${system}.default; + logosLiblogos = logos-liblogos.packages.${system}.default; + }); + in + { + packages = forAllSystems ({ pkgs, logosSdk, logosLiblogos }: { + default = pkgs.stdenv.mkDerivation rec { + pname = "logos-package-manager"; + version = "1.0.0"; + + src = ./.; + + nativeBuildInputs = [ + pkgs.cmake + pkgs.ninja + pkgs.pkg-config + pkgs.qt6.wrapQtAppsNoGuiHook + ]; + + buildInputs = [ + pkgs.qt6.qtbase + pkgs.qt6.qtremoteobjects + logosSdk + logosLiblogos + ]; + + cmakeFlags = [ + "-GNinja" + "-DLOGOS_CPP_SDK_ROOT=${logosSdk}" + "-DLOGOS_LIBLOGOS_ROOT=${logosLiblogos}" + "-DLOGOS_PACKAGE_MANAGER_USE_VENDOR=OFF" + ]; + + # Set environment variables for CMake to find the dependencies + LOGOS_CPP_SDK_ROOT = "${logosSdk}"; + LOGOS_LIBLOGOS_ROOT = "${logosLiblogos}"; + + meta = with pkgs.lib; { + description = "Logos Package Manager Module - Plugin manager for the Logos system"; + platforms = platforms.unix; + }; + }; + }); + + devShells = forAllSystems ({ pkgs, logosSdk, logosLiblogos }: { + default = pkgs.mkShell { + nativeBuildInputs = [ + pkgs.cmake + pkgs.ninja + pkgs.pkg-config + ]; + buildInputs = [ + pkgs.qt6.qtbase + pkgs.qt6.qtremoteobjects + logosSdk + logosLiblogos + ]; + + shellHook = '' + export LOGOS_CPP_SDK_ROOT="${logosSdk}" + export LOGOS_LIBLOGOS_ROOT="${logosLiblogos}" + echo "Logos Package Manager development environment" + echo "LOGOS_CPP_SDK_ROOT: $LOGOS_CPP_SDK_ROOT" + echo "LOGOS_LIBLOGOS_ROOT: $LOGOS_LIBLOGOS_ROOT" + ''; + }; + }); + }; +} + diff --git a/package_manager_interface.h b/package_manager_interface.h index 2e3abde..b5e9234 100644 --- a/package_manager_interface.h +++ b/package_manager_interface.h @@ -1,6 +1,6 @@ #pragma once -#include "../../logos-liblogos/interface.h" +#include "interface.h" class PackageManagerInterface : public PluginInterface { diff --git a/package_manager_plugin.cpp b/package_manager_plugin.cpp index 564df64..9861c13 100644 --- a/package_manager_plugin.cpp +++ b/package_manager_plugin.cpp @@ -11,8 +11,7 @@ #include #include #include -#include "../../logos-cpp-sdk/cpp/logos_api_client.h" -#include "logos_sdk.h" +#include "logos_api_client.h" PackageManagerPlugin::PackageManagerPlugin() { @@ -154,10 +153,9 @@ bool PackageManagerPlugin::installPlugin(const QString& pluginPath) return false; } - LogosModules logos(logosAPI); - qDebug() << "Calling processPlugin with destinationPath:" << destinationPath; - QString pluginName = logos.core_manager.processPlugin(destinationPath); + QVariant result = coreManagerClient->invokeRemoteMethod("core_manager_api", "processPlugin", destinationPath); + QString pluginName = result.toString(); if (pluginName.isEmpty()) { qDebug() << "ERROR: --------------------------------"; qWarning() << "Failed to process installed plugin:" << destinationPath; diff --git a/package_manager_plugin.h b/package_manager_plugin.h index be30335..e484833 100644 --- a/package_manager_plugin.h +++ b/package_manager_plugin.h @@ -3,8 +3,8 @@ #include #include #include "package_manager_interface.h" -#include "../../logos-cpp-sdk/cpp/logos_api.h" -#include "../../logos-cpp-sdk/cpp/logos_api_client.h" +#include "logos_api.h" +#include "logos_api_client.h" class PackageManagerPlugin : public QObject, public PackageManagerInterface {