feat: add nix flake

This commit is contained in:
Iuri Matias
2025-10-09 09:26:12 -04:00
parent 150f154196
commit 0ef3671e90
8 changed files with 406 additions and 58 deletions
+1
View File
@@ -0,0 +1 @@
result
+143 -50
View File
@@ -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
)
+40
View File
@@ -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)
Generated
+132
View File
@@ -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
}
+84
View File
@@ -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"
'';
};
});
};
}
+1 -1
View File
@@ -1,6 +1,6 @@
#pragma once
#include "../../logos-liblogos/interface.h"
#include "interface.h"
class PackageManagerInterface : public PluginInterface
{
+3 -5
View File
@@ -11,8 +11,7 @@
#include <QRemoteObjectNode>
#include <QRemoteObjectReplica>
#include <QRemoteObjectPendingCall>
#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;
+2 -2
View File
@@ -3,8 +3,8 @@
#include <QtCore/QObject>
#include <QJsonArray>
#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
{