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)
144 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
146 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
149 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
154 # Configure MSVC Runtime
157 if(NOT DEFINED MSVC_RUNTIME)
158 set(MSVC_RUNTIME "dynamic")
160 if(MSVC_RUNTIME STREQUAL "static")
161 if(BUILD_SHARED_LIBS)
162 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
164 message(STATUS "Use the MSVC static runtime option carefully!")
165 message(STATUS "OpenSSL uses /MD by default, and is very picky")
166 message(STATUS "Random freeing errors are a common sign of runtime issues")
168 configure_msvc_runtime()
170 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
171 set(CMAKE_SUPPRESS_REGENERATION ON)
175 # Compiler-specific flags
176 if(CMAKE_COMPILER_IS_GNUCC)
177 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
178 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
180 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
182 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
185 if(CMAKE_POSITION_INDEPENDENT_CODE)
186 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
187 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
192 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
194 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
195 if(Wno-unused-result)
196 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
198 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
199 if(Wno-unused-but-set-variable)
200 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
202 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
203 if(Wno-deprecated-declarations)
204 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
206 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
207 if(Wno-deprecated-declarationsCXX)
208 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
211 if(NOT EXPORT_ALL_SYMBOLS)
212 message(STATUS "GCC default symbol visibility: hidden")
213 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
216 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
218 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
221 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
222 if(Wimplicit-function-declaration)
223 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
227 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
229 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
232 if(CMAKE_BUILD_TYPE STREQUAL "Release")
233 set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
234 set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG")
236 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
237 if(Wno-builtin-macro-redefined)
238 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
239 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
242 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
243 if(Wno-builtin-macro-redefinedCXX)
244 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-builtin-macro-redefined")
245 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__FILE__='\"$(subst ${CMAKE_BINARY_DIR}/,,$(subst ${CMAKE_SOURCE_DIR}/,,$(abspath $<)))\"'")
248 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
249 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
252 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
256 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
257 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
258 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
259 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
261 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
263 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
264 if(Wno-deprecated-declarations)
265 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
267 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
268 if(Wno-deprecated-declarationsCXX)
269 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
273 # Enable address sanitizer, where supported and when required
274 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
275 if(WITH_SANITIZE_ADDRESS)
276 if (DEFINED CMAKE_REQUIRED_FLAGS)
277 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
279 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
280 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
281 if(fsanitize-address)
282 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
284 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
285 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
287 unset(CMAKE_REQUIRED_FLAGS)
290 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
291 if(fno-omit-frame-pointer)
292 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
295 if (WITH_NO_UNDEFINED)
296 if (DEFINED CMAKE_REQUIRED_FLAGS)
297 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
299 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
300 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
301 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
302 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
303 unset(SAVE_CMAKE_REQUIRED_FLAGS)
305 unset(CMAKE_REQUIRED_FLAGS)
308 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
314 # Remove previous warning definitions,
315 # NMake is otherwise complaining.
316 foreach (flags_var_to_scrub
319 CMAKE_CXX_FLAGS_RELEASE
320 CMAKE_CXX_FLAGS_RELWITHDEBINFO
321 CMAKE_CXX_FLAGS_MINSIZEREL
322 CMAKE_C_FLAGS_RELEASE
323 CMAKE_C_FLAGS_RELWITHDEBINFO
324 CMAKE_C_FLAGS_MINSIZEREL)
325 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
326 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
329 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
330 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
332 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
333 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_AMD64_")
335 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
338 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
339 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
341 if(CMAKE_BUILD_TYPE STREQUAL "Release")
343 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
344 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
350 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUNICODE -D_UNICODE")
351 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
352 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
353 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WINSOCK_DEPRECATED_NO_WARNINGS")
355 set(CMAKE_USE_RELATIVE_PATH ON)
356 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
357 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
358 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
359 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
361 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
364 # Set product and vendor for dll and exe version information.
365 set(RC_VERSION_VENDOR ${VENDOR})
366 set(RC_VERSION_PRODUCT ${PRODUCT})
367 set(RC_VERSION_PATCH ${BUILD_NUMBER})
368 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
370 string(TIMESTAMP RC_VERSION_YEAR "%Y")
372 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
373 set(CMAKE_WINDOWS_VERSION "WINXP")
376 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
377 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
378 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
379 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
380 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
381 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
382 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
383 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
384 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
385 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
386 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00")
387 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00")
390 if (FREERDP_EXTERNAL_SSL_PATH)
391 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
396 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
399 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
400 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINPR_EXPORTS -DFREERDP_EXPORTS")
404 check_include_files(fcntl.h HAVE_FCNTL_H)
405 check_include_files(unistd.h HAVE_UNISTD_H)
406 check_include_files(execinfo.h HAVE_EXECINFO_H)
407 check_include_files(inttypes.h HAVE_INTTYPES_H)
408 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
409 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
410 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
411 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
412 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
413 check_include_files(syslog.h HAVE_SYSLOG_H)
417 set(HAVE_INTTYPES_H 1)
418 set(HAVE_SYS_FILIO_H 1)
422 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
424 set(HAVE_TM_GMTOFF 1)
430 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
431 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
433 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
434 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
436 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
437 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
440 if(IS_DIRECTORY /opt/local/include)
441 include_directories(/opt/local/include)
442 link_directories(/opt/local/lib)
446 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
447 # Workaround: specify the parameter in the command-line
449 # set(CMAKE_C_COMPILER "clang")
453 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
454 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
460 set(WITH_MANPAGES "ON")
462 set(WITH_PULSE "OFF")
464 set(WITH_WAYLAND "OFF")
469 set(WITH_LIBRARY_VERSIONING "OFF")
471 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
473 if (${ANDROID_ABI} STREQUAL "armeabi")
477 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
478 add_definitions(-DNDK_DEBUG=1)
480 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
481 # which is not supported by the gdbserver binary shipped with
482 # the android NDK (tested with r9b)
483 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
485 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
487 if (NOT FREERDP_EXTERNAL_PATH)
488 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
489 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
491 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
495 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
496 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
497 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
498 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
501 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
502 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
506 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
509 find_package(Threads REQUIRED)
513 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
514 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
515 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
516 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
517 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
518 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
519 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
521 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
522 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
523 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
526 if(WITH_VALGRIND_MEMCHECK)
527 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
529 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
533 check_include_files(sys/eventfd.h HAVE_AIO_H)
534 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
536 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
538 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
539 check_include_files(poll.h HAVE_POLL_H)
540 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
541 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
542 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
543 set(X11_FEATURE_TYPE "RECOMMENDED")
544 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
546 set(X11_FEATURE_TYPE "DISABLED")
547 set(WAYLAND_FEATURE_TYPE "DISABLED")
551 find_package(PCSCWinPR)
554 set(X11_FEATURE_PURPOSE "X11")
555 set(X11_FEATURE_DESCRIPTION "X11 client and server")
557 set(WAYLAND_FEATURE_PURPOSE "Wayland")
558 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
560 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
561 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
562 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
564 set(ZLIB_FEATURE_TYPE "REQUIRED")
565 set(ZLIB_FEATURE_PURPOSE "compression")
566 set(ZLIB_FEATURE_DESCRIPTION "data compression")
568 set(OPENSSL_FEATURE_TYPE "REQUIRED")
569 set(OPENSSL_FEATURE_PURPOSE "cryptography")
570 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
572 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
573 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
574 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
576 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
577 set(OPENSLES_FEATURE_PURPOSE "multimedia")
578 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
580 set(OSS_FEATURE_TYPE "RECOMMENDED")
581 set(OSS_FEATURE_PURPOSE "sound")
582 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
584 set(ALSA_FEATURE_TYPE "RECOMMENDED")
585 set(ALSA_FEATURE_PURPOSE "sound")
586 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
588 set(PULSE_FEATURE_TYPE "OPTIONAL")
589 set(PULSE_FEATURE_PURPOSE "sound")
590 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
592 set(CUPS_FEATURE_TYPE "OPTIONAL")
593 set(CUPS_FEATURE_PURPOSE "printing")
594 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
596 set(PCSC_FEATURE_TYPE "OPTIONAL")
597 set(PCSC_FEATURE_PURPOSE "smart card")
598 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
600 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
601 set(FFMPEG_FEATURE_PURPOSE "multimedia")
602 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
604 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
605 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
606 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
608 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
609 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
610 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
612 set(IPP_FEATURE_TYPE "OPTIONAL")
613 set(IPP_FEATURE_PURPOSE "performance")
614 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
616 set(JPEG_FEATURE_TYPE "OPTIONAL")
617 set(JPEG_FEATURE_PURPOSE "codec")
618 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
620 set(X264_FEATURE_TYPE "OPTIONAL")
621 set(X264_FEATURE_PURPOSE "codec")
622 set(X264_FEATURE_DESCRIPTION "use x264 library")
624 set(OPENH264_FEATURE_TYPE "OPTIONAL")
625 set(OPENH264_FEATURE_PURPOSE "codec")
626 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
628 set(GSM_FEATURE_TYPE "OPTIONAL")
629 set(GSM_FEATURE_PURPOSE "codec")
630 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
633 set(X11_FEATURE_TYPE "DISABLED")
634 set(WAYLAND_FEATURE_TYPE "DISABLED")
635 set(ZLIB_FEATURE_TYPE "DISABLED")
636 set(DIRECTFB_FEATURE_TYPE "DISABLED")
637 set(OSS_FEATURE_TYPE "DISABLED")
638 set(ALSA_FEATURE_TYPE "DISABLED")
639 set(PULSE_FEATURE_TYPE "DISABLED")
640 set(CUPS_FEATURE_TYPE "DISABLED")
641 set(PCSC_FEATURE_TYPE "DISABLED")
642 set(FFMPEG_FEATURE_TYPE "DISABLED")
643 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
644 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
645 set(OPENSLES_FEATURE_TYPE "DISABLED")
649 set(DIRECTFB_FEATURE_TYPE "DISABLED")
650 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
651 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
652 set(X11_FEATURE_TYPE "OPTIONAL")
653 set(WAYLAND_FEATURE_TYPE "DISABLED")
654 set(OSS_FEATURE_TYPE "DISABLED")
655 set(ALSA_FEATURE_TYPE "DISABLED")
657 set(X11_FEATURE_TYPE "DISABLED")
658 set(PULSE_FEATURE_TYPE "DISABLED")
659 set(CUPS_FEATURE_TYPE "DISABLED")
660 set(PCSC_FEATURE_TYPE "DISABLED")
661 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
662 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
664 set(OPENSLES_FEATURE_TYPE "DISABLED")
667 if(UNIX AND NOT ANDROID)
668 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
669 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
670 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
672 #include(Findlibsystemd)
673 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
676 set(HAVE_JOURNALD_H TRUE)
678 unset(HAVE_JOURNALD_H)
680 endif(UNIX AND NOT ANDROID)
683 set(X11_FEATURE_TYPE "DISABLED")
684 set(WAYLAND_FEATURE_TYPE "DISABLED")
685 set(DIRECTFB_FEATURE_TYPE "DISABLED")
686 set(OSS_FEATURE_TYPE "DISABLED")
687 set(ALSA_FEATURE_TYPE "DISABLED")
688 set(PULSE_FEATURE_TYPE "DISABLED")
689 set(CUPS_FEATURE_TYPE "DISABLED")
690 set(PCSC_FEATURE_TYPE "DISABLED")
691 set(FFMPEG_FEATURE_TYPE "DISABLED")
692 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
693 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
694 set(OPENSLES_FEATURE_TYPE "REQUIRED")
697 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
698 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
699 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
700 if (${WITH_DIRECTFB})
701 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
704 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
705 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
706 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
707 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
709 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
710 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
711 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
713 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
714 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
716 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
718 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
719 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
721 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
722 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
723 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
724 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
726 if(TARGET_ARCH MATCHES "x86|x64")
728 # Intel Performance Primitives
729 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
734 add_definitions("-DWITH_OPENSSL")
738 add_definitions("-DWITH_MBEDTLS")
741 if (TARGET_ARCH MATCHES "sparc")
742 set(HAVE_ALIGNED_REQUIRED 1)
745 # Path to put FreeRDP data
746 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
748 # Path to put plugins
750 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
752 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
753 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
755 # Path to put extensions
756 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
758 # Include directories
759 include_directories(${CMAKE_CURRENT_BINARY_DIR})
760 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
761 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
764 add_definitions("-DHAVE_CONFIG_H")
765 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
767 # RPATH configuration
769 set(CMAKE_SKIP_RPATH FALSE)
770 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
772 set(CMAKE_SKIP_BUILD_RPATH FALSE)
773 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
774 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
775 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
780 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
781 set(PROFILER_LIBRARIES
782 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
783 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
792 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_TEST_EXPORTS")
797 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
799 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
804 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
805 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
807 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
808 set(PUBLIC_KEYWORD "")
809 set(PRIVATE_KEYWORD "")
811 set(PUBLIC_KEYWORD "PUBLIC")
812 set(PRIVATE_KEYWORD "PRIVATE")
815 add_subdirectory(winpr)
820 add_subdirectory(third-party)
821 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
822 include_directories(${THIRD_PARTY_INCLUDES})
826 add_subdirectory(include)
828 add_subdirectory(libfreerdp)
831 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
832 if (IOS_PLATFORM MATCHES "SIMULATOR")
833 set(CMAKE_OSX_SYSROOT "iphonesimulator")
835 set(CMAKE_OSX_SYSROOT "iphoneos")
840 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
841 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
843 add_subdirectory(rdtk)
846 add_subdirectory(uwac)
850 if(IS_DIRECTORY /usr/local/include)
851 include_directories(/usr/local/include)
852 link_directories(/usr/local/lib)
855 if(IS_DIRECTORY /usr/X11R6/include)
856 include_directories(/usr/X11R6/include)
862 add_subdirectory(channels)
865 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
866 add_subdirectory(client)
870 add_subdirectory(server)
875 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
877 if(NOT (VENDOR MATCHES "FreeRDP"))
878 if(DEFINED CLIENT_VENDOR_PATH)
879 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
880 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
885 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
887 include(${CMAKE_CPACK_INCLUDE_FILE})
889 set(FREERDP_BUILD_CONFIG_LIST "")
890 GET_CMAKE_PROPERTY(res VARIABLES)
892 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
893 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
896 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
897 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)