From 8826089bff301aba4fc573201d2ec984444aba10 Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Tue, 3 Jun 2025 11:17:07 +0200 Subject: [PATCH] Add cmake function to handle plugin meta data --- ManiVault/CMakeLists.txt | 20 +++++----- ManiVault/cmake/MvCoreConfig.cmake.in | 1 + ManiVault/cmake/mv_plugin_meta_data.cmake | 45 +++++++++++++++++++++++ 3 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 ManiVault/cmake/mv_plugin_meta_data.cmake diff --git a/ManiVault/CMakeLists.txt b/ManiVault/CMakeLists.txt index a11d2a307..c191eb96e 100644 --- a/ManiVault/CMakeLists.txt +++ b/ManiVault/CMakeLists.txt @@ -37,6 +37,9 @@ include(mv_check_and_set_AVX) # Helper function to install runtime dependencies include(mv_install_dependencies_utils) +# Helper function to handle plugin meta data +include(mv_plugin_meta_data) + # Generate a header file that contains the EXPORT macro for public libraries include(GenerateExportHeader) @@ -487,17 +490,12 @@ install(EXPORT "ManiVaultPublicExport" COMPONENT MVPUBLIC_EXPORT ) -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mv_install_dependencies_utils.cmake" - DESTINATION cmake/mv - COMPONENT MVPUBLIC_CMAKE_HELPER -) - -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mv_install_dependencies.cmake.in" - DESTINATION cmake/mv - COMPONENT MVPUBLIC_CMAKE_HELPER -) - -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mv_check_and_set_AVX.cmake" +# Copy cmake helper files +install(FILES + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mv_install_dependencies_utils.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mv_install_dependencies.cmake.in" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mv_check_and_set_AVX.cmake" + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/mv_plugin_meta_data.cmake" DESTINATION cmake/mv COMPONENT MVPUBLIC_CMAKE_HELPER ) diff --git a/ManiVault/cmake/MvCoreConfig.cmake.in b/ManiVault/cmake/MvCoreConfig.cmake.in index b0053bae3..e456686c1 100644 --- a/ManiVault/cmake/MvCoreConfig.cmake.in +++ b/ManiVault/cmake/MvCoreConfig.cmake.in @@ -15,6 +15,7 @@ check_required_components("@PROJECT_NAME@") # include some helper functions include("${ManiVault_CMAKE_DIR}/mv_install_dependencies_utils.cmake") include("${ManiVault_CMAKE_DIR}/mv_check_and_set_AVX.cmake") +include("${ManiVault_CMAKE_DIR}/mv_plugin_meta_data.cmake") message(STATUS "Found ManiVault version ${ManiVault_VERSION}. Use for example as:") message(STATUS " find_package(ManiVault COMPONENTS Core PointData ClusterData ImageData ColorData TextData CONFIG)") diff --git a/ManiVault/cmake/mv_plugin_meta_data.cmake b/ManiVault/cmake/mv_plugin_meta_data.cmake new file mode 100644 index 000000000..21676cea6 --- /dev/null +++ b/ManiVault/cmake/mv_plugin_meta_data.cmake @@ -0,0 +1,45 @@ +function(mv_handle_plugin_config plugin_target) + + # Read config file + set(PLUGIN_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/PluginInfo.json") + + if(NOT EXISTS "${PLUGIN_CONFIG_FILE}") + message(FATAL_ERROR "JSON file not found: ${PLUGIN_CONFIG_FILE}") + endif() + + file(READ ${PLUGIN_CONFIG_FILE} PLUGIN_INFO_JSON) + + # Check if config file contains certain entries + set(HAS_PLUGIN_TYPE 0) + + # Get the number of top-level keys + string(JSON TOP_LEVEL_COUNT LENGTH "${PLUGIN_INFO_JSON}") + + math(EXPR LAST_INDEX "${TOP_LEVEL_COUNT} - 1") + foreach(I RANGE 0 ${LAST_INDEX}) + string(JSON KEY_NAME MEMBER "${PLUGIN_INFO_JSON}" ${I}) + if("${KEY_NAME}" STREQUAL "type") + set(HAS_PLUGIN_TYPE 1) + endif() + endforeach() + + string(JSON PLUGIN_NAME GET "${PLUGIN_INFO_JSON}" name) + message(STATUS "ManiVault plugin: ${PLUGIN_NAME}") + + # Extract plugin version + string(JSON PLUGIN_VERSION GET "${PLUGIN_INFO_JSON}" version plugin) + message(STATUS " version: ${PLUGIN_VERSION}") + set_target_properties(${plugin_target} PROPERTIES + OUTPUT_NAME "${plugin_target}_p${PLUGIN_VERSION}_c${ManiVault_VERSION}" + ) + + # Extract plugin type + if(HAS_PLUGIN_TYPE) + string(JSON PLUGIN_TYPE GET "${PLUGIN_INFO_JSON}" type) + message(STATUS " type: ${PLUGIN_TYPE}") + set_target_properties(${plugin_target} PROPERTIES + FOLDER "${PLUGIN_TYPE}Plugins" + ) + endif() + +endfunction()