diff --git a/CMakeLists.txt b/CMakeLists.txt index 061f666..8d2b2ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,7 @@ add_library(logos_cpp_sdk INTERFACE) target_include_directories(logos_cpp_sdk INTERFACE "${SDK_INC}" "${SDK_INC}/cpp") # ---- Plugin ---- -set(PLUGIN_TARGET logos-blockchain-module) +set(PLUGIN_TARGET logos_blockchain_module) qt_add_plugin(${PLUGIN_TARGET} CLASS_NAME LogosBlockchainModule) diff --git a/flake.lock b/flake.lock index f244457..446fbbf 100644 --- a/flake.lock +++ b/flake.lock @@ -23,11 +23,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1771148003, - "narHash": "sha256-GhA2aeadEN24IMFYXnmCJxtJOx9ctuA8kTF7EWDqtY4=", + "lastModified": 1771256037, + "narHash": "sha256-8/sdrRyHYd01pYQwnjL2QWN8zACSUkMd/JPmhAFaaoc=", "owner": "logos-blockchain", "repo": "logos-blockchain", - "rev": "4c3738609e9fd4847db4f918e473da3c69b3366f", + "rev": "fe11562ea895b2d39af9d9c97c561cd14cbcedbe", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 32c56c3..9c4e808 100644 --- a/flake.nix +++ b/flake.nix @@ -29,6 +29,7 @@ "aarch64-linux" "x86_64-darwin" "aarch64-darwin" + "x86_64-windows" ]; forAll = lib.genAttrs systems; @@ -40,54 +41,35 @@ system: let pkgs = mkPkgs system; - llvmPkgs = pkgs.llvmPackages; + src = ./.; logosCore = logos-core.packages.${system}.default; logosBlockchainC = logos-blockchain.packages.${system}.logos-blockchain-c; - logosBlockchainModule = pkgs.stdenv.mkDerivation { - pname = "logos-blockchain-module"; - version = "dev"; - src = ./.; + common = import ./nix/default.nix { + inherit pkgs; + logosSdk = logosCore; + }; - nativeBuildInputs = [ - pkgs.cmake - pkgs.ninja - pkgs.pkg-config - pkgs.qt6.wrapQtAppsHook - ]; + libDerivation = import ./nix/lib.nix { + inherit pkgs common src logosBlockchainC; + }; - buildInputs = [ - pkgs.qt6.qtbase - pkgs.qt6.qtremoteobjects - pkgs.qt6.qttools - llvmPkgs.clang - llvmPkgs.libclang - logosBlockchainC - ] - ++ lib.optionals pkgs.stdenv.isDarwin [ - pkgs.libiconv - pkgs.cacert - ]; + includeDerivation = import ./nix/include.nix { + inherit pkgs common src; + lib = libDerivation; + logosSdk = logosCore; + }; - LIBCLANG_PATH = "${llvmPkgs.libclang.lib}/lib"; - CLANG_PATH = "${llvmPkgs.clang}/bin/clang"; - SSL_CERT_FILE = lib.optionalString pkgs.stdenv.isDarwin "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; - - cmakeFlags = [ - "-DLOGOS_CORE_ROOT=${logosCore}" - "-DLOGOS_BLOCKCHAIN_LIB=${logosBlockchainC}/lib" - "-DLOGOS_BLOCKCHAIN_INCLUDE=${logosBlockchainC}/include" - ]; - - postInstall = '' - cp -r ${logosBlockchainC}/circuits $out/lib/ - ''; - }; + combined = pkgs.symlinkJoin { + name = "logos-blockchain-module"; + paths = [ libDerivation includeDerivation ]; + }; in { - lib = logosBlockchainModule; - default = logosBlockchainModule; + lib = libDerivation; + include = includeDerivation; + default = combined; } ); @@ -105,7 +87,7 @@ program = "${pkgs.writeShellScriptBin "inspect-module" '' exec ${logosModuleViewer}/bin/logos-module-viewer \ - --module ${logosBlockchainModuleLib}/lib/liblogos-blockchain-module.${extension} + --module ${logosBlockchainModuleLib}/lib/liblogos_blockchain_module.${extension} ''}/bin/inspect-module"; }; in @@ -141,7 +123,7 @@ RESET='\e[0m' echo -e "\n''${BLUE}=== Logos Blockchain Module Development Environment ===''${RESET}" - echo -e "''${GREEN}LOGOS_CORE_ROOT:''${RESET} $LOGOS_CORE_ROOT" + echo -e "''${GREEN}LOGOS_CORE_ROOT:''${RESET} $LOGOS_CORE_ROOT" echo -e "''${GREEN}LOGOS_BLOCKCHAIN_LIB:''${RESET} $LOGOS_BLOCKCHAIN_LIB" echo -e "''${GREEN}LOGOS_BLOCKCHAIN_INCLUDE:''${RESET} $LOGOS_BLOCKCHAIN_INCLUDE" echo -e "''${BLUE}---------------------------------------------------------''${RESET}" diff --git a/metadata.json b/metadata.json index e0b3ddd..56d7cd9 100644 --- a/metadata.json +++ b/metadata.json @@ -1,5 +1,5 @@ { - "name": "liblogos-blockchain-module", + "name": "liblogos_blockchain_module", "version": "1.0.0", "description": "Logos blockchain node for logos-core", "author": "Logos Blockchain Team", @@ -12,9 +12,9 @@ "liblogos_blockchain.dylib", "liblogos_blockchain.so", "liblogos_blockchain.dll", - "liblogos-blockchain-module.dylib", - "liblogos-blockchain-module.so", - "liblogos-blockchain-module.dll", + "liblogos_blockchain_module.dylib", + "liblogos_blockchain_module.so", + "liblogos_blockchain_module.dll", "circuits" ] } \ No newline at end of file diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 0000000..0e2d6c1 --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,33 @@ +# Common build configuration shared across all packages +{ pkgs, logosSdk }: + +{ + pname = "logos-blockchain-module"; + version = "1.0.0"; + + # Common native build inputs + nativeBuildInputs = [ + pkgs.cmake + pkgs.ninja + pkgs.pkg-config + pkgs.qt6.wrapQtAppsNoGuiHook + ]; + + # Common runtime dependencies + buildInputs = [ + pkgs.qt6.qtbase + pkgs.qt6.qtremoteobjects + ]; + + # Common CMake flags + cmakeFlags = [ + "-GNinja" + "-DLOGOS_CORE_ROOT=${logosSdk}" + ]; + + # Metadata + meta = with pkgs.lib; { + description = "Logos Blockchain Module - Qt6 Plugin"; + platforms = platforms.unix ++ platforms.windows; + }; +} diff --git a/nix/include.nix b/nix/include.nix new file mode 100644 index 0000000..6a8b80f --- /dev/null +++ b/nix/include.nix @@ -0,0 +1,69 @@ +# Generates headers from the blockchain module plugin using logos-cpp-generator +{ pkgs, common, src, lib, logosSdk }: + +pkgs.stdenv.mkDerivation { + pname = "${common.pname}-headers"; + version = common.version; + inherit src; + inherit (common) meta; + + # We need the generator and the built plugin + nativeBuildInputs = [ logosSdk ]; + + # No configure phase needed + dontConfigure = true; + + buildPhase = '' + runHook preBuild + + # Create output directory for generated headers + mkdir -p ./generated_headers + if [ -f "${lib}/lib/liblogos_blockchain_module.dylib" ]; then + PLUGIN_FILE="${lib}/lib/liblogos_blockchain_module.dylib" + elif [ -f "${lib}/lib/liblogos_blockchain_module.so" ]; then + PLUGIN_FILE="${lib}/lib/liblogos_blockchain_module.so" + else + echo "Error: No liblogos_blockchain_module library found" + exit 1 + fi + + # Set library path so the plugin can find libblockchain when loaded + if [ "$(uname -s)" = "Darwin" ]; then + export DYLD_LIBRARY_PATH="${lib}/lib:''${DYLD_LIBRARY_PATH:-}" + else + export LD_LIBRARY_PATH="${lib}/lib:''${LD_LIBRARY_PATH:-}" + fi + + # Run logos-cpp-generator on the built plugin with --module-only flag + echo "Running logos-cpp-generator on $PLUGIN_FILE" + echo "Library path: ${lib}/lib" + ls -la "${lib}/lib" + logos-cpp-generator "$PLUGIN_FILE" --output-dir ./generated_headers --module-only || { + echo "Warning: logos-cpp-generator failed, this may be expected if the module has no public API" + # Create a marker file to indicate attempt was made + touch ./generated_headers/.no-api + } + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + # Install generated headers + mkdir -p $out/include + + # Copy all generated files to include/ if they exist + if [ -d ./generated_headers ] && [ "$(ls -A ./generated_headers 2>/dev/null)" ]; then + echo "Copying generated headers..." + ls -la ./generated_headers + cp -r ./generated_headers/* $out/include/ + else + echo "Warning: No generated headers found, creating empty include directory" + # Create a placeholder file to indicate headers should be generated from metadata + echo "# Generated headers from metadata.json" > $out/include/.generated + fi + + runHook postInstall + ''; +} diff --git a/nix/lib.nix b/nix/lib.nix new file mode 100644 index 0000000..e929a88 --- /dev/null +++ b/nix/lib.nix @@ -0,0 +1,45 @@ +# Builds the logos-blockchain-module library +{ pkgs, common, src, logosBlockchainC }: + +pkgs.stdenv.mkDerivation { + pname = "${common.pname}-lib"; + version = common.version; + + inherit src; + inherit (common) nativeBuildInputs buildInputs cmakeFlags meta; + + preConfigure = '' + runHook prePreConfigure + # Stage logos-blockchain C lib into build tree + export BLOCKCHAIN_LIB_STAGE="''${NIX_BUILD_TOP}/blockchain-lib" + mkdir -p "$BLOCKCHAIN_LIB_STAGE/lib" "$BLOCKCHAIN_LIB_STAGE/include" + cp -r "${logosBlockchainC}/lib"/* "$BLOCKCHAIN_LIB_STAGE/lib/" + cp -r "${logosBlockchainC}/include"/* "$BLOCKCHAIN_LIB_STAGE/include/" + runHook postPreConfigure + ''; + + configurePhase = '' + runHook preConfigure + mkdir -p build + cd build + cmake .. ''${cmakeFlags} \ + -DCMAKE_INSTALL_PREFIX=$out \ + -DLOGOS_BLOCKCHAIN_LIB="''${NIX_BUILD_TOP}/blockchain-lib/lib" \ + -DLOGOS_BLOCKCHAIN_INCLUDE="''${NIX_BUILD_TOP}/blockchain-lib/include" + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + # We are already in build/ from configurePhase + ninja + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + # We are in build/ from previous phases; plugin is in current dir + ninja install + runHook postInstall + ''; +} diff --git a/src/logos_blockchain_module.cpp b/src/logos_blockchain_module.cpp index 014798b..a809036 100644 --- a/src/logos_blockchain_module.cpp +++ b/src/logos_blockchain_module.cpp @@ -27,7 +27,7 @@ LogosBlockchainModule::~LogosBlockchainModule() { } QString LogosBlockchainModule::name() const { - return "liblogos-blockchain-module"; + return "liblogos_blockchain_module"; } QString LogosBlockchainModule::version() const { @@ -37,9 +37,9 @@ QString LogosBlockchainModule::version() const { void LogosBlockchainModule::initLogos(LogosAPI* logosAPIInstance) { logosAPI = logosAPIInstance; if (logosAPI) { - client = logosAPI->getClient("liblogos-blockchain-module"); + client = logosAPI->getClient("liblogos_blockchain_module"); if (!client) { - qWarning() << "LogosBlockchainModule: Failed to get liblogos-blockchain-module client"; + qWarning() << "LogosBlockchainModule: Failed to get liblogos_blockchain_module client"; } } } @@ -178,7 +178,7 @@ void LogosBlockchainModule::emitEvent(const QString& eventName, const QVariantLi return; } if (!client) { - qWarning() << "LogosBlockchainModule: Failed to get liblogos-blockchain-module client for event" << eventName; + qWarning() << "LogosBlockchainModule: Failed to get liblogos_blockchain_module client for event" << eventName; return; } client->onEventResponse(this, eventName, data);