1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
4 # Copyright 2011 O.S. Systems Software Ltda.
5 # Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
6 # Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7 # Copyright 2012 HP Development Company, LLC
9 # Licensed under the Apache License, Version 2.0 (the "License");
10 # you may not use this file except in compliance with the License.
11 # You may obtain a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 # See the License for the specific language governing permissions and
19 # limitations under the License.
21 cmake_minimum_required(VERSION 2.8)
23 project(FreeRDP C CXX)
25 if(NOT DEFINED VENDOR)
26 set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor")
29 if(NOT DEFINED PRODUCT)
30 set(PRODUCT "FreeRDP" CACHE STRING "FreeRDP package name")
33 if(NOT DEFINED FREERDP_VENDOR)
37 set(CMAKE_COLOR_MAKEFILE ON)
39 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
41 # Include our extra modules
42 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
44 if((CMAKE_SYSTEM_NAME MATCHES "WindowsStore") AND (CMAKE_SYSTEM_VERSION MATCHES "10.0"))
46 add_definitions("-D_UWP")
47 set(CMAKE_WINDOWS_VERSION "WIN10")
50 # Check for cmake compatibility (enable/disable features)
51 include(CheckCmakeCompat)
53 # Include cmake modules
54 include(CheckIncludeFiles)
55 include(CheckLibraryExists)
56 include(CheckSymbolExists)
57 include(CheckStructHasMember)
58 include(FindPkgConfig)
59 include(TestBigEndian)
62 include(AutoVersioning)
63 include(ConfigOptions)
64 include(ComplexLibrary)
65 include(FeatureSummary)
66 include(CheckCCompilerFlag)
67 include(CheckCXXCompilerFlag)
68 include(GNUInstallDirsWrapper)
69 include(CMakePackageConfigHelpers)
73 if ($ENV{BUILD_NUMBER})
74 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
76 set(WITH_LIBRARY_VERSIONING "ON")
77 set(FREERDP_VERSION_MAJOR "2")
78 set(FREERDP_VERSION_MINOR "0")
79 set(FREERDP_VERSION_REVISION "0")
80 set(FREERDP_VERSION_SUFFIX "dev")
81 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
82 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
83 if (FREERDP_VERSION_SUFFIX)
84 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
86 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
88 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
90 # Compatibility options
91 if(DEFINED STATIC_CHANNELS)
92 message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
93 set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
97 if (CMAKE_INSTALL_PREFIX)
98 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
100 if (FREERDP_EXTERNAL_PATH)
101 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
104 # Allow to search the host machine for git
105 if(CMAKE_CROSSCOMPILING)
106 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
107 endif(CMAKE_CROSSCOMPILING)
109 include(GetGitRevisionDescription)
110 git_get_exact_tag(GIT_REVISION --tags --always)
112 if (${GIT_REVISION} STREQUAL "n/a")
113 git_rev_parse (GIT_REVISION --short)
115 if(CMAKE_CROSSCOMPILING)
116 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
117 endif(CMAKE_CROSSCOMPILING)
119 message(STATUS "Git Revision ${GIT_REVISION}")
121 # Turn on solution folders (2.8.4+)
122 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
124 # Default to release build type
125 if(NOT CMAKE_BUILD_TYPE)
126 set(CMAKE_BUILD_TYPE "Release")
129 if(NOT DEFINED BUILD_SHARED_LIBS)
131 set(BUILD_SHARED_LIBS OFF)
133 set(BUILD_SHARED_LIBS ON)
138 set(EXPORT_ALL_SYMBOLS TRUE)
139 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
140 set(EXPORT_ALL_SYMBOLS FALSE)
143 if (EXPORT_ALL_SYMBOLS)
144 # set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
145 add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
146 endif(EXPORT_ALL_SYMBOLS)
149 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
151 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
154 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
159 # Configure MSVC Runtime
162 if(NOT DEFINED MSVC_RUNTIME)
163 set(MSVC_RUNTIME "dynamic")
165 if(MSVC_RUNTIME STREQUAL "static")
166 if(BUILD_SHARED_LIBS)
167 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
169 message(STATUS "Use the MSVC static runtime option carefully!")
170 message(STATUS "OpenSSL uses /MD by default, and is very picky")
171 message(STATUS "Random freeing errors are a common sign of runtime issues")
173 configure_msvc_runtime()
175 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
176 set(CMAKE_SUPPRESS_REGENERATION ON)
180 # Compiler-specific flags
181 if(CMAKE_COMPILER_IS_GNUCC)
182 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
183 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
185 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
187 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
190 if(CMAKE_POSITION_INDEPENDENT_CODE)
191 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
192 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
197 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
199 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
200 if(Wno-unused-result)
201 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
203 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
204 if(Wno-unused-but-set-variable)
205 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
207 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
208 if(Wno-deprecated-declarations)
209 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
211 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
212 if(Wno-deprecated-declarationsCXX)
213 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
216 if(NOT EXPORT_ALL_SYMBOLS)
217 message(STATUS "GCC default symbol visibility: hidden")
218 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
221 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
223 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
226 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
227 if(Wimplicit-function-declaration)
228 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
232 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
234 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
237 if(CMAKE_BUILD_TYPE STREQUAL "Release")
238 add_definitions(-DNDEBUG)
240 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
241 if(Wno-builtin-macro-redefined)
242 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
243 add_definitions("-D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
246 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
247 if(Wno-builtin-macro-redefinedCXX)
248 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
249 add_definitions("-D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
252 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
253 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
256 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
260 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
261 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
262 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
263 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
265 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
267 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
268 if(Wno-deprecated-declarations)
269 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
271 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
272 if(Wno-deprecated-declarationsCXX)
273 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
277 # Enable address sanitizer, where supported and when required
278 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
279 if(WITH_SANITIZE_ADDRESS)
280 if (DEFINED CMAKE_REQUIRED_FLAGS)
281 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
283 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
284 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
285 if(fsanitize-address)
286 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
288 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
289 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
291 unset(CMAKE_REQUIRED_FLAGS)
294 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
295 if(fno-omit-frame-pointer)
296 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
298 elseif(WITH_SANITIZE_LEAK)
299 if (DEFINED CMAKE_REQUIRED_FLAGS)
300 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
302 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
303 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
305 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
307 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
308 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
310 unset(CMAKE_REQUIRED_FLAGS)
313 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
314 if(fno-omit-frame-pointer)
315 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
319 if (WITH_NO_UNDEFINED)
320 if (DEFINED CMAKE_REQUIRED_FLAGS)
321 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
323 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
324 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
325 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
326 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
327 unset(SAVE_CMAKE_REQUIRED_FLAGS)
329 unset(CMAKE_REQUIRED_FLAGS)
332 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
338 # Remove previous warning definitions,
339 # NMake is otherwise complaining.
340 foreach (flags_var_to_scrub
343 CMAKE_CXX_FLAGS_RELEASE
344 CMAKE_CXX_FLAGS_RELWITHDEBINFO
345 CMAKE_CXX_FLAGS_MINSIZEREL
346 CMAKE_C_FLAGS_RELEASE
347 CMAKE_C_FLAGS_RELWITHDEBINFO
348 CMAKE_C_FLAGS_MINSIZEREL)
349 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
350 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
353 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
354 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
356 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
357 add_definitions(-D_AMD64_)
359 add_definitions(-D_X86_)
362 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
363 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
365 if(CMAKE_BUILD_TYPE STREQUAL "Release")
367 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
368 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
374 add_definitions(-DUNICODE -D_UNICODE)
375 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
376 add_definitions(-DWIN32_LEAN_AND_MEAN)
377 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
379 set(CMAKE_USE_RELATIVE_PATH ON)
380 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
381 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
382 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
383 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
385 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
388 # Set product and vendor for dll and exe version information.
389 set(RC_VERSION_VENDOR ${VENDOR})
390 set(RC_VERSION_PRODUCT ${PRODUCT})
391 set(RC_VERSION_PATCH ${BUILD_NUMBER})
392 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
394 string(TIMESTAMP RC_VERSION_YEAR "%Y")
396 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
397 set(CMAKE_WINDOWS_VERSION "WINXP")
400 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
401 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
402 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
403 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
404 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
405 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
406 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
407 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
410 if (FREERDP_EXTERNAL_SSL_PATH)
411 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
416 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
419 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
423 check_include_files(fcntl.h HAVE_FCNTL_H)
424 check_include_files(unistd.h HAVE_UNISTD_H)
425 check_include_files(execinfo.h HAVE_EXECINFO_H)
426 check_include_files(inttypes.h HAVE_INTTYPES_H)
427 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
428 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
429 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
430 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
431 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
432 check_include_files(syslog.h HAVE_SYSLOG_H)
436 set(HAVE_INTTYPES_H 1)
437 set(HAVE_SYS_FILIO_H 1)
441 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
443 set(HAVE_TM_GMTOFF 1)
449 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
450 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
452 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
453 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
455 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
456 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
459 if(IS_DIRECTORY /opt/local/include)
460 include_directories(/opt/local/include)
461 link_directories(/opt/local/lib)
465 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
466 # Workaround: specify the parameter in the command-line
468 # set(CMAKE_C_COMPILER "clang")
472 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
473 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
479 set(WITH_MANPAGES "ON")
481 set(WITH_PULSE "OFF")
483 set(WITH_WAYLAND "OFF")
488 set(WITH_LIBRARY_VERSIONING "OFF")
490 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
492 if (${ANDROID_ABI} STREQUAL "armeabi")
496 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
497 add_definitions(-DNDK_DEBUG=1)
499 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
500 # which is not supported by the gdbserver binary shipped with
501 # the android NDK (tested with r9b)
502 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
504 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
506 if (NOT FREERDP_EXTERNAL_PATH)
507 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
508 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
510 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
514 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
515 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
516 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
517 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
520 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
521 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
525 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
528 find_package(Threads REQUIRED)
532 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
533 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
534 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
535 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
536 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
537 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
538 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
540 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
541 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
542 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
545 if(WITH_VALGRIND_MEMCHECK)
546 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
548 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
552 check_include_files(sys/eventfd.h HAVE_AIO_H)
553 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
555 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
557 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
558 check_include_files(poll.h HAVE_POLL_H)
559 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
560 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
561 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
562 set(X11_FEATURE_TYPE "RECOMMENDED")
563 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
565 set(X11_FEATURE_TYPE "DISABLED")
566 set(WAYLAND_FEATURE_TYPE "DISABLED")
570 find_package(PCSCWinPR)
573 set(X11_FEATURE_PURPOSE "X11")
574 set(X11_FEATURE_DESCRIPTION "X11 client and server")
576 set(WAYLAND_FEATURE_PURPOSE "Wayland")
577 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
579 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
580 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
581 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
583 set(ZLIB_FEATURE_TYPE "REQUIRED")
584 set(ZLIB_FEATURE_PURPOSE "compression")
585 set(ZLIB_FEATURE_DESCRIPTION "data compression")
587 set(OPENSSL_FEATURE_TYPE "REQUIRED")
588 set(OPENSSL_FEATURE_PURPOSE "cryptography")
589 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
591 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
592 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
593 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
595 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
596 set(OPENSLES_FEATURE_PURPOSE "multimedia")
597 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
599 set(OSS_FEATURE_TYPE "RECOMMENDED")
600 set(OSS_FEATURE_PURPOSE "sound")
601 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
603 set(ALSA_FEATURE_TYPE "RECOMMENDED")
604 set(ALSA_FEATURE_PURPOSE "sound")
605 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
607 set(PULSE_FEATURE_TYPE "OPTIONAL")
608 set(PULSE_FEATURE_PURPOSE "sound")
609 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
611 set(CUPS_FEATURE_TYPE "OPTIONAL")
612 set(CUPS_FEATURE_PURPOSE "printing")
613 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
615 set(PCSC_FEATURE_TYPE "OPTIONAL")
616 set(PCSC_FEATURE_PURPOSE "smart card")
617 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
619 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
620 set(FFMPEG_FEATURE_PURPOSE "multimedia")
621 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
623 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
624 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
625 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
627 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
628 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
629 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
631 set(IPP_FEATURE_TYPE "OPTIONAL")
632 set(IPP_FEATURE_PURPOSE "performance")
633 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
635 set(JPEG_FEATURE_TYPE "OPTIONAL")
636 set(JPEG_FEATURE_PURPOSE "codec")
637 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
639 set(X264_FEATURE_TYPE "OPTIONAL")
640 set(X264_FEATURE_PURPOSE "codec")
641 set(X264_FEATURE_DESCRIPTION "use x264 library")
643 set(OPENH264_FEATURE_TYPE "OPTIONAL")
644 set(OPENH264_FEATURE_PURPOSE "codec")
645 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
647 set(GSM_FEATURE_TYPE "OPTIONAL")
648 set(GSM_FEATURE_PURPOSE "codec")
649 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
652 set(X11_FEATURE_TYPE "DISABLED")
653 set(WAYLAND_FEATURE_TYPE "DISABLED")
654 set(ZLIB_FEATURE_TYPE "DISABLED")
655 set(DIRECTFB_FEATURE_TYPE "DISABLED")
656 set(OSS_FEATURE_TYPE "DISABLED")
657 set(ALSA_FEATURE_TYPE "DISABLED")
658 set(PULSE_FEATURE_TYPE "DISABLED")
659 set(CUPS_FEATURE_TYPE "DISABLED")
660 set(PCSC_FEATURE_TYPE "DISABLED")
661 set(FFMPEG_FEATURE_TYPE "DISABLED")
662 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
663 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
664 set(OPENSLES_FEATURE_TYPE "DISABLED")
668 set(DIRECTFB_FEATURE_TYPE "DISABLED")
669 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
670 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
671 set(X11_FEATURE_TYPE "OPTIONAL")
672 set(WAYLAND_FEATURE_TYPE "DISABLED")
673 set(OSS_FEATURE_TYPE "DISABLED")
674 set(ALSA_FEATURE_TYPE "DISABLED")
676 set(X11_FEATURE_TYPE "DISABLED")
677 set(PULSE_FEATURE_TYPE "DISABLED")
678 set(CUPS_FEATURE_TYPE "DISABLED")
679 set(PCSC_FEATURE_TYPE "DISABLED")
680 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
681 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
683 set(OPENSLES_FEATURE_TYPE "DISABLED")
686 if(UNIX AND NOT ANDROID)
687 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
688 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
689 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
691 #include(Findlibsystemd)
692 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
695 set(HAVE_JOURNALD_H TRUE)
697 unset(HAVE_JOURNALD_H)
699 endif(UNIX AND NOT ANDROID)
702 set(X11_FEATURE_TYPE "DISABLED")
703 set(WAYLAND_FEATURE_TYPE "DISABLED")
704 set(DIRECTFB_FEATURE_TYPE "DISABLED")
705 set(OSS_FEATURE_TYPE "DISABLED")
706 set(ALSA_FEATURE_TYPE "DISABLED")
707 set(PULSE_FEATURE_TYPE "DISABLED")
708 set(CUPS_FEATURE_TYPE "DISABLED")
709 set(PCSC_FEATURE_TYPE "DISABLED")
710 set(FFMPEG_FEATURE_TYPE "DISABLED")
711 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
712 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
713 set(OPENSLES_FEATURE_TYPE "REQUIRED")
716 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
717 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
718 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
719 if (${WITH_DIRECTFB})
720 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
723 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
724 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
725 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
726 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
728 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
729 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
730 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
732 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
733 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
735 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
737 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
738 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
740 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
741 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
742 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
743 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
745 if(TARGET_ARCH MATCHES "x86|x64")
747 # Intel Performance Primitives
748 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
753 add_definitions("-DWITH_OPENSSL")
757 add_definitions("-DWITH_MBEDTLS")
760 if (TARGET_ARCH MATCHES "sparc")
761 set(HAVE_ALIGNED_REQUIRED 1)
764 # Path to put FreeRDP data
765 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
767 # Path to put plugins
769 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
771 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
772 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
774 # Path to put extensions
775 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
777 # Include directories
778 include_directories(${CMAKE_CURRENT_BINARY_DIR})
779 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
780 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
783 add_definitions("-DHAVE_CONFIG_H")
784 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
786 # RPATH configuration
788 set(CMAKE_SKIP_RPATH FALSE)
789 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
791 set(CMAKE_SKIP_BUILD_RPATH FALSE)
792 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
793 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
794 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
799 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
800 set(PROFILER_LIBRARIES
801 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
802 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
814 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
816 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
821 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
822 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
824 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
825 set(PUBLIC_KEYWORD "")
826 set(PRIVATE_KEYWORD "")
828 set(PUBLIC_KEYWORD "PUBLIC")
829 set(PRIVATE_KEYWORD "PRIVATE")
832 add_subdirectory(winpr)
837 add_subdirectory(third-party)
838 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
839 include_directories(${THIRD_PARTY_INCLUDES})
843 add_subdirectory(include)
845 add_subdirectory(libfreerdp)
848 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
849 if (IOS_PLATFORM MATCHES "SIMULATOR")
850 set(CMAKE_OSX_SYSROOT "iphonesimulator")
852 set(CMAKE_OSX_SYSROOT "iphoneos")
857 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
858 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
860 add_subdirectory(rdtk)
863 add_subdirectory(uwac)
867 if(IS_DIRECTORY /usr/local/include)
868 include_directories(/usr/local/include)
869 link_directories(/usr/local/lib)
872 if(IS_DIRECTORY /usr/X11R6/include)
873 include_directories(/usr/X11R6/include)
879 add_subdirectory(channels)
882 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
883 add_subdirectory(client)
887 add_subdirectory(server)
892 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
894 if(NOT (VENDOR MATCHES "FreeRDP"))
895 if(DEFINED CLIENT_VENDOR_PATH)
896 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
897 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
902 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
904 include(${CMAKE_CPACK_INCLUDE_FILE})
906 set(FREERDP_BUILD_CONFIG_LIST "")
907 GET_CMAKE_PROPERTY(res VARIABLES)
909 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
910 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
913 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
914 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)