cmake_minimum_required ( VERSION 3.4 )
cmake_policy ( SET CMP0037 NEW )
project ( LibVNCServer )
include ( CheckFunctionExists )
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_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 )
if ( WITH_ZLIB )
find_package ( ZLIB )
endif ( WITH_ZLIB )
if ( WITH_JPEG )
find_package ( JPEG )
# 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
i n t main ( void ) { \ n
s t r u c t j p e g _ c o m p r e s s _ s t r u c t c i n f o ; \ n
s t r u c t j p e g _ e r r o r _ m g r j e r r ; \ n
c i n f o . e r r = jpeg_std_error ( &jerr ) ; \ n
jpeg_create_compress ( &cinfo ) ; \ n
c i n f o . i n p u t _ c o m p o n e n t s = 3 ; \ n
jpeg_set_defaults ( &cinfo ) ; \ n
c i n f o . i n _ c o l o r _ s p a c e = J C S _ E X T _ R G B ; \ n
jpeg_default_colorspace ( &cinfo ) ; \ n
r e t u r n 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 ( WITH_JPEG )
if ( WITH_PNG )
find_package ( PNG )
endif ( WITH_PNG )
if ( WITH_SDL )
find_package ( SDL )
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 )
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 )
# On systems such as GNU/Linux with glibc, __b64_ntop is defined in a
# separate library, libresolv. On some others, such as FreeBSD, it is
# part of libc itself. We first check if __b64_ntop is found without
# additional libraries, and then try looking for it with libresolv if
# the first test fails.
check_function_exists ( __b64_ntop HAVE_B64_IN_LIBC )
if ( NOT HAVE_B64_IN_LIBC )
set ( CMAKE_REQUIRED_LIBRARIES resolv )
check_function_exists ( __b64_ntop HAVE_B64_IN_LIBRESOLV )
set ( CMAKE_REQUIRED_LIBRARIES )
if ( HAVE_B64_IN_LIBRESOLV )
set ( RESOLV_LIB "resolv" )
endif ( HAVE_B64_IN_LIBRESOLV )
# the function check somehow fails for apple but the function is there
if ( APPLE )
set ( RESOLV_LIB "resolv" )
endif ( APPLE )
endif ( NOT HAVE_B64_IN_LIBC )
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 ( JPEG_FOUND )
set ( LIBVNCSERVER_HAVE_LIBJPEG 1 )
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 ( WITH_WEBSOCKETS AND LIBVNCSERVER_HAVE_SYS_UIO_H )
set ( LIBVNCSERVER_WITH_WEBSOCKETS 1 )
if ( GNUTLS_FOUND )
set ( LIBVNCSERVER_WITH_CLIENT_TLS 1 )
message ( STATUS "Building websockets with GnuTLS" )
set ( WEBSOCKET_LIBRARIES ${ RESOLV_LIB } ${ GNUTLS_LIBRARIES } )
set ( WSSRCS ${ LIBVNCSERVER_DIR } /rfbssl_gnutls ${ LIBVNCSERVER_DIR } /rfbcrypto_gnutls )
include_directories ( ${ GNUTLS_INCLUDE_DIR } )
elseif ( OPENSSL_FOUND )
message ( STATUS "Building websockets with OpenSSL" )
set ( WEBSOCKET_LIBRARIES ${ RESOLV_LIB } ${ OPENSSL_LIBRARIES } )
set ( WSSRCS ${ LIBVNCSERVER_DIR } /rfbssl_openssl ${ LIBVNCSERVER_DIR } /rfbcrypto_openssl )
else ( )
message ( STATUS "Building websockets without SSL" )
set ( WEBSOCKET_LIBRARIES ${ RESOLV_LIB } )
set ( WSSRCS ${ LIBVNCSERVER_DIR } /rfbssl_none.c ${ LIBVNCSERVER_DIR } /rfbcrypto_included.c ${ COMMON_DIR } /md5.c ${ COMMON_DIR } /sha1.c )
endif ( )
endif ( WITH_WEBSOCKETS AND LIBVNCSERVER_HAVE_SYS_UIO_H )
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 ( 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 )
# TODO:
# LIBVNCSERVER_ENOENT_WORKAROUND
# inline
configure_file ( ${ CMAKE_CURRENT_SOURCE_DIR } /rfb/rfbconfig.h.cmakein ${ CMAKE_BINARY_DIR } /rfb/rfbconfig.h )
set ( LIBVNCSERVER_SOURCES
$ { L I B V N C S E R V E R _ D I R } / m a i n . c
$ { L I B V N C S E R V E R _ D I R } / r f b s e r v e r . c
$ { L I B V N C S E R V E R _ D I R } / r f b r e g i o n . c
$ { L I B V N C S E R V E R _ D I R } / a u t h . c
$ { L I B V N C S E R V E R _ D I R } / s o c k e t s . c
$ { L I B V N C S E R V E R _ D I R } / s t a t s . c
$ { L I B V N C S E R V E R _ D I R } / c o r r e . c
$ { L I B V N C S E R V E R _ D I R } / h e x t i l e . c
$ { L I B V N C S E R V E R _ D I R } / r r e . c
$ { L I B V N C S E R V E R _ D I R } / t r a n s l a t e . c
$ { L I B V N C S E R V E R _ D I R } / c u t p a s t e . c
$ { L I B V N C S E R V E R _ D I R } / h t t p d . c
$ { L I B V N C S E R V E R _ D I R } / c u r s o r . c
$ { L I B V N C S E R V E R _ D I R } / f o n t . c
$ { L I B V N C S E R V E R _ D I R } / d r a w . c
$ { L I B V N C S E R V E R _ D I R } / s e l b o x . c
$ { C O M M O N _ D I R } / d 3 d e s . c
$ { C O M M O N _ D I R } / v n c a u t h . c
$ { L I B V N C S E R V E R _ D I R } / c a r g s . c
$ { C O M M O N _ D I R } / m i n i l z o . c
$ { L I B V N C S E R V E R _ D I R } / u l t r a . c
$ { L I B V N C S E R V E R _ D I R } / s c a l e . c
)
set ( LIBVNCCLIENT_SOURCES
$ { L I B V N C C L I E N T _ D I R } / c u r s o r . c
$ { L I B V N C C L I E N T _ D I R } / l i s t e n . c
$ { L I B V N C C L I E N T _ D I R } / r f b p r o t o . c
$ { L I B V N C C L I E N T _ D I R } / s o c k e t s . c
$ { L I B V N C C L I E N T _ D I R } / v n c v i e w e r . c
$ { C O M M O N _ D I R } / m i n i l z o . c
)
if ( GNUTLS_FOUND )
set ( LIBVNCCLIENT_SOURCES
$ { L I B V N C C L I E N T _ S O U R C E S }
$ { L I B V N C C L I E N T _ D I R } / t l s _ g n u t l s . c
)
elseif ( OPENSSL_FOUND )
set ( LIBVNCCLIENT_SOURCES
$ { L I B V N C C L I E N T _ S O U R C E S }
$ { L I B V N C C L I E N T _ D I R } / t l s _ o p e n s s l . c
)
include_directories ( ${ OPENSSL_INCLUDE_DIR } )
else ( )
set ( LIBVNCCLIENT_SOURCES
$ { L I B V N C C L I E N T _ S O U R C E S }
$ { L I B V N C C L I E N T _ D I R } / t l s _ n o n e . c
)
endif ( )
if ( ZLIB_FOUND )
add_definitions ( -DLIBVNCSERVER_HAVE_LIBZ )
include_directories ( ${ ZLIB_INCLUDE_DIR } )
set ( LIBVNCSERVER_SOURCES
$ { L I B V N C S E R V E R _ S O U R C E S }
$ { L I B V N C S E R V E R _ D I R } / z l i b . c
$ { L I B V N C S E R V E R _ D I R } / z r l e . c
$ { L I B V N C S E R V E R _ D I R } / z r l e o u t s t r e a m . c
$ { L I B V N C S E R V E R _ D I R } / z r l e p a l e t t e h e l p e r . c
)
endif ( ZLIB_FOUND )
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
$ { L I B V N C S E R V E R _ S O U R C E S }
$ { T I G H T _ C }
)
if ( WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT )
set ( LIBVNCSERVER_SOURCES
$ { L I B V N C S E R V E R _ S O U R C E S }
$ { L I B V N C S E R V E R _ D I R } / t i g h t v n c - f i l e t r a n s f e r / r f b t i g h t s e r v e r . c
$ { L I B V N C S E R V E R _ D I R } / t i g h t v n c - f i l e t r a n s f e r / h a n d l e f i l e t r a n s f e r r e q u e s t . c
$ { L I B V N C S E R V E R _ D I R } / t i g h t v n c - f i l e t r a n s f e r / f i l e t r a n s f e r m s g . c
$ { L I B V N C S E R V E R _ D I R } / t i g h t v n c - f i l e t r a n s f e r / f i l e l i s t i n f o . c
)
endif ( WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT )
if ( LIBVNCSERVER_WITH_WEBSOCKETS )
add_definitions ( -DLIBVNCSERVER_WITH_WEBSOCKETS )
set ( LIBVNCSERVER_SOURCES
$ { L I B V N C S E R V E R _ S O U R C E S }
$ { L I B V N C S E R V E R _ D I R } / w e b s o c k e t s . c
$ { L I B V N C S E R V E R _ D I R } / w s _ d e c o d e . c
$ { W S S R C S }
)
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
$ { A D D I T I O N A L _ L I B S }
$ { Z L I B _ L I B R A R I E S }
$ { J P E G _ L I B R A R I E S }
$ { G N U T L S _ L I B R A R I E S }
$ { O P E N S S L _ L I B R A R I E S }
)
target_link_libraries ( vncserver
$ { A D D I T I O N A L _ L I B S }
$ { Z L I B _ L I B R A R I E S }
$ { J P E G _ L I B R A R I E S }
$ { P N G _ L I B R A R I E S }
$ { W E B S O C K E T _ L I B R A R I E S }
)
SET_TARGET_PROPERTIES ( vncclient vncserver
P R O P E R T I E S S O V E R S I O N " $ { V E R S I O N _ S O } " V E R S I O N " $ { P A C K A G E _ V E R S I O N } "
)
# EXAMPLES
set ( LIBVNCSERVER_EXAMPLES
b a c k c h a n n e l
c a m e r a
c o l o u r m a p t e s t
e x a m p l e
f o n t s e l
p n m s h o w
p n m s h o w 2 4
r e g i o n t e s t
r o t a t e
s i m p l e
s i m p l e 1 5
s t o r e p a s s w d
v n c e v
)
if ( CMAKE_USE_PTHREADS_INIT )
set ( LIBVNCSERVER_EXAMPLES
$ { L I B V N C S E R V E R _ E X A M P L E S }
b l o o p t e s t
)
endif ( CMAKE_USE_PTHREADS_INIT )
if ( WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT )
set ( LIBVNCSERVER_EXAMPLES
$ { L I B V N C S E R V E R _ E X A M P L E S }
f i l e t r a n s f e r
)
endif ( WITH_TIGHTVNC_FILETRANSFER AND CMAKE_USE_PTHREADS_INIT )
if ( MACOS )
set ( LIBVNCSERVER_EXAMPLES
$ { L I B V N C S E R V E R _ E X A M P L E S }
m a c
)
endif ( MACOS )
if ( ANDROID )
set ( LIBVNCSERVER_EXAMPLES
$ { L I B V N C S E R V E R _ E X A M P L E S }
a n d r o i d v n c s e r v e r
)
endif ( ANDROID )
set ( LIBVNCCLIENT_EXAMPLES
b a c k c h a n n e l
p p m t e s t
)
if ( SDL_FOUND )
include_directories ( ${ SDL_INCLUDE_DIR } )
set ( LIBVNCCLIENT_EXAMPLES
$ { L I B V N C C L I E N T _ E X A M P L E S }
S D L v n c v i e w e r
)
set ( SDLvncviewer_EXTRA_SOURCES scrap.c )
endif ( SDL_FOUND )
if ( FFMPEG_FOUND )
set ( LIBVNCCLIENT_EXAMPLES
$ { L I B V N C C L I E N T _ E X A M P L E S }
v n c 2 m p g
)
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 } ${ SDL_LIBRARY } ${ FFMPEG_LIBRARIES } )
endforeach ( e ${ LIBVNCCLIENT_EXAMPLES } )
#
# them tests
#
if ( UNIX )
set ( ADDITIONAL_TEST_LIBS m )
endif ( UNIX )
set ( SIMPLETESTS
c a r g s t e s t
c o p y r e c t t e s t
)
if ( CMAKE_USE_PTHREADS_INIT )
set ( SIMPLETESTS
$ { S I M P L E T E S T S }
e n c o d i n g s t e s t
)
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
$ { T E S T S _ D I R } / t j u n i t t e s t . c
$ { T E S T S _ D I R } / t j u t i l . c
$ { T E S T S _ D I R } / t j u t i l . h
$ { C O M M O N _ D I R } / t u r b o j p e g . c
$ { C O M M O N _ D I R } / t u r b o j p e g . 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
$ { T E S T S _ D I R } / t j b e n c h . c
$ { T E S T S _ D I R } / t j u t i l . c
$ { T E S T S _ D I R } / t j u t i l . h
$ { T E S T S _ D I R } / b m p . c
$ { T E S T S _ D I R } / b m p . h
$ { C O M M O N _ D I R } / t u r b o j p e g . c
$ { C O M M O N _ D I R } / t u r b o j p e g . 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
$ { T E S T S _ D I R } / w s t e s t . c
$ { T E S T S _ D I R } / w s t e s t d a t a . i n c
)
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
string ( REPLACE "-l" " -l" RESULT ${ RESULT } ) # re-add separators
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
r f b / k e y s y m . h
r f b / r f b . h
r f b / r f b c l i e n t . h
r f b / r f b c o n f i g . h
r f b / r f b p r o t o . h
r f b / r f b r e g i o n . h
)
install_files ( /lib/pkgconfig FILES
l i b v n c s e r v e r . p c
l i b v n c c l i e n t . p c
)