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 set(FILE_SUBST "\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"")
239 add_definitions(-DNDEBUG)
241 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
242 if(Wno-builtin-macro-redefined)
243 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
244 add_definitions("-D__FILE__=${FILE_SUBST}")
247 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
248 if(Wno-builtin-macro-redefinedCXX)
249 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
250 add_definitions("-D__FILE__=${FILE_SUBST}")
253 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
254 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
257 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
261 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
262 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
263 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
264 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
266 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
268 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
269 if(Wno-deprecated-declarations)
270 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
272 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
273 if(Wno-deprecated-declarationsCXX)
274 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
278 # Enable address sanitizer, where supported and when required
279 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
280 if(WITH_SANITIZE_ADDRESS)
281 if (DEFINED CMAKE_REQUIRED_FLAGS)
282 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
284 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
285 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
286 if(fsanitize-address)
287 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
289 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
290 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
292 unset(CMAKE_REQUIRED_FLAGS)
295 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
296 if(fno-omit-frame-pointer)
297 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
299 elseif(WITH_SANITIZE_LEAK)
300 if (DEFINED CMAKE_REQUIRED_FLAGS)
301 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
303 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
304 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
306 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
308 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
309 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
311 unset(CMAKE_REQUIRED_FLAGS)
314 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
315 if(fno-omit-frame-pointer)
316 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
320 if (WITH_NO_UNDEFINED)
321 if (DEFINED CMAKE_REQUIRED_FLAGS)
322 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
324 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
325 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
326 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
327 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
328 unset(SAVE_CMAKE_REQUIRED_FLAGS)
330 unset(CMAKE_REQUIRED_FLAGS)
333 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
339 # Remove previous warning definitions,
340 # NMake is otherwise complaining.
341 foreach (flags_var_to_scrub
344 CMAKE_CXX_FLAGS_RELEASE
345 CMAKE_CXX_FLAGS_RELWITHDEBINFO
346 CMAKE_CXX_FLAGS_MINSIZEREL
347 CMAKE_C_FLAGS_RELEASE
348 CMAKE_C_FLAGS_RELWITHDEBINFO
349 CMAKE_C_FLAGS_MINSIZEREL)
350 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
351 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
354 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
355 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
357 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
358 add_definitions(-D_AMD64_)
360 add_definitions(-D_X86_)
363 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
364 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
366 if(CMAKE_BUILD_TYPE STREQUAL "Release")
368 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
369 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
375 add_definitions(-DUNICODE -D_UNICODE)
376 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
377 add_definitions(-DWIN32_LEAN_AND_MEAN)
378 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
380 set(CMAKE_USE_RELATIVE_PATH ON)
381 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
382 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
383 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
384 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
386 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
389 # Set product and vendor for dll and exe version information.
390 set(RC_VERSION_VENDOR ${VENDOR})
391 set(RC_VERSION_PRODUCT ${PRODUCT})
392 set(RC_VERSION_PATCH ${BUILD_NUMBER})
393 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
395 string(TIMESTAMP RC_VERSION_YEAR "%Y")
397 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
398 set(CMAKE_WINDOWS_VERSION "WINXP")
401 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
402 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
403 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
404 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
405 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
406 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
407 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
408 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
411 if (FREERDP_EXTERNAL_SSL_PATH)
412 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
417 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
420 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
424 check_include_files(fcntl.h HAVE_FCNTL_H)
425 check_include_files(unistd.h HAVE_UNISTD_H)
426 check_include_files(execinfo.h HAVE_EXECINFO_H)
427 check_include_files(inttypes.h HAVE_INTTYPES_H)
428 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
429 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
430 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
431 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
432 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
433 check_include_files(syslog.h HAVE_SYSLOG_H)
437 set(HAVE_INTTYPES_H 1)
438 set(HAVE_SYS_FILIO_H 1)
442 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
444 set(HAVE_TM_GMTOFF 1)
450 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
451 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
453 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
454 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
456 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
457 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
460 if(IS_DIRECTORY /opt/local/include)
461 include_directories(/opt/local/include)
462 link_directories(/opt/local/lib)
466 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
467 # Workaround: specify the parameter in the command-line
469 # set(CMAKE_C_COMPILER "clang")
473 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
474 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
480 set(WITH_MANPAGES "ON")
482 set(WITH_PULSE "OFF")
484 set(WITH_WAYLAND "OFF")
489 set(WITH_LIBRARY_VERSIONING "OFF")
491 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
493 if (${ANDROID_ABI} STREQUAL "armeabi")
497 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
498 add_definitions(-DNDK_DEBUG=1)
500 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
501 # which is not supported by the gdbserver binary shipped with
502 # the android NDK (tested with r9b)
503 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
505 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
507 if (NOT FREERDP_EXTERNAL_PATH)
508 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
509 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
511 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
515 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
516 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
517 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
518 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
521 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
522 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
526 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
529 find_package(Threads REQUIRED)
533 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
534 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
535 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
536 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
537 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
538 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
539 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
541 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
542 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
543 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
546 if(WITH_VALGRIND_MEMCHECK)
547 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
549 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
553 check_include_files(sys/eventfd.h HAVE_AIO_H)
554 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
556 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
558 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
559 check_include_files(poll.h HAVE_POLL_H)
560 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
561 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
562 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
563 set(X11_FEATURE_TYPE "RECOMMENDED")
564 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
566 set(X11_FEATURE_TYPE "DISABLED")
567 set(WAYLAND_FEATURE_TYPE "DISABLED")
571 find_package(PCSCWinPR)
574 set(X11_FEATURE_PURPOSE "X11")
575 set(X11_FEATURE_DESCRIPTION "X11 client and server")
577 set(WAYLAND_FEATURE_PURPOSE "Wayland")
578 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
580 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
581 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
582 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
584 set(ZLIB_FEATURE_TYPE "REQUIRED")
585 set(ZLIB_FEATURE_PURPOSE "compression")
586 set(ZLIB_FEATURE_DESCRIPTION "data compression")
588 set(OPENSSL_FEATURE_TYPE "REQUIRED")
589 set(OPENSSL_FEATURE_PURPOSE "cryptography")
590 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
592 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
593 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
594 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
596 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
597 set(OPENSLES_FEATURE_PURPOSE "multimedia")
598 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
600 set(OSS_FEATURE_TYPE "RECOMMENDED")
601 set(OSS_FEATURE_PURPOSE "sound")
602 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
604 set(ALSA_FEATURE_TYPE "RECOMMENDED")
605 set(ALSA_FEATURE_PURPOSE "sound")
606 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
608 set(PULSE_FEATURE_TYPE "OPTIONAL")
609 set(PULSE_FEATURE_PURPOSE "sound")
610 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
612 set(CUPS_FEATURE_TYPE "OPTIONAL")
613 set(CUPS_FEATURE_PURPOSE "printing")
614 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
616 set(PCSC_FEATURE_TYPE "OPTIONAL")
617 set(PCSC_FEATURE_PURPOSE "smart card")
618 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
620 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
621 set(FFMPEG_FEATURE_PURPOSE "multimedia")
622 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
624 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
625 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
626 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
628 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
629 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
630 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
632 set(IPP_FEATURE_TYPE "OPTIONAL")
633 set(IPP_FEATURE_PURPOSE "performance")
634 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
636 set(JPEG_FEATURE_TYPE "OPTIONAL")
637 set(JPEG_FEATURE_PURPOSE "codec")
638 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
640 set(X264_FEATURE_TYPE "OPTIONAL")
641 set(X264_FEATURE_PURPOSE "codec")
642 set(X264_FEATURE_DESCRIPTION "use x264 library")
644 set(OPENH264_FEATURE_TYPE "OPTIONAL")
645 set(OPENH264_FEATURE_PURPOSE "codec")
646 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
648 set(GSM_FEATURE_TYPE "OPTIONAL")
649 set(GSM_FEATURE_PURPOSE "codec")
650 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
653 set(X11_FEATURE_TYPE "DISABLED")
654 set(WAYLAND_FEATURE_TYPE "DISABLED")
655 set(ZLIB_FEATURE_TYPE "DISABLED")
656 set(DIRECTFB_FEATURE_TYPE "DISABLED")
657 set(OSS_FEATURE_TYPE "DISABLED")
658 set(ALSA_FEATURE_TYPE "DISABLED")
659 set(PULSE_FEATURE_TYPE "DISABLED")
660 set(CUPS_FEATURE_TYPE "DISABLED")
661 set(PCSC_FEATURE_TYPE "DISABLED")
662 set(FFMPEG_FEATURE_TYPE "DISABLED")
663 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
664 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
665 set(OPENSLES_FEATURE_TYPE "DISABLED")
669 set(DIRECTFB_FEATURE_TYPE "DISABLED")
670 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
671 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
672 set(X11_FEATURE_TYPE "OPTIONAL")
673 set(WAYLAND_FEATURE_TYPE "DISABLED")
674 set(OSS_FEATURE_TYPE "DISABLED")
675 set(ALSA_FEATURE_TYPE "DISABLED")
677 set(X11_FEATURE_TYPE "DISABLED")
678 set(PULSE_FEATURE_TYPE "DISABLED")
679 set(CUPS_FEATURE_TYPE "DISABLED")
680 set(PCSC_FEATURE_TYPE "DISABLED")
681 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
682 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
684 set(OPENSLES_FEATURE_TYPE "DISABLED")
687 if(UNIX AND NOT ANDROID)
688 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
689 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
690 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
692 #include(Findlibsystemd)
693 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
696 set(HAVE_JOURNALD_H TRUE)
698 unset(HAVE_JOURNALD_H)
700 endif(UNIX AND NOT ANDROID)
703 set(X11_FEATURE_TYPE "DISABLED")
704 set(WAYLAND_FEATURE_TYPE "DISABLED")
705 set(DIRECTFB_FEATURE_TYPE "DISABLED")
706 set(OSS_FEATURE_TYPE "DISABLED")
707 set(ALSA_FEATURE_TYPE "DISABLED")
708 set(PULSE_FEATURE_TYPE "DISABLED")
709 set(CUPS_FEATURE_TYPE "DISABLED")
710 set(PCSC_FEATURE_TYPE "DISABLED")
711 set(FFMPEG_FEATURE_TYPE "DISABLED")
712 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
713 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
714 set(OPENSLES_FEATURE_TYPE "REQUIRED")
717 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
718 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
719 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
720 if (${WITH_DIRECTFB})
721 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
724 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
725 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
726 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
727 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
729 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
730 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
731 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
733 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
734 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
736 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
738 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
739 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
741 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
742 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
743 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
744 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
746 if(TARGET_ARCH MATCHES "x86|x64")
748 # Intel Performance Primitives
749 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
754 add_definitions("-DWITH_OPENSSL")
758 add_definitions("-DWITH_MBEDTLS")
761 if (TARGET_ARCH MATCHES "sparc")
762 set(HAVE_ALIGNED_REQUIRED 1)
765 # Path to put FreeRDP data
766 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
768 # Path to put plugins
770 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
772 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
773 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
775 # Path to put extensions
776 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
778 # Include directories
779 include_directories(${CMAKE_CURRENT_BINARY_DIR})
780 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
781 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
784 add_definitions("-DHAVE_CONFIG_H")
785 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
787 # RPATH configuration
789 set(CMAKE_SKIP_RPATH FALSE)
790 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
792 set(CMAKE_SKIP_BUILD_RPATH FALSE)
793 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
794 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
795 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
800 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
801 set(PROFILER_LIBRARIES
802 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
803 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
815 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
817 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
822 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
823 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
825 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
826 set(PUBLIC_KEYWORD "")
827 set(PRIVATE_KEYWORD "")
829 set(PUBLIC_KEYWORD "PUBLIC")
830 set(PRIVATE_KEYWORD "PRIVATE")
833 add_subdirectory(winpr)
838 add_subdirectory(third-party)
839 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
840 include_directories(${THIRD_PARTY_INCLUDES})
844 add_subdirectory(include)
846 add_subdirectory(libfreerdp)
849 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
850 if (IOS_PLATFORM MATCHES "SIMULATOR")
851 set(CMAKE_OSX_SYSROOT "iphonesimulator")
853 set(CMAKE_OSX_SYSROOT "iphoneos")
858 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
859 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
861 add_subdirectory(rdtk)
864 add_subdirectory(uwac)
868 if(IS_DIRECTORY /usr/local/include)
869 include_directories(/usr/local/include)
870 link_directories(/usr/local/lib)
873 if(IS_DIRECTORY /usr/X11R6/include)
874 include_directories(/usr/X11R6/include)
880 add_subdirectory(channels)
883 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
884 add_subdirectory(client)
888 add_subdirectory(server)
893 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
895 if(NOT (VENDOR MATCHES "FreeRDP"))
896 if(DEFINED CLIENT_VENDOR_PATH)
897 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
898 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
903 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
905 include(${CMAKE_CPACK_INCLUDE_FILE})
907 set(FREERDP_BUILD_CONFIG_LIST "")
908 GET_CMAKE_PROPERTY(res VARIABLES)
910 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
911 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
914 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
915 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)