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)
70 include(InstallFreeRDPMan)
74 if ($ENV{BUILD_NUMBER})
75 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
77 set(WITH_LIBRARY_VERSIONING "ON")
78 set(FREERDP_VERSION_MAJOR "2")
79 set(FREERDP_VERSION_MINOR "0")
80 set(FREERDP_VERSION_REVISION "0")
81 set(FREERDP_VERSION_SUFFIX "dev")
82 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
83 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
84 if (FREERDP_VERSION_SUFFIX)
85 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
87 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
89 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
91 # Compatibility options
92 if(DEFINED STATIC_CHANNELS)
93 message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
94 set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
98 if (CMAKE_INSTALL_PREFIX)
99 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
101 if (FREERDP_EXTERNAL_PATH)
102 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
105 # Allow to search the host machine for git
106 if(CMAKE_CROSSCOMPILING)
107 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
108 endif(CMAKE_CROSSCOMPILING)
110 include(GetGitRevisionDescription)
111 git_get_exact_tag(GIT_REVISION --tags --always)
113 if (${GIT_REVISION} STREQUAL "n/a")
114 git_rev_parse (GIT_REVISION --short)
116 if(CMAKE_CROSSCOMPILING)
117 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
118 endif(CMAKE_CROSSCOMPILING)
120 message(STATUS "Git Revision ${GIT_REVISION}")
122 # Turn on solution folders (2.8.4+)
123 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
125 # Default to release build type
126 if(NOT CMAKE_BUILD_TYPE)
127 set(CMAKE_BUILD_TYPE "Release")
130 if(NOT DEFINED BUILD_SHARED_LIBS)
132 set(BUILD_SHARED_LIBS OFF)
134 set(BUILD_SHARED_LIBS ON)
139 set(EXPORT_ALL_SYMBOLS TRUE)
140 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
141 set(EXPORT_ALL_SYMBOLS FALSE)
144 if (EXPORT_ALL_SYMBOLS)
145 # set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
146 add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
147 endif(EXPORT_ALL_SYMBOLS)
150 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
152 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
155 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
160 # Configure MSVC Runtime
163 if(NOT DEFINED MSVC_RUNTIME)
164 set(MSVC_RUNTIME "dynamic")
166 if(MSVC_RUNTIME STREQUAL "static")
167 if(BUILD_SHARED_LIBS)
168 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
170 message(STATUS "Use the MSVC static runtime option carefully!")
171 message(STATUS "OpenSSL uses /MD by default, and is very picky")
172 message(STATUS "Random freeing errors are a common sign of runtime issues")
174 configure_msvc_runtime()
176 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
177 set(CMAKE_SUPPRESS_REGENERATION ON)
181 # Compiler-specific flags
182 if(CMAKE_COMPILER_IS_GNUCC)
183 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
184 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
186 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
188 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
191 if(CMAKE_POSITION_INDEPENDENT_CODE)
192 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
193 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
198 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
200 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
201 if(Wno-unused-result)
202 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
204 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
205 if(Wno-unused-but-set-variable)
206 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
208 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
209 if(Wno-deprecated-declarations)
210 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
212 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
213 if(Wno-deprecated-declarationsCXX)
214 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
217 if(NOT EXPORT_ALL_SYMBOLS)
218 message(STATUS "GCC default symbol visibility: hidden")
219 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
222 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
224 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
227 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
228 if(Wimplicit-function-declaration)
229 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
233 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
235 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
238 if(CMAKE_BUILD_TYPE STREQUAL "Release")
239 add_definitions(-DNDEBUG)
241 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
242 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
245 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
249 # When building with Unix Makefiles and doing any release builds
250 # try to set __FILE__ to relative paths via a make specific macro
251 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
252 if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
253 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
254 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
255 if(Wno-builtin-macro-redefined)
256 set(CMAKE_C_FLAGS_${UPPER_BUILD_TYPE} "${CMAKE_C_FLAGS_${UPPER_BUILD_TYPE}} -Wno-builtin-macro-redefined -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
259 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
260 if(Wno-builtin-macro-redefinedCXX)
261 set(CMAKE_CXX_FLAGS_${UPPER_BUILD_TYPE} "${CMAKE_CXX_FLAGS_${UPPER_BUILD_TYPE}} -Wno-builtin-macro-redefined -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
266 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
267 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
268 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
269 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
271 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
273 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
274 if(Wno-deprecated-declarations)
275 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
277 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
278 if(Wno-deprecated-declarationsCXX)
279 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
283 # Enable address sanitizer, where supported and when required
284 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
285 if(WITH_SANITIZE_ADDRESS)
286 if (DEFINED CMAKE_REQUIRED_FLAGS)
287 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
289 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
290 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
291 if(fsanitize-address)
292 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
294 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
295 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
297 unset(CMAKE_REQUIRED_FLAGS)
300 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
301 if(fno-omit-frame-pointer)
302 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
304 elseif(WITH_SANITIZE_LEAK)
305 if (DEFINED CMAKE_REQUIRED_FLAGS)
306 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
308 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
309 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
311 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
313 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
314 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
316 unset(CMAKE_REQUIRED_FLAGS)
319 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
320 if(fno-omit-frame-pointer)
321 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
325 if (WITH_NO_UNDEFINED)
326 if (DEFINED CMAKE_REQUIRED_FLAGS)
327 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
329 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
330 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
331 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
332 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
333 unset(SAVE_CMAKE_REQUIRED_FLAGS)
335 unset(CMAKE_REQUIRED_FLAGS)
338 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
344 # Remove previous warning definitions,
345 # NMake is otherwise complaining.
346 foreach (flags_var_to_scrub
349 CMAKE_CXX_FLAGS_RELEASE
350 CMAKE_CXX_FLAGS_RELWITHDEBINFO
351 CMAKE_CXX_FLAGS_MINSIZEREL
352 CMAKE_C_FLAGS_RELEASE
353 CMAKE_C_FLAGS_RELWITHDEBINFO
354 CMAKE_C_FLAGS_MINSIZEREL)
355 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
356 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
359 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
360 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
362 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
363 add_definitions(-D_AMD64_)
365 add_definitions(-D_X86_)
368 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
369 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
371 if(CMAKE_BUILD_TYPE STREQUAL "Release")
373 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
374 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
380 add_definitions(-DUNICODE -D_UNICODE)
381 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
382 add_definitions(-DWIN32_LEAN_AND_MEAN)
383 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
385 set(CMAKE_USE_RELATIVE_PATH ON)
386 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
387 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
388 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
389 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
391 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
394 # Set product and vendor for dll and exe version information.
395 set(RC_VERSION_VENDOR ${VENDOR})
396 set(RC_VERSION_PRODUCT ${PRODUCT})
397 set(RC_VERSION_PATCH ${BUILD_NUMBER})
398 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
400 string(TIMESTAMP RC_VERSION_YEAR "%Y")
402 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
403 set(CMAKE_WINDOWS_VERSION "WINXP")
406 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
407 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
408 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
409 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
410 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
411 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
412 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
413 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
416 if (FREERDP_EXTERNAL_SSL_PATH)
417 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
422 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
425 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
429 check_include_files(fcntl.h HAVE_FCNTL_H)
430 check_include_files(unistd.h HAVE_UNISTD_H)
431 check_include_files(execinfo.h HAVE_EXECINFO_H)
432 check_include_files(inttypes.h HAVE_INTTYPES_H)
433 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
434 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
435 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
436 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
437 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
438 check_include_files(syslog.h HAVE_SYSLOG_H)
442 set(HAVE_INTTYPES_H 1)
443 set(HAVE_SYS_FILIO_H 1)
447 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
449 set(HAVE_TM_GMTOFF 1)
455 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
456 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
458 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
459 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
461 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
462 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
465 if(IS_DIRECTORY /opt/local/include)
466 include_directories(/opt/local/include)
467 link_directories(/opt/local/lib)
471 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
472 # Workaround: specify the parameter in the command-line
474 # set(CMAKE_C_COMPILER "clang")
478 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
479 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
485 set(WITH_MANPAGES "ON")
487 set(WITH_PULSE "OFF")
489 set(WITH_WAYLAND "OFF")
494 set(WITH_LIBRARY_VERSIONING "OFF")
496 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
498 if (${ANDROID_ABI} STREQUAL "armeabi")
502 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
503 add_definitions(-DNDK_DEBUG=1)
505 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
506 # which is not supported by the gdbserver binary shipped with
507 # the android NDK (tested with r9b)
508 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
510 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
512 if (NOT FREERDP_EXTERNAL_PATH)
513 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
514 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
516 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
520 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
521 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
522 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
523 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
526 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
527 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
531 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
534 find_package(Threads REQUIRED)
538 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
539 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
540 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
541 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
542 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
543 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
544 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
546 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
547 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
548 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
551 if(WITH_VALGRIND_MEMCHECK)
552 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
554 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
558 check_include_files(sys/eventfd.h HAVE_AIO_H)
559 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
561 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
563 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
564 check_include_files(poll.h HAVE_POLL_H)
565 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
566 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
567 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
568 set(X11_FEATURE_TYPE "RECOMMENDED")
569 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
571 set(X11_FEATURE_TYPE "DISABLED")
572 set(WAYLAND_FEATURE_TYPE "DISABLED")
576 find_package(PCSCWinPR)
579 set(X11_FEATURE_PURPOSE "X11")
580 set(X11_FEATURE_DESCRIPTION "X11 client and server")
582 set(WAYLAND_FEATURE_PURPOSE "Wayland")
583 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
585 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
586 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
587 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
589 set(ZLIB_FEATURE_TYPE "REQUIRED")
590 set(ZLIB_FEATURE_PURPOSE "compression")
591 set(ZLIB_FEATURE_DESCRIPTION "data compression")
593 set(OPENSSL_FEATURE_TYPE "REQUIRED")
594 set(OPENSSL_FEATURE_PURPOSE "cryptography")
595 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
597 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
598 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
599 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
601 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
602 set(OPENSLES_FEATURE_PURPOSE "multimedia")
603 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
605 set(OSS_FEATURE_TYPE "RECOMMENDED")
606 set(OSS_FEATURE_PURPOSE "sound")
607 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
609 set(ALSA_FEATURE_TYPE "RECOMMENDED")
610 set(ALSA_FEATURE_PURPOSE "sound")
611 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
613 set(PULSE_FEATURE_TYPE "OPTIONAL")
614 set(PULSE_FEATURE_PURPOSE "sound")
615 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
617 set(CUPS_FEATURE_TYPE "OPTIONAL")
618 set(CUPS_FEATURE_PURPOSE "printing")
619 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
621 set(PCSC_FEATURE_TYPE "OPTIONAL")
622 set(PCSC_FEATURE_PURPOSE "smart card")
623 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
625 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
626 set(FFMPEG_FEATURE_PURPOSE "multimedia")
627 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
629 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
630 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
631 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
633 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
634 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
635 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
637 set(IPP_FEATURE_TYPE "OPTIONAL")
638 set(IPP_FEATURE_PURPOSE "performance")
639 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
641 set(JPEG_FEATURE_TYPE "OPTIONAL")
642 set(JPEG_FEATURE_PURPOSE "codec")
643 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
645 set(X264_FEATURE_TYPE "OPTIONAL")
646 set(X264_FEATURE_PURPOSE "codec")
647 set(X264_FEATURE_DESCRIPTION "use x264 library")
649 set(OPENH264_FEATURE_TYPE "OPTIONAL")
650 set(OPENH264_FEATURE_PURPOSE "codec")
651 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
653 set(GSM_FEATURE_TYPE "OPTIONAL")
654 set(GSM_FEATURE_PURPOSE "codec")
655 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
658 set(X11_FEATURE_TYPE "DISABLED")
659 set(WAYLAND_FEATURE_TYPE "DISABLED")
660 set(ZLIB_FEATURE_TYPE "DISABLED")
661 set(DIRECTFB_FEATURE_TYPE "DISABLED")
662 set(OSS_FEATURE_TYPE "DISABLED")
663 set(ALSA_FEATURE_TYPE "DISABLED")
664 set(PULSE_FEATURE_TYPE "DISABLED")
665 set(CUPS_FEATURE_TYPE "DISABLED")
666 set(PCSC_FEATURE_TYPE "DISABLED")
667 set(FFMPEG_FEATURE_TYPE "DISABLED")
668 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
669 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
670 set(OPENSLES_FEATURE_TYPE "DISABLED")
674 set(DIRECTFB_FEATURE_TYPE "DISABLED")
675 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
676 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
677 set(X11_FEATURE_TYPE "OPTIONAL")
678 set(WAYLAND_FEATURE_TYPE "DISABLED")
679 set(OSS_FEATURE_TYPE "DISABLED")
680 set(ALSA_FEATURE_TYPE "DISABLED")
682 set(X11_FEATURE_TYPE "DISABLED")
683 set(PULSE_FEATURE_TYPE "DISABLED")
684 set(CUPS_FEATURE_TYPE "DISABLED")
685 set(PCSC_FEATURE_TYPE "DISABLED")
686 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
687 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
689 set(OPENSLES_FEATURE_TYPE "DISABLED")
692 if(UNIX AND NOT ANDROID)
693 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
694 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
695 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
697 #include(Findlibsystemd)
698 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
701 set(HAVE_JOURNALD_H TRUE)
703 unset(HAVE_JOURNALD_H)
705 endif(UNIX AND NOT ANDROID)
708 set(X11_FEATURE_TYPE "DISABLED")
709 set(WAYLAND_FEATURE_TYPE "DISABLED")
710 set(DIRECTFB_FEATURE_TYPE "DISABLED")
711 set(OSS_FEATURE_TYPE "DISABLED")
712 set(ALSA_FEATURE_TYPE "DISABLED")
713 set(PULSE_FEATURE_TYPE "DISABLED")
714 set(CUPS_FEATURE_TYPE "DISABLED")
715 set(PCSC_FEATURE_TYPE "DISABLED")
716 set(FFMPEG_FEATURE_TYPE "DISABLED")
717 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
718 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
719 set(OPENSLES_FEATURE_TYPE "REQUIRED")
722 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
723 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
724 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
725 if (${WITH_DIRECTFB})
726 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
729 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
730 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
731 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
732 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
734 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
735 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
736 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
738 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
739 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
741 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
743 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
744 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
746 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
747 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
748 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
749 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
751 if(TARGET_ARCH MATCHES "x86|x64")
753 # Intel Performance Primitives
754 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
759 add_definitions("-DWITH_OPENSSL")
760 message(STATUS "Using OpenSSL Version: ${OPENSSL_VERSION}")
764 add_definitions("-DWITH_MBEDTLS")
767 if (TARGET_ARCH MATCHES "sparc")
768 set(HAVE_ALIGNED_REQUIRED 1)
771 # Android expects all libraries to be loadable
774 set(FREERDP_DATA_PATH "share")
775 set(FREERDP_INSTALL_PREFIX ".")
776 set(FREERDP_LIBRARY_PATH ".")
777 set(FREERDP_PLUGIN_PATH ".")
778 set(FREERDP_ADDIN_PATH ".")
780 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
781 set(FREERDP_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
782 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
783 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
784 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
787 # Path to put extensions
788 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
790 # Include directories
791 include_directories(${CMAKE_CURRENT_BINARY_DIR})
792 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
793 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
796 add_definitions("-DHAVE_CONFIG_H")
797 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
799 # RPATH configuration
801 set(CMAKE_SKIP_RPATH FALSE)
802 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
804 set(CMAKE_SKIP_BUILD_RPATH FALSE)
805 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
806 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
807 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
812 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
813 set(PROFILER_LIBRARIES
814 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
815 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
827 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
829 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
834 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
835 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
837 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
838 set(PUBLIC_KEYWORD "")
839 set(PRIVATE_KEYWORD "")
841 set(PUBLIC_KEYWORD "PUBLIC")
842 set(PRIVATE_KEYWORD "PRIVATE")
845 add_subdirectory(winpr)
850 add_subdirectory(third-party)
851 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
852 include_directories(${THIRD_PARTY_INCLUDES})
856 add_subdirectory(include)
858 add_subdirectory(libfreerdp)
861 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
862 if (IOS_PLATFORM MATCHES "SIMULATOR")
863 set(CMAKE_OSX_SYSROOT "iphonesimulator")
865 set(CMAKE_OSX_SYSROOT "iphoneos")
870 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
871 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
873 add_subdirectory(rdtk)
876 add_subdirectory(uwac)
880 if(IS_DIRECTORY /usr/local/include)
881 include_directories(/usr/local/include)
882 link_directories(/usr/local/lib)
885 if(IS_DIRECTORY /usr/X11R6/include)
886 include_directories(/usr/X11R6/include)
892 add_subdirectory(channels)
895 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
896 add_subdirectory(client)
900 add_subdirectory(server)
905 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
907 if(NOT (VENDOR MATCHES "FreeRDP"))
908 if(DEFINED CLIENT_VENDOR_PATH)
909 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
910 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
915 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
917 include(${CMAKE_CPACK_INCLUDE_FILE})
919 set(FREERDP_BUILD_CONFIG_LIST "")
920 GET_CMAKE_PROPERTY(res VARIABLES)
922 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
923 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
926 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
927 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)