cmake_minimum_required(VERSION 2.8) 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) 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 ") jrtplib_include_test(sys/sockio.h RTP_HAVE_SYS_SOCKIO "// Don't have ") jrtplib_include_test(netinet/in.h RTP_SUPPORT_NETINET_IN "// Don't have ") 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 \n#include \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 \n#include \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 \n#include \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 \n#include ") else (JRTPLIB_STDINT) check_cxx_source_compiles("#include \n#include \nint main(void) { uint32_t x = 0; uint32_t y = x; return 0; }" JRTPLIB_INTTYPES) if (JRTPLIB_INTTYPES) set(RTP_INTTYPE_HEADERS "#include \n#include \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 \n #include \n#ifndef _WIN32_WCE\n #include \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 ()