include(CMakeParseArguments)

# 生成插件动态库
# 使用方法:rv_add_plugin(target_name SOURCES <source files> DEPENDS <link libraries> PLUGIN_DEPENDS <depend plugins>)
function(rv_add_plugin TARGET)
    set(OPTIONS)
    set(ONE_ARGS)
    set(MULTI_ARGS SOURCES DEPENDS PLUGIN_DEPENDS)
    cmake_parse_arguments(ARG "${OPTIONS}" "${ONE_ARGS}" "${MULTI_ARGS}" ${ARGN})

    set(PLUGIN_NAME ${PROJECT_NAME})
    set(PLUGIN_VERSION ${PROJECT_VERSION})
    rv_parse_plugin_depends(${ARG_PLUGIN_DEPENDS})
    configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.json.in
        ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.json
        @ONLY)

    add_library(${TARGET} SHARED
        ${ARG_SOURCES}
    )

    target_link_libraries(${TARGET} PRIVATE
        ${ARG_DEPENDS}
    )

    set_target_properties(${TARGET} PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/plugin"
        RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/plugin"
        RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/plugin"
    )
endfunction()

function(rv_parse_plugin_depends)
    # TODO: 应该传进来版本号,暂时写死用全局的版本号
    set(VERSION ${TSP_VERSION_MAJ}.${TSP_VERSION_MIN}.${TSP_VERSION_PATCH})
    set(LIST PARENT_SCOPE)
    set(INDEX 0)
    foreach(DEP ${ARGV})
        if(${ARGC} STREQUAL "1")
            set(LIST "{\"Name\" : \"${DEP}\",\"Version\" :\"${VERSION}\"}")
        else()
            math(EXPR INDEX "${INDEX} + 1")
            if(${INDEX} STREQUAL ${ARGC})
                set(LIST "${LIST} {\"Name\" : \"${DEP}\",\"Version\" :\"${VERSION}\"}")
            else()
                set(LIST "${LIST} {\"Name\" : \"${DEP}\",\"Version\" :\"${VERSION}\"}, ")
            endif()
        endif()
    endforeach()
    set(DEPENDENCY_LIST ${LIST} PARENT_SCOPE)
endfunction()
作者:admin  创建时间:2025-02-10 11:17
最后编辑:admin  更新时间:2025-02-10 14:09