Split tasks so rebuilding doesn't recompile deps.

This commit is contained in:
Alejandro Cabeza Romero 2025-12-19 13:18:16 +01:00
parent 1328b2d995
commit 8ac0122295
No known key found for this signature in database
GPG Key ID: DA3D14AE478030FD
4 changed files with 44 additions and 29 deletions

3
.gitignore vendored
View File

@ -8,8 +8,5 @@ CMakeCache.txt
cmake_install.cmake
cmake-build-debug
# Build directories
build/
# Artifacts
libblockchainmodulelib.so

View File

@ -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)

View File

@ -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

View File

@ -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.