2026-02-27 14:10:19 -03:00

158 lines
5.7 KiB
CMake

cmake_minimum_required(VERSION 3.16)
project(LogosStorageCLI LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
########### DEPENDENCIES ###########
if(NOT EXISTS "${LOGOS_LIBLOGOS_ROOT}/include/interface.h")
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 EXISTS "${LOGOS_CPP_SDK_ROOT}/include/cpp/logos_api.h")
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()
if(NOT EXISTS "${LOGOS_STORAGE_ROOT}/include/storage_module_api.h")
message(FATAL_ERROR "logos-storage-module not found at ${LOGOS_STORAGE_ROOT}. "
"Set LOGOS_STORAGE_ROOT or run git submodule update --init --recursive.")
endif()
message(STATUS "Using logos-liblogos at: ${LOGOS_LIBLOGOS_ROOT}")
message(STATUS "Using logos-cpp-sdk at: ${LOGOS_CPP_SDK_ROOT}")
message(STATUS "Using logos-storage-module at: ${LOGOS_STORAGE_ROOT}")
########### DEPENDENCIES END ###########
# Sources
set(COMMON_SOURCES
logos_manager.cpp
)
# CPP Generator
set(PLUGINS_OUTPUT_DIR "${CMAKE_SOURCE_DIR}/generated_code")
list(APPEND COMMON_SOURCES ${PLUGINS_OUTPUT_DIR}/logos_sdk.cpp)
########### APP DEFINITION ###########
# Find Qt packages
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core RemoteObjects)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core RemoteObjects)
# Set output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# Shared library target holding common sources, includes, and link libraries
add_library(logos-common STATIC ${COMMON_SOURCES})
find_library(LOGOS_CORE_LIB logos_core PATHS ${LOGOS_LIBLOGOS_ROOT}/lib NO_DEFAULT_PATH REQUIRED)
target_link_libraries(logos-common PUBLIC
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::RemoteObjects
${LOGOS_CORE_LIB}
)
# Link SDK library if using installed layout (source layout compiles the SDK directly)
find_library(LOGOS_SDK_LIB logos_sdk PATHS ${LOGOS_CPP_SDK_ROOT}/lib NO_DEFAULT_PATH REQUIRED)
target_link_libraries(logos-common PUBLIC ${LOGOS_SDK_LIB})
# Create executables
add_executable(storage-app main.cpp)
target_link_libraries(storage-app PRIVATE logos-common)
########### APP DEFINITION END ###########
########### HEADERS ###########
# Include directories on the common target so all executables inherit them
target_include_directories(logos-common PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${PLUGINS_OUTPUT_DIR}
)
target_include_directories(logos-common PUBLIC ${LOGOS_LIBLOGOS_ROOT}/include)
target_include_directories(logos-common PUBLIC
${LOGOS_CPP_SDK_ROOT}/include
${LOGOS_CPP_SDK_ROOT}/include/cpp
${LOGOS_CPP_SDK_ROOT}/include/core
${PLUGINS_OUTPUT_DIR}/include
)
########### LOGOS DEPENDENCIES LIBRARIES ###########
# Check if logos_sdk library exists
if(NOT EXISTS "${LOGOS_CPP_SDK_ROOT}/lib/liblogos_sdk.a" AND NOT EXISTS "${LOGOS_CPP_SDK_ROOT}/lib/liblogos_sdk.dylib" AND NOT EXISTS "${LOGOS_CPP_SDK_ROOT}/lib/liblogos_sdk.so")
set(LOGOS_CPP_SDK_BUILD_DIR "${LOGOS_CPP_SDK_ROOT}/build")
add_custom_target(run_build_cpp_sdk
COMMAND ${CMAKE_COMMAND} -E make_directory "${LOGOS_CPP_SDK_BUILD_DIR}"
COMMAND ${CMAKE_COMMAND} -E chdir "${LOGOS_CPP_SDK_BUILD_DIR}" cmake ../cpp -GNinja -DCMAKE_POSITION_INDEPENDENT_CODE=ON
COMMAND ${CMAKE_COMMAND} -E chdir "${LOGOS_CPP_SDK_BUILD_DIR}" ninja
COMMAND ${CMAKE_COMMAND} -E make_directory "${LOGOS_CPP_SDK_ROOT}/lib"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${LOGOS_CPP_SDK_BUILD_DIR}/lib/liblogos_sdk.a"
"${LOGOS_CPP_SDK_ROOT}/lib/liblogos_sdk.a"
WORKING_DIRECTORY "${LOGOS_CPP_SDK_ROOT}"
COMMENT "Build cpp sdk and copy liblogos_sdk.a to ${LOGOS_CPP_SDK_ROOT}/lib"
VERBATIM
)
add_dependencies(logos-common run_build_cpp_sdk)
endif()
if(NOT EXISTS "${LOGOS_LIBLOGOS_ROOT}/lib/liblogos_core.a" AND NOT EXISTS "${LOGOS_LIBLOGOS_ROOT}/lib/liblogos_core.dylib" AND NOT EXISTS "${LOGOS_LIBLOGOS_ROOT}/lib/liblogos_core.so")
set(LOGOS_LIBLOGOS_BUILD_DIR "${LOGOS_LIBLOGOS_ROOT}/build")
add_custom_target(run_build_liblogos
COMMAND ${CMAKE_COMMAND} -E make_directory "${LOGOS_LIBLOGOS_BUILD_DIR}"
COMMAND ${CMAKE_COMMAND} -E chdir "${LOGOS_LIBLOGOS_BUILD_DIR}" cmake .. -GNinja -DCMAKE_POSITION_INDEPENDENT_CODE=ON
COMMAND ${CMAKE_COMMAND} -E chdir "${LOGOS_LIBLOGOS_BUILD_DIR}" ninja
COMMAND ${CMAKE_COMMAND} -E make_directory "${LOGOS_LIBLOGOS_ROOT}/lib"
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${LOGOS_LIBLOGOS_BUILD_DIR}/lib"
"${LOGOS_LIBLOGOS_ROOT}/lib"
WORKING_DIRECTORY "${LOGOS_LIBLOGOS_ROOT}"
COMMENT "Build logos-liblogos and copy liblogos_core.a to ${LOGOS_LIBLOGOS_ROOT}/lib"
VERBATIM
)
add_dependencies(logos-common run_build_liblogos)
endif()
########### LOGOS DEPENDENCIES END ###########
########### RUNTIME LINKS ###########
# Set RPATH settings for each executable
foreach(_target storage-app)
if(APPLE)
set_target_properties(${_target} PROPERTIES
INSTALL_RPATH "@executable_path/../lib"
BUILD_WITH_INSTALL_RPATH TRUE
)
elseif(UNIX)
set_target_properties(${_target} PROPERTIES
INSTALL_RPATH "$ORIGIN/../lib"
BUILD_WITH_INSTALL_RPATH TRUE
)
endif()
endforeach()
########### RUNTIME LINKS END ###########
########### INSTALL ###########
# Install rules
install(TARGETS storage-app
RUNTIME DESTINATION bin
)
########### INSTALL END ###########