You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
679 lines
21 KiB
679 lines
21 KiB
cmake_minimum_required(VERSION 3.4)
|
|
cmake_policy(SET CMP0037 NEW)
|
|
|
|
project(LibVNCServer)
|
|
include(CheckFunctionExists)
|
|
include(CheckSymbolExists)
|
|
include(CheckIncludeFile)
|
|
include(CheckTypeSize)
|
|
include(TestBigEndian)
|
|
include(CheckCSourceCompiles)
|
|
include(CheckCSourceRuns)
|
|
|
|
enable_testing()
|
|
|
|
set(PACKAGE_NAME "LibVNCServer")
|
|
set(FULL_PACKAGE_NAME "LibVNCServer")
|
|
set(VERSION_MAJOR "0")
|
|
set(VERSION_MINOR "9")
|
|
set(VERSION_PATCHLEVEL "12")
|
|
set(VERSION_SO "1")
|
|
set(PACKAGE_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCHLEVEL}")
|
|
set(PROJECT_BUGREPORT_PATH "https://github.com/LibVNC/libvncserver/issues")
|
|
set(LIBVNCSERVER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libvncserver)
|
|
set(COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/common)
|
|
set(LIBVNCCLIENT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libvncclient)
|
|
set(LIBVNCSRVEXAMPLE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/examples)
|
|
set(LIBVNCCLIEXAMPLE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/client_examples)
|
|
set(TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test)
|
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
|
|
|
|
|
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libvncserver ${CMAKE_CURRENT_SOURCE_DIR}/common)
|
|
|
|
# all the build configuration switches
|
|
option(BUILD_SHARED_LIBS "Build shared libraries" ${UNIX})
|
|
option(WITH_ZLIB "Search for the zlib compression library to support additional encodings" ON)
|
|
option(WITH_LZO "Search for the LZO compression library to omit internal miniLZO implementation" ON)
|
|
option(WITH_JPEG "Search for the libjpeg compression library to support additional encodings" ON)
|
|
option(WITH_PNG "Search for the PNG compression library to support additional encodings" ON)
|
|
option(WITH_SDL "Search for the Simple Direct Media Layer library to build an example SDL vnc client" ON)
|
|
option(WITH_THREADS "Search for a threading library to build with multithreading support" ON)
|
|
option(WITH_GNUTLS "Search for the GnuTLS secure communications library to support encryption" ON)
|
|
option(WITH_OPENSSL "Search for the OpenSSL cryptography library to support encryption" ON)
|
|
option(WITH_SYSTEMD "Search for libsystemd to build with systemd socket activation support" ON)
|
|
option(WITH_GCRYPT "Search for libgcrypt to support additional authentication methods in LibVNCClient" ON)
|
|
option(WITH_FFMPEG "Search for FFMPEG to build an example VNC to MPEG encoder" ON)
|
|
option(WITH_TIGHTVNC_FILETRANSFER "Enable filetransfer if there is pthreads support" ON)
|
|
option(WITH_24BPP "Allow 24 bpp" ON)
|
|
option(WITH_IPv6 "Enable IPv6 Support" ON)
|
|
option(WITH_WEBSOCKETS "Build with websockets support" ON)
|
|
option(WITH_SASL "Build with SASL support" ON)
|
|
|
|
|
|
|
|
if(WITH_ZLIB)
|
|
find_package(ZLIB)
|
|
endif(WITH_ZLIB)
|
|
|
|
if(WITH_LZO)
|
|
find_package(LZO)
|
|
endif()
|
|
|
|
if(WITH_JPEG)
|
|
find_package(JPEG)
|
|
if(JPEG_FOUND)
|
|
# Check whether the version of libjpeg we found was libjpeg-turbo and print a
|
|
# warning if not.
|
|
set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARIES})
|
|
set(CMAKE_REQUIRED_FLAGS -I${JPEG_INCLUDE_DIR})
|
|
|
|
set(JPEG_TEST_SOURCE "\n
|
|
#include <stdio.h>\n
|
|
#include <jpeglib.h>\n
|
|
int main(void) {\n
|
|
struct jpeg_compress_struct cinfo;\n
|
|
struct jpeg_error_mgr jerr;\n
|
|
cinfo.err=jpeg_std_error(&jerr);\n
|
|
jpeg_create_compress(&cinfo);\n
|
|
cinfo.input_components = 3;\n
|
|
jpeg_set_defaults(&cinfo);\n
|
|
cinfo.in_color_space = JCS_EXT_RGB;\n
|
|
jpeg_default_colorspace(&cinfo);\n
|
|
return 0;\n
|
|
}")
|
|
|
|
if(CMAKE_CROSSCOMPILING)
|
|
check_c_source_compiles("${JPEG_TEST_SOURCE}" FOUND_LIBJPEG_TURBO)
|
|
else()
|
|
check_c_source_runs("${JPEG_TEST_SOURCE}" FOUND_LIBJPEG_TURBO)
|
|
endif()
|
|
|
|
set(CMAKE_REQUIRED_LIBRARIES)
|
|
set(CMAKE_REQUIRED_FLAGS)
|
|
set(CMAKE_REQUIRED_DEFINITIONS)
|
|
|
|
if(NOT FOUND_LIBJPEG_TURBO)
|
|
message(WARNING "*** The libjpeg library you are building against is not libjpeg-turbo. Performance will be reduced. You can obtain libjpeg-turbo from: https://sourceforge.net/projects/libjpeg-turbo/files/ ***")
|
|
endif()
|
|
endif(JPEG_FOUND)
|
|
endif(WITH_JPEG)
|
|
|
|
|
|
if(WITH_PNG)
|
|
find_package(PNG)
|
|
endif(WITH_PNG)
|
|
|
|
|
|
if(WITH_SDL)
|
|
find_package(SDL2)
|
|
endif(WITH_SDL)
|
|
|
|
|
|
if(WITH_THREADS)
|
|
find_package(Threads)
|
|
endif(WITH_THREADS)
|
|
|
|
|
|
if(WITH_GNUTLS)
|
|
find_package(GnuTLS)
|
|
endif(WITH_GNUTLS)
|
|
|
|
|
|
if(WITH_OPENSSL)
|
|
find_package(OpenSSL)
|
|
endif(WITH_OPENSSL)
|
|
|
|
|
|
if(WITH_SYSTEMD AND NOT ANDROID)
|
|
find_package(PkgConfig)
|
|
pkg_check_modules(SYSTEMD "libsystemd")
|
|
endif(WITH_SYSTEMD AND NOT ANDROID)
|
|
|
|
|
|
if(WITH_GCRYPT)
|
|
find_library(LIBGCRYPT_LIBRARIES gcrypt)
|
|
endif(WITH_GCRYPT)
|
|
|
|
if(WITH_FFMPEG)
|
|
find_package(FFMPEG 3.1.0)
|
|
endif(WITH_FFMPEG)
|
|
|
|
|
|
check_include_file("endian.h" LIBVNCSERVER_HAVE_ENDIAN_H)
|
|
check_include_file("fcntl.h" LIBVNCSERVER_HAVE_FCNTL_H)
|
|
check_include_file("netinet/in.h" LIBVNCSERVER_HAVE_NETINET_IN_H)
|
|
check_include_file("sys/endian.h" LIBVNCSERVER_HAVE_SYS_ENDIAN_H)
|
|
check_include_file("sys/socket.h" LIBVNCSERVER_HAVE_SYS_SOCKET_H)
|
|
check_include_file("sys/stat.h" LIBVNCSERVER_HAVE_SYS_STAT_H)
|
|
check_include_file("sys/time.h" LIBVNCSERVER_HAVE_SYS_TIME_H)
|
|
check_include_file("sys/types.h" LIBVNCSERVER_HAVE_SYS_TYPES_H)
|
|
check_include_file("sys/wait.h" LIBVNCSERVER_HAVE_SYS_WAIT_H)
|
|
check_include_file("unistd.h" LIBVNCSERVER_HAVE_UNISTD_H)
|
|
check_include_file("sys/uio.h" LIBVNCSERVER_HAVE_SYS_UIO_H)
|
|
|
|
|
|
# headers needed for check_type_size()
|
|
check_include_file("vfork.h" LIBVNCSERVER_HAVE_VFORK_H)
|
|
check_include_file("ws2tcpip.h" LIBVNCSERVER_HAVE_WS2TCPIP_H)
|
|
check_include_file("arpa/inet.h" HAVE_ARPA_INET_H)
|
|
check_include_file("stdint.h" HAVE_STDINT_H)
|
|
check_include_file("stddef.h" HAVE_STDDEF_H)
|
|
check_include_file("sys/types.h" HAVE_SYS_TYPES_H)
|
|
|
|
check_function_exists(gettimeofday LIBVNCSERVER_HAVE_GETTIMEOFDAY)
|
|
check_function_exists(vfork LIBVNCSERVER_HAVE_VFORK)
|
|
check_function_exists(vprintf LIBVNCSERVER_HAVE_VPRINTF)
|
|
check_function_exists(mmap LIBVNCSERVER_HAVE_MMAP)
|
|
check_function_exists(fork LIBVNCSERVER_HAVE_FORK)
|
|
check_function_exists(ftime LIBVNCSERVER_HAVE_FTIME)
|
|
check_function_exists(gethostbyname LIBVNCSERVER_HAVE_GETHOSTBYNAME)
|
|
check_function_exists(gethostname LIBVNCSERVER_HAVE_GETHOSTNAME)
|
|
check_function_exists(inet_ntoa LIBVNCSERVER_HAVE_INET_NTOA)
|
|
check_function_exists(memmove LIBVNCSERVER_HAVE_MEMMOVE)
|
|
check_function_exists(memset LIBVNCSERVER_HAVE_MEMSET)
|
|
check_function_exists(mkfifo LIBVNCSERVER_HAVE_MKFIFO)
|
|
check_function_exists(select LIBVNCSERVER_HAVE_SELECT)
|
|
check_function_exists(socket LIBVNCSERVER_HAVE_SOCKET)
|
|
check_function_exists(strchr LIBVNCSERVER_HAVE_STRCHR)
|
|
check_function_exists(strcspn LIBVNCSERVER_HAVE_STRCSPN)
|
|
check_function_exists(strdup LIBVNCSERVER_HAVE_STRDUP)
|
|
check_function_exists(strerror LIBVNCSERVER_HAVE_STRERROR)
|
|
check_function_exists(strstr LIBVNCSERVER_HAVE_STRSTR)
|
|
|
|
check_symbol_exists(htobe64 "endian.h" LIBVNCSERVER_HAVE_HTOBE64)
|
|
check_symbol_exists(OSSwapHostToBigInt64 "libkern/OSByteOrder.h" LIBVNCSERVER_HAVE_OSSWAPHOSTTOBIGINT64)
|
|
|
|
if(Threads_FOUND)
|
|
set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} ${CMAKE_THREAD_LIBS_INIT})
|
|
endif(Threads_FOUND)
|
|
if(ZLIB_FOUND)
|
|
set(LIBVNCSERVER_HAVE_LIBZ 1)
|
|
else()
|
|
unset(ZLIB_LIBRARIES) # would otherwise contain -NOTFOUND, confusing target_link_libraries()
|
|
endif(ZLIB_FOUND)
|
|
if(LZO_FOUND)
|
|
set(LIBVNCSERVER_HAVE_LZO 1)
|
|
else()
|
|
unset(LZO_LIBRARIES CACHE) # would otherwise contain -NOTFOUND, confusing target_link_libraries()
|
|
endif()
|
|
if(JPEG_FOUND)
|
|
set(LIBVNCSERVER_HAVE_LIBJPEG 1)
|
|
else()
|
|
unset(JPEG_LIBRARIES) # would otherwise confuse target_link_libraries()
|
|
endif(JPEG_FOUND)
|
|
if(PNG_FOUND)
|
|
set(LIBVNCSERVER_HAVE_LIBPNG 1)
|
|
endif(PNG_FOUND)
|
|
if(NOT OPENSSL_FOUND)
|
|
unset(OPENSSL_LIBRARIES) # would otherwise contain -NOTFOUND, confusing target_link_libraries()
|
|
endif()
|
|
if(SYSTEMD_FOUND)
|
|
add_definitions(-DLIBVNCSERVER_WITH_SYSTEMD)
|
|
include_directories(${SYSTEMD_INCLUDE_DIRS})
|
|
set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} ${SYSTEMD_LIBRARIES})
|
|
endif(SYSTEMD_FOUND)
|
|
|
|
if(LIBVNCSERVER_HAVE_SYS_UIO_H)
|
|
if(GNUTLS_FOUND)
|
|
message(STATUS "Building crypto with GnuTLS")
|
|
set(CRYPTO_LIBRARIES ${GNUTLS_LIBRARIES})
|
|
set(CRYPTO_SOURCES ${COMMON_DIR}/rfbcrypto_gnutls)
|
|
include_directories(${GNUTLS_INCLUDE_DIR})
|
|
elseif(OPENSSL_FOUND)
|
|
message(STATUS "Building crypto with OpenSSL")
|
|
set(CRYPTO_LIBRARIES ${OPENSSL_LIBRARIES})
|
|
set(CRYPTO_SOURCES ${COMMON_DIR}/rfbcrypto_openssl)
|
|
else()
|
|
message(STATUS "Building crypto with builtin functions")
|
|
set(CRYPTO_SOURCES ${COMMON_DIR}/rfbcrypto_included.c ${COMMON_DIR}/md5.c ${COMMON_DIR}/sha1.c)
|
|
endif()
|
|
set(LIBVNCSERVER_HAVE_CRYPTO 1)
|
|
endif(LIBVNCSERVER_HAVE_SYS_UIO_H)
|
|
|
|
|
|
if(WITH_WEBSOCKETS AND LIBVNCSERVER_HAVE_CRYPTO AND (LIBVNCSERVER_HAVE_HTOBE64 OR LIBVNCSERVER_HAVE_OSSWAPHOSTTOBIGINT64))
|
|
set(LIBVNCSERVER_WITH_WEBSOCKETS 1)
|
|
endif()
|
|
|
|
if(WITH_GCRYPT AND LIBGCRYPT_LIBRARIES)
|
|
message(STATUS "Found libgcrypt: ${LIBGCRYPT_LIBRARIES}")
|
|
set(LIBVNCSERVER_WITH_CLIENT_GCRYPT 1)
|
|
set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} ${LIBGCRYPT_LIBRARIES})
|
|
endif(WITH_GCRYPT AND LIBGCRYPT_LIBRARIES)
|
|
|
|
if(GNUTLS_FOUND)
|
|
set(LIBVNCSERVER_HAVE_GNUTLS 1)
|
|
endif(GNUTLS_FOUND)
|
|
|
|
if(OPENSSL_FOUND)
|
|
set(LIBVNCSERVER_HAVE_LIBSSL 1)
|
|
endif(OPENSSL_FOUND)
|
|
|
|
if(WITH_IPv6)
|
|
if(WIN32 AND LIBVNCSERVER_HAVE_WS2TCPIP_H AND LIBVNCSERVER_HAVE_VPRINTF)
|
|
set(LIBVNCSERVER_IPv6 1)
|
|
endif()
|
|
if(NOT WIN32)
|
|
set(LIBVNCSERVER_IPv6 1)
|
|
endif()
|
|
endif(WITH_IPv6)
|
|
|
|
|
|
if(WITH_24BPP)
|
|
set(LIBVNCSERVER_ALLOW24BPP 1)
|
|
endif()
|
|
|
|
|
|
if(CMAKE_USE_PTHREADS_INIT)
|
|
set(LIBVNCSERVER_HAVE_LIBPTHREAD 1)
|
|
endif(CMAKE_USE_PTHREADS_INIT)
|
|
if(LIBVNCSERVER_HAVE_SYS_SOCKET_H)
|
|
# socklen_t
|
|
list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
|
|
endif(LIBVNCSERVER_HAVE_SYS_SOCKET_H)
|
|
if(HAVE_ARPA_INET_H)
|
|
# in_addr_t
|
|
list(APPEND CMAKE_EXTRA_INCLUDE_FILES "arpa/inet.h")
|
|
endif(HAVE_ARPA_INET_H)
|
|
|
|
check_type_size(pid_t LIBVNCSERVER_PID_T)
|
|
check_type_size(size_t LIBVNCSERVER_SIZE_T)
|
|
check_type_size(socklen_t LIBVNCSERVER_SOCKLEN_T)
|
|
check_type_size(in_addr_t LIBVNCSERVER_IN_ADDR_T)
|
|
if(NOT HAVE_LIBVNCSERVER_IN_ADDR_T)
|
|
set(LIBVNCSERVER_NEED_INADDR_T 1)
|
|
endif(NOT HAVE_LIBVNCSERVER_IN_ADDR_T)
|
|
|
|
TEST_BIG_ENDIAN(LIBVNCSERVER_WORDS_BIGENDIAN)
|
|
|
|
if(WITH_SASL)
|
|
find_path(SASL2_INCLUDE_DIR sasl/sasl.h)
|
|
find_library(LIBSASL2_LIBRARIES sasl2 libsasl.lib)
|
|
endif(WITH_SASL)
|
|
|
|
if(WITH_SASL AND LIBSASL2_LIBRARIES AND SASL2_INCLUDE_DIR)
|
|
message(STATUS "Building with SASL: ${LIBSASL2_LIBRARIES} and ${SASL2_INCLUDE_DIR}")
|
|
set(LIBVNCSERVER_HAVE_SASL 1)
|
|
set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} ${LIBSASL2_LIBRARIES})
|
|
include_directories(${SASL2_INCLUDE_DIR})
|
|
endif(WITH_SASL AND LIBSASL2_LIBRARIES AND SASL2_INCLUDE_DIR)
|
|
|
|
# TODO:
|
|
# LIBVNCSERVER_ENOENT_WORKAROUND
|
|
# inline
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rfb/rfbconfig.h.cmakein ${CMAKE_BINARY_DIR}/rfb/rfbconfig.h)
|
|
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_DIR}/main.c
|
|
${LIBVNCSERVER_DIR}/rfbserver.c
|
|
${LIBVNCSERVER_DIR}/rfbregion.c
|
|
${LIBVNCSERVER_DIR}/auth.c
|
|
${LIBVNCSERVER_DIR}/sockets.c
|
|
${LIBVNCSERVER_DIR}/stats.c
|
|
${LIBVNCSERVER_DIR}/corre.c
|
|
${LIBVNCSERVER_DIR}/hextile.c
|
|
${LIBVNCSERVER_DIR}/rre.c
|
|
${LIBVNCSERVER_DIR}/translate.c
|
|
${LIBVNCSERVER_DIR}/cutpaste.c
|
|
${LIBVNCSERVER_DIR}/httpd.c
|
|
${LIBVNCSERVER_DIR}/cursor.c
|
|
${LIBVNCSERVER_DIR}/font.c
|
|
${LIBVNCSERVER_DIR}/draw.c
|
|
${LIBVNCSERVER_DIR}/selbox.c
|
|
${COMMON_DIR}/d3des.c
|
|
${COMMON_DIR}/vncauth.c
|
|
${LIBVNCSERVER_DIR}/cargs.c
|
|
${LIBVNCSERVER_DIR}/ultra.c
|
|
${LIBVNCSERVER_DIR}/scale.c
|
|
)
|
|
|
|
set(LIBVNCCLIENT_SOURCES
|
|
${LIBVNCCLIENT_DIR}/cursor.c
|
|
${LIBVNCCLIENT_DIR}/listen.c
|
|
${LIBVNCCLIENT_DIR}/rfbproto.c
|
|
${LIBVNCCLIENT_DIR}/sockets.c
|
|
${LIBVNCCLIENT_DIR}/vncviewer.c
|
|
)
|
|
|
|
if(JPEG_FOUND)
|
|
set(LIBVNCCLIENT_SOURCES
|
|
${LIBVNCCLIENT_SOURCES}
|
|
${COMMON_DIR}/turbojpeg.c
|
|
)
|
|
endif()
|
|
|
|
if(GNUTLS_FOUND)
|
|
set(LIBVNCCLIENT_SOURCES
|
|
${LIBVNCCLIENT_SOURCES}
|
|
${LIBVNCCLIENT_DIR}/tls_gnutls.c
|
|
)
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${LIBVNCSERVER_DIR}/rfbssl_gnutls.c
|
|
)
|
|
include_directories(${GNUTLS_INCLUDE_DIR})
|
|
elseif(OPENSSL_FOUND)
|
|
set(LIBVNCCLIENT_SOURCES
|
|
${LIBVNCCLIENT_SOURCES}
|
|
${LIBVNCCLIENT_DIR}/tls_openssl.c
|
|
)
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${LIBVNCSERVER_DIR}/rfbssl_openssl.c
|
|
)
|
|
include_directories(${OPENSSL_INCLUDE_DIR})
|
|
else()
|
|
set(LIBVNCCLIENT_SOURCES
|
|
${LIBVNCCLIENT_SOURCES}
|
|
${LIBVNCCLIENT_DIR}/tls_none.c
|
|
)
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${LIBVNCSERVER_DIR}/rfbssl_none.c
|
|
)
|
|
endif()
|
|
|
|
if(LIBVNCSERVER_HAVE_SASL)
|
|
set(LIBVNCCLIENT_SOURCES
|
|
${LIBVNCCLIENT_SOURCES}
|
|
${LIBVNCCLIENT_DIR}/sasl.c
|
|
)
|
|
endif()
|
|
|
|
if(ZLIB_FOUND)
|
|
add_definitions(-DLIBVNCSERVER_HAVE_LIBZ)
|
|
include_directories(${ZLIB_INCLUDE_DIR})
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${LIBVNCSERVER_DIR}/zlib.c
|
|
${LIBVNCSERVER_DIR}/zrle.c
|
|
${LIBVNCSERVER_DIR}/zrleoutstream.c
|
|
${LIBVNCSERVER_DIR}/zrlepalettehelper.c
|
|
)
|
|
endif(ZLIB_FOUND)
|
|
|
|
if(LZO_FOUND)
|
|
add_definitions(-DLIBVNCSERVER_HAVE_LZO)
|
|
include_directories(${LZO_INCLUDE_DIR})
|
|
else()
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${COMMON_DIR}/minilzo.c
|
|
)
|
|
set(LIBVNCCLIENT_SOURCES
|
|
${LIBVNCCLIENT_SOURCES}
|
|
${COMMON_DIR}/minilzo.c
|
|
)
|
|
endif()
|
|
|
|
if(JPEG_FOUND)
|
|
add_definitions(-DLIBVNCSERVER_HAVE_LIBJPEG)
|
|
include_directories(${JPEG_INCLUDE_DIR})
|
|
set(TIGHT_C ${LIBVNCSERVER_DIR}/tight.c ${COMMON_DIR}/turbojpeg.c)
|
|
endif(JPEG_FOUND)
|
|
|
|
if(PNG_FOUND)
|
|
add_definitions(-DLIBVNCSERVER_HAVE_LIBPNG)
|
|
include_directories(${PNG_INCLUDE_DIR})
|
|
endif(PNG_FOUND)
|
|
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${TIGHT_C}
|
|
)
|
|
|
|
if(WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT)
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/rfbtightserver.c
|
|
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/handlefiletransferrequest.c
|
|
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/filetransfermsg.c
|
|
${LIBVNCSERVER_DIR}/tightvnc-filetransfer/filelistinfo.c
|
|
)
|
|
endif(WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT)
|
|
|
|
if(LIBVNCSERVER_WITH_WEBSOCKETS)
|
|
add_definitions(-DLIBVNCSERVER_WITH_WEBSOCKETS)
|
|
set(LIBVNCSERVER_SOURCES
|
|
${LIBVNCSERVER_SOURCES}
|
|
${LIBVNCSERVER_DIR}/websockets.c
|
|
${LIBVNCSERVER_DIR}/ws_decode.c
|
|
${COMMON_DIR}/base64.c
|
|
${CRYPTO_SOURCES}
|
|
)
|
|
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
|
|
|
|
add_library(vncclient ${LIBVNCCLIENT_SOURCES})
|
|
add_library(vncserver ${LIBVNCSERVER_SOURCES})
|
|
if(WIN32)
|
|
set(ADDITIONAL_LIBS ${ADDITIONAL_LIBS} ws2_32)
|
|
endif(WIN32)
|
|
|
|
target_link_libraries(vncclient
|
|
${ADDITIONAL_LIBS}
|
|
${ZLIB_LIBRARIES}
|
|
${LZO_LIBRARIES}
|
|
${JPEG_LIBRARIES}
|
|
${GNUTLS_LIBRARIES}
|
|
${OPENSSL_LIBRARIES}
|
|
)
|
|
target_link_libraries(vncserver
|
|
${ADDITIONAL_LIBS}
|
|
${ZLIB_LIBRARIES}
|
|
${LZO_LIBRARIES}
|
|
${JPEG_LIBRARIES}
|
|
${PNG_LIBRARIES}
|
|
${CRYPTO_LIBRARIES}
|
|
${GNUTLS_LIBRARIES}
|
|
${OPENSSL_LIBRARIES}
|
|
)
|
|
|
|
SET_TARGET_PROPERTIES(vncclient vncserver
|
|
PROPERTIES SOVERSION "${VERSION_SO}" VERSION "${PACKAGE_VERSION}"
|
|
)
|
|
|
|
# EXAMPLES
|
|
set(LIBVNCSERVER_EXAMPLES
|
|
backchannel
|
|
camera
|
|
colourmaptest
|
|
example
|
|
fontsel
|
|
pnmshow
|
|
pnmshow24
|
|
regiontest
|
|
repeater
|
|
rotate
|
|
simple
|
|
simple15
|
|
storepasswd
|
|
vncev
|
|
)
|
|
|
|
if(CMAKE_USE_PTHREADS_INIT)
|
|
set(LIBVNCSERVER_EXAMPLES
|
|
${LIBVNCSERVER_EXAMPLES}
|
|
blooptest
|
|
)
|
|
endif(CMAKE_USE_PTHREADS_INIT)
|
|
|
|
if(WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT)
|
|
set(LIBVNCSERVER_EXAMPLES
|
|
${LIBVNCSERVER_EXAMPLES}
|
|
filetransfer
|
|
)
|
|
endif(WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT)
|
|
|
|
if(MACOS)
|
|
set(LIBVNCSERVER_EXAMPLES
|
|
${LIBVNCSERVER_EXAMPLES}
|
|
mac
|
|
)
|
|
endif(MACOS)
|
|
|
|
if(ANDROID)
|
|
set(LIBVNCSERVER_EXAMPLES
|
|
${LIBVNCSERVER_EXAMPLES}
|
|
androidvncserver
|
|
)
|
|
endif(ANDROID)
|
|
|
|
set(LIBVNCCLIENT_EXAMPLES
|
|
backchannel
|
|
ppmtest
|
|
)
|
|
|
|
if(SDL2_FOUND)
|
|
include_directories(${SDL2_INCLUDE_DIR})
|
|
set(LIBVNCCLIENT_EXAMPLES
|
|
${LIBVNCCLIENT_EXAMPLES}
|
|
SDLvncviewer
|
|
)
|
|
endif(SDL2_FOUND)
|
|
|
|
if(FFMPEG_FOUND)
|
|
set(LIBVNCCLIENT_EXAMPLES
|
|
${LIBVNCCLIENT_EXAMPLES}
|
|
vnc2mpg
|
|
)
|
|
endif(FFMPEG_FOUND)
|
|
|
|
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/examples)
|
|
foreach(e ${LIBVNCSERVER_EXAMPLES})
|
|
add_executable(examples_${e} ${LIBVNCSRVEXAMPLE_DIR}/${e}.c)
|
|
set_target_properties(examples_${e} PROPERTIES OUTPUT_NAME ${e})
|
|
set_target_properties(examples_${e} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/examples)
|
|
target_link_libraries(examples_${e} vncserver ${CMAKE_THREAD_LIBS_INIT})
|
|
endforeach(e ${LIBVNCSERVER_EXAMPLES})
|
|
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/client_examples)
|
|
foreach(e ${LIBVNCCLIENT_EXAMPLES})
|
|
add_executable(client_examples_${e} ${LIBVNCCLIEXAMPLE_DIR}/${e}.c ${LIBVNCCLIEXAMPLE_DIR}/${${e}_EXTRA_SOURCES} )
|
|
set_target_properties(client_examples_${e} PROPERTIES OUTPUT_NAME ${e})
|
|
set_target_properties(client_examples_${e} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/client_examples)
|
|
target_link_libraries(client_examples_${e} vncclient ${CMAKE_THREAD_LIBS_INIT} ${SDL2_LIBRARY} ${FFMPEG_LIBRARIES})
|
|
endforeach(e ${LIBVNCCLIENT_EXAMPLES})
|
|
|
|
|
|
#
|
|
# them tests
|
|
#
|
|
|
|
if(UNIX)
|
|
set(ADDITIONAL_TEST_LIBS m)
|
|
endif(UNIX)
|
|
|
|
set(SIMPLETESTS
|
|
cargstest
|
|
copyrecttest
|
|
)
|
|
|
|
if(CMAKE_USE_PTHREADS_INIT)
|
|
set(SIMPLETESTS
|
|
${SIMPLETESTS}
|
|
encodingstest
|
|
)
|
|
endif(CMAKE_USE_PTHREADS_INIT)
|
|
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
|
|
foreach(t ${SIMPLETESTS})
|
|
add_executable(test_${t} ${TESTS_DIR}/${t}.c)
|
|
set_target_properties(test_${t} PROPERTIES OUTPUT_NAME ${t})
|
|
set_target_properties(test_${t} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
|
|
target_link_libraries(test_${t} vncserver vncclient ${ADDITIONAL_TEST_LIBS})
|
|
endforeach(t ${SIMPLETESTS})
|
|
|
|
if(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
|
|
add_executable(test_tjunittest
|
|
${TESTS_DIR}/tjunittest.c
|
|
${TESTS_DIR}/tjutil.c
|
|
${TESTS_DIR}/tjutil.h
|
|
${COMMON_DIR}/turbojpeg.c
|
|
${COMMON_DIR}/turbojpeg.h
|
|
)
|
|
set_target_properties(test_tjunittest PROPERTIES OUTPUT_NAME tjunittest)
|
|
set_target_properties(test_tjunittest PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
|
|
target_link_libraries(test_tjunittest vncserver vncclient ${ADDITIONAL_TEST_LIBS})
|
|
|
|
add_executable(test_tjbench
|
|
${TESTS_DIR}/tjbench.c
|
|
${TESTS_DIR}/tjutil.c
|
|
${TESTS_DIR}/tjutil.h
|
|
${TESTS_DIR}/bmp.c
|
|
${TESTS_DIR}/bmp.h
|
|
${COMMON_DIR}/turbojpeg.c
|
|
${COMMON_DIR}/turbojpeg.h
|
|
)
|
|
set_target_properties(test_tjbench PROPERTIES OUTPUT_NAME tjbench)
|
|
set_target_properties(test_tjbench PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
|
|
target_link_libraries(test_tjbench vncserver vncclient ${ADDITIONAL_TEST_LIBS})
|
|
|
|
endif(WITH_JPEG AND FOUND_LIBJPEG_TURBO)
|
|
|
|
if(LIBVNCSERVER_WITH_WEBSOCKETS)
|
|
add_executable(test_wstest
|
|
${TESTS_DIR}/wstest.c
|
|
${TESTS_DIR}/wstestdata.inc
|
|
)
|
|
set_target_properties(test_wstest PROPERTIES OUTPUT_NAME wstest)
|
|
set_target_properties(test_wstest PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/test)
|
|
target_link_libraries(test_wstest vncserver vncclient ${ADDITIONAL_TEST_LIBS})
|
|
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
|
|
|
|
add_test(NAME cargs COMMAND test_cargstest)
|
|
if(FOUND_LIBJPEG_TURBO)
|
|
add_test(NAME turbojpeg COMMAND test_tjunittest)
|
|
endif(FOUND_LIBJPEG_TURBO)
|
|
if(LIBVNCSERVER_WITH_WEBSOCKETS)
|
|
add_test(NAME wstest COMMAND test_wstest)
|
|
endif(LIBVNCSERVER_WITH_WEBSOCKETS)
|
|
|
|
#
|
|
# this gets the libraries needed by TARGET in "-libx -liby ..." form
|
|
#
|
|
function(get_link_libraries OUT TARGET)
|
|
set(RESULT "")
|
|
get_target_property(LIBRARIES ${TARGET} INTERFACE_LINK_LIBRARIES)
|
|
foreach(LIB ${LIBRARIES})
|
|
if("${LIB}" MATCHES ".*NOTFOUND.*")
|
|
continue()
|
|
endif()
|
|
string(REGEX REPLACE "^.*/lib" "" LIB ${LIB}) # remove leading path and "lib" name prefix
|
|
string(REGEX REPLACE "-l" "" LIB ${LIB}) # remove leading -l
|
|
string(REGEX REPLACE "\\.so$" "" LIB ${LIB}) # remove trailing .so
|
|
list(APPEND RESULT "-l${LIB}")
|
|
endforeach()
|
|
list(REMOVE_DUPLICATES RESULT)
|
|
string(CONCAT RESULT ${RESULT}) # back to string
|
|
if(RESULT)
|
|
string(REPLACE "-l" " -l" RESULT ${RESULT}) # re-add separators
|
|
endif(RESULT)
|
|
set(${OUT} ${RESULT} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
get_link_libraries(PRIVATE_LIBS vncserver)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libvncserver.pc.cmakein ${CMAKE_CURRENT_BINARY_DIR}/libvncserver.pc @ONLY)
|
|
get_link_libraries(PRIVATE_LIBS vncclient)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libvncclient.pc.cmakein ${CMAKE_CURRENT_BINARY_DIR}/libvncclient.pc @ONLY)
|
|
|
|
|
|
install_targets(/lib vncserver)
|
|
install_targets(/lib vncclient)
|
|
install_files(/include/rfb FILES
|
|
rfb/keysym.h
|
|
rfb/rfb.h
|
|
rfb/rfbclient.h
|
|
rfb/rfbconfig.h
|
|
rfb/rfbproto.h
|
|
rfb/rfbregion.h
|
|
)
|
|
|
|
install_files(/lib/pkgconfig FILES
|
|
libvncserver.pc
|
|
libvncclient.pc
|
|
)
|