From 8ac0122295b39103cb1211773a2cf2958ba858b0 Mon Sep 17 00:00:00 2001 From: Alejandro Cabeza Romero Date: Fri, 19 Dec 2025 13:18:16 +0100 Subject: [PATCH] Split tasks so rebuilding doesn't recompile deps. --- .gitignore | 3 --- CMakeLists.txt | 44 ++++++++++++++++++++++++++++++-------------- justfile | 24 +++++++++++++----------- library.cpp | 2 +- 4 files changed, 44 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 6a80b0c..8ce17a6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,5 @@ CMakeCache.txt cmake_install.cmake cmake-build-debug -# Build directories -build/ - # Artifacts libblockchainmodulelib.so diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a1e821..2b6857f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,10 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) option(UNTITLED_USE_QT "Enable Qt6 dependency" ON) option(COPY_PLUGIN_TO_SOURCE_DIR "Copy built plugin to source dir root (dev convenience)" ON) +# Default OFF: keep normal builds fast; deps are built when needed by link step, +# and you can force-refresh via your Justfile update target. +option(LOGOS_BUILD_DEPS_BY_DEFAULT "Force stage+cargo targets as explicit deps of the plugin" OFF) + set(LOGOS_CPP_SDK_ROOT "" CACHE PATH "Path to logos-cpp-sdk package root (must contain include/core and include/cpp)") set(LOGOS_BLOCKCHAIN_ROOT "" CACHE PATH "Path to logos-blockchain source root (read-only in Nix store is OK)") @@ -37,20 +41,23 @@ endif() # Writable stage of logos-blockchain source # (Fixes: build.rs/cbindgen writing into source dir inside /nix/store) # ------------------------- -set(LOGOS_BLOCKCHAIN_WORKDIR "${CMAKE_BINARY_DIR}/logos_blockchain_src") +set(LOGOS_BLOCKCHAIN_WORKDIR "${CMAKE_BINARY_DIR}/logos_blockchain_src") set(LOGOS_BLOCKCHAIN_STAGE_STAMP "${LOGOS_BLOCKCHAIN_WORKDIR}/.staged") +# NOTE: +# - We do NOT rm -rf here; normal builds stay stable. +# - Force refresh is handled by deleting workdir/stamp in your Justfile update target. add_custom_command( OUTPUT "${LOGOS_BLOCKCHAIN_STAGE_STAMP}" COMMAND ${CMAKE_COMMAND} -E echo "Staging logos-blockchain into writable dir: ${LOGOS_BLOCKCHAIN_WORKDIR}" - COMMAND ${CMAKE_COMMAND} -E rm -rf "${LOGOS_BLOCKCHAIN_WORKDIR}" COMMAND ${CMAKE_COMMAND} -E make_directory "${LOGOS_BLOCKCHAIN_WORKDIR}" COMMAND ${CMAKE_COMMAND} -E copy_directory "${LOGOS_BLOCKCHAIN_ROOT}" "${LOGOS_BLOCKCHAIN_WORKDIR}" COMMAND ${CMAKE_COMMAND} -E touch "${LOGOS_BLOCKCHAIN_STAGE_STAMP}" VERBATIM ) -add_custom_target(logos_blockchain_stage ALL +# Not ALL: only runs when required. +add_custom_target(logos_blockchain_stage DEPENDS "${LOGOS_BLOCKCHAIN_STAGE_STAMP}" ) @@ -65,13 +72,10 @@ file(MAKE_DIRECTORY "${LOGOS_INSTALL_DIR}/lib") # Platform naming if(APPLE) set(NOMOS_EXT ".dylib") - set(NOMOS_BIN_DIR "lib") elseif(WIN32) set(NOMOS_EXT ".dll") - set(NOMOS_BIN_DIR "bin") else() set(NOMOS_EXT ".so") - set(NOMOS_BIN_DIR "lib") endif() # What cargo produces and what we stage as @@ -85,8 +89,15 @@ set(NOMOS_STAGED_HEADER "${LOGOS_INSTALL_DIR}/include/${NOMOS_C_HEADER_NAME}") # Build output dir for cargo (writable) set(CARGO_TARGET_DIR "${CMAKE_BINARY_DIR}/cargo-target") -# We will patch the SONAME so the plugin depends on "libnomos.so" not "logos_stage/lib/libnomos.so". -find_program(PATCHELF_EXE patchelf) +# Linux-only SONAME patching command list +set(PATCHELF_COMMANDS "") +if(UNIX AND NOT APPLE AND NOT WIN32) + find_program(PATCHELF_EXE patchelf REQUIRED) + set(PATCHELF_COMMANDS + COMMAND ${CMAKE_COMMAND} -E echo "Patching SONAME of ${NOMOS_C_STAGED_DYLIB_NAME}" + COMMAND ${PATCHELF_EXE} --set-soname "${NOMOS_C_STAGED_DYLIB_NAME}" "${NOMOS_STAGED_DYLIB}" + ) +endif() add_custom_command( OUTPUT "${NOMOS_STAGED_DYLIB}" @@ -100,10 +111,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy "${CARGO_TARGET_DIR}/release/${NOMOS_C_SOURCE_DYLIB_NAME}" "${NOMOS_STAGED_DYLIB}" - # Patch SONAME (Linux only) so DT_NEEDED becomes "libnomos.so" - COMMAND ${CMAKE_COMMAND} -E echo "Patching SONAME of ${NOMOS_STAGED_DYLIB_NAME}" - COMMAND ${CMAKE_COMMAND} -E env - ${PATCHELF_EXE} --set-soname "${NOMOS_C_STAGED_DYLIB_NAME}" "${NOMOS_STAGED_DYLIB}" + ${PATCHELF_COMMANDS} DEPENDS "${LOGOS_BLOCKCHAIN_STAGE_STAMP}" WORKING_DIRECTORY "${LOGOS_BLOCKCHAIN_WORKDIR}" VERBATIM @@ -120,15 +128,19 @@ add_custom_command( VERBATIM ) -add_custom_target(logos_cargo_build ALL +# Not ALL: only runs when required. +add_custom_target(logos_cargo_build DEPENDS "${NOMOS_STAGED_DYLIB}" "${NOMOS_STAGED_HEADER}" ) +# Imported library for consumers (this is what the plugin links) add_library(nomos_c SHARED IMPORTED GLOBAL) set_target_properties(nomos_c PROPERTIES IMPORTED_LOCATION "${NOMOS_STAGED_DYLIB}" INTERFACE_INCLUDE_DIRECTORIES "${LOGOS_INSTALL_DIR}/include" ) + +# Ensure the imported target is materialized before consumers link add_dependencies(nomos_c logos_cargo_build) # ------------------------- @@ -169,7 +181,11 @@ set_target_properties(${PLUGIN_TARGET} PROPERTIES AUTORCC ON ) -add_dependencies(${PLUGIN_TARGET} logos_cargo_build logos_blockchain_stage) +# Optional: force deps as explicit build dependencies of the plugin target. +# This is mainly useful if you want "build plugin" to always stage+build first. +if(LOGOS_BUILD_DEPS_BY_DEFAULT) + add_dependencies(${PLUGIN_TARGET} logos_blockchain_stage logos_cargo_build) +endif() # Runtime: prefer libnomos next to the plugin if(APPLE) diff --git a/justfile b/justfile index 9c7ad1e..1f25565 100644 --- a/justfile +++ b/justfile @@ -1,7 +1,5 @@ -default: - just build +default: build -# One-time (or when CMakeLists.txt changes) configure: test -n "${LOGOS_CPP_SDK_ROOT}" || (echo "LOGOS_CPP_SDK_ROOT not set" && exit 1) test -n "${LOGOS_BLOCKCHAIN_ROOT}" || (echo "LOGOS_BLOCKCHAIN_ROOT not set" && exit 1) @@ -11,18 +9,22 @@ configure: -DLOGOS_BLOCKCHAIN_ROOT="${LOGOS_BLOCKCHAIN_ROOT}" \ -DCOPY_PLUGIN_TO_SOURCE_DIR=ON -# Build only (assumes configure already ran) build: cmake --build build --parallel --target blockchainmodulelib -# Build via Nix -nix: - nix build .#default -L - -# Enter dev shell -dev: - nix develop .# +update: + rm -rf build/logos_blockchain_src + rm -f build/logos_blockchain_src/.staged + rm -rf build/logos_stage + cmake --build build --parallel --target logos_blockchain_stage + cmake --build build --parallel --target logos_cargo_build + just build clean: rm -rf build rm -f libblockchainmodulelib.so + +rebuild: clean configure build + +run: + ../logos-module-viewer/result/bin/logos-module-viewer --module libblockchainmodulelib.so > libblockchainmodulelib.log 2>&1 diff --git a/library.cpp b/library.cpp index 4f5165a..7284861 100644 --- a/library.cpp +++ b/library.cpp @@ -71,4 +71,4 @@ private: NomosNode *node; }; -#include "library.moc" // Test if this is actually needed +#include "library.moc" // Required. Must be at the bottom.