2026-02-24 20:57:59 +04:00

178 lines
5.7 KiB
Nix

# Builds the logos-storage-cli standalone CLI application
{ pkgs, common, src, logosLiblogos, logosSdk, logosStorageModule, logosCapabilityModule }:
pkgs.stdenv.mkDerivation rec {
pname = "${common.pname}-cli";
version = common.version;
inherit src;
# CLI has no design system or QML dependency: trim buildInputs accordingly
buildInputs = [
pkgs.qt6.qtbase
pkgs.qt6.qtremoteobjects
pkgs.zstd
pkgs.krb5
pkgs.abseil-cpp
];
# Add logosSdk to nativeBuildInputs for logos-cpp-generator
nativeBuildInputs = common.nativeBuildInputs ++ [ logosSdk pkgs.patchelf ];
inherit (common) meta;
# CLI is not a GUI application: still wrap so Qt shared libs are on LD_LIBRARY_PATH
dontWrapQtApps = false;
dontStrip = true;
qtLibPath = pkgs.lib.makeLibraryPath (
[
pkgs.qt6.qtbase
pkgs.qt6.qtremoteobjects
pkgs.zstd
pkgs.krb5
pkgs.zlib
pkgs.glib
pkgs.stdenv.cc.cc
]
);
qtWrapperArgs = [
"--prefix" "LD_LIBRARY_PATH" ":" qtLibPath
];
preConfigure = ''
runHook prePreConfigure
# Create generated_code directory for the CLI (cmake -S cli sets CMAKE_SOURCE_DIR=cli/)
mkdir -p ./cli/generated_code
# Copy pre-generated API files from logos-storage-module
echo "Copying include files from logos-storage-module..."
if [ -d "${logosStorageModule}/include" ]; then
cp -r "${logosStorageModule}/include"/* ./cli/generated_code/
echo "Copied include files:"
ls -la ./cli/generated_code/
else
echo "Warning: No include directory found in logos-storage-module"
fi
# Run logos-cpp-generator with cli/metadata.json and --general-only flag
# This generates logos_sdk.cpp which #includes storage_module_api.cpp
echo "Running logos-cpp-generator for CLI..."
logos-cpp-generator --metadata ${src}/cli/metadata.json --general-only --output-dir ./cli/generated_code
echo "Checking generated files in cli/generated_code:"
ls -la ./cli/generated_code/
# Move generated headers to include/ subdirectory (installed layout convention)
if [ -f "./cli/generated_code/logos_sdk.h" ] || [ -f "./cli/generated_code/core_manager_api.h" ]; then
echo "Creating include directory and moving generated files..."
mkdir -p ./cli/generated_code/include
for file in ./cli/generated_code/*.h; do
[ -f "$file" ] && mv "$file" ./cli/generated_code/include/
done
# Keep a copy of .cpp files in include/ so #include "storage_module_api.cpp" resolves
for file in ./cli/generated_code/*.cpp; do
[ -f "$file" ] && cp "$file" ./cli/generated_code/include/
done
echo "Generated include directory:"
ls -la ./cli/generated_code/include/
else
echo "Warning: No header files generated by logos-cpp-generator"
fi
runHook postPreConfigure
'';
configurePhase = ''
runHook preConfigure
echo "Configuring logos-storage-cli..."
echo "liblogos: ${logosLiblogos}"
echo "cpp-sdk: ${logosSdk}"
echo "storage-module: ${logosStorageModule}"
echo "capability-module: ${logosCapabilityModule}"
test -d "${logosLiblogos}" || (echo "liblogos not found" && exit 1)
test -d "${logosSdk}" || (echo "cpp-sdk not found" && exit 1)
test -d "${logosStorageModule}" || (echo "storage-module not found" && exit 1)
test -d "${logosCapabilityModule}" || (echo "capability-module not found" && exit 1)
cmake -S cli -B build/cli \
-GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=FALSE \
-DCMAKE_INSTALL_RPATH="" \
-DCMAKE_SKIP_BUILD_RPATH=TRUE \
-DLOGOS_LIBLOGOS_ROOT=${logosLiblogos} \
-DLOGOS_CPP_SDK_ROOT=${logosSdk} \
-DLOGOS_STORAGE_ROOT=${logosStorageModule}
runHook postConfigure
'';
buildPhase = ''
runHook preBuild
cmake --build build/cli
echo "logos-storage-cli built successfully!"
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin $out/lib $out/modules
# Install CLI binary
if [ -f "build/cli/bin/logos-storage-cli" ]; then
cp build/cli/bin/logos-storage-cli "$out/bin/"
echo "Installed logos-storage-cli binary"
fi
# Copy the core binaries from liblogos
if [ -f "${logosLiblogos}/bin/logoscore" ]; then
cp -L "${logosLiblogos}/bin/logoscore" "$out/bin/"
echo "Installed logoscore binary"
fi
if [ -f "${logosLiblogos}/bin/logos_host" ]; then
cp -L "${logosLiblogos}/bin/logos_host" "$out/bin/"
echo "Installed logos_host binary"
fi
# Copy required shared libraries from liblogos
if ls "${logosLiblogos}/lib/"liblogos_core.* >/dev/null 2>&1; then
cp -L "${logosLiblogos}/lib/"liblogos_core.* "$out/lib/" || true
fi
# Copy SDK library if it exists
if ls "${logosSdk}/lib/"liblogos_sdk.* >/dev/null 2>&1; then
cp -L "${logosSdk}/lib/"liblogos_sdk.* "$out/lib/" || true
fi
# Determine platform-specific plugin extension
OS_EXT="so"
case "$(uname -s)" in
Darwin) OS_EXT="dylib";;
Linux) OS_EXT="so";;
esac
# Copy module plugins into the modules directory
if [ -f "${logosCapabilityModule}/lib/capability_module_plugin.$OS_EXT" ]; then
cp -L "${logosCapabilityModule}/lib/capability_module_plugin.$OS_EXT" "$out/modules/"
fi
if [ -f "${logosStorageModule}/lib/storage_module_plugin.$OS_EXT" ]; then
cp -L "${logosStorageModule}/lib/storage_module_plugin.$OS_EXT" "$out/modules/"
fi
# Copy libstorage library to modules directory (needed by storage_module_plugin)
if [ -f "${logosStorageModule}/lib/libstorage.$OS_EXT" ]; then
cp -L "${logosStorageModule}/lib/libstorage.$OS_EXT" "$out/modules/"
fi
runHook postInstall
'';
}