option(AUDIOCPP_BUILD_SERVER_FRONTENDS "Build optional in-process audiocpp_server frontend adapters" OFF) set(AUDIOCPP_SERVER_FRONTEND_MODULES "" CACHE STRING "Semicolon-separated optional audiocpp_server frontend modules to build") set(AUDIOCPP_SERVER_FRONTENDS_DIR "" CACHE PATH "Optional external server frontend module package") if (NOT AUDIOCPP_BUILD_SERVER_FRONTENDS AND AUDIOCPP_SERVER_FRONTEND_MODULES) message(FATAL_ERROR "AUDIOCPP_SERVER_FRONTEND_MODULES requires AUDIOCPP_BUILD_SERVER_FRONTENDS=ON") endif() function(audiocpp_register_server_frontend AUDIOCPP_SERVER_FRONTEND_NAME) set(options) set(one_value_args REGISTER_FUNCTION) set(multi_value_args SOURCES INCLUDE_DIRS LIBRARIES COMPILE_DEFINITIONS) cmake_parse_arguments( AUDIOCPP_REGISTERED_FRONTEND "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) set_property(GLOBAL APPEND PROPERTY "AUDIOCPP_SERVER_FRONTEND_REGISTERED_MODULES" "${AUDIOCPP_SERVER_FRONTEND_NAME}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_NAME}_REGISTER_FUNCTION" "${AUDIOCPP_REGISTERED_FRONTEND_REGISTER_FUNCTION}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_NAME}_SOURCES" "${AUDIOCPP_REGISTERED_FRONTEND_SOURCES}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_NAME}_INCLUDE_DIRS" "${AUDIOCPP_REGISTERED_FRONTEND_INCLUDE_DIRS}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_NAME}_LIBRARIES" "${AUDIOCPP_REGISTERED_FRONTEND_LIBRARIES}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_NAME}_COMPILE_DEFINITIONS" "${AUDIOCPP_REGISTERED_FRONTEND_COMPILE_DEFINITIONS}") endfunction() function(audiocpp_collect_server_frontends) get_property(AUDIOCPP_SERVER_FRONTENDS_ALREADY_COLLECTED GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTENDS_COLLECTED" SET) if (AUDIOCPP_SERVER_FRONTENDS_ALREADY_COLLECTED) return() endif() set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTENDS_COLLECTED" TRUE) set(AUDIOCPP_SERVER_FRONTEND_DECLARATIONS "") set(AUDIOCPP_SERVER_FRONTEND_REGISTRATIONS "") set(AUDIOCPP_SERVER_FRONTEND_SOURCES "") set(AUDIOCPP_SERVER_FRONTEND_INCLUDE_DIRS "") set(AUDIOCPP_SERVER_FRONTEND_LIBRARIES "") set(AUDIOCPP_SERVER_FRONTEND_COMPILE_DEFINITIONS "") if (AUDIOCPP_BUILD_SERVER_FRONTENDS AND AUDIOCPP_SERVER_FRONTEND_MODULES) if (NOT AUDIOCPP_SERVER_FRONTENDS_DIR) message(FATAL_ERROR "AUDIOCPP_BUILD_SERVER_FRONTENDS=ON requires AUDIOCPP_SERVER_FRONTENDS_DIR=") endif() get_filename_component( AUDIOCPP_SERVER_FRONTENDS_DIR_ABS "${AUDIOCPP_SERVER_FRONTENDS_DIR}" ABSOLUTE BASE_DIR "${PROJECT_SOURCE_DIR}") if (NOT EXISTS "${AUDIOCPP_SERVER_FRONTENDS_DIR_ABS}/server_frontends.cmake") message(FATAL_ERROR "AUDIOCPP_SERVER_FRONTENDS_DIR must contain server_frontends.cmake: ${AUDIOCPP_SERVER_FRONTENDS_DIR_ABS}") endif() set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_REGISTERED_MODULES" "") include("${AUDIOCPP_SERVER_FRONTENDS_DIR_ABS}/server_frontends.cmake") get_property(AUDIOCPP_REGISTERED_SERVER_FRONTENDS GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_REGISTERED_MODULES") foreach(AUDIOCPP_SERVER_FRONTEND_MODULE IN LISTS AUDIOCPP_SERVER_FRONTEND_MODULES) list(FIND AUDIOCPP_REGISTERED_SERVER_FRONTENDS "${AUDIOCPP_SERVER_FRONTEND_MODULE}" AUDIOCPP_SERVER_FRONTEND_INDEX) if (AUDIOCPP_SERVER_FRONTEND_INDEX EQUAL -1) message(FATAL_ERROR "External server frontend package did not register requested module: ${AUDIOCPP_SERVER_FRONTEND_MODULE}") endif() get_property(AUDIOCPP_FRONTEND_REGISTER_FUNCTION GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_MODULE}_REGISTER_FUNCTION") get_property(AUDIOCPP_FRONTEND_SOURCES GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_MODULE}_SOURCES") get_property(AUDIOCPP_FRONTEND_INCLUDE_DIRS GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_MODULE}_INCLUDE_DIRS") get_property(AUDIOCPP_FRONTEND_LIBRARIES GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_MODULE}_LIBRARIES") get_property(AUDIOCPP_FRONTEND_COMPILE_DEFINITIONS GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_${AUDIOCPP_SERVER_FRONTEND_MODULE}_COMPILE_DEFINITIONS") if (AUDIOCPP_FRONTEND_REGISTER_FUNCTION) string(APPEND AUDIOCPP_SERVER_FRONTEND_DECLARATIONS "void ${AUDIOCPP_FRONTEND_REGISTER_FUNCTION}(ServerFrontendRegistry & registry);\n") string(APPEND AUDIOCPP_SERVER_FRONTEND_REGISTRATIONS " ${AUDIOCPP_FRONTEND_REGISTER_FUNCTION}(registry);\n") endif() list(APPEND AUDIOCPP_SERVER_FRONTEND_SOURCES ${AUDIOCPP_FRONTEND_SOURCES}) list(APPEND AUDIOCPP_SERVER_FRONTEND_INCLUDE_DIRS ${AUDIOCPP_FRONTEND_INCLUDE_DIRS}) list(APPEND AUDIOCPP_SERVER_FRONTEND_LIBRARIES ${AUDIOCPP_FRONTEND_LIBRARIES}) list(APPEND AUDIOCPP_SERVER_FRONTEND_COMPILE_DEFINITIONS ${AUDIOCPP_FRONTEND_COMPILE_DEFINITIONS}) endforeach() endif() if (AUDIOCPP_SERVER_FRONTEND_SOURCES) list(REMOVE_DUPLICATES AUDIOCPP_SERVER_FRONTEND_INCLUDE_DIRS) list(REMOVE_DUPLICATES AUDIOCPP_SERVER_FRONTEND_LIBRARIES) list(REMOVE_DUPLICATES AUDIOCPP_SERVER_FRONTEND_COMPILE_DEFINITIONS) endif() set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_DECLARATIONS" "${AUDIOCPP_SERVER_FRONTEND_DECLARATIONS}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_REGISTRATIONS" "${AUDIOCPP_SERVER_FRONTEND_REGISTRATIONS}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_SOURCES" "${AUDIOCPP_SERVER_FRONTEND_SOURCES}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_INCLUDE_DIRS" "${AUDIOCPP_SERVER_FRONTEND_INCLUDE_DIRS}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_LIBRARIES" "${AUDIOCPP_SERVER_FRONTEND_LIBRARIES}") set_property(GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_COMPILE_DEFINITIONS" "${AUDIOCPP_SERVER_FRONTEND_COMPILE_DEFINITIONS}") endfunction() function(audiocpp_configure_server_frontends AUDIOCPP_SERVER_TARGET) audiocpp_collect_server_frontends() get_property(AUDIOCPP_SERVER_FRONTEND_DECLARATIONS GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_DECLARATIONS") get_property(AUDIOCPP_SERVER_FRONTEND_REGISTRATIONS GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_REGISTRATIONS") get_property(AUDIOCPP_SERVER_FRONTEND_SOURCES GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_SOURCES") get_property(AUDIOCPP_SERVER_FRONTEND_INCLUDE_DIRS GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_INCLUDE_DIRS") get_property(AUDIOCPP_SERVER_FRONTEND_LIBRARIES GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_LIBRARIES") get_property(AUDIOCPP_SERVER_FRONTEND_COMPILE_DEFINITIONS GLOBAL PROPERTY "AUDIOCPP_SERVER_FRONTEND_SELECTED_COMPILE_DEFINITIONS") file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/generated") if (AUDIOCPP_SERVER_FRONTEND_SOURCES) add_library(audiocpp_server_frontends OBJECT ${AUDIOCPP_SERVER_FRONTEND_SOURCES} ) target_include_directories(audiocpp_server_frontends PRIVATE "${PROJECT_SOURCE_DIR}/app/server" ${AUDIOCPP_SERVER_FRONTEND_INCLUDE_DIRS} ) target_link_libraries(audiocpp_server_frontends PUBLIC engine_runtime PRIVATE ${AUDIOCPP_SERVER_FRONTEND_LIBRARIES}) target_compile_definitions(audiocpp_server_frontends PRIVATE ${AUDIOCPP_SERVER_FRONTEND_COMPILE_DEFINITIONS}) target_sources(${AUDIOCPP_SERVER_TARGET} PRIVATE $) target_link_libraries(${AUDIOCPP_SERVER_TARGET} PRIVATE audiocpp_server_frontends ${AUDIOCPP_SERVER_FRONTEND_LIBRARIES}) target_compile_definitions(${AUDIOCPP_SERVER_TARGET} PRIVATE ${AUDIOCPP_SERVER_FRONTEND_COMPILE_DEFINITIONS}) endif() file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/generated/server_frontend_module_declarations.inc" "${AUDIOCPP_SERVER_FRONTEND_DECLARATIONS}") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/generated/server_frontend_module_registrations.inc" "${AUDIOCPP_SERVER_FRONTEND_REGISTRATIONS}") endfunction()