Some checks failed
Linux Build / Linux cpu (push) Has been cancelled
Linux Build / Linux cpu-clang (push) Has been cancelled
Linux Build / Linux vulkan (push) Has been cancelled
mac-build / macOS CPU (push) Has been cancelled
Nix Build / Nix (cpu) (push) Has been cancelled
Nix Build / Nix (vulkan) (push) Has been cancelled
windows-build / Windows CPU (push) Has been cancelled
181 lines
8.9 KiB
CMake
181 lines
8.9 KiB
CMake
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=<external frontend package>")
|
|
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_OBJECTS:audiocpp_server_frontends>)
|
|
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()
|