Distribution_Service/CC_SDK/Environment/jrtplib/CMakeLists.txt
2026-03-24 14:43:26 +08:00

274 lines
12 KiB
CMake

cmake_minimum_required(VERSION 2.8...4.0)
if (POLICY CMP0042)
cmake_policy(SET CMP0042 NEW)
endif()
project(jrtplib)
set(VERSION_MAJOR 3)
set(VERSION_MINOR 11)
set(VERSION_DEBUG 2)
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_DEBUG}")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
if (CMAKE_INSTALL_PREFIX AND NOT CMAKE_PREFIX_PATH)
#message("Setting CMAKE_PREFIX_PATH to ${CMAKE_INSTALL_PREFIX}")
file(TO_CMAKE_PATH "${CMAKE_INSTALL_PREFIX}" CMAKE_PREFIX_PATH)
endif()
set (_DEFAULT_LIBRARY_INSTALL_DIR lib)
if (EXISTS "${CMAKE_INSTALL_PREFIX}/lib32/" AND CMAKE_SIZEOF_VOID_P EQUAL 4)
set (_DEFAULT_LIBRARY_INSTALL_DIR lib32)
elseif (EXISTS "${CMAKE_INSTALL_PREFIX}/lib64/" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
set (_DEFAULT_LIBRARY_INSTALL_DIR lib64)
endif ()
set(LIBRARY_INSTALL_DIR "${_DEFAULT_LIBRARY_INSTALL_DIR}" CACHE PATH "Library installation directory")
if(NOT IS_ABSOLUTE "${LIBRARY_INSTALL_DIR}")
set(LIBRARY_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIBRARY_INSTALL_DIR}")
endif()
include(CheckCXXCompilerFlag)
include(CheckIncludeFile)
include(CheckIncludeFileCXX)
include(CheckCXXSourceCompiles)
include(TestBigEndian)
include(${PROJECT_SOURCE_DIR}/cmake/Macros.cmake)
#find_package(JThread)
add_subdirectory(../jthread ${CMAKE_CURRENT_BINARY_DIR}/jthread)
#Set JThread variables manually since we're using add_subdirectory instead of find_package
set(JTHREAD_FOUND TRUE)
set(JTHREAD_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../jthread/src" "${CMAKE_CURRENT_BINARY_DIR}/../jthread/src" "${CMAKE_CURRENT_SOURCE_DIR}/../jthread/src/jthread")
if (MSVC AND NOT JTHREAD_COMPILE_STATIC)
set(JTHREAD_LIBRARIES jthread-shared)
else ()
set(JTHREAD_LIBRARIES jthread-static)
endif ()
set(JRTPLIB_LINK_LIBS "")
set(JRTPLIB_INTERNAL_INCLUDES "")
set(JRTPLIB_EXTERNAL_INCLUDES "")
add_additional_stuff(JRTPLIB_EXTERNAL_INCLUDES JRTPLIB_LINK_LIBS)
jrtplib_support_option("Support SDES PRIV items" JRTPLIB_SUPPORT_SDESPRIV RTP_SUPPORT_SDESPRIV ON "// No support for SDES PRIV items")
jrtplib_support_option("Support the probation mechanism for a new source" JRTPLIB_SUPPORT_PROBATION RTP_SUPPORT_PROBATION ON "// Do not wait for a number of consecutive packets to validate source")
jrtplib_support_option("Support sending RTCP APP packets" JRTPLIB_SUPPORT_SENDAPP RTP_SUPPORT_SENDAPP ON "// No direct support for sending RTCP APP packets")
jrtplib_support_option("Support sending unknown RTCP packets" JRTPLIB_SUPPORT_RTCPUNKNOWN RTP_SUPPORT_RTCPUNKNOWN OFF "// No support for sending unknown RTCP packets")
jrtplib_support_option("Support memory management mechanism" JRTPLIB_SUPPORT_MEMORYMGMT RTP_SUPPORT_MEMORYMANAGEMENT ON "// No memory management support")
jrtplib_include_test(sys/filio.h RTP_HAVE_SYS_FILIO "// Don't have <sys/filio.h>")
jrtplib_include_test(sys/sockio.h RTP_HAVE_SYS_SOCKIO "// Don't have <sys/sockio.h>")
jrtplib_include_test(netinet/in.h RTP_SUPPORT_NETINET_IN "// Don't have <netinet/in.h>")
if (JTHREAD_FOUND)
set(V "ON")
else (JTHREAD_FOUND)
set(V "OFF")
endif (JTHREAD_FOUND)
option(JTHREAD_ENABLED "Thread support" ${V})
if (JTHREAD_ENABLED)
set (RTP_SUPPORT_THREAD "#define RTP_SUPPORT_THREAD")
if (JTHREAD_FOUND)
save_paths(JRTPLIB_EXTERNAL_INCLUDES "${JTHREAD_INCLUDE_DIRS}")
save_paths(JRTPLIB_LINK_LIBS "${JTHREAD_LIBRARIES}")
endif(JTHREAD_FOUND)
else (JTHREAD_ENABLED)
set (RTP_SUPPORT_THREAD "// No support for JThread was enabled")
endif (JTHREAD_ENABLED)
find_package(LIBSRTP)
if (LIBSRTP_FOUND)
set(V "ON")
else (LIBSRTP_FOUND)
set(V "OFF")
endif (LIBSRTP_FOUND)
option(SRTP_ENABLED "Secure RTP (SRTP) support" ${V})
if (SRTP_ENABLED)
set(RTP_SUPPORT_SRTP "#define RTP_SUPPORT_SRTP")
if (LIBSRTP_FOUND)
save_paths(JRTPLIB_EXTERNAL_INCLUDES "${LIBSRTP_INCLUDE_DIR}")
save_paths(JRTPLIB_LINK_LIBS "${LIBSRTP_LIBRARY_DIR}")
endif (LIBSRTP_FOUND)
else (SRTP_ENABLED)
set(RTP_SUPPORT_SRTP "// No SRTP support")
endif (SRTP_ENABLED)
find_package(LIBSRTP2)
if (LIBSRTP2_FOUND)
set(V "ON")
else (LIBSRTP2_FOUND)
set(V "OFF")
endif (LIBSRTP2_FOUND)
option(SRTP2_ENABLED "Secure RTP 2 (SRTP2) support" ${V})
if (SRTP2_ENABLED)
set(RTP_SUPPORT_SRTP2 "#define RTP_SUPPORT_SRTP2")
if (LIBSRTP2_FOUND)
save_paths(JRTPLIB_EXTERNAL_INCLUDES "${LIBSRTP2_INCLUDE_DIR}")
save_paths(JRTPLIB_LINK_LIBS "${LIBSRTP2_LIBRARY_DIR}")
endif (LIBSRTP2_FOUND)
else (SRTP2_ENABLED)
set(RTP_SUPPORT_SRTP2 "// No SRTP2 support")
endif (SRTP2_ENABLED)
if (SRTP2_ENABLED)
if (SRTP_ENABLED)
message(FATAL_ERROR "Can't enable both SRTP and SRTP2 at the same time")
endif()
endif ()
if (CMAKE_CROSSCOMPILING)
option (JRTPLIB_USE_BIGENDIAN "Target platform is big endian" ON)
if (JRTPLIB_USE_BIGENDIAN)
set(RTP_ENDIAN "#define RTP_BIG_ENDIAN")
else (JRTPLIB_USE_BIGENDIAN)
set(RTP_ENDIAN "// Little endian system")
endif (JRTPLIB_USE_BIGENDIAN)
else (CMAKE_CROSSCOMPILING)
test_big_endian(JRTPLIB_BIGENDIAN)
if (JRTPLIB_BIGENDIAN)
set(RTP_ENDIAN "#define RTP_BIG_ENDIAN")
else (JRTPLIB_BIGENDIAN)
set(RTP_ENDIAN "// Little endian system")
endif (JRTPLIB_BIGENDIAN)
endif (CMAKE_CROSSCOMPILING)
option(JRTPLIB_COMPILE_TESTS "Compile various tests in the 'tests' subdirectory" NO)
option(JRTPLIB_COMPILE_EXAMPLES "Compile various examples in the 'examples' subdirectory" YES)
# Check winsock first
set(TESTDEFS "")
set(EMPTYWSSTRING "// Not using winsock sockets")
jrtplib_test_feature(winsocktest RTP_SOCKETTYPE_WINSOCK FALSE "${EMPTYWSSTRING}" "${TESTDEFS}")
if ("${RTP_SOCKETTYPE_WINSOCK}" STREQUAL "${EMPTYWSSTRING}")
set(JRTPLIB_WINSOCK FALSE)
else ()
set(JRTPLIB_WINSOCK TRUE)
set(TESTDEFS "${TESTDEFS} -DRTP_SOCKETTYPE_WINSOCK")
endif()
jrtplib_test_feature(socklentest RTP_SOCKLENTYPE_UINT TRUE "// socklen_t is 'int'" "${TESTDEFS}")
jrtplib_test_feature(ipv4mcasttest RTP_SUPPORT_IPV4MULTICAST FALSE "// No IPv4 multicasting support" "${TESTDEFS}")
jrtplib_test_feature(salentest RTP_HAVE_SOCKADDR_LEN FALSE "// No sa_len member in struct sockaddr" "${TESTDEFS}")
jrtplib_test_feature(getloginrtest RTP_SUPPORT_GETLOGINR FALSE "// Not using getlogin_r" "${TESTDEFS}")
jrtplib_test_feature(ipv6test RTP_SUPPORT_IPV6 FALSE "// No IPv6 support" "${TESTDEFS}")
jrtplib_test_feature(ipv6mcasttest RTP_SUPPORT_IPV6MULTICAST FALSE "// No IPv6 multicasting support" "${TESTDEFS}")
jrtplib_test_feature(performancecounter RTP_HAVE_QUERYPERFORMANCECOUNTER FALSE "// No QueryPerformanceCounter support" "${TESTDEFS}")
jrtplib_test_feature(suffix RTP_HAVE_VSUINT64SUFFIX FALSE "// No ui64 suffix" "${TESTDEFS}")
jrtplib_test_feature(arrayalloc RTP_HAVE_ARRAYALLOC FALSE "// No custom new[]" "${TESTDEFS}")
jrtplib_test_feature(randstest RTP_HAVE_RAND_S FALSE "// No rand_s support" "${TESTDEFS}")
jrtplib_test_feature(strncpystest RTP_HAVE_STRNCPY_S FALSE "// No strncpy_s support" "${TESTDEFS}")
jrtplib_test_feature(clockgettimetest RTP_HAVE_CLOCK_GETTIME FALSE "// No clock_gettime support" "${TESTDEFS}")
jrtplib_test_feature(polltest RTP_HAVE_POLL FALSE "// No 'poll' support" "${TESTDEFS}")
jrtplib_test_feature(wsapolltest RTP_HAVE_WSAPOLL FALSE "// No 'WSAPoll' support" "${TESTDEFS}")
jrtplib_test_feature(msgnosignaltest RTP_HAVE_MSG_NOSIGNAL FALSE "// No MSG_NOSIGNAL option" "${TESTDEFS}")
jrtplib_test_feature(ifaddrstest RTP_SUPPORT_IFADDRS FALSE "// No ifaddrs support" "${TESTDEFS}")
check_cxx_source_compiles("#include <windows.h>\n#include <stdio.h>\nint main(void) { char s[1024]; _snprintf_s(s, 1024,\"%d\", 10);\n return 0; }" JRTPLIB_SNPRINTF_S)
if (JRTPLIB_SNPRINTF_S)
set(RTP_SNPRINTF_VERSION "#define RTP_HAVE_SNPRINTF_S")
else ()
check_cxx_source_compiles("#include <windows.h>\n#include <stdio.h>\nint main(void) { char s[1024]; _snprintf(s, 1024,\"%d\", 10);\n return 0; }" JRTPLIB_SNPRINTF)
if (JRTPLIB_SNPRINTF)
set(RTP_SNPRINTF_VERSION "#define RTP_HAVE_SNPRINTF")
else ()
set(RTP_SNPRINTF_VERSION "// Stdio snprintf version")
endif()
endif()
check_cxx_source_compiles("#include <stdint.h>\n#include <sys/types.h>\nint main(void) { size_t a = 0 ; size_t b = a; uint32_t x = 0; uint32_t y = x; return 0; }" JRTPLIB_STDINT)
if (JRTPLIB_STDINT)
set(RTP_INTTYPE_HEADERS "#include <stdint.h>\n#include <sys/types.h>")
else (JRTPLIB_STDINT)
check_cxx_source_compiles("#include <inttypes.h>\n#include <sys/types.h>\nint main(void) { uint32_t x = 0; uint32_t y = x; return 0; }" JRTPLIB_INTTYPES)
if (JRTPLIB_INTTYPES)
set(RTP_INTTYPE_HEADERS "#include <inttypes.h>\n#include <sys/types.h>\n")
else (JRTPLIB_INTTYPES)
if (MSVC)
set(RTP_INTTYPE_HEADERS "#include \"rtptypes_win.h\"")
else (MSVC)
set(RTP_INTTYPE_HEADERS "#error Could not find header files that define types like 'uint32_t'. Please edit the file ${PROJECT_BINARY_DIR}/src/rtptypes_unix.h and make sure that the following types are defined: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t")
message("\n\nError: Could not find header files that define types like 'uint32_t'.\nPlease edit the file ${PROJECT_BINARY_DIR}/src/rtptypes_unix.h\nand make sure that the following types are defined: \nint8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t\n\n")
endif (MSVC)
endif (JRTPLIB_INTTYPES)
endif (JRTPLIB_STDINT)
if (JRTPLIB_WINSOCK)
set(RTP_WINSOCK_HEADERS "#ifdef RTP_SOCKETTYPE_WINSOCK\n #include <winsock2.h> \n #include <ws2tcpip.h>\n#ifndef _WIN32_WCE\n #include <sys/types.h>\n#endif // _WIN32_WCE\n#endif // RTP_SOCKETTYPE_WINSOCK\n")
list(APPEND JRTPLIB_LINK_LIBS "ws2_32")
endif ()
if (MSVC)
set(JRTPLIB_COMPILE_STATIC ON CACHE BOOL "Flag indicating if a static library should be built, or a dynamic one")
endif ()
if (NOT MSVC OR JRTPLIB_COMPILE_STATIC)
set(JRTPLIB_IMPORT "")
set(JRTPLIB_EXPORT "")
else ()
set(JRTPLIB_IMPORT "__declspec(dllimport)")
set(JRTPLIB_EXPORT "__declspec(dllexport)")
endif ()
configure_file("${PROJECT_SOURCE_DIR}/src/rtptypes.h.in" "${PROJECT_BINARY_DIR}/src/rtptypes.h")
configure_file("${PROJECT_SOURCE_DIR}/src/rtpconfig.h.in" "${PROJECT_BINARY_DIR}/src/rtpconfig.h")
configure_file("${PROJECT_SOURCE_DIR}/src/rtplibraryversioninternal.h.in" "${PROJECT_BINARY_DIR}/src/rtplibraryversioninternal.h")
save_paths(JRTPLIB_INTERNAL_INCLUDES "${PROJECT_SOURCE_DIR}/src" "${PROJECT_BINARY_DIR}/src")
add_subdirectory(src)
#if (JRTPLIB_COMPILE_EXAMPLES)
# add_subdirectory(examples)
#endif()
#
#if (JRTPLIB_COMPILE_TESTS)
# add_subdirectory(tests)
#endif()
if (NOT MSVC)
set(JRTPLIB_LIBS "-L${LIBRARY_INSTALL_DIR}" "-ljrtp")
else ()
set(JRTPLIB_LIBS optimized "${LIBRARY_INSTALL_DIR}/jrtplib.lib"
debug "${LIBRARY_INSTALL_DIR}/jrtplib_d.lib")
endif ()
set(JRTPLIB_INCDIRS ${JRTPLIB_EXTERNAL_INCLUDES} ${CMAKE_INSTALL_PREFIX}/include)
set(JRTPLIB_LIBS ${JRTPLIB_LIBS} ${JRTPLIB_LINK_LIBS})
remove_empty(JRTPLIB_INCDIRS)
list(REMOVE_DUPLICATES JRTPLIB_INCDIRS)
remove_empty(JRTPLIB_LIBS)
foreach(ARG ${JRTPLIB_LIBS})
set(JRTPLIB_LIBS_CMAKECONFIG "${JRTPLIB_LIBS_CMAKECONFIG} \"${ARG}\"")
endforeach()
foreach(ARG ${JRTPLIB_INCDIRS})
set(JRTPLIB_INCDIRS_CMAKECONFIG "${JRTPLIB_INCDIRS_CMAKECONFIG} \"${ARG}\"")
endforeach()
configure_file("${PROJECT_SOURCE_DIR}/cmake/JRTPLIBConfig.cmake.in" "${PROJECT_BINARY_DIR}/cmake/JRTPLIBConfig.cmake")
install(FILES "${PROJECT_BINARY_DIR}/cmake/JRTPLIBConfig.cmake" DESTINATION ${LIBRARY_INSTALL_DIR}/cmake/JRTPLIB)
if (NOT MSVC)
foreach(ARG ${JRTPLIB_LIBS})
set(JRTPLIB_LIBS_PKGCONFIG "${JRTPLIB_LIBS_PKGCONFIG} ${ARG}")
endforeach()
foreach(ARG ${JRTPLIB_INCDIRS})
set(JRTPLIB_INCDIRS_PKGCONFIG "${JRTPLIB_INCDIRS_PKGCONFIG} -I${ARG}")
endforeach()
configure_file(${PROJECT_SOURCE_DIR}/pkgconfig/jrtplib.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/jrtplib.pc)
install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/jrtplib.pc DESTINATION ${LIBRARY_INSTALL_DIR}/pkgconfig)
endif ()
set(J_RTP_LIB_INC
${J_RTP_LIB_INC_t}
PARENT_SCOPE
)