From aa95ce53798235d6122cf54c63a075e4e5126446 Mon Sep 17 00:00:00 2001 From: Alejandro Cabeza Romero Date: Thu, 29 Jan 2026 18:11:42 +0100 Subject: [PATCH] Refactor Nix, CMakeLists and codebase to enable proper nix building, and good IDE integration. --- .gitignore | 11 +- CMakeLists.txt | 245 +++++++++++++++++++++-------------- flake.lock | 344 +++++++++++++++++++++++++++++++++++++++---------- flake.nix | 132 +++++++++++-------- justfile | 31 +---- library.cpp | 3 +- library.h | 3 +- 7 files changed, 514 insertions(+), 255 deletions(-) diff --git a/.gitignore b/.gitignore index 4f1645a..cabf2a7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,19 +3,10 @@ *.bak # CMake generated files -Makefile -CMakeFiles/ -CMakeCache.txt -cmake_install.cmake -cmake-build-debug .cache/ build/ target/ - -# Artifacts -liblogos-blockchain-module.so -liblogos-blockchain-module.log +result # Node -logos_blockchain_db/ resources/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f6bb5a..c00adbc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,124 +4,173 @@ project(logos-blockchain-module LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# ---- Options ---- +option(LOGOS_MODULE_BUNDLE "Create local runtime bundle in target/." ON) +set(LOGOS_CORE_ROOT "" CACHE PATH "Path to logos-core root directory.") +set(LOGOS_BLOCKCHAIN_ROOT "" CACHE PATH "Path to logos-blockchain source root.") +set(LOGOS_BLOCKCHAIN_LIB "" CACHE PATH "Path to prebuilt logos-blockchain lib.") +set(LOGOS_BLOCKCHAIN_INCLUDE "" CACHE PATH "Path to prebuilt logos-blockchain include.") -set(LOGOS_CORE_ROOT "$ENV{LOGOS_CORE_ROOT}" CACHE PATH "Path to logos-core root") -set(LOGOS_BLOCKCHAIN_ROOT "$ENV{LOGOS_BLOCKCHAIN_ROOT}" CACHE PATH "Path to logos-blockchain source root") +set(HAS_LOGOS_CORE_ROOT FALSE) +set(HAS_LOGOS_BLOCKCHAIN_ROOT FALSE) +set(HAS_LOGOS_BLOCKCHAIN_LIB FALSE) +set(HAS_LOGOS_BLOCKCHAIN_INCLUDE FALSE) -if(LOGOS_CORE_ROOT STREQUAL "") - message(FATAL_ERROR "LOGOS_CORE_ROOT not set. Pass -DLOGOS_CORE_ROOT=/path/to/logos-core") -endif() -if(LOGOS_BLOCKCHAIN_ROOT STREQUAL "") - message(FATAL_ERROR "LOGOS_BLOCKCHAIN_ROOT not set. Pass -DLOGOS_BLOCKCHAIN_ROOT=/path/to/logos-blockchain") +if (DEFINED LOGOS_CORE_ROOT AND NOT "${LOGOS_CORE_ROOT}" STREQUAL "") + set(HAS_LOGOS_CORE_ROOT TRUE) endif() +if (DEFINED LOGOS_BLOCKCHAIN_ROOT AND NOT "${LOGOS_BLOCKCHAIN_ROOT}" STREQUAL "") + set(HAS_LOGOS_BLOCKCHAIN_ROOT TRUE) +endif() + +if(DEFINED LOGOS_BLOCKCHAIN_LIB AND NOT "${LOGOS_BLOCKCHAIN_LIB}" STREQUAL "") + set(HAS_LOGOS_BLOCKCHAIN_LIB TRUE) +endif() + +if(DEFINED LOGOS_BLOCKCHAIN_INCLUDE AND NOT "${LOGOS_BLOCKCHAIN_INCLUDE}" STREQUAL "") + set(HAS_LOGOS_BLOCKCHAIN_INCLUDE TRUE) +endif() + +if (NOT HAS_LOGOS_CORE_ROOT) + message(FATAL_ERROR "LOGOS_CORE_ROOT must be set to the logos-core root directory.") +endif() + +if(HAS_LOGOS_BLOCKCHAIN_LIB AND HAS_LOGOS_BLOCKCHAIN_INCLUDE AND NOT HAS_LOGOS_BLOCKCHAIN_ROOT) + message(STATUS "Using prebuilt logos-blockchain.") + set(LOGOS_BLOCKCHAIN_PREBUILT TRUE) +elseif(NOT HAS_LOGOS_BLOCKCHAIN_LIB AND NOT HAS_LOGOS_BLOCKCHAIN_INCLUDE AND HAS_LOGOS_BLOCKCHAIN_ROOT) + message(STATUS "Building logos-blockchain from source.") + set(LOGOS_BLOCKCHAIN_PREBUILT FALSE) +else() + message(FATAL_ERROR "Either both LOGOS_BLOCKCHAIN_LIB and LOGOS_BLOCKCHAIN_INCLUDE must be set for prebuilt logos-blockchain, or only LOGOS_BLOCKCHAIN_ROOT must be set for building from source.") +endif() + +# ---- Qt ---- find_package(Qt6 REQUIRED COMPONENTS Core) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) -# ---- Directory Structure ---- -set(WORKSPACE_ROOT "${CMAKE_BINARY_DIR}/workspace") -set(INTERNAL_STAGE "${WORKSPACE_ROOT}/stage") -set(FINAL_TARGET "${CMAKE_SOURCE_DIR}/target") +# ---- Directories ---- +set(WORKSPACE_ROOT "${CMAKE_BINARY_DIR}/workspace") +set(TARGET_DIR "${CMAKE_SOURCE_DIR}/target") +file(MAKE_DIRECTORY "${WORKSPACE_ROOT}" "${TARGET_DIR}") -# Ensure directories exist -file(MAKE_DIRECTORY "${INTERNAL_STAGE}/include" "${INTERNAL_STAGE}/lib" "${FINAL_TARGET}") - -# ---- Internal Staging for C++ SDK (Symlinks) ---- -set(SDK_STAGED_LIB "${INTERNAL_STAGE}/lib/liblogos_sdk.a") -if(NOT EXISTS "${SDK_STAGED_LIB}") - file(CREATE_LINK "${LOGOS_CORE_ROOT}/lib/liblogos_sdk.a" "${SDK_STAGED_LIB}" SYMBOLIC) - file(CREATE_LINK "${LOGOS_CORE_ROOT}/include/core" "${INTERNAL_STAGE}/include/core" SYMBOLIC) - file(CREATE_LINK "${LOGOS_CORE_ROOT}/include/cpp" "${INTERNAL_STAGE}/include/cpp" SYMBOLIC) -endif() - -# ---- Rust Blockchain Build (Zero-Copy) ---- -find_program(CARGO_EXECUTABLE cargo REQUIRED) -set(CARGO_TARGET_DIR "${WORKSPACE_ROOT}/logos-blockchain/target") +# ---- Logos Core SDK ---- +set(SDK_LIB "${LOGOS_CORE_ROOT}/lib/liblogos_sdk.a") +set(SDK_INC "${LOGOS_CORE_ROOT}/include") +# ---- OS Specifics ---- if(APPLE) - set(LOGOS_BLOCKCHAIN_EXT ".dylib") + set(DYLIB_EXT ".dylib") elseif(WIN32) - set(LOGOS_BLOCKCHAIN_EXT ".dll") + set(DYLIB_EXT ".dll") + set(IMPLIB_EXT ".lib") else() - set(LOGOS_BLOCKCHAIN_EXT ".so") + set(DYLIB_EXT ".so") endif() -set(LOGOS_BLOCKCHAIN_C_SOURCE_DYLIB_NAME "liblib_logos_blockchain${LOGOS_BLOCKCHAIN_EXT}") -set(LOGOS_BLOCKCHAIN_C_STAGED_DYLIB_NAME "lib_logos_blockchain${LOGOS_BLOCKCHAIN_EXT}") -set(LOGOS_BLOCKCHAIN_C_HEADER_NAME "lib_logos_blockchain.h") +# NOTE (Windows): +# Rust cdylib typically produces: +# - logos_blockchain.dll (runtime) +# - logos_blockchain.lib (import lib) +# The Windows build hasn't been yet, so adjust accordingly if the DLL is named without the 'lib' prefix. -set(LOGOS_BLOCKCHAIN_STAGED_DYLIB "${INTERNAL_STAGE}/lib/${LOGOS_BLOCKCHAIN_C_STAGED_DYLIB_NAME}") -set(LOGOS_BLOCKCHAIN_STAGED_HEADER "${INTERNAL_STAGE}/include/${LOGOS_BLOCKCHAIN_C_HEADER_NAME}") +# ---- Logos Blockchain (build OR consume) ---- +if(LOGOS_BLOCKCHAIN_PREBUILT) + set(LOGOS_BLOCKCHAIN_DYLIB "${LOGOS_BLOCKCHAIN_LIB}/liblogos_blockchain${DYLIB_EXT}") -set(PATCHELF_COMMANDS "") -if(UNIX AND NOT APPLE AND NOT WIN32) - find_program(PATCHELF_EXE patchelf REQUIRED) - set(PATCHELF_COMMANDS - COMMAND ${PATCHELF_EXE} --set-soname "${LOGOS_BLOCKCHAIN_C_STAGED_DYLIB_NAME}" "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" - ) + if(WIN32) + set(LOGOS_BLOCKCHAIN_IMPLIB "${LOGOS_BLOCKCHAIN_LIB}/logos_blockchain${IMPLIB_EXT}") + endif() + + add_custom_target(logos_blockchain_libs) + +else() + find_program(CARGO_EXECUTABLE cargo REQUIRED) + + set(CARGO_TARGET_DIR "${WORKSPACE_ROOT}/logos-blockchain/target") + set(INTERNAL_STAGE "${WORKSPACE_ROOT}/stage") + set(INTERNAL_STAGE_LIB "${INTERNAL_STAGE}/lib") + set(INTERNAL_STAGE_INCLUDE "${INTERNAL_STAGE}/include") + file(MAKE_DIRECTORY "${CARGO_TARGET_DIR}" "${INTERNAL_STAGE_LIB}" "${INTERNAL_STAGE_INCLUDE}") + + set(LOGOS_BLOCKCHAIN_LIB "${INTERNAL_STAGE_LIB}") + set(LOGOS_BLOCKCHAIN_INCLUDE "${INTERNAL_STAGE_INCLUDE}") + + set(LOGOS_BLOCKCHAIN_DYLIB "${INTERNAL_STAGE_LIB}/liblogos_blockchain${DYLIB_EXT}") + set(LOGOS_BLOCKCHAIN_HEADER "${INTERNAL_STAGE_INCLUDE}/logos_blockchain.h") + + add_custom_command( + OUTPUT "${LOGOS_BLOCKCHAIN_DYLIB}" + COMMAND ${CMAKE_COMMAND} -E env + CARGO_TARGET_DIR=${CARGO_TARGET_DIR} + ${CARGO_EXECUTABLE} build --release + --package logos-blockchain-c + --manifest-path "${LOGOS_BLOCKCHAIN_ROOT}/Cargo.toml" + COMMAND ${CMAKE_COMMAND} -E copy + "${CARGO_TARGET_DIR}/release/liblogos_blockchain${DYLIB_EXT}" + "${LOGOS_BLOCKCHAIN_DYLIB}" + DEPENDS "${LOGOS_BLOCKCHAIN_ROOT}/Cargo.toml" + VERBATIM + ) + + add_custom_command( + OUTPUT "${LOGOS_BLOCKCHAIN_HEADER}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${LOGOS_BLOCKCHAIN_ROOT}/c-bindings/logos_blockchain.h" + "${LOGOS_BLOCKCHAIN_HEADER}" + DEPENDS "${LOGOS_BLOCKCHAIN_DYLIB}" + VERBATIM + ) + + add_custom_target(logos_blockchain_libs DEPENDS "${LOGOS_BLOCKCHAIN_DYLIB}" "${LOGOS_BLOCKCHAIN_HEADER}") endif() -add_custom_command( - OUTPUT "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" - COMMAND ${CMAKE_COMMAND} -E make_directory "${CARGO_TARGET_DIR}" - COMMAND ${CMAKE_COMMAND} -E env - CARGO_TERM_COLOR=always - CARGO_TARGET_DIR=${CARGO_TARGET_DIR} - cargo build --release --package logos-blockchain-c --manifest-path "${LOGOS_BLOCKCHAIN_ROOT}/Cargo.toml" - COMMAND ${CMAKE_COMMAND} -E copy - "${CARGO_TARGET_DIR}/release/${LOGOS_BLOCKCHAIN_C_SOURCE_DYLIB_NAME}" - "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" - ${PATCHELF_COMMANDS} - DEPENDS "${LOGOS_BLOCKCHAIN_ROOT}/Cargo.toml" - VERBATIM -) - -add_custom_command( - OUTPUT "${LOGOS_BLOCKCHAIN_STAGED_HEADER}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${LOGOS_BLOCKCHAIN_ROOT}/c-bindings/${LOGOS_BLOCKCHAIN_C_HEADER_NAME}" - "${LOGOS_BLOCKCHAIN_STAGED_HEADER}" - DEPENDS "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" - VERBATIM -) - -add_custom_target(logos_blockchain_libs DEPENDS "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" "${LOGOS_BLOCKCHAIN_STAGED_HEADER}") - +# ---- Imported targets ---- add_library(logos_blockchain_interface SHARED IMPORTED GLOBAL) set_target_properties(logos_blockchain_interface PROPERTIES - IMPORTED_LOCATION "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" - INTERFACE_INCLUDE_DIRECTORIES "${INTERNAL_STAGE}/include" + IMPORTED_LOCATION "${LOGOS_BLOCKCHAIN_DYLIB}" + INTERFACE_INCLUDE_DIRECTORIES "${LOGOS_BLOCKCHAIN_INCLUDE}" ) -add_dependencies(logos_blockchain_interface logos_blockchain_libs) -# ---- C++ SDK Target (using staged symlinks) ---- -add_library(logos_cpp_sdk INTERFACE) -target_include_directories(logos_cpp_sdk INTERFACE - "${INTERNAL_STAGE}/include" -) +if(NOT LOGOS_BLOCKCHAIN_PREBUILT) + add_dependencies(logos_blockchain_interface logos_blockchain_libs) +endif() + +if(WIN32) + set_target_properties(logos_blockchain_interface PROPERTIES IMPORTED_IMPLIB "${LOGOS_BLOCKCHAIN_IMPLIB}") +endif() add_library(logos_core STATIC IMPORTED) set_target_properties(logos_core PROPERTIES - IMPORTED_LOCATION "${SDK_STAGED_LIB}" + IMPORTED_LOCATION "${SDK_LIB}" ) +add_library(logos_cpp_sdk INTERFACE) +target_include_directories(logos_cpp_sdk INTERFACE "${SDK_INC}") + # ---- Plugin ---- -set(PLUGIN_TARGET "liblogos-blockchain-module") +set(PLUGIN_TARGET liblogos-blockchain-module) qt_add_plugin(${PLUGIN_TARGET} CLASS_NAME LogosBlockchainModule) set_target_properties(${PLUGIN_TARGET} PROPERTIES OUTPUT_NAME "logos-blockchain-module" - LIBRARY_OUTPUT_DIRECTORY "${FINAL_TARGET}" + LIBRARY_OUTPUT_DIRECTORY "${TARGET_DIR}" ) target_sources(${PLUGIN_TARGET} PRIVATE - "library.cpp" - "metadata.json" + library.cpp + metadata.json ) +set_target_properties(${PLUGIN_TARGET} PROPERTIES + PUBLIC_HEADER "library.h" +) + + target_link_libraries(${PLUGIN_TARGET} PRIVATE Qt6::Core logos_blockchain_interface @@ -129,36 +178,36 @@ target_link_libraries(${PLUGIN_TARGET} PRIVATE logos_core ) -target_compile_definitions(${PLUGIN_TARGET} PRIVATE USING_QT) - -# Ensure the Rust backend is always built before the plugin add_dependencies(${PLUGIN_TARGET} logos_blockchain_libs) -# RPATH so the plugin finds the Rust .so in the same folder if(APPLE) - set_target_properties(${PLUGIN_TARGET} PROPERTIES BUILD_RPATH "@loader_path" INSTALL_RPATH "@loader_path") + set_target_properties(${PLUGIN_TARGET} PROPERTIES + BUILD_RPATH "@loader_path" + INSTALL_RPATH "@loader_path" + ) elseif(UNIX) - set_target_properties(${PLUGIN_TARGET} PROPERTIES BUILD_RPATH "$ORIGIN" INSTALL_RPATH "$ORIGIN") + set_target_properties(${PLUGIN_TARGET} PROPERTIES + BUILD_RPATH "$ORIGIN" + INSTALL_RPATH "$ORIGIN" + ) endif() -# Copy Rust library to final target folder next to the plugin -add_custom_command(TARGET ${PLUGIN_TARGET} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" - "${FINAL_TARGET}/${LOGOS_BLOCKCHAIN_C_STAGED_DYLIB_NAME}" - VERBATIM -) +# ---- Optional local bundle ---- +if(LOGOS_MODULE_BUNDLE) + add_custom_command(TARGET ${PLUGIN_TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${LOGOS_BLOCKCHAIN_DYLIB}" + "${TARGET_DIR}/liblogos_blockchain${DYLIB_EXT}" + VERBATIM + ) +endif() -# ---- Installation ---- +# ---- Install ---- install(TARGETS ${PLUGIN_TARGET} LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin ) - install(FILES library.h DESTINATION include) - -install(FILES "${LOGOS_BLOCKCHAIN_STAGED_DYLIB}" - DESTINATION lib - RENAME "${LOGOS_BLOCKCHAIN_C_STAGED_DYLIB_NAME}" -) +install(DIRECTORY "${LOGOS_BLOCKCHAIN_INCLUDE}/" DESTINATION include) +install(FILES "${LOGOS_BLOCKCHAIN_DYLIB}" DESTINATION lib) diff --git a/flake.lock b/flake.lock index bdd2dca..9444317 100644 --- a/flake.lock +++ b/flake.lock @@ -1,25 +1,90 @@ { "nodes": { - "logos-blockchain": { - "flake": false, + "crane": { "locked": { - "lastModified": 1768919760, - "narHash": "sha256-YJ8VjYl8QgT7htdAsy38bgKzpYB2k4jn8Y820Swqbmg=", + "lastModified": 1769287525, + "narHash": "sha256-gABuYA6BzoRMLuPaeO5p7SLrpd4qExgkwEmYaYQY4bM=", + "owner": "ipetkov", + "repo": "crane", + "rev": "0314e365877a85c9e5758f9ea77a9972afbb4c21", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "logos-blockchain": { + "inputs": { + "crane": "crane", + "logos-blockchain-circuits": "logos-blockchain-circuits", + "nixpkgs": "nixpkgs_2", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1769692605, + "narHash": "sha256-8V1SRCZw6o0vCgEI8FmBnw056jmFackhZJzwCXtjmj4=", "owner": "logos-blockchain", "repo": "logos-blockchain", - "rev": "73d977aa5e9ffb2de8d7708b29be2f00636aa22b", + "rev": "63e9806adda4a6ba9b75bef7adf478535a879b0a", "type": "github" }, "original": { "owner": "logos-blockchain", + "ref": "ci/circuits/integrate-binaries-on-tests-using-nix", "repo": "logos-blockchain", "type": "github" } }, + "logos-blockchain-circuits": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1769615660, + "narHash": "sha256-B2CYcJWuJIXAJaWgBcY4k0FTxo62mI8Hd9RqBECfq4o=", + "owner": "logos-blockchain", + "repo": "logos-blockchain-circuits", + "rev": "1576b3a31ff784e21884a4509e71ee61fb10fa7e", + "type": "github" + }, + "original": { + "owner": "logos-blockchain", + "ref": "feat/nixify", + "repo": "logos-blockchain-circuits", + "type": "github" + } + }, "logos-capability-module": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_2", + "logos-cpp-sdk": "logos-cpp-sdk", "logos-liblogos": "logos-liblogos_2", + "nixpkgs": [ + "logos-liblogos", + "logos-capability-module", + "logos-liblogos", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767809111, + "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "owner": "logos-co", + "repo": "logos-capability-module", + "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-capability-module", + "type": "github" + } + }, + "logos-capability-module_2": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_4", + "logos-liblogos": "logos-liblogos_3", "nixpkgs": [ "logos-module-viewer", "logos-capability-module", @@ -43,7 +108,7 @@ }, "logos-core": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs_3" }, "locked": { "lastModified": 1767724329, @@ -61,14 +126,14 @@ }, "logos-cpp-sdk": { "inputs": { - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1764699992, - "narHash": "sha256-nCmK9C9F31cHvy6lWKR5WGl99aJbS3kIsROAoZ4OrwI=", + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "5d0bbd0d1e00aad0532ffa7c8bf2c80f460a4f6d", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", "type": "github" }, "original": { @@ -79,7 +144,7 @@ }, "logos-cpp-sdk_2": { "inputs": { - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_5" }, "locked": { "lastModified": 1761230734, @@ -96,42 +161,6 @@ } }, "logos-cpp-sdk_3": { - "inputs": { - "nixpkgs": "nixpkgs_4" - }, - "locked": { - "lastModified": 1761230734, - "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "4b143922c190df00bb3835441c9f0075cb28283b", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_4": { - "inputs": { - "nixpkgs": "nixpkgs_5" - }, - "locked": { - "lastModified": 1764699992, - "narHash": "sha256-nCmK9C9F31cHvy6lWKR5WGl99aJbS3kIsROAoZ4OrwI=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "5d0bbd0d1e00aad0532ffa7c8bf2c80f460a4f6d", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_5": { "inputs": { "nixpkgs": "nixpkgs_6" }, @@ -149,7 +178,7 @@ "type": "github" } }, - "logos-cpp-sdk_6": { + "logos-cpp-sdk_4": { "inputs": { "nixpkgs": "nixpkgs_7" }, @@ -167,7 +196,7 @@ "type": "github" } }, - "logos-cpp-sdk_7": { + "logos-cpp-sdk_5": { "inputs": { "nixpkgs": "nixpkgs_8" }, @@ -185,9 +214,82 @@ "type": "github" } }, + "logos-cpp-sdk_6": { + "inputs": { + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1764699992, + "narHash": "sha256-nCmK9C9F31cHvy6lWKR5WGl99aJbS3kIsROAoZ4OrwI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "5d0bbd0d1e00aad0532ffa7c8bf2c80f460a4f6d", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_7": { + "inputs": { + "nixpkgs": "nixpkgs_10" + }, + "locked": { + "lastModified": 1764699992, + "narHash": "sha256-nCmK9C9F31cHvy6lWKR5WGl99aJbS3kIsROAoZ4OrwI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "5d0bbd0d1e00aad0532ffa7c8bf2c80f460a4f6d", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_8": { + "inputs": { + "nixpkgs": "nixpkgs_11" + }, + "locked": { + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_9": { + "inputs": { + "nixpkgs": "nixpkgs_12" + }, + "locked": { + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, "logos-liblogos": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk", + "logos-capability-module": "logos-capability-module", + "logos-cpp-sdk": "logos-cpp-sdk_3", "nixpkgs": [ "logos-liblogos", "logos-cpp-sdk", @@ -195,11 +297,11 @@ ] }, "locked": { - "lastModified": 1768343028, - "narHash": "sha256-4LvsuZTDTlLtfMF4C69ls+lmkYJWD7LZitS04Mc+8UI=", + "lastModified": 1769640265, + "narHash": "sha256-hwnkxGxY2V0N1U6iNW02gY7mfcPSg+KG2plZv/rEf9k=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "a76d33f5519af0ee12317c8f149eee2ac5d292a0", + "rev": "02dd00d6a000f3d45bcf0f36f849ff14da2e6d75", "type": "github" }, "original": { @@ -210,9 +312,9 @@ }, "logos-liblogos_2": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_3", + "logos-cpp-sdk": "logos-cpp-sdk_2", "nixpkgs": [ - "logos-module-viewer", + "logos-liblogos", "logos-capability-module", "logos-liblogos", "logos-cpp-sdk", @@ -236,6 +338,31 @@ "logos-liblogos_3": { "inputs": { "logos-cpp-sdk": "logos-cpp-sdk_5", + "nixpkgs": [ + "logos-module-viewer", + "logos-capability-module", + "logos-liblogos", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1761845775, + "narHash": "sha256-ulK8xq05ejK6qIgZ7WtWb/MJt2rk5BKfDA2z7mM3wq8=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "a92c2c1268bc70764c8f73c7bce07d21024f5af9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "logos-liblogos_4": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_7", "nixpkgs": [ "logos-module-viewer", "logos-liblogos", @@ -257,9 +384,9 @@ "type": "github" } }, - "logos-liblogos_4": { + "logos-liblogos_5": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_7", + "logos-cpp-sdk": "logos-cpp-sdk_9", "nixpkgs": [ "logos-module-viewer", "logos-package-manager", @@ -284,9 +411,9 @@ }, "logos-module-viewer": { "inputs": { - "logos-capability-module": "logos-capability-module", - "logos-cpp-sdk": "logos-cpp-sdk_4", - "logos-liblogos": "logos-liblogos_3", + "logos-capability-module": "logos-capability-module_2", + "logos-cpp-sdk": "logos-cpp-sdk_6", + "logos-liblogos": "logos-liblogos_4", "logos-package-manager": "logos-package-manager", "nixpkgs": [ "logos-module-viewer", @@ -310,8 +437,8 @@ }, "logos-package-manager": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_6", - "logos-liblogos": "logos-liblogos_4", + "logos-cpp-sdk": "logos-cpp-sdk_8", + "logos-liblogos": "logos-liblogos_5", "nixpkgs": [ "logos-module-viewer", "logos-package-manager", @@ -334,6 +461,54 @@ } }, "nixpkgs": { + "locked": { + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_10": { + "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_11": { + "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_12": { "locked": { "lastModified": 1759036355, "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", @@ -351,11 +526,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1759036355, - "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", "type": "github" }, "original": { @@ -461,6 +636,22 @@ "type": "github" } }, + "nixpkgs_9": { + "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" + } + }, "root": { "inputs": { "logos-blockchain": "logos-blockchain", @@ -472,6 +663,27 @@ "nixpkgs" ] } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "logos-blockchain", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769568593, + "narHash": "sha256-vf3cZf8imUlPzFtICa1uyReDzoPV0XhHOIRM3tqI5VY=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "6fe5039018d05cee5d01dda7df1c0846fb7943a4", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 2e28407..281b186 100644 --- a/flake.nix +++ b/flake.nix @@ -1,112 +1,138 @@ { - description = "Logos Blockchain Module - Qt6 Plugin (Nix)"; + description = "Logos Blockchain Module - Qt6 Plugin"; inputs = { nixpkgs.follows = "logos-liblogos/nixpkgs"; + logos-liblogos.url = "github:logos-co/logos-liblogos"; logos-core.url = "github:logos-co/logos-cpp-sdk"; - logos-blockchain = { - url = "github:logos-blockchain/logos-blockchain"; - flake = false; - }; + + logos-blockchain.url = "github:logos-blockchain/logos-blockchain?ref=ci/circuits/integrate-binaries-on-tests-using-nix"; + logos-module-viewer.url = "github:logos-co/logos-module-viewer"; }; - outputs = { self, nixpkgs, ... }@inputs: + outputs = + { + self, + nixpkgs, + logos-core, + logos-blockchain, + logos-module-viewer, + ... + }: let - systems = [ "aarch64-darwin" "x86_64-darwin" "aarch64-linux" "x86_64-linux" ]; - forAllSystems = f: nixpkgs.lib.genAttrs systems (system: + lib = nixpkgs.lib; + + systems = [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + + forAll = lib.genAttrs systems; + + mkPkgs = system: import nixpkgs { inherit system; }; + in + { + packages = forAll ( + system: let - pkgs = import nixpkgs { inherit system; }; + pkgs = mkPkgs system; llvmPkgs = pkgs.llvmPackages; - logosCore = inputs.logos-core.packages.${system}.default; - logosBlockchain = inputs.logos-blockchain; - # 1. Environment variables shared by build and shell - env = { - LOGOS_CORE_ROOT = "${logosCore}"; - LOGOS_BLOCKCHAIN_ROOT = "${logosBlockchain}"; - LIBCLANG_PATH = "${llvmPkgs.libclang.lib}/lib"; - CLANG_PATH = "${llvmPkgs.clang}/bin/clang"; - }; + 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 = ./.; - # 2. Tools and libraries shared by build and shell - baseArgs = env // { nativeBuildInputs = [ pkgs.cmake pkgs.ninja pkgs.pkg-config - pkgs.patchelf + pkgs.qt6.wrapQtAppsHook ]; buildInputs = [ pkgs.qt6.qtbase pkgs.qt6.qttools - pkgs.rustc - pkgs.cargo - pkgs.git llvmPkgs.clang - llvmPkgs.llvm llvmPkgs.libclang - ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ + logosBlockchainC + ] + ++ lib.optionals pkgs.stdenv.isDarwin [ pkgs.libiconv ]; - }; - viewer = inputs.logos-module-viewer.packages.${system}.default; + LIBCLANG_PATH = "${llvmPkgs.libclang.lib}/lib"; + CLANG_PATH = "${llvmPkgs.clang}/bin/clang"; + + cmakeFlags = [ + "-DLOGOS_CORE_ROOT=${logosCore}" + "-DLOGOS_BLOCKCHAIN_LIB=${logosBlockchainC}/lib" + "-DLOGOS_BLOCKCHAIN_INCLUDE=${logosBlockchainC}/include" + "-DLOGOS_MODULE_BUNDLE=OFF" + ]; + }; in - f { inherit pkgs system baseArgs viewer; }); - in - { - packages = forAllSystems ({ pkgs, baseArgs, ... }: { - default = pkgs.stdenv.mkDerivation (baseArgs // { - pname = "logos-blockchain-module"; - version = "dev"; - src = ./.; - - nativeBuildInputs = baseArgs.nativeBuildInputs ++ [ pkgs.qt6.wrapQtAppsHook ]; - - CARGO_HOME = "${"$"}TMPDIR/cargo-home"; - preConfigure = "mkdir -p $CARGO_HOME"; - }); + logos-blockchain-module = logosBlockchainModule; + default = logosBlockchainModule; } ); - apps = forAllSystems ({ pkgs, system, viewer, ... }: + apps = forAll ( + system: let - pkg = self.packages.${system}.default; + pkgs = mkPkgs system; + logosBlockchainModule = self.packages.${system}.logos-blockchain-module; + logosModuleViewer = logos-module-viewer.packages.${system}.default; in { default = { type = "app"; - program = "${pkgs.writeShellScriptBin "inspect-module" '' - ${viewer}/bin/logos-module-viewer --module ${pkg}/lib/liblogos-blockchain-module.so - ''}/bin/inspect-module"; + program = + "${pkgs.writeShellScriptBin "inspect-module" '' + exec ${logosModuleViewer}/bin/logos-module-viewer \ + --module ${logosBlockchainModule}/lib/liblogos-blockchain-module.so + ''}/bin/inspect-module"; }; } ); - devShells = forAllSystems ({ pkgs, system, ... }: + devShells = forAll ( + system: let + pkgs = mkPkgs system; pkg = self.packages.${system}.default; + logosCore = logos-core.packages.${system}.default; + logosBlockchainC = logos-blockchain.packages.${system}.logos-blockchain-c; in { default = pkgs.mkShell { inputsFrom = [ pkg ]; - # Inherit environment variables from the package - inherit (pkg) LOGOS_CORE_ROOT LOGOS_BLOCKCHAIN_ROOT LIBCLANG_PATH CLANG_PATH; + inherit (pkg) + LIBCLANG_PATH + CLANG_PATH; + + LOGOS_CORE_ROOT = "${logosCore}"; + LOGOS_BLOCKCHAIN_LIB = "${logosBlockchainC}/lib"; + LOGOS_BLOCKCHAIN_INCLUDE = "${logosBlockchainC}/include"; shellHook = '' BLUE='\e[1;34m' GREEN='\e[1;32m' - YELLOW='\e[1;33m' RESET='\e[0m' echo -e "\n''${BLUE}=== Logos Blockchain Module Development Environment ===''${RESET}" - echo -e "''${GREEN}Core SDK:''${RESET} $LOGOS_CORE_ROOT" - echo -e "''${GREEN}Blockchain:''${RESET} $LOGOS_BLOCKCHAIN_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/justfile b/justfile index 0854203..2625aea 100644 --- a/justfile +++ b/justfile @@ -3,38 +3,19 @@ default: build configure: cmake -S . -B build -G Ninja \ ${LOGOS_CORE_ROOT:+-DLOGOS_CORE_ROOT="$LOGOS_CORE_ROOT"} \ - ${LOGOS_BLOCKCHAIN_ROOT:+-DLOGOS_BLOCKCHAIN_ROOT="$LOGOS_BLOCKCHAIN_ROOT"} \ - -DCOPY_PLUGIN_TO_SOURCE_DIR=ON + ${LOGOS_BLOCKCHAIN_LIB:+-DLOGOS_BLOCKCHAIN_LIB="$LOGOS_BLOCKCHAIN_LIB"} \ + ${LOGOS_BLOCKCHAIN_INCLUDE:+-DLOGOS_BLOCKCHAIN_INCLUDE="$LOGOS_BLOCKCHAIN_INCLUDE"} -build: +build: configure cmake --build build --parallel --target liblogos-blockchain-module -update: clean-full - cmake --build build --parallel --target logos_blockchain_libs - just build - clean: - rm -rf build - rm -rf target - rm -f liblogos-blockchain-module.log - rm -rf logos_blockchain_db/ - -clean-full: clean + rm -rf build target rebuild: clean configure build -run: - RUST_BACKTRACE=full RUST_LOG=trace ../logos-module-viewer/result/bin/logos-module-viewer --module target/liblogos-blockchain-module.so > liblogos-blockchain-module.log 2>&1 - nix: - nix develop .# + nix develop -# View the log with unicode characters rendered unicode-logs file: - perl -pe 's/\\u([0-9A-Fa-f]{4})/chr(hex($1))/ge' {{ file }} | less -R - -logs: - just unicode-logs liblogos-blockchain-module.log - -logs-tail: - tail -f liblogos-blockchain-module.log | perl -pe 's/\\u([0-9A-Fa-f]{4})/chr(hex($1))/ge' + perl -pe 's/\\u([0-9A-Fa-f]{4})/chr(hex($1))/ge' {{file}} | less -R diff --git a/library.cpp b/library.cpp index 3b8df19..6b3f773 100644 --- a/library.cpp +++ b/library.cpp @@ -37,7 +37,8 @@ public: // TODO: Ensure proper cleanup on SIGINT const QByteArray path = config_path.toUtf8(); - auto [value, error] = start_lb_node(path.constData()); + const char* deployment = nullptr; + auto [value, error] = start_lb_node(path.constData(), deployment); if (!is_ok(&error)) { qCritical() << "Failed to start the node. Error:" << error; diff --git a/library.h b/library.h index ff89e14..a2fd62a 100644 --- a/library.h +++ b/library.h @@ -6,13 +6,12 @@ #ifdef __cplusplus extern "C" { #endif -#include +#include #ifdef __cplusplus } #endif class LogosBlockchainModuleAPI : public QObject, public PluginInterface { - Q_OBJECT Q_INTERFACES(PluginInterface) public: