2026-04-15 17:35:49 +03:00
cmake_minimum_required ( VERSION 3.20 )
2026-06-16 15:42:53 +03:00
project ( LEZIndexerModule LANGUAGES CXX )
2026-04-15 17:35:49 +03:00
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_EXECUTION_ZONE_INDEXER_ROOT "" CACHE PATH "Path to logos-execution-zone-indexer source root." )
set ( LOGOS_EXECUTION_ZONE_INDEXER_LIB "" CACHE PATH "Path to prebuilt logos-execution-zone-indexer lib." )
set ( LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE "" CACHE PATH "Path to prebuilt logos-execution-zone-indexer include." )
2026-05-14 09:33:10 +03:00
set ( LOGOS_EXECUTION_ZONE_PREBUILT FALSE )
2026-04-15 17:35:49 +03:00
set ( HAS_LOGOS_CORE_ROOT FALSE )
set ( HAS_LOGOS_EXECUTION_ZONE_INDEXER_ROOT FALSE )
set ( HAS_LOGOS_EXECUTION_ZONE_INDEXER_LIB FALSE )
set ( HAS_LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE FALSE )
if ( DEFINED LOGOS_CORE_ROOT AND NOT "${LOGOS_CORE_ROOT}" STREQUAL "" )
set ( HAS_LOGOS_CORE_ROOT TRUE )
endif ( )
if ( DEFINED LOGOS_EXECUTION_ZONE_INDEXER_ROOT AND NOT "${LOGOS_EXECUTION_ZONE_INDEXER_ROOT}" STREQUAL "" )
set ( HAS_LOGOS_EXECUTION_ZONE_INDEXER_ROOT TRUE )
endif ( )
if ( DEFINED LOGOS_EXECUTION_ZONE_INDEXER_LIB AND NOT "${LOGOS_EXECUTION_ZONE_INDEXER_LIB}" STREQUAL "" )
set ( HAS_LOGOS_EXECUTION_ZONE_INDEXER_LIB TRUE )
endif ( )
if ( DEFINED LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE AND NOT "${LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE}" STREQUAL "" )
set ( HAS_LOGOS_EXECUTION_ZONE_INDEXER_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_EXECUTION_ZONE_INDEXER_LIB AND HAS_LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE AND NOT HAS_LOGOS_EXECUTION_ZONE_INDEXER_ROOT )
message ( STATUS "Using prebuilt logos-execution-zone-indexer." )
set ( LOGOS_EXECUTION_ZONE_PREBUILT TRUE )
elseif ( NOT HAS_LOGOS_EXECUTION_ZONE_INDEXER_LIB AND NOT HAS_LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE AND HAS_LOGOS_EXECUTION_ZONE_INDEXER_ROOT )
message ( STATUS "Building logos-execution-zone-indexer from source." )
set ( LOGOS_EXECUTION_ZONE_PREBUILT FALSE )
else ( )
message ( FATAL_ERROR "Either both LOGOS_EXECUTION_ZONE_INDEXER_LIB and LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE must be set for prebuilt logos-execution-zone-indexer, or LOGOS_EXECUTION_ZONE_INDEXER_ROOT must be set to build from source." )
endif ( )
# ---- Qt ----
find_package ( Qt6 REQUIRED COMPONENTS Core RemoteObjects )
set ( CMAKE_AUTOMOC ON )
2026-06-16 13:22:49 +03:00
# ---- OpenSSL ----
# liblogos_sdk.a uses boost::asio::ssl (rpc_server, plain_transport_*); as a
# static archive it does not carry its OpenSSL dependency, so the final link
# of this plugin must link libssl/libcrypto itself.
find_package ( OpenSSL REQUIRED )
2026-04-15 17:35:49 +03:00
set ( CMAKE_AUTOUIC ON )
set ( CMAKE_AUTORCC ON )
# ---- Directories ----
set ( WORKSPACE_ROOT "${CMAKE_BINARY_DIR}/workspace" )
file ( MAKE_DIRECTORY "${WORKSPACE_ROOT}" )
# ---- 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 ( DYLIB_EXT ".dylib" )
elseif ( WIN32 )
set ( DYLIB_EXT ".dll" )
set ( IMPLIB_EXT ".lib" )
else ( )
set ( DYLIB_EXT ".so" )
endif ( )
# 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.
# ---- Logos Blockchain (build OR consume) ----
if ( LOGOS_EXECUTION_ZONE_PREBUILT )
set ( LOGOS_EXECUTION_ZONE_DYLIB "${LOGOS_EXECUTION_ZONE_INDEXER_LIB}/libindexer_ffi${DYLIB_EXT}" )
if ( WIN32 )
set ( LOGOS_EXECUTION_ZONE_IMPLIB "${LOGOS_EXECUTION_ZONE_INDEXER_LIB}/indexer_ffi${IMPLIB_EXT}" )
endif ( )
add_custom_target ( logos_execution_zone_libs )
else ( )
find_program ( CARGO_EXECUTABLE cargo REQUIRED )
set ( CARGO_TARGET_DIR "${WORKSPACE_ROOT}/logos-execution-zone/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_EXECUTION_ZONE_INDEXER_LIB "${INTERNAL_STAGE_LIB}" )
set ( LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE "${INTERNAL_STAGE_INCLUDE}" )
set ( LOGOS_EXECUTION_ZONE_DYLIB "${INTERNAL_STAGE_LIB}/libindexer_ffi${DYLIB_EXT}" )
set ( LOGOS_EXECUTION_ZONE_HEADER "${INTERNAL_STAGE_INCLUDE}/indexer_ffi.h" )
add_custom_command (
O U T P U T " $ { L O G O S _ E X E C U T I O N _ Z O N E _ D Y L I B } "
C O M M A N D $ { C M A K E _ C O M M A N D } - E e n v
C A R G O _ T A R G E T _ D I R = $ { C A R G O _ T A R G E T _ D I R }
$ { C A R G O _ E X E C U T A B L E } b u i l d - - r e l e a s e
- - p a c k a g e i n d e x e r - f f i
- - m a n i f e s t - p a t h " $ { L O G O S _ E X E C U T I O N _ Z O N E _ I N D E X E R _ R O O T } / C a r g o . t o m l "
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y
" $ { C A R G O _ T A R G E T _ D I R } / r e l e a s e / l i b i n d e x e r _ f f i $ { D Y L I B _ E X T } "
" $ { L O G O S _ E X E C U T I O N _ Z O N E _ D Y L I B } "
D E P E N D S " $ { L O G O S _ E X E C U T I O N _ Z O N E _ I N D E X E R _ R O O T } / C a r g o . t o m l "
V E R B A T I M
)
add_custom_command (
O U T P U T " $ { L O G O S _ E X E C U T I O N _ Z O N E _ H E A D E R } "
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y _ i f _ d i f f e r e n t
" $ { L O G O S _ E X E C U T I O N _ Z O N E _ I N D E X E R _ R O O T } / i n d e x e r - f f i / i n d e x e r _ f f i . h "
" $ { L O G O S _ E X E C U T I O N _ Z O N E _ H E A D E R } "
D E P E N D S " $ { L O G O S _ E X E C U T I O N _ Z O N E _ D Y L I B } "
V E R B A T I M
)
add_custom_target ( logos_execution_zone_libs DEPENDS "${LOGOS_EXECUTION_ZONE_DYLIB}" "${LOGOS_EXECUTION_ZONE_HEADER}" )
endif ( )
# ---- Imported targets ----
add_library ( logos_execution_zone_indexer SHARED IMPORTED GLOBAL )
set_target_properties ( logos_execution_zone_indexer PROPERTIES
I M P O R T E D _ L O C A T I O N " $ { L O G O S _ E X E C U T I O N _ Z O N E _ D Y L I B } "
I N T E R F A C E _ I N C L U D E _ D I R E C T O R I E S " $ { L O G O S _ E X E C U T I O N _ Z O N E _ I N D E X E R _ I N C L U D E } "
)
if ( NOT LOGOS_EXECUTION_ZONE_PREBUILT )
add_dependencies ( logos_execution_zone_indexer logos_execution_zone_libs )
endif ( )
if ( WIN32 )
set_target_properties ( logos_execution_zone_indexer PROPERTIES IMPORTED_IMPLIB "${LOGOS_EXECUTION_ZONE_IMPLIB}" )
endif ( )
add_library ( logos_core STATIC IMPORTED
2026-06-16 15:42:53 +03:00
s r c / i _ l e z _ i n d e x e r _ m o d u l e . h )
2026-04-15 17:35:49 +03:00
set_target_properties ( logos_core PROPERTIES
I M P O R T E D _ L O C A T I O N " $ { S D K _ L I B } "
)
add_library ( logos_cpp_sdk INTERFACE )
target_include_directories ( logos_cpp_sdk INTERFACE "${SDK_INC}" )
# ---- Plugin ----
2026-06-16 15:42:53 +03:00
set ( PLUGIN_TARGET lez_indexer_module )
qt_add_plugin ( ${ PLUGIN_TARGET } CLASS_NAME LezIndexerModule )
# A consumer (module-viewer / basecamp) derives the QtRO object name it INVOKES
# from the produced library's FILENAME, whereas logos_host REGISTERS the plugin
# under metadata.json `name`. They must be identical, and short — macOS caps the
# QtRO `local:` socket path (sun_path) at 104 bytes, so a long name makes the host
# fail to listen. `PREFIX ""` drops the `lib` prefix so the file is exactly
# `lez_indexer_module.<ext>` == metadata `name` == `main` == name().
set_target_properties ( ${ PLUGIN_TARGET } PROPERTIES
O U T P U T _ N A M E l e z _ i n d e x e r _ m o d u l e
P R E F I X " "
)
2026-04-15 17:35:49 +03:00
target_sources ( ${ PLUGIN_TARGET } PRIVATE
2026-06-16 15:42:53 +03:00
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / l e z _ i n d e x e r _ m o d u l e . c p p
2026-06-17 18:22:41 +03:00
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / l e z _ f f i _ m a r s h a l l i n g . c p p
2026-04-15 17:35:49 +03:00
)
set_property ( TARGET ${ PLUGIN_TARGET } PROPERTY PUBLIC_HEADER
2026-06-16 15:42:53 +03:00
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / i _ l e z _ i n d e x e r _ m o d u l e . h
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / l e z _ i n d e x e r _ m o d u l e . h
2026-04-15 17:35:49 +03:00
)
target_include_directories ( ${ PLUGIN_TARGET } PRIVATE
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c
)
target_link_libraries ( ${ PLUGIN_TARGET } PRIVATE
Q t 6 : : C o r e
Q t 6 : : R e m o t e O b j e c t s
l o g o s _ e x e c u t i o n _ z o n e _ i n d e x e r
l o g o s _ c p p _ s d k
l o g o s _ c o r e
2026-06-16 13:22:49 +03:00
O p e n S S L : : S S L
O p e n S S L : : C r y p t o
2026-04-15 17:35:49 +03:00
)
target_compile_definitions ( ${ PLUGIN_TARGET } PRIVATE
2026-06-16 15:42:53 +03:00
L E Z _ I N D E X E R _ M O D U L E _ M E T A D A T A _ F I L E = " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m e t a d a t a . j s o n "
2026-04-15 17:35:49 +03:00
)
add_dependencies ( ${ PLUGIN_TARGET } logos_execution_zone_libs )
if ( APPLE )
set_target_properties ( ${ PLUGIN_TARGET } PROPERTIES
B U I L D _ R P A T H " @ l o a d e r _ p a t h "
I N S T A L L _ R P A T H " @ l o a d e r _ p a t h "
)
elseif ( UNIX )
set_target_properties ( ${ PLUGIN_TARGET } PROPERTIES
B U I L D _ R P A T H " $ O R I G I N "
I N S T A L L _ R P A T H " $ O R I G I N "
)
endif ( )
# ---- Install ----
install ( TARGETS ${ PLUGIN_TARGET }
L I B R A R Y D E S T I N A T I O N l i b
A R C H I V E D E S T I N A T I O N l i b
R U N T I M E D E S T I N A T I O N b i n
P U B L I C _ H E A D E R D E S T I N A T I O N i n c l u d e
)
install ( DIRECTORY "${LOGOS_EXECUTION_ZONE_INDEXER_INCLUDE}/" DESTINATION include )
install ( FILES "${LOGOS_EXECUTION_ZONE_DYLIB}" DESTINATION lib )