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 endif(EXPORT_ALL_SYMBOLS)
148 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
150 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
153 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
158 # Configure MSVC Runtime
161 if(NOT DEFINED MSVC_RUNTIME)
162 set(MSVC_RUNTIME "dynamic")
164 if(MSVC_RUNTIME STREQUAL "static")
165 if(BUILD_SHARED_LIBS)
166 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
168 message(STATUS "Use the MSVC static runtime option carefully!")
169 message(STATUS "OpenSSL uses /MD by default, and is very picky")
170 message(STATUS "Random freeing errors are a common sign of runtime issues")
172 configure_msvc_runtime()
174 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
175 set(CMAKE_SUPPRESS_REGENERATION ON)
179 # Compiler-specific flags
180 if(CMAKE_COMPILER_IS_GNUCC)
181 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
182 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
184 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
186 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
189 if(CMAKE_POSITION_INDEPENDENT_CODE)
190 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
191 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
196 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
198 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
199 if(Wno-unused-result)
200 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
202 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
203 if(Wno-unused-but-set-variable)
204 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
206 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
207 if(Wno-deprecated-declarations)
208 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
210 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
211 if(Wno-deprecated-declarationsCXX)
212 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
215 if(NOT EXPORT_ALL_SYMBOLS)
216 message(STATUS "GCC default symbol visibility: hidden")
217 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
220 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
222 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
225 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
226 if(Wimplicit-function-declaration)
227 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
231 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
233 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
236 if(CMAKE_BUILD_TYPE STREQUAL "Release")
237 add_definitions(-DNDEBUG)
239 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
240 if(Wno-builtin-macro-redefined)
241 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
242 add_definitions(-D__FILE__="\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"")
245 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
246 if(Wno-builtin-macro-redefinedCXX)
247 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
248 add_definitions(-D__FILE__="\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"")
251 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
252 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
255 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
259 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
260 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
261 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
262 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
264 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
266 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
267 if(Wno-deprecated-declarations)
268 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
270 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
271 if(Wno-deprecated-declarationsCXX)
272 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
276 # Enable address sanitizer, where supported and when required
277 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
278 if(WITH_SANITIZE_ADDRESS)
279 if (DEFINED CMAKE_REQUIRED_FLAGS)
280 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
282 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
283 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
284 if(fsanitize-address)
285 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
287 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
288 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
290 unset(CMAKE_REQUIRED_FLAGS)
293 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
294 if(fno-omit-frame-pointer)
295 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
298 if (WITH_NO_UNDEFINED)
299 if (DEFINED CMAKE_REQUIRED_FLAGS)
300 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
302 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
303 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
304 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
305 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
306 unset(SAVE_CMAKE_REQUIRED_FLAGS)
308 unset(CMAKE_REQUIRED_FLAGS)
311 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
317 # Remove previous warning definitions,
318 # NMake is otherwise complaining.
319 foreach (flags_var_to_scrub
322 CMAKE_CXX_FLAGS_RELEASE
323 CMAKE_CXX_FLAGS_RELWITHDEBINFO
324 CMAKE_CXX_FLAGS_MINSIZEREL
325 CMAKE_C_FLAGS_RELEASE
326 CMAKE_C_FLAGS_RELWITHDEBINFO
327 CMAKE_C_FLAGS_MINSIZEREL)
328 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
329 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
332 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
333 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
335 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
336 add_definitions(-D_AMD64_)
338 add_definitions(-D_X86_)
341 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
342 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
344 if(CMAKE_BUILD_TYPE STREQUAL "Release")
346 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
347 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
353 add_definitions(-DUNICODE -D_UNICODE)
354 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
355 add_definitions(-DWIN32_LEAN_AND_MEAN)
356 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
358 set(CMAKE_USE_RELATIVE_PATH ON)
359 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
360 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
361 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
362 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
364 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
367 # Set product and vendor for dll and exe version information.
368 set(RC_VERSION_VENDOR ${VENDOR})
369 set(RC_VERSION_PRODUCT ${PRODUCT})
370 set(RC_VERSION_PATCH ${BUILD_NUMBER})
371 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
373 string(TIMESTAMP RC_VERSION_YEAR "%Y")
375 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
376 set(CMAKE_WINDOWS_VERSION "WINXP")
379 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
380 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
381 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
382 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
383 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
384 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
385 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
386 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
389 if (FREERDP_EXTERNAL_SSL_PATH)
390 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
395 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
398 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
402 check_include_files(fcntl.h HAVE_FCNTL_H)
403 check_include_files(unistd.h HAVE_UNISTD_H)
404 check_include_files(execinfo.h HAVE_EXECINFO_H)
405 check_include_files(inttypes.h HAVE_INTTYPES_H)
406 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
407 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
408 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
409 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
410 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
411 check_include_files(syslog.h HAVE_SYSLOG_H)
415 set(HAVE_INTTYPES_H 1)
416 set(HAVE_SYS_FILIO_H 1)
420 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
422 set(HAVE_TM_GMTOFF 1)
428 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
429 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
431 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
432 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
434 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
435 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
438 if(IS_DIRECTORY /opt/local/include)
439 include_directories(/opt/local/include)
440 link_directories(/opt/local/lib)
444 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
445 # Workaround: specify the parameter in the command-line
447 # set(CMAKE_C_COMPILER "clang")
451 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
452 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
458 set(WITH_MANPAGES "ON")
460 set(WITH_PULSE "OFF")
462 set(WITH_WAYLAND "OFF")
467 set(WITH_LIBRARY_VERSIONING "OFF")
469 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
471 if (${ANDROID_ABI} STREQUAL "armeabi")
475 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
476 add_definitions(-DNDK_DEBUG=1)
478 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
479 # which is not supported by the gdbserver binary shipped with
480 # the android NDK (tested with r9b)
481 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
483 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
485 if (NOT FREERDP_EXTERNAL_PATH)
486 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
487 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
489 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
493 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
494 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
495 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
496 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
499 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
500 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
504 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
507 find_package(Threads REQUIRED)
511 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
512 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
513 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
514 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
515 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
516 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
517 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
519 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
520 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
521 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
524 if(WITH_VALGRIND_MEMCHECK)
525 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
527 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
531 check_include_files(sys/eventfd.h HAVE_AIO_H)
532 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
534 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
536 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
537 check_include_files(poll.h HAVE_POLL_H)
538 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
539 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
540 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
541 set(X11_FEATURE_TYPE "RECOMMENDED")
542 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
544 set(X11_FEATURE_TYPE "DISABLED")
545 set(WAYLAND_FEATURE_TYPE "DISABLED")
549 find_package(PCSCWinPR)
552 set(X11_FEATURE_PURPOSE "X11")
553 set(X11_FEATURE_DESCRIPTION "X11 client and server")
555 set(WAYLAND_FEATURE_PURPOSE "Wayland")
556 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
558 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
559 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
560 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
562 set(ZLIB_FEATURE_TYPE "REQUIRED")
563 set(ZLIB_FEATURE_PURPOSE "compression")
564 set(ZLIB_FEATURE_DESCRIPTION "data compression")
566 set(OPENSSL_FEATURE_TYPE "REQUIRED")
567 set(OPENSSL_FEATURE_PURPOSE "cryptography")
568 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
570 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
571 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
572 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
574 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
575 set(OPENSLES_FEATURE_PURPOSE "multimedia")
576 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
578 set(OSS_FEATURE_TYPE "RECOMMENDED")
579 set(OSS_FEATURE_PURPOSE "sound")
580 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
582 set(ALSA_FEATURE_TYPE "RECOMMENDED")
583 set(ALSA_FEATURE_PURPOSE "sound")
584 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
586 set(PULSE_FEATURE_TYPE "OPTIONAL")
587 set(PULSE_FEATURE_PURPOSE "sound")
588 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
590 set(CUPS_FEATURE_TYPE "OPTIONAL")
591 set(CUPS_FEATURE_PURPOSE "printing")
592 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
594 set(PCSC_FEATURE_TYPE "OPTIONAL")
595 set(PCSC_FEATURE_PURPOSE "smart card")
596 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
598 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
599 set(FFMPEG_FEATURE_PURPOSE "multimedia")
600 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
602 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
603 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
604 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
606 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
607 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
608 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
610 set(IPP_FEATURE_TYPE "OPTIONAL")
611 set(IPP_FEATURE_PURPOSE "performance")
612 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
614 set(JPEG_FEATURE_TYPE "OPTIONAL")
615 set(JPEG_FEATURE_PURPOSE "codec")
616 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
618 set(X264_FEATURE_TYPE "OPTIONAL")
619 set(X264_FEATURE_PURPOSE "codec")
620 set(X264_FEATURE_DESCRIPTION "use x264 library")
622 set(OPENH264_FEATURE_TYPE "OPTIONAL")
623 set(OPENH264_FEATURE_PURPOSE "codec")
624 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
626 set(GSM_FEATURE_TYPE "OPTIONAL")
627 set(GSM_FEATURE_PURPOSE "codec")
628 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
631 set(X11_FEATURE_TYPE "DISABLED")
632 set(WAYLAND_FEATURE_TYPE "DISABLED")
633 set(ZLIB_FEATURE_TYPE "DISABLED")
634 set(DIRECTFB_FEATURE_TYPE "DISABLED")
635 set(OSS_FEATURE_TYPE "DISABLED")
636 set(ALSA_FEATURE_TYPE "DISABLED")
637 set(PULSE_FEATURE_TYPE "DISABLED")
638 set(CUPS_FEATURE_TYPE "DISABLED")
639 set(PCSC_FEATURE_TYPE "DISABLED")
640 set(FFMPEG_FEATURE_TYPE "DISABLED")
641 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
642 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
643 set(OPENSLES_FEATURE_TYPE "DISABLED")
647 set(DIRECTFB_FEATURE_TYPE "DISABLED")
648 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
649 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
650 set(X11_FEATURE_TYPE "OPTIONAL")
651 set(WAYLAND_FEATURE_TYPE "DISABLED")
652 set(OSS_FEATURE_TYPE "DISABLED")
653 set(ALSA_FEATURE_TYPE "DISABLED")
655 set(X11_FEATURE_TYPE "DISABLED")
656 set(PULSE_FEATURE_TYPE "DISABLED")
657 set(CUPS_FEATURE_TYPE "DISABLED")
658 set(PCSC_FEATURE_TYPE "DISABLED")
659 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
660 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
662 set(OPENSLES_FEATURE_TYPE "DISABLED")
665 if(UNIX AND NOT ANDROID)
666 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
667 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
668 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
670 #include(Findlibsystemd)
671 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
674 set(HAVE_JOURNALD_H TRUE)
676 unset(HAVE_JOURNALD_H)
678 endif(UNIX AND NOT ANDROID)
681 set(X11_FEATURE_TYPE "DISABLED")
682 set(WAYLAND_FEATURE_TYPE "DISABLED")
683 set(DIRECTFB_FEATURE_TYPE "DISABLED")
684 set(OSS_FEATURE_TYPE "DISABLED")
685 set(ALSA_FEATURE_TYPE "DISABLED")
686 set(PULSE_FEATURE_TYPE "DISABLED")
687 set(CUPS_FEATURE_TYPE "DISABLED")
688 set(PCSC_FEATURE_TYPE "DISABLED")
689 set(FFMPEG_FEATURE_TYPE "DISABLED")
690 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
691 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
692 set(OPENSLES_FEATURE_TYPE "REQUIRED")
695 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
696 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
697 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
698 if (${WITH_DIRECTFB})
699 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
702 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
703 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
704 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
705 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
707 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
708 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
709 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
711 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
712 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
714 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
716 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
717 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
719 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
720 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
721 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
722 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
724 if(TARGET_ARCH MATCHES "x86|x64")
726 # Intel Performance Primitives
727 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
732 add_definitions("-DWITH_OPENSSL")
736 add_definitions("-DWITH_MBEDTLS")
739 if (TARGET_ARCH MATCHES "sparc")
740 set(HAVE_ALIGNED_REQUIRED 1)
743 # Path to put FreeRDP data
744 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
746 # Path to put plugins
748 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
750 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
751 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
753 # Path to put extensions
754 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
756 # Include directories
757 include_directories(${CMAKE_CURRENT_BINARY_DIR})
758 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
759 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
762 add_definitions("-DHAVE_CONFIG_H")
763 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
765 # RPATH configuration
767 set(CMAKE_SKIP_RPATH FALSE)
768 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
770 set(CMAKE_SKIP_BUILD_RPATH FALSE)
771 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
772 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
773 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
778 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
779 set(PROFILER_LIBRARIES
780 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
781 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
790 add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
795 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
797 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
802 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
803 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
805 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
806 set(PUBLIC_KEYWORD "")
807 set(PRIVATE_KEYWORD "")
809 set(PUBLIC_KEYWORD "PUBLIC")
810 set(PRIVATE_KEYWORD "PRIVATE")
813 add_subdirectory(winpr)
818 add_subdirectory(third-party)
819 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
820 include_directories(${THIRD_PARTY_INCLUDES})
824 add_subdirectory(include)
826 add_subdirectory(libfreerdp)
829 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
830 if (IOS_PLATFORM MATCHES "SIMULATOR")
831 set(CMAKE_OSX_SYSROOT "iphonesimulator")
833 set(CMAKE_OSX_SYSROOT "iphoneos")
838 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
839 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
841 add_subdirectory(rdtk)
844 add_subdirectory(uwac)
848 if(IS_DIRECTORY /usr/local/include)
849 include_directories(/usr/local/include)
850 link_directories(/usr/local/lib)
853 if(IS_DIRECTORY /usr/X11R6/include)
854 include_directories(/usr/X11R6/include)
860 add_subdirectory(channels)
863 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
864 add_subdirectory(client)
868 add_subdirectory(server)
873 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
875 if(NOT (VENDOR MATCHES "FreeRDP"))
876 if(DEFINED CLIENT_VENDOR_PATH)
877 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
878 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
883 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
885 include(${CMAKE_CPACK_INCLUDE_FILE})
887 set(FREERDP_BUILD_CONFIG_LIST "")
888 GET_CMAKE_PROPERTY(res VARIABLES)
890 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
891 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
894 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
895 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)