2025-12-17 10:55:13 +01:00
cmake_minimum_required ( VERSION 3.20 )
2025-12-18 11:47:59 +01:00
project ( logos-blockchain-module LANGUAGES CXX )
2025-12-17 10:55:13 +01:00
set ( CMAKE_CXX_STANDARD 20 )
2025-12-18 11:47:59 +01:00
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
# ---- 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 ( HAS_LOGOS_CORE_ROOT FALSE )
set ( HAS_LOGOS_BLOCKCHAIN_ROOT FALSE )
set ( HAS_LOGOS_BLOCKCHAIN_LIB FALSE )
set ( HAS_LOGOS_BLOCKCHAIN_INCLUDE FALSE )
if ( DEFINED LOGOS_CORE_ROOT AND NOT "${LOGOS_CORE_ROOT}" STREQUAL "" )
set ( HAS_LOGOS_CORE_ROOT TRUE )
endif ( )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
if ( DEFINED LOGOS_BLOCKCHAIN_ROOT AND NOT "${LOGOS_BLOCKCHAIN_ROOT}" STREQUAL "" )
set ( HAS_LOGOS_BLOCKCHAIN_ROOT TRUE )
endif ( )
2025-12-19 13:18:16 +01:00
2026-01-29 18:11:42 +01:00
if ( DEFINED LOGOS_BLOCKCHAIN_LIB AND NOT "${LOGOS_BLOCKCHAIN_LIB}" STREQUAL "" )
set ( HAS_LOGOS_BLOCKCHAIN_LIB TRUE )
2025-12-18 11:47:59 +01:00
endif ( )
2026-01-29 18:11:42 +01:00
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." )
2025-12-18 11:47:59 +01:00
endif ( )
2026-01-29 18:11:42 +01:00
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 ----
2025-12-19 15:53:41 +01:00
find_package ( Qt6 REQUIRED COMPONENTS Core )
set ( CMAKE_AUTOMOC ON )
set ( CMAKE_AUTOUIC ON )
set ( CMAKE_AUTORCC ON )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
# ---- Directories ----
set ( WORKSPACE_ROOT "${CMAKE_BINARY_DIR}/workspace" )
set ( TARGET_DIR "${CMAKE_SOURCE_DIR}/target" )
file ( MAKE_DIRECTORY "${WORKSPACE_ROOT}" "${TARGET_DIR}" )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
# ---- Logos Core SDK ----
set ( SDK_LIB "${LOGOS_CORE_ROOT}/lib/liblogos_sdk.a" )
set ( SDK_INC "${LOGOS_CORE_ROOT}/include" )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
# ---- OS Specifics ----
2025-12-17 15:38:09 +01:00
if ( APPLE )
2026-01-29 18:11:42 +01:00
set ( DYLIB_EXT ".dylib" )
2025-12-17 15:38:09 +01:00
elseif ( WIN32 )
2026-01-29 18:11:42 +01:00
set ( DYLIB_EXT ".dll" )
set ( IMPLIB_EXT ".lib" )
2025-12-17 15:38:09 +01:00
else ( )
2026-01-29 18:11:42 +01:00
set ( DYLIB_EXT ".so" )
2025-12-17 15:38:09 +01:00
endif ( )
2026-01-29 18:11:42 +01:00
# 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.
2025-12-17 15:38:09 +01:00
2026-01-29 18:11:42 +01:00
# ---- Logos Blockchain (build OR consume) ----
if ( LOGOS_BLOCKCHAIN_PREBUILT )
set ( LOGOS_BLOCKCHAIN_DYLIB "${LOGOS_BLOCKCHAIN_LIB}/liblogos_blockchain${DYLIB_EXT}" )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
if ( WIN32 )
set ( LOGOS_BLOCKCHAIN_IMPLIB "${LOGOS_BLOCKCHAIN_LIB}/logos_blockchain${IMPLIB_EXT}" )
endif ( )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
add_custom_target ( logos_blockchain_libs )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
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 (
O U T P U T " $ { L O G O S _ B L O C K C H A I N _ 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 l o g o s - b l o c k c h a i n - c
- - m a n i f e s t - p a t h " $ { L O G O S _ B L O C K C H A I N _ 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 l o g o s _ b l o c k c h a i n $ { D Y L I B _ E X T } "
" $ { L O G O S _ B L O C K C H A I N _ D Y L I B } "
D E P E N D S " $ { L O G O S _ B L O C K C H A I N _ 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 _ B L O C K C H A I N _ 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 _ B L O C K C H A I N _ R O O T } / c - b i n d i n g s / l o g o s _ b l o c k c h a i n . h "
" $ { L O G O S _ B L O C K C H A I N _ H E A D E R } "
D E P E N D S " $ { L O G O S _ B L O C K C H A I N _ D Y L I B } "
V E R B A T I M
)
add_custom_target ( logos_blockchain_libs DEPENDS "${LOGOS_BLOCKCHAIN_DYLIB}" "${LOGOS_BLOCKCHAIN_HEADER}" )
endif ( )
2025-12-17 10:55:13 +01:00
2026-01-29 18:11:42 +01:00
# ---- Imported targets ----
2026-01-27 10:31:49 +01:00
add_library ( logos_blockchain_interface SHARED IMPORTED GLOBAL )
set_target_properties ( logos_blockchain_interface PROPERTIES
2026-01-29 18:11:42 +01:00
I M P O R T E D _ L O C A T I O N " $ { L O G O S _ B L O C K C H A I N _ 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 _ B L O C K C H A I N _ I N C L U D E } "
2025-12-18 11:47:59 +01:00
)
2026-01-29 18:11:42 +01:00
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 ( )
2025-12-18 11:47:59 +01:00
2025-12-19 15:53:41 +01:00
add_library ( logos_core STATIC IMPORTED )
set_target_properties ( logos_core PROPERTIES
2026-01-29 18:11:42 +01:00
I M P O R T E D _ L O C A T I O N " $ { S D K _ L I B } "
2025-12-19 15:53:41 +01:00
)
2026-01-29 18:11:42 +01:00
add_library ( logos_cpp_sdk INTERFACE )
target_include_directories ( logos_cpp_sdk INTERFACE "${SDK_INC}" )
2026-01-26 19:44:49 +01:00
# ---- Plugin ----
2026-01-29 18:11:42 +01:00
set ( PLUGIN_TARGET liblogos-blockchain-module )
2025-12-18 11:47:59 +01:00
2025-12-19 15:53:41 +01:00
qt_add_plugin ( ${ PLUGIN_TARGET } CLASS_NAME LogosBlockchainModule )
set_target_properties ( ${ PLUGIN_TARGET } PROPERTIES
O U T P U T _ N A M E " l o g o s - b l o c k c h a i n - m o d u l e "
2026-01-29 18:11:42 +01:00
L I B R A R Y _ O U T P U T _ D I R E C T O R Y " $ { T A R G E T _ D I R } "
2025-12-18 11:47:59 +01:00
)
target_sources ( ${ PLUGIN_TARGET } PRIVATE
2026-01-30 00:43:09 +01:00
s r c / l o g o s _ b l o c k c h a i n _ m o d u l e . c p p
s r c / l o g o s _ b l o c k c h a i n _ m o d u l e . h
2026-01-29 18:11:42 +01:00
m e t a d a t a . j s o n
2025-12-18 11:47:59 +01:00
)
2026-01-29 18:11:42 +01:00
set_target_properties ( ${ PLUGIN_TARGET } PROPERTIES
2026-01-30 00:43:09 +01:00
P U B L I C _ H E A D E R " s r c / i _ l o g o s _ b l o c k c h a i n _ m o d u l e . h "
2026-01-29 18:11:42 +01:00
)
2026-01-30 00:20:08 +01: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
)
2026-01-29 18:11:42 +01:00
2025-12-18 11:47:59 +01:00
target_link_libraries ( ${ PLUGIN_TARGET } PRIVATE
Q t 6 : : C o r e
2026-01-27 10:31:49 +01:00
l o g o s _ b l o c k c h a i n _ i n t e r f a c e
2025-12-18 11:47:59 +01:00
l o g o s _ c p p _ s d k
2025-12-19 15:53:41 +01:00
l o g o s _ c o r e
2025-12-18 11:47:59 +01:00
)
2026-01-27 10:31:49 +01:00
add_dependencies ( ${ PLUGIN_TARGET } logos_blockchain_libs )
2025-12-18 11:47:59 +01:00
if ( APPLE )
2026-01-29 18:11:42 +01:00
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 "
)
2025-12-18 11:47:59 +01:00
elseif ( UNIX )
2026-01-29 18:11:42 +01:00
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 "
)
2025-12-18 11:47:59 +01:00
endif ( )
2026-01-29 18:11:42 +01:00
# ---- Optional local bundle ----
if ( LOGOS_MODULE_BUNDLE )
add_custom_command ( TARGET ${ PLUGIN_TARGET } POST_BUILD
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 _ B L O C K C H A I N _ D Y L I B } "
" $ { T A R G E T _ D I R } / l i b l o g o s _ b l o c k c h a i n $ { D Y L I B _ E X T } "
V E R B A T I M
)
endif ( )
2025-12-17 15:38:09 +01:00
2026-01-29 18:11:42 +01:00
# ---- Install ----
2026-01-26 16:50:20 +01:00
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
2026-01-30 00:20:08 +01:00
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
2026-01-26 16:50:20 +01:00
)
2026-01-29 18:11:42 +01:00
install ( DIRECTORY "${LOGOS_BLOCKCHAIN_INCLUDE}/" DESTINATION include )
install ( FILES "${LOGOS_BLOCKCHAIN_DYLIB}" DESTINATION lib )