From 8e8c553da4bc462d95a135467c8310410c6837c3 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Thu, 21 Aug 2025 23:19:31 +0200 Subject: [PATCH] build: Fix external plugins linking with plugin libraries --- cmake/modules/ImHexPlugin.cmake | 189 ++++++++++++++++++-------------- cmake/sdk/CMakeLists.txt | 6 + 2 files changed, 110 insertions(+), 85 deletions(-) diff --git a/cmake/modules/ImHexPlugin.cmake b/cmake/modules/ImHexPlugin.cmake index 8e19e3fb8..76d0a8a24 100644 --- a/cmake/modules/ImHexPlugin.cmake +++ b/cmake/modules/ImHexPlugin.cmake @@ -36,106 +36,125 @@ macro(add_imhex_plugin) # Define new project for plugin project(${IMHEX_PLUGIN_NAME}) - # Create a new shared library for the plugin source code - add_library(${IMHEX_PLUGIN_NAME} ${IMHEX_PLUGIN_LIBRARY_TYPE} ${IMHEX_PLUGIN_SOURCES}) + if (IMHEX_PLUGIN_IMPORTED) + add_library(${IMHEX_PLUGIN_NAME} SHARED IMPORTED GLOBAL) - # Add include directories and link libraries - target_include_directories(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_INCLUDES}) - target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_LIBRARIES}) - target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE libimhex ${FMT_LIBRARIES} imgui_all_includes libwolv) - addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl) - addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl-gen) - - precompileHeaders(${IMHEX_PLUGIN_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/include") - - # Add IMHEX_PROJECT_NAME and IMHEX_VERSION define - target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}") - target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_VERSION="${IMHEX_VERSION_STRING}") - target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PLUGIN_NAME=${IMHEX_PLUGIN_NAME}) - - # Enable required compiler flags - enableUnityBuild(${IMHEX_PLUGIN_NAME}) - setupCompilerFlags(${IMHEX_PLUGIN_NAME}) - addCppCheck(${IMHEX_PLUGIN_NAME}) - - # Configure build properties - set_target_properties(${IMHEX_PLUGIN_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins" - CXX_STANDARD 23 - PREFIX "" - SUFFIX ${IMHEX_PLUGIN_SUFFIX} - ) - - # Set rpath of plugin libraries to the plugins folder - if (WIN32) - if (IMHEX_PLUGIN_LIBRARY_PLUGIN) - set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + if (WIN32) + set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES + IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}" + IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/../lib${IMHEX_PLUGIN_NAME}.dll.a" + INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include") + elseif (APPLE) + set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES + IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../../MacOS/plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}" + INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include") + else() + set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES + IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}" + INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include") endif() - elseif (APPLE) - set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES BUILD_RPATH "@executable_path/../Frameworks;@executable_path/plugins") - endif() + else() + # Create a new shared library for the plugin source code + add_library(${IMHEX_PLUGIN_NAME} ${IMHEX_PLUGIN_LIBRARY_TYPE} ${IMHEX_PLUGIN_SOURCES}) - # Setup a romfs for the plugin - list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/romfs) - set(LIBROMFS_PROJECT_NAME ${IMHEX_PLUGIN_NAME}) - add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs) - target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY}) + # Add include directories and link libraries + target_include_directories(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_INCLUDES}) + target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_LIBRARIES}) + target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE libimhex ${FMT_LIBRARIES} imgui_all_includes libwolv) + addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl) + addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl-gen) - set(FEATURE_DEFINE_CONTENT) + precompileHeaders(${IMHEX_PLUGIN_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/include") - if (IMHEX_PLUGIN_FEATURES) - list(LENGTH IMHEX_PLUGIN_FEATURES IMHEX_FEATURE_COUNT) - math(EXPR IMHEX_FEATURE_COUNT "${IMHEX_FEATURE_COUNT} - 1" OUTPUT_FORMAT DECIMAL) - foreach(index RANGE 0 ${IMHEX_FEATURE_COUNT} 2) - list(SUBLIST IMHEX_PLUGIN_FEATURES ${index} 2 IMHEX_PLUGIN_FEATURE) - list(GET IMHEX_PLUGIN_FEATURE 0 feature_define) - list(GET IMHEX_PLUGIN_FEATURE 1 feature_description) + # Add IMHEX_PROJECT_NAME and IMHEX_VERSION define + target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}") + target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_VERSION="${IMHEX_VERSION_STRING}") + target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PLUGIN_NAME=${IMHEX_PLUGIN_NAME}) - string(TOUPPER ${feature_define} feature_define) - add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature_define}=0) - set(FEATURE_DEFINE_CONTENT "${FEATURE_DEFINE_CONTENT}{ \"${feature_description}\", IMHEX_FEATURE_ENABLED(${feature_define}) },") - endforeach() - endif() + # Enable required compiler flags + enableUnityBuild(${IMHEX_PLUGIN_NAME}) + setupCompilerFlags(${IMHEX_PLUGIN_NAME}) + addCppCheck(${IMHEX_PLUGIN_NAME}) - target_compile_options(${IMHEX_PLUGIN_NAME} PRIVATE -DIMHEX_PLUGIN_FEATURES_CONTENT=${FEATURE_DEFINE_CONTENT}) - - # Add the new plugin to the main dependency list so it gets built by default - if (TARGET imhex_all) - add_dependencies(imhex_all ${IMHEX_PLUGIN_NAME}) - endif() - - if (IMHEX_EXTERNAL_PLUGIN_BUILD) - install(TARGETS ${IMHEX_PLUGIN_NAME} DESTINATION ".") - endif() - - # Fix rpath - if (APPLE) - set_target_properties( - ${IMHEX_PLUGIN_NAME} + # Configure build properties + set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES - INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/plugins" + RUNTIME_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins" + CXX_STANDARD 23 + PREFIX "" + SUFFIX ${IMHEX_PLUGIN_SUFFIX} ) - elseif (UNIX) - set(PLUGIN_RPATH "") - list(APPEND PLUGIN_RPATH "$ORIGIN") - if (IMHEX_PLUGIN_ADD_INSTALL_PREFIX_TO_RPATH) - list(APPEND PLUGIN_RPATH "${CMAKE_INSTALL_PREFIX}/lib") + # Set rpath of plugin libraries to the plugins folder + if (WIN32) + if (IMHEX_PLUGIN_LIBRARY_PLUGIN) + set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE) + endif() + elseif (APPLE) + set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES BUILD_RPATH "@executable_path/../Frameworks;@executable_path/plugins") endif() - set_target_properties( - ${IMHEX_PLUGIN_NAME} - PROPERTIES + # Setup a romfs for the plugin + list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/romfs) + set(LIBROMFS_PROJECT_NAME ${IMHEX_PLUGIN_NAME}) + add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs) + target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY}) + + set(FEATURE_DEFINE_CONTENT) + + if (IMHEX_PLUGIN_FEATURES) + list(LENGTH IMHEX_PLUGIN_FEATURES IMHEX_FEATURE_COUNT) + math(EXPR IMHEX_FEATURE_COUNT "${IMHEX_FEATURE_COUNT} - 1" OUTPUT_FORMAT DECIMAL) + foreach(index RANGE 0 ${IMHEX_FEATURE_COUNT} 2) + list(SUBLIST IMHEX_PLUGIN_FEATURES ${index} 2 IMHEX_PLUGIN_FEATURE) + list(GET IMHEX_PLUGIN_FEATURE 0 feature_define) + list(GET IMHEX_PLUGIN_FEATURE 1 feature_description) + + string(TOUPPER ${feature_define} feature_define) + add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature_define}=0) + set(FEATURE_DEFINE_CONTENT "${FEATURE_DEFINE_CONTENT}{ \"${feature_description}\", IMHEX_FEATURE_ENABLED(${feature_define}) },") + endforeach() + endif() + + target_compile_options(${IMHEX_PLUGIN_NAME} PRIVATE -DIMHEX_PLUGIN_FEATURES_CONTENT=${FEATURE_DEFINE_CONTENT}) + + # Add the new plugin to the main dependency list so it gets built by default + if (TARGET imhex_all) + add_dependencies(imhex_all ${IMHEX_PLUGIN_NAME}) + endif() + + if (IMHEX_EXTERNAL_PLUGIN_BUILD) + install(TARGETS ${IMHEX_PLUGIN_NAME} DESTINATION ".") + endif() + + # Fix rpath + if (APPLE) + set_target_properties( + ${IMHEX_PLUGIN_NAME} + PROPERTIES + INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/plugins" + ) + elseif (UNIX) + set(PLUGIN_RPATH "") + list(APPEND PLUGIN_RPATH "$ORIGIN") + + if (IMHEX_PLUGIN_ADD_INSTALL_PREFIX_TO_RPATH) + list(APPEND PLUGIN_RPATH "${CMAKE_INSTALL_PREFIX}/lib") + endif() + + set_target_properties( + ${IMHEX_PLUGIN_NAME} + PROPERTIES INSTALL_RPATH_USE_ORIGIN ON INSTALL_RPATH "${PLUGIN_RPATH}" - ) - endif() + ) + endif() - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt AND IMHEX_ENABLE_UNIT_TESTS AND IMHEX_ENABLE_PLUGIN_TESTS) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests) - target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_NAME}_tests) - target_compile_definitions(${IMHEX_PLUGIN_NAME}_tests PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}-tests") + if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt AND IMHEX_ENABLE_UNIT_TESTS AND IMHEX_ENABLE_PLUGIN_TESTS) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests) + target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_NAME}_tests) + target_compile_definitions(${IMHEX_PLUGIN_NAME}_tests PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}-tests") + endif() endif() endmacro() diff --git a/cmake/sdk/CMakeLists.txt b/cmake/sdk/CMakeLists.txt index 6ef02836b..9ae8e5301 100644 --- a/cmake/sdk/CMakeLists.txt +++ b/cmake/sdk/CMakeLists.txt @@ -38,8 +38,14 @@ add_subdirectory(lib/external/libwolv EXCLUDE_FROM_ALL) set(LIBPL_ENABLE_CLI OFF CACHE BOOL "" FORCE) add_subdirectory(lib/external/pattern_language EXCLUDE_FROM_ALL) +set(IMHEX_PLUGIN_IMPORTED ON) + add_subdirectory(lib/libimhex) add_subdirectory(lib/trace) +add_subdirectory(lib/fonts) +add_subdirectory(lib/ui) + +set(IMHEX_PLUGIN_IMPORTED OFF) if (WIN32) set_target_properties(libimhex PROPERTIES