mirror of
https://github.com/logos-blockchain/logos-blockchain-ui.git
synced 2026-02-14 02:23:40 +00:00
274 lines
9.3 KiB
CMake
274 lines
9.3 KiB
CMake
cmake_minimum_required(VERSION 3.16)
|
|
project(BlockchainUIPlugin VERSION 1.0.0 LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_AUTOMOC ON)
|
|
set(CMAKE_AUTORCC ON)
|
|
set(CMAKE_AUTOUIC ON)
|
|
|
|
# Allow override from environment or command line
|
|
if(NOT DEFINED LOGOS_LIBLOGOS_ROOT)
|
|
set(_parent_liblogos "${CMAKE_SOURCE_DIR}/../logos-liblogos")
|
|
set(_use_vendor ${LOGOS_BLOCKCHAIN_UI_USE_VENDOR})
|
|
if(NOT _use_vendor)
|
|
if(NOT EXISTS "${_parent_liblogos}/interface.h")
|
|
set(_use_vendor ON)
|
|
endif()
|
|
endif()
|
|
if(_use_vendor)
|
|
set(LOGOS_LIBLOGOS_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-liblogos")
|
|
else()
|
|
set(LOGOS_LIBLOGOS_ROOT "${_parent_liblogos}")
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT DEFINED LOGOS_CPP_SDK_ROOT)
|
|
set(_parent_cpp_sdk "${CMAKE_SOURCE_DIR}/../logos-cpp-sdk")
|
|
set(_use_vendor ${LOGOS_BLOCKCHAIN_UI_USE_VENDOR})
|
|
if(NOT _use_vendor)
|
|
if(NOT EXISTS "${_parent_cpp_sdk}/cpp/logos_api.h")
|
|
set(_use_vendor ON)
|
|
endif()
|
|
endif()
|
|
if(_use_vendor)
|
|
set(LOGOS_CPP_SDK_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-cpp-sdk")
|
|
else()
|
|
set(LOGOS_CPP_SDK_ROOT "${_parent_cpp_sdk}")
|
|
endif()
|
|
endif()
|
|
|
|
# Check if dependencies are available (support both source and installed layouts)
|
|
set(_liblogos_found FALSE)
|
|
if(EXISTS "${LOGOS_LIBLOGOS_ROOT}/interface.h")
|
|
set(_liblogos_found TRUE)
|
|
set(_liblogos_is_source TRUE)
|
|
elseif(EXISTS "${LOGOS_LIBLOGOS_ROOT}/include/interface.h")
|
|
set(_liblogos_found TRUE)
|
|
set(_liblogos_is_source FALSE)
|
|
endif()
|
|
|
|
set(_cpp_sdk_found FALSE)
|
|
if(EXISTS "${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h")
|
|
set(_cpp_sdk_found TRUE)
|
|
set(_cpp_sdk_is_source TRUE)
|
|
elseif(EXISTS "${LOGOS_CPP_SDK_ROOT}/include/cpp/logos_api.h")
|
|
set(_cpp_sdk_found TRUE)
|
|
set(_cpp_sdk_is_source FALSE)
|
|
endif()
|
|
|
|
if(NOT _liblogos_found)
|
|
message(FATAL_ERROR "logos-liblogos not found at ${LOGOS_LIBLOGOS_ROOT}. "
|
|
"Set LOGOS_LIBLOGOS_ROOT or run git submodule update --init --recursive.")
|
|
endif()
|
|
|
|
if(NOT _cpp_sdk_found)
|
|
message(FATAL_ERROR "logos-cpp-sdk not found at ${LOGOS_CPP_SDK_ROOT}. "
|
|
"Set LOGOS_CPP_SDK_ROOT or run git submodule update --init --recursive.")
|
|
endif()
|
|
|
|
# Find Qt packages
|
|
find_package(Qt6 REQUIRED COMPONENTS Core Widgets RemoteObjects Quick QuickWidgets)
|
|
|
|
# Get the real path to handle symlinks correctly
|
|
get_filename_component(REAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" REALPATH)
|
|
|
|
# Try to find the component-interfaces package first
|
|
find_package(component-interfaces QUIET)
|
|
|
|
# If not found, use the local interfaces folder
|
|
if(NOT component-interfaces_FOUND)
|
|
# Include the local interfaces directory
|
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/interfaces)
|
|
|
|
# Create a component-interfaces library
|
|
add_library(component-interfaces INTERFACE)
|
|
target_include_directories(component-interfaces INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/interfaces)
|
|
endif()
|
|
|
|
# Source files
|
|
set(SOURCES
|
|
src/BlockchainPlugin.cpp
|
|
src/BlockchainPlugin.h
|
|
src/BlockchainBackend.cpp
|
|
src/BlockchainBackend.h
|
|
src/LogModel.cpp
|
|
src/LogModel.h
|
|
src/blockchain_resources.qrc
|
|
)
|
|
|
|
# Add SDK sources (only if source layout, installed layout uses the library)
|
|
if(_cpp_sdk_is_source)
|
|
list(APPEND SOURCES
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.h
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.h
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.h
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.h
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.h
|
|
)
|
|
endif()
|
|
|
|
# Run Logos C++ generator on metadata before compilation (only for source layout)
|
|
set(METADATA_JSON "${CMAKE_CURRENT_SOURCE_DIR}/metadata.json")
|
|
|
|
# Only run generator for source layout - nix builds already have generated files
|
|
if(_cpp_sdk_is_source)
|
|
# Source layout: build and run the generator
|
|
# Generate into build directory
|
|
set(PLUGINS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/generated_code")
|
|
set(CPP_GENERATOR_BUILD_DIR "${LOGOS_CPP_SDK_ROOT}/../build/cpp-generator")
|
|
set(CPP_GENERATOR "${CPP_GENERATOR_BUILD_DIR}/bin/logos-cpp-generator")
|
|
|
|
if(NOT TARGET cpp_generator_build)
|
|
add_custom_target(cpp_generator_build
|
|
COMMAND bash "${LOGOS_CPP_SDK_ROOT}/cpp-generator/compile.sh"
|
|
WORKING_DIRECTORY "${LOGOS_CPP_SDK_ROOT}/.."
|
|
COMMENT "Building logos-cpp-generator via ${LOGOS_CPP_SDK_ROOT}/cpp-generator/compile.sh"
|
|
VERBATIM
|
|
)
|
|
endif()
|
|
|
|
add_custom_target(run_cpp_generator_blockchain_ui
|
|
COMMAND "${CPP_GENERATOR}" --metadata "${METADATA_JSON}" --general-only --output-dir "${PLUGINS_OUTPUT_DIR}"
|
|
WORKING_DIRECTORY "${LOGOS_CPP_SDK_ROOT}/.."
|
|
COMMENT "Running logos-cpp-generator on ${METADATA_JSON} with output-dir ${PLUGINS_OUTPUT_DIR}"
|
|
VERBATIM
|
|
)
|
|
add_dependencies(run_cpp_generator_blockchain_ui cpp_generator_build)
|
|
|
|
# Add generated logos_sdk.cpp - will be generated by run_cpp_generator_blockchain_ui
|
|
list(APPEND SOURCES ${PLUGINS_OUTPUT_DIR}/logos_sdk.cpp)
|
|
# Mark as generated so CMake knows to wait for it
|
|
set_source_files_properties(
|
|
${PLUGINS_OUTPUT_DIR}/logos_sdk.cpp
|
|
PROPERTIES GENERATED TRUE
|
|
)
|
|
else()
|
|
# Installed/nix layout: lib.nix preConfigure populates generated_code before CMake.
|
|
# May be overridden by -DPLUGINS_OUTPUT_DIR= when source tree is read-only (e.g. Nix sandbox).
|
|
set(PLUGINS_OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated_code" CACHE PATH "Generated code directory (nix layout)")
|
|
list(APPEND SOURCES ${PLUGINS_OUTPUT_DIR}/include/logos_sdk.cpp)
|
|
endif()
|
|
|
|
# Create the plugin library
|
|
add_library(blockchain_ui SHARED ${SOURCES})
|
|
|
|
# Set output name without lib prefix and with correct name for generator
|
|
set_target_properties(blockchain_ui PROPERTIES
|
|
PREFIX ""
|
|
OUTPUT_NAME "blockchain_ui"
|
|
)
|
|
|
|
# Ensure generator runs before building the plugin (only for source layout)
|
|
if(_cpp_sdk_is_source)
|
|
add_dependencies(blockchain_ui run_cpp_generator_blockchain_ui)
|
|
endif()
|
|
|
|
# Include directories
|
|
target_include_directories(blockchain_ui PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_BINARY_DIR}
|
|
${PLUGINS_OUTPUT_DIR}
|
|
)
|
|
|
|
# Add include directories based on layout type
|
|
if(_liblogos_is_source)
|
|
target_include_directories(blockchain_ui PRIVATE ${LOGOS_LIBLOGOS_ROOT})
|
|
else()
|
|
target_include_directories(blockchain_ui PRIVATE ${LOGOS_LIBLOGOS_ROOT}/include)
|
|
endif()
|
|
|
|
if(_cpp_sdk_is_source)
|
|
target_include_directories(blockchain_ui PRIVATE
|
|
${LOGOS_CPP_SDK_ROOT}/cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/generated
|
|
)
|
|
else()
|
|
# For nix builds, also include the include subdirectory
|
|
# (lib.nix moves header files to ./generated_code/include/)
|
|
target_include_directories(blockchain_ui PRIVATE
|
|
${LOGOS_CPP_SDK_ROOT}/include
|
|
${LOGOS_CPP_SDK_ROOT}/include/cpp
|
|
${LOGOS_CPP_SDK_ROOT}/include/core
|
|
${PLUGINS_OUTPUT_DIR}/include
|
|
)
|
|
endif()
|
|
|
|
# Link against libraries
|
|
target_link_libraries(blockchain_ui PRIVATE
|
|
Qt6::Core
|
|
Qt6::Widgets
|
|
Qt6::RemoteObjects
|
|
Qt6::Quick
|
|
Qt6::QuickWidgets
|
|
component-interfaces
|
|
)
|
|
|
|
# Link SDK library if using installed layout
|
|
if(NOT _cpp_sdk_is_source)
|
|
find_library(LOGOS_SDK_LIB logos_sdk PATHS ${LOGOS_CPP_SDK_ROOT}/lib NO_DEFAULT_PATH REQUIRED)
|
|
target_link_libraries(blockchain_ui PRIVATE ${LOGOS_SDK_LIB})
|
|
endif()
|
|
|
|
# Link against Abseil libraries if found
|
|
find_package(absl QUIET)
|
|
if(absl_FOUND)
|
|
target_link_libraries(blockchain_ui PRIVATE
|
|
absl::base
|
|
absl::strings
|
|
absl::log
|
|
absl::check
|
|
)
|
|
endif()
|
|
|
|
# Set common properties for both platforms
|
|
set_target_properties(blockchain_ui PROPERTIES
|
|
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/modules"
|
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/modules" # For Windows .dll
|
|
BUILD_WITH_INSTALL_RPATH TRUE
|
|
SKIP_BUILD_RPATH FALSE)
|
|
|
|
if(APPLE)
|
|
# macOS specific settings
|
|
set_target_properties(blockchain_ui PROPERTIES
|
|
INSTALL_RPATH "@loader_path"
|
|
INSTALL_NAME_DIR "@rpath"
|
|
BUILD_WITH_INSTALL_NAME_DIR TRUE)
|
|
|
|
add_custom_command(TARGET blockchain_ui POST_BUILD
|
|
COMMAND install_name_tool -id "@rpath/blockchain_ui.dylib" $<TARGET_FILE:blockchain_ui>
|
|
COMMENT "Updating library paths for macOS"
|
|
)
|
|
else()
|
|
# Linux specific settings
|
|
set_target_properties(blockchain_ui PROPERTIES
|
|
INSTALL_RPATH "$ORIGIN"
|
|
INSTALL_RPATH_USE_LINK_PATH FALSE)
|
|
endif()
|
|
|
|
install(TARGETS blockchain_ui
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules
|
|
)
|
|
|
|
install(FILES ${METADATA_JSON}
|
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/logos-blockchain-ui-new
|
|
)
|
|
|
|
install(DIRECTORY "${PLUGINS_OUTPUT_DIR}/"
|
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/logos-blockchain-ui-new/generated
|
|
OPTIONAL
|
|
)
|
|
|
|
# Print status messages
|
|
message(STATUS "Blockchain UI Plugin configured successfully")
|