mirror of
https://github.com/logos-storage/logos-storage-app-skeleton.git
synced 2026-06-14 04:19:25 +00:00
394 lines
14 KiB
CMake
394 lines
14 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 ###########
|
|
|
|
# This section locates the required dependencies in 3 different ways:
|
|
# 1- With NIX, the root folders (LOGOS_LIBLOGOS_ROOT, LOGOS_CPP_SDK_ROOT,
|
|
# and LOGOS_STORAGE_ROOT) are defined and point to the correct locations in
|
|
# the Nix store.
|
|
# 2- If the root folders are fetched from source (basically using git) in the
|
|
# parent folder, this is detected and used.
|
|
# 3- If none of the above apply, the vendor folders inside this project are used,
|
|
# meaning the dependencies need to be fetched using git submodules.
|
|
|
|
if(NOT DEFINED LOGOS_LIBLOGOS_ROOT)
|
|
set(_parent_liblogos "${CMAKE_SOURCE_DIR}/../../logos-liblogos")
|
|
set(_use_vendor ${LOGOS_STORAGE_CLI_USE_VENDOR})
|
|
if(NOT _use_vendor)
|
|
if(NOT EXISTS "${_parent_liblogos}/src/common/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_STORAGE_CLI_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()
|
|
|
|
if(NOT DEFINED LOGOS_STORAGE_ROOT)
|
|
set(_parent_storage_module "${CMAKE_SOURCE_DIR}/../../logos-storage-module")
|
|
set(_use_vendor ${LOGOS_STORAGE_CLI_USE_VENDOR})
|
|
if(NOT _use_vendor)
|
|
if(NOT EXISTS "${_parent_storage_module}/storage_module_plugin.h")
|
|
set(_use_vendor ON)
|
|
endif()
|
|
endif()
|
|
if(_use_vendor)
|
|
set(LOGOS_STORAGE_ROOT "${CMAKE_SOURCE_DIR}/../vendor/logos-storage-module")
|
|
else()
|
|
set(LOGOS_STORAGE_ROOT "${_parent_storage_module}")
|
|
endif()
|
|
endif()
|
|
|
|
set(_liblogos_found FALSE)
|
|
if(EXISTS "${LOGOS_LIBLOGOS_ROOT}/src/common/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()
|
|
|
|
set(_storage_module_found FALSE)
|
|
if(EXISTS "${LOGOS_STORAGE_ROOT}/storage_module_plugin.h")
|
|
set(_storage_module_found TRUE)
|
|
set(_storage_module_is_source TRUE)
|
|
elseif(EXISTS "${LOGOS_STORAGE_ROOT}/include/storage_module_api.h")
|
|
set(_storage_module_found TRUE)
|
|
set(_storage_module_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()
|
|
|
|
if(NOT _storage_module_found)
|
|
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(SOURCES
|
|
main.cpp
|
|
logos_manager.cpp
|
|
logos_manager.h
|
|
)
|
|
|
|
# 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
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_types.cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/logos_types.h
|
|
)
|
|
endif()
|
|
|
|
########### SOURCES END ###########
|
|
|
|
########### CPP GENERATOR ###########
|
|
|
|
# Define metadata json path
|
|
set(METADATA_JSON "${CMAKE_CURRENT_SOURCE_DIR}/metadata.json")
|
|
|
|
# Run the cpp generator for the storage module (produces storage_module_api.h/cpp).
|
|
# Only for source layout - nix builds already have pre-generated files.
|
|
if(_storage_module_is_source)
|
|
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_build_storage_module
|
|
COMMAND "${CMAKE_COMMAND}" -S "${LOGOS_STORAGE_ROOT}" -B "${LOGOS_STORAGE_ROOT}/build"
|
|
COMMAND "${CMAKE_COMMAND}" --build "${LOGOS_STORAGE_ROOT}/build" --target all
|
|
WORKING_DIRECTORY "${LOGOS_STORAGE_ROOT}/.."
|
|
COMMENT "Building storage module in ${LOGOS_STORAGE_ROOT}/build"
|
|
VERBATIM
|
|
)
|
|
|
|
if(APPLE)
|
|
set(PLUGIN_FILE "${LOGOS_STORAGE_ROOT}/build/modules/storage_module_plugin.dylib")
|
|
elseif(UNIX)
|
|
set(PLUGIN_FILE "${LOGOS_STORAGE_ROOT}/build/modules/storage_module_plugin.so")
|
|
else()
|
|
message(FATAL_ERROR "storage_module_plugin is not found.")
|
|
endif()
|
|
|
|
add_custom_target(run_cpp_generator_storage_module
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory "${PLUGINS_OUTPUT_DIR}"
|
|
COMMAND "${CPP_GENERATOR}" "${PLUGIN_FILE}" --interface "${LOGOS_STORAGE_ROOT}/storage_module_interface.h" --module-only --output-dir "${PLUGINS_OUTPUT_DIR}"
|
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
COMMENT "Running logos-cpp-generator on ${PLUGIN_FILE} with output-dir ${PLUGINS_OUTPUT_DIR}"
|
|
VERBATIM
|
|
)
|
|
|
|
add_dependencies(run_cpp_generator_storage_module cpp_generator_build)
|
|
add_dependencies(run_cpp_generator_storage_module run_build_storage_module)
|
|
endif()
|
|
|
|
# Generate logos_sdk.cpp via --general-only --metadata.
|
|
# This file #includes all module APIs (storage_module_api.cpp etc.) based on
|
|
# the dependencies declared in metadata.json.
|
|
# storage_module_api.cpp is NOT added directly to SOURCES to avoid AUTOMOC issues
|
|
# with files that don't exist at configure time.
|
|
if(_cpp_sdk_is_source)
|
|
if(NOT DEFINED PLUGINS_OUTPUT_DIR)
|
|
set(PLUGINS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/generated_code")
|
|
endif()
|
|
|
|
if(NOT DEFINED CPP_GENERATOR_BUILD_DIR)
|
|
set(CPP_GENERATOR_BUILD_DIR "${LOGOS_CPP_SDK_ROOT}/../build/cpp-generator")
|
|
endif()
|
|
|
|
if(NOT DEFINED CPP_GENERATOR)
|
|
set(CPP_GENERATOR "${CPP_GENERATOR_BUILD_DIR}/bin/logos-cpp-generator")
|
|
endif()
|
|
|
|
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_command(
|
|
OUTPUT "${PLUGINS_OUTPUT_DIR}/logos_sdk.cpp"
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory "${PLUGINS_OUTPUT_DIR}"
|
|
COMMAND "${CPP_GENERATOR}" --metadata "${METADATA_JSON}" --general-only --output-dir "${PLUGINS_OUTPUT_DIR}"
|
|
WORKING_DIRECTORY "${LOGOS_CPP_SDK_ROOT}/.."
|
|
DEPENDS "${METADATA_JSON}" cpp_generator_build
|
|
VERBATIM
|
|
)
|
|
|
|
add_custom_target(run_cpp_generator_logos_cli DEPENDS "${PLUGINS_OUTPUT_DIR}/logos_sdk.cpp")
|
|
|
|
if(_storage_module_is_source)
|
|
add_dependencies(run_cpp_generator_logos_cli run_cpp_generator_storage_module)
|
|
endif()
|
|
|
|
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()
|
|
# For installed/nix layout, logos_sdk.cpp is already pre-generated
|
|
set(PLUGINS_OUTPUT_DIR "${CMAKE_SOURCE_DIR}/generated_code")
|
|
list(APPEND SOURCES ${PLUGINS_OUTPUT_DIR}/logos_sdk.cpp)
|
|
endif()
|
|
|
|
########### CPP GENERATOR END ###########
|
|
|
|
########### 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)
|
|
|
|
# Link directories
|
|
link_directories(
|
|
${LOGOS_LIBLOGOS_ROOT}/lib
|
|
${LOGOS_CPP_SDK_ROOT}/lib
|
|
)
|
|
|
|
# Set output directories
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|
|
|
# Create the executable
|
|
add_executable(logos-storage-cli ${SOURCES})
|
|
|
|
# Link libraries
|
|
target_link_libraries(logos-storage-cli PRIVATE
|
|
Qt${QT_VERSION_MAJOR}::Core
|
|
Qt${QT_VERSION_MAJOR}::RemoteObjects
|
|
logos_core
|
|
)
|
|
|
|
# Link SDK library if using installed layout (source layout compiles the SDK directly)
|
|
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(logos-storage-cli PRIVATE ${LOGOS_SDK_LIB})
|
|
endif()
|
|
|
|
########### APP DEFINITION END ###########
|
|
|
|
########### HEADERS ###########
|
|
|
|
# Include directories
|
|
target_include_directories(logos-storage-cli PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}
|
|
${CMAKE_CURRENT_BINARY_DIR}
|
|
${PLUGINS_OUTPUT_DIR}
|
|
)
|
|
|
|
if(_liblogos_is_source)
|
|
target_include_directories(logos-storage-cli PRIVATE ${LOGOS_LIBLOGOS_ROOT})
|
|
else()
|
|
target_include_directories(logos-storage-cli PRIVATE ${LOGOS_LIBLOGOS_ROOT}/include)
|
|
endif()
|
|
|
|
if(_cpp_sdk_is_source)
|
|
target_include_directories(logos-storage-cli PRIVATE
|
|
${LOGOS_CPP_SDK_ROOT}/cpp
|
|
${LOGOS_CPP_SDK_ROOT}/cpp/generated
|
|
)
|
|
else()
|
|
target_include_directories(logos-storage-cli PRIVATE
|
|
${LOGOS_CPP_SDK_ROOT}/include
|
|
${LOGOS_CPP_SDK_ROOT}/include/cpp
|
|
${LOGOS_CPP_SDK_ROOT}/include/core
|
|
${PLUGINS_OUTPUT_DIR}/include
|
|
)
|
|
endif()
|
|
|
|
########### HEADERS END ###########
|
|
|
|
########### GENERATOR DEPENDENCY ###########
|
|
|
|
if(_cpp_sdk_is_source)
|
|
add_dependencies(logos-storage-cli run_cpp_generator_logos_cli)
|
|
endif()
|
|
|
|
if(_storage_module_is_source)
|
|
add_dependencies(logos-storage-cli run_cpp_generator_storage_module)
|
|
endif()
|
|
|
|
########### GENERATOR DEPENDENCY END ###########
|
|
|
|
########### 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-storage-cli 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-storage-cli run_build_liblogos)
|
|
endif()
|
|
|
|
########### LOGOS DEPENDENCIES END ###########
|
|
|
|
########### RUNTIME LINKS ###########
|
|
|
|
# Set RPATH settings for the executable
|
|
if(APPLE)
|
|
set_target_properties(logos-storage-cli PROPERTIES
|
|
INSTALL_RPATH "@executable_path/../lib"
|
|
BUILD_WITH_INSTALL_RPATH TRUE
|
|
)
|
|
elseif(UNIX)
|
|
set_target_properties(logos-storage-cli PROPERTIES
|
|
INSTALL_RPATH "$ORIGIN/../lib"
|
|
BUILD_WITH_INSTALL_RPATH TRUE
|
|
)
|
|
endif()
|
|
|
|
########### RUNTIME LINKS END ###########
|
|
|
|
########### INSTALL ###########
|
|
|
|
# Install rules
|
|
install(TARGETS logos-storage-cli
|
|
RUNTIME DESTINATION bin
|
|
)
|
|
|
|
########### INSTALL END ###########
|