San Mehat | a430b2b | 2014-09-23 08:30:51 -0700 | [diff] [blame] | 1 | cmake_minimum_required(VERSION 2.6) |
| 2 | |
| 3 | project(LibVNCServer) |
| 4 | include(CheckFunctionExists) |
| 5 | include(CheckIncludeFile) |
| 6 | include(CheckTypeSize) |
| 7 | include(TestBigEndian) |
| 8 | include(CheckCSourceCompiles) |
| 9 | include(CheckCXXSourceCompiles) |
| 10 | include(CheckCSourceRuns) |
| 11 | |
| 12 | set(PACKAGE_NAME "LibVNCServer") |
| 13 | set(FULL_PACKAGE_NAME "LibVNCServer") |
| 14 | set(PACKAGE_VERSION "0.9.9") |
| 15 | set(PROJECT_BUGREPORT_PATH "http://sourceforge.net/projects/libvncserver") |
| 16 | set(CMAKE_C_FLAGS "-O2 -W -Wall -g") |
| 17 | set(LIBVNCSERVER_DIR ${CMAKE_SOURCE_DIR}/libvncserver) |
| 18 | set(COMMON_DIR ${CMAKE_SOURCE_DIR}/common) |
| 19 | set(LIBVNCCLIENT_DIR ${CMAKE_SOURCE_DIR}/libvncclient) |
| 20 | set(LIBVNCSRVTEST_DIR ${CMAKE_SOURCE_DIR}/examples) |
| 21 | set(LIBVNCCLITEST_DIR ${CMAKE_SOURCE_DIR}/client_examples) |
| 22 | |
| 23 | |
| 24 | include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/libvncserver ${CMAKE_SOURCE_DIR}/common) |
| 25 | |
| 26 | find_package(ZLIB) |
| 27 | find_package(JPEG) |
| 28 | find_package(PNG) |
| 29 | find_package(SDL) |
| 30 | find_package(GnuTLS) |
| 31 | find_package(Threads) |
| 32 | find_package(X11) |
| 33 | find_package(OpenSSL) |
| 34 | find_library(LIBGCRYPT_LIBRARIES gcrypt) |
| 35 | |
| 36 | # Check whether the version of libjpeg we found was libjpeg-turbo and print a |
| 37 | # warning if not. |
| 38 | set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARIES}) |
| 39 | set(CMAKE_REQUIRED_FLAGS -I${JPEG_INCLUDE_DIR}) |
| 40 | |
| 41 | set(JPEG_TEST_SOURCE "\n |
| 42 | #include <stdio.h>\n |
| 43 | #include <jpeglib.h>\n |
| 44 | int main(void) {\n |
| 45 | struct jpeg_compress_struct cinfo;\n |
| 46 | struct jpeg_error_mgr jerr;\n |
| 47 | cinfo.err=jpeg_std_error(&jerr);\n |
| 48 | jpeg_create_compress(&cinfo);\n |
| 49 | cinfo.input_components = 3;\n |
| 50 | jpeg_set_defaults(&cinfo);\n |
| 51 | cinfo.in_color_space = JCS_EXT_RGB;\n |
| 52 | jpeg_default_colorspace(&cinfo);\n |
| 53 | return 0;\n |
| 54 | }") |
| 55 | |
| 56 | if(CMAKE_CROSSCOMPILING) |
| 57 | check_c_source_compiles("${JPEG_TEST_SOURCE}" FOUND_LIBJPEG_TURBO) |
| 58 | else() |
| 59 | check_c_source_runs("${JPEG_TEST_SOURCE}" FOUND_LIBJPEG_TURBO) |
| 60 | endif() |
| 61 | |
| 62 | set(CMAKE_REQUIRED_LIBRARIES) |
| 63 | set(CMAKE_REQUIRED_FLAGS) |
| 64 | set(CMAKE_REQUIRED_DEFINITIONS) |
| 65 | |
| 66 | if(NOT FOUND_LIBJPEG_TURBO) |
| 67 | 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/ ***") |
| 68 | endif() |
| 69 | |
| 70 | set(CMAKE_REQUIRED_LIBRARIES resolv) |
| 71 | check_function_exists(__b64_ntop HAVE_B64) |
| 72 | |
| 73 | if(Threads_FOUND) |
| 74 | option(TIGHTVNC_FILETRANSFER "Enable filetransfer" ON) |
| 75 | endif(Threads_FOUND) |
| 76 | if (HAVE_B64) |
| 77 | endif(HAVE_B64) |
| 78 | if(ZLIB_FOUND) |
| 79 | set(LIBVNCSERVER_HAVE_LIBZ 1) |
| 80 | endif(ZLIB_FOUND) |
| 81 | if(JPEG_FOUND) |
| 82 | set(LIBVNCSERVER_HAVE_LIBJPEG 1) |
| 83 | endif(JPEG_FOUND) |
| 84 | if(PNG_FOUND) |
| 85 | set(LIBVNCSERVER_HAVE_LIBPNG 1) |
| 86 | endif(PNG_FOUND) |
| 87 | option(LIBVNCSERVER_ALLOW24BPP "Allow 24 bpp" ON) |
| 88 | |
| 89 | if(GNUTLS_FOUND) |
| 90 | set(LIBVNCSERVER_WITH_CLIENT_TLS 1) |
| 91 | option(LIBVNCSERVER_WITH_WEBSOCKETS "Build with websockets support (gnutls)" ON) |
| 92 | set(WEBSOCKET_LIBRARIES -lresolv ${GNUTLS_LIBRARIES}) |
| 93 | set(WSSRCS ${LIBVNCSERVER_DIR}/rfbssl_gnutls ${LIBVNCSERVER_DIR}/rfbcrypto_gnutls) |
| 94 | elseif(OPENSSL_FOUND) |
| 95 | option(LIBVNCSERVER_WITH_WEBSOCKETS "Build with websockets support (openssl)" ON) |
| 96 | set(WEBSOCKET_LIBRARIES -lresolv ${OPENSSL_LIBRARIES}) |
| 97 | set(WSSRCS ${LIBVNCSERVER_DIR}/rfbssl_openssl ${LIBVNCSERVER_DIR}/rfbcrypto_openssl) |
| 98 | else() |
| 99 | option(LIBVNCSERVER_WITH_WEBSOCKETS "Build with websockets support (no ssl)" ON) |
| 100 | set(WEBSOCKET_LIBRARIES -lresolv) |
| 101 | set(WSSRCS ${LIBVNCSERVER_DIR}/rfbssl_none.c ${LIBVNCSERVER_DIR}/rfbcrypto_included.c ${COMMON_DIR}/md5.c ${COMMON_DIR}/sha1.c) |
| 102 | endif() |
| 103 | |
| 104 | if(LIBGCRYPT_LIBRARIES) |
| 105 | message(STATUS "Found libgcrypt: ${LIBGCRYPT_LIBRARIES}") |
| 106 | set(LIBVNCSERVER_WITH_CLIENT_GCRYPT 1) |
| 107 | endif(LIBGCRYPT_LIBRARIES) |
| 108 | |
| 109 | |
| 110 | check_include_file("fcntl.h" LIBVNCSERVER_HAVE_FCNTL_H) |
| 111 | check_include_file("netinet/in.h" LIBVNCSERVER_HAVE_NETINET_IN_H) |
| 112 | check_include_file("sys/socket.h" LIBVNCSERVER_HAVE_SYS_SOCKET_H) |
| 113 | check_include_file("sys/stat.h" LIBVNCSERVER_HAVE_SYS_STAT_H) |
| 114 | check_include_file("sys/time.h" LIBVNCSERVER_HAVE_SYS_TIME_H) |
| 115 | check_include_file("sys/types.h" LIBVNCSERVER_HAVE_SYS_TYPES_H) |
| 116 | check_include_file("sys/wait.h" LIBVNCSERVER_HAVE_SYS_WAIT_H) |
| 117 | check_include_file("unistd.h" LIBVNCSERVER_HAVE_UNISTD_H) |
| 118 | |
| 119 | # headers needed for check_type_size() |
| 120 | check_include_file("arpa/inet.h" HAVE_ARPA_INET_H) |
| 121 | check_include_file("stdint.h" HAVE_STDINT_H) |
| 122 | check_include_file("stddef.h" HAVE_STDDEF_H) |
| 123 | check_include_file("sys/types.h" HAVE_SYS_TYPES_H) |
| 124 | |
| 125 | check_function_exists(gettimeofday LIBVNCSERVER_HAVE_GETTIMEOFDAY) |
| 126 | |
| 127 | if(CMAKE_USE_PTHREADS_INIT) |
| 128 | set(LIBVNCSERVER_HAVE_LIBPTHREAD 1) |
| 129 | endif(CMAKE_USE_PTHREADS_INIT) |
| 130 | if(LIBVNCSERVER_HAVE_SYS_SOCKET_H) |
| 131 | # socklen_t |
| 132 | list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") |
| 133 | endif(LIBVNCSERVER_HAVE_SYS_SOCKET_H) |
| 134 | if(HAVE_ARPA_INET_H) |
| 135 | # in_addr_t |
| 136 | list(APPEND CMAKE_EXTRA_INCLUDE_FILES "arpa/inet.h") |
| 137 | endif(HAVE_ARPA_INET_H) |
| 138 | |
| 139 | check_type_size(pid_t LIBVNCSERVER_PID_T) |
| 140 | check_type_size(size_t LIBVNCSERVER_SIZE_T) |
| 141 | check_type_size(socklen_t LIBVNCSERVER_SOCKLEN_T) |
| 142 | check_type_size(in_addr_t LIBVNCSERVER_IN_ADDR_T) |
| 143 | if(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) |
| 144 | set(LIBVNCSERVER_NEED_INADDR_T 1) |
| 145 | endif(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) |
| 146 | |
| 147 | TEST_BIG_ENDIAN(LIBVNCSERVER_WORDS_BIGENDIAN) |
| 148 | |
| 149 | # TODO: |
| 150 | # LIBVNCSERVER_ENOENT_WORKAROUND |
| 151 | # inline |
| 152 | |
| 153 | configure_file(${CMAKE_SOURCE_DIR}/rfb/rfbconfig.h.cmake ${CMAKE_BINARY_DIR}/rfb/rfbconfig.h) |
| 154 | configure_file(${CMAKE_SOURCE_DIR}/rfb/rfbint.h.cmake ${CMAKE_BINARY_DIR}/rfb/rfbint.h) |
| 155 | |
| 156 | set(LIBVNCSERVER_SOURCES |
| 157 | ${LIBVNCSERVER_DIR}/main.c |
| 158 | ${LIBVNCSERVER_DIR}/rfbserver.c |
| 159 | ${LIBVNCSERVER_DIR}/rfbregion.c |
| 160 | ${LIBVNCSERVER_DIR}/auth.c |
| 161 | ${LIBVNCSERVER_DIR}/sockets.c |
| 162 | ${LIBVNCSERVER_DIR}/stats.c |
| 163 | ${LIBVNCSERVER_DIR}/corre.c |
| 164 | ${LIBVNCSERVER_DIR}/hextile.c |
| 165 | ${LIBVNCSERVER_DIR}/rre.c |
| 166 | ${LIBVNCSERVER_DIR}/translate.c |
| 167 | ${LIBVNCSERVER_DIR}/cutpaste.c |
| 168 | ${LIBVNCSERVER_DIR}/httpd.c |
| 169 | ${LIBVNCSERVER_DIR}/cursor.c |
| 170 | ${LIBVNCSERVER_DIR}/font.c |
| 171 | ${LIBVNCSERVER_DIR}/draw.c |
| 172 | ${LIBVNCSERVER_DIR}/selbox.c |
| 173 | ${COMMON_DIR}/d3des.c |
| 174 | ${COMMON_DIR}/vncauth.c |
| 175 | ${LIBVNCSERVER_DIR}/cargs.c |
| 176 | ${COMMON_DIR}/minilzo.c |
| 177 | ${LIBVNCSERVER_DIR}/ultra.c |
| 178 | ${LIBVNCSERVER_DIR}/scale.c |
| 179 | ) |
| 180 | |
| 181 | set(LIBVNCCLIENT_SOURCES |
| 182 | ${LIBVNCCLIENT_DIR}/cursor.c |
| 183 | ${LIBVNCCLIENT_DIR}/listen.c |
| 184 | ${LIBVNCCLIENT_DIR}/rfbproto.c |
| 185 | ${LIBVNCCLIENT_DIR}/sockets.c |
| 186 | ${LIBVNCCLIENT_DIR}/vncviewer.c |
| 187 | ${COMMON_DIR}/minilzo.c |
| 188 | ) |
| 189 | |
| 190 | if(GNUTLS_FOUND) |
| 191 | set(LIBVNCCLIENT_SOURCES |
| 192 | ${LIBVNCCLIENT_SOURCES} |
| 193 | ${LIBVNCCLIENT_DIR}/tls_gnutls.c |
| 194 | ) |
| 195 | elseif(OPENSSL_FOUND) |
| 196 | set(LIBVNCCLIENT_SOURCES |
| 197 | ${LIBVNCCLIENT_SOURCES} |
| 198 | ${LIBVNCCLIENT_DIR}/tls_openssl.c |
| 199 | ) |
| 200 | else() |
| 201 | set(LIBVNCCLIENT_SOURCES |
| 202 | ${LIBVNCCLIENT_SOURCES} |
| 203 | ${LIBVNCCLIENT_DIR}/tls_none.c |
| 204 | ) |
| 205 | endif() |
| 206 | |
| 207 | if(ZLIB_FOUND) |
| 208 | add_definitions(-DLIBVNCSERVER_HAVE_LIBZ) |
| 209 | include_directories(${ZLIB_INCLUDE_DIR}) |
| 210 | set(LIBVNCSERVER_SOURCES |
| 211 | ${LIBVNCSERVER_SOURCES} |
| 212 | ${LIBVNCSERVER_DIR}/zlib.c |
| 213 | ${LIBVNCSERVER_DIR}/zrle.c |
| 214 | ${LIBVNCSERVER_DIR}/zrleoutstream.c |
| 215 | ${LIBVNCSERVER_DIR}/zrlepalettehelper.c |
| 216 | ) |
| 217 | endif(ZLIB_FOUND) |
| 218 | |
| 219 | if(JPEG_FOUND) |
| 220 | add_definitions(-DLIBVNCSERVER_HAVE_LIBJPEG) |
| 221 | include_directories(${JPEG_INCLUDE_DIR}) |
| 222 | set(TIGHT_C ${LIBVNCSERVER_DIR}/tight.c ${COMMON_DIR}/turbojpeg.c) |
| 223 | endif(JPEG_FOUND) |
| 224 | |
| 225 | if(PNG_FOUND) |
| 226 | add_definitions(-DLIBVNCSERVER_HAVE_LIBPNG) |
| 227 | include_directories(${PNG_INCLUDE_DIR}) |
| 228 | set(TIGHT_C ${LIBVNCSERVER_DIR}/tight.c ${COMMON_DIR}/turbojpeg.c) |
| 229 | endif(PNG_FOUND) |
| 230 | |
| 231 | set(LIBVNCSERVER_SOURCES |
| 232 | ${LIBVNCSERVER_SOURCES} |
| 233 | ${TIGHT_C} |
| 234 | ) |
| 235 | |
| 236 | if(TIGHTVNC_FILETRANSFER) |
| 237 | set(LIBVNCSERVER_SOURCES |
| 238 | ${LIBVNCSERVER_SOURCES} |
| 239 | ${LIBVNCSERVER_DIR}/tightvnc-filetransfer/rfbtightserver.c |
| 240 | ${LIBVNCSERVER_DIR}/tightvnc-filetransfer/handlefiletransferrequest.c |
| 241 | ${LIBVNCSERVER_DIR}/tightvnc-filetransfer/filetransfermsg.c |
| 242 | ${LIBVNCSERVER_DIR}/tightvnc-filetransfer/filelistinfo.c |
| 243 | ) |
| 244 | endif(TIGHTVNC_FILETRANSFER) |
| 245 | |
| 246 | if(LIBVNCSERVER_WITH_WEBSOCKETS) |
| 247 | add_definitions(-DLIBVNCSERVER_WITH_WEBSOCKETS) |
| 248 | set(LIBVNCSERVER_SOURCES |
| 249 | ${LIBVNCSERVER_SOURCES} |
| 250 | ${LIBVNCSERVER_DIR}/websockets.c |
| 251 | ${WSSRCS} |
| 252 | ) |
| 253 | endif(LIBVNCSERVER_WITH_WEBSOCKETS) |
| 254 | |
| 255 | |
| 256 | add_library(vncclient SHARED ${LIBVNCCLIENT_SOURCES}) |
| 257 | add_library(vncserver SHARED ${LIBVNCSERVER_SOURCES}) |
| 258 | if(WIN32) |
| 259 | set(ADDITIONAL_LIBS ws2_32) |
| 260 | endif(WIN32) |
| 261 | |
| 262 | target_link_libraries(vncclient |
| 263 | ${ADDITIONAL_LIBS} |
| 264 | ${ZLIB_LIBRARIES} |
| 265 | ${JPEG_LIBRARIES} |
| 266 | ) |
| 267 | target_link_libraries(vncserver |
| 268 | ${ADDITIONAL_LIBS} |
| 269 | ${ZLIB_LIBRARIES} |
| 270 | ${JPEG_LIBRARIES} |
| 271 | ${PNG_LIBRARIES} |
| 272 | ${WEBSOCKET_LIBRARIES} |
| 273 | ) |
| 274 | |
| 275 | SET_TARGET_PROPERTIES(vncclient vncserver |
| 276 | PROPERTIES SOVERSION "0.0.0" |
| 277 | ) |
| 278 | |
| 279 | # tests |
| 280 | set(LIBVNCSERVER_TESTS |
| 281 | backchannel |
| 282 | camera |
| 283 | colourmaptest |
| 284 | example |
| 285 | fontsel |
| 286 | pnmshow |
| 287 | pnmshow24 |
| 288 | regiontest |
| 289 | rotate |
| 290 | simple |
| 291 | simple15 |
| 292 | storepasswd |
| 293 | vncev |
| 294 | ) |
| 295 | |
| 296 | if(Threads_FOUND) |
| 297 | set(LIBVNCSERVER_TESTS |
| 298 | ${LIBVNCSERVER_TESTS} |
| 299 | blooptest |
| 300 | ) |
| 301 | endif(Threads_FOUND) |
| 302 | |
| 303 | if(TIGHTVNC_FILETRANSFER) |
| 304 | set(LIBVNCSERVER_TESTS |
| 305 | ${LIBVNCSERVER_TESTS} |
| 306 | filetransfer |
| 307 | ) |
| 308 | endif(TIGHTVNC_FILETRANSFER) |
| 309 | |
| 310 | if(MACOS) |
| 311 | set(LIBVNCSERVER_TESTS |
| 312 | ${LIBVNCSERVER_TESTS} |
| 313 | mac |
| 314 | ) |
| 315 | endif(MACOS) |
| 316 | |
| 317 | set(LIBVNCCLIENT_TESTS |
| 318 | backchannel |
| 319 | ppmtest |
| 320 | ) |
| 321 | |
| 322 | if(SDL_FOUND) |
| 323 | include_directories(${SDL_INCLUDE_DIR}) |
| 324 | set(LIBVNCCLIENT_TESTS |
| 325 | ${LIBVNCCLIENT_TESTS} |
| 326 | SDLvncviewer |
| 327 | ) |
| 328 | set(SDLvncviewer_EXTRA_SOURCES scrap.c) |
| 329 | endif(SDL_FOUND) |
| 330 | |
| 331 | if(HAVE_FFMPEG) |
| 332 | set(LIBVNCCLIENT_TESTS |
| 333 | ${LIBVNCCLIENT_TESTS} |
| 334 | vnc2mpg |
| 335 | ) |
| 336 | endif(HAVE_FFMPEG) |
| 337 | |
| 338 | |
| 339 | file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/examples) |
| 340 | foreach(test ${LIBVNCSERVER_TESTS}) |
| 341 | add_executable(examples/${test} ${LIBVNCSRVTEST_DIR}/${test}.c) |
| 342 | target_link_libraries(examples/${test} vncserver ${CMAKE_THREAD_LIBS_INIT}) |
| 343 | endforeach(test ${LIBVNCSERVER_TESTS}) |
| 344 | |
| 345 | file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/client_examples) |
| 346 | foreach(test ${LIBVNCCLIENT_TESTS}) |
| 347 | add_executable(client_examples/${test} ${LIBVNCCLITEST_DIR}/${test}.c ${LIBVNCCLITEST_DIR}/${${test}_EXTRA_SOURCES} ) |
| 348 | target_link_libraries(client_examples/${test} vncclient ${CMAKE_THREAD_LIBS_INIT} ${GNUTLS_LIBRARIES} ${X11_LIBRARIES} ${SDL_LIBRARY} ${FFMPEG_LIBRARIES}) |
| 349 | endforeach(test ${LIBVNCCLIENT_TESTS}) |
| 350 | |
| 351 | install_targets(/lib vncserver) |
| 352 | install_targets(/lib vncclient) |
| 353 | install_files(/include/rfb FILES |
| 354 | rfb/keysym.h |
| 355 | rfb/rfb.h |
| 356 | rfb/rfbclient.h |
| 357 | rfb/rfbconfig.h |
| 358 | rfb/rfbint.h |
| 359 | rfb/rfbproto.h |
| 360 | rfb/rfbregion.h |
| 361 | ) |