1 # FreeRDP: A Remote Desktop Protocol Implementation
2 # FreeRDP cmake build script
4 # Copyright 2011 O.S. Systems Software Ltda.
5 # Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
6 # Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
7 # Copyright 2012 HP Development Company, LLC
9 # Licensed under the Apache License, Version 2.0 (the "License");
10 # you may not use this file except in compliance with the License.
11 # You may obtain a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 # See the License for the specific language governing permissions and
19 # limitations under the License.
21 cmake_minimum_required(VERSION 2.8)
23 project(FreeRDP C CXX)
25 if(NOT DEFINED VENDOR)
26 set(VENDOR "FreeRDP" CACHE STRING "FreeRDP package vendor")
29 if(NOT DEFINED PRODUCT)
30 set(PRODUCT "FreeRDP" CACHE STRING "FreeRDP package name")
33 if(NOT DEFINED FREERDP_VENDOR)
37 set(CMAKE_COLOR_MAKEFILE ON)
39 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
41 # Include our extra modules
42 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
44 if((CMAKE_SYSTEM_NAME MATCHES "WindowsStore") AND (CMAKE_SYSTEM_VERSION MATCHES "10.0"))
46 add_definitions("-D_UWP")
47 set(CMAKE_WINDOWS_VERSION "WIN10")
50 # Check for cmake compatibility (enable/disable features)
51 include(CheckCmakeCompat)
53 # Include cmake modules
54 include(CheckIncludeFiles)
55 include(CheckLibraryExists)
56 include(CheckSymbolExists)
57 include(CheckStructHasMember)
58 include(FindPkgConfig)
59 include(TestBigEndian)
62 include(AutoVersioning)
63 include(ConfigOptions)
64 include(ComplexLibrary)
65 include(FeatureSummary)
66 include(CheckCCompilerFlag)
67 include(CheckCXXCompilerFlag)
68 include(GNUInstallDirsWrapper)
69 include(CMakePackageConfigHelpers)
73 if ($ENV{BUILD_NUMBER})
74 set(BUILD_NUMBER $ENV{BUILD_NUMBER})
76 set(WITH_LIBRARY_VERSIONING "ON")
77 set(FREERDP_VERSION_MAJOR "2")
78 set(FREERDP_VERSION_MINOR "0")
79 set(FREERDP_VERSION_REVISION "0")
80 set(FREERDP_VERSION_SUFFIX "dev")
81 set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}")
82 set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}")
83 if (FREERDP_VERSION_SUFFIX)
84 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}-${FREERDP_VERSION_SUFFIX}")
86 set(FREERDP_VERSION_FULL "${FREERDP_VERSION}")
88 set(FREERDP_INCLUDE_DIR "include/freerdp${FREERDP_VERSION_MAJOR}/")
90 # Compatibility options
91 if(DEFINED STATIC_CHANNELS)
92 message(WARNING "STATIC_CHANNELS is obsolete, please use BUILTIN_CHANNELS instead")
93 set(BUILTIN_CHANNELS ${STATIC_CHANNELS} CACHE BOOL "" FORCE)
97 if (CMAKE_INSTALL_PREFIX)
98 get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
100 if (FREERDP_EXTERNAL_PATH)
101 get_filename_component (FREERDP_EXTERNAL_PATH "${FREERDP_EXTERNAL_PATH}" ABSOLUTE)
104 # Allow to search the host machine for git
105 if(CMAKE_CROSSCOMPILING)
106 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
107 endif(CMAKE_CROSSCOMPILING)
109 include(GetGitRevisionDescription)
110 git_get_exact_tag(GIT_REVISION --tags --always)
112 if (${GIT_REVISION} STREQUAL "n/a")
113 git_rev_parse (GIT_REVISION --short)
115 if(CMAKE_CROSSCOMPILING)
116 SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
117 endif(CMAKE_CROSSCOMPILING)
119 message(STATUS "Git Revision ${GIT_REVISION}")
121 # Turn on solution folders (2.8.4+)
122 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
124 # Default to release build type
125 if(NOT CMAKE_BUILD_TYPE)
126 set(CMAKE_BUILD_TYPE "Release")
129 if(NOT DEFINED BUILD_SHARED_LIBS)
131 set(BUILD_SHARED_LIBS OFF)
133 set(BUILD_SHARED_LIBS ON)
138 set(EXPORT_ALL_SYMBOLS TRUE)
139 elseif(NOT DEFINED EXPORT_ALL_SYMBOLS)
140 set(EXPORT_ALL_SYMBOLS FALSE)
143 if (EXPORT_ALL_SYMBOLS)
144 # set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
145 add_definitions(-DFREERDP_TEST_EXPORTS -DBUILD_TESTING)
146 endif(EXPORT_ALL_SYMBOLS)
149 if(${CMAKE_SYSTEM_NAME} MATCHES "BSD")
151 if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
154 if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
159 # Configure MSVC Runtime
162 if(NOT DEFINED MSVC_RUNTIME)
163 set(MSVC_RUNTIME "dynamic")
165 if(MSVC_RUNTIME STREQUAL "static")
166 if(BUILD_SHARED_LIBS)
167 message(FATAL_ERROR "Static CRT is only supported in a fully static build")
169 message(STATUS "Use the MSVC static runtime option carefully!")
170 message(STATUS "OpenSSL uses /MD by default, and is very picky")
171 message(STATUS "Random freeing errors are a common sign of runtime issues")
173 configure_msvc_runtime()
175 if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
176 set(CMAKE_SUPPRESS_REGENERATION ON)
180 # Compiler-specific flags
181 if(CMAKE_COMPILER_IS_GNUCC)
182 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
183 CHECK_SYMBOL_EXISTS(__x86_64__ "" IS_X86_64)
185 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
187 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
190 if(CMAKE_POSITION_INDEPENDENT_CODE)
191 if(${CMAKE_VERSION} VERSION_LESS 2.8.9)
192 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
197 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
199 CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
200 if(Wno-unused-result)
201 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
203 CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
204 if(Wno-unused-but-set-variable)
205 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
207 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
208 if(Wno-deprecated-declarations)
209 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
211 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
212 if(Wno-deprecated-declarationsCXX)
213 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
216 if(NOT EXPORT_ALL_SYMBOLS)
217 message(STATUS "GCC default symbol visibility: hidden")
218 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
221 CHECK_C_COMPILER_FLAG(-Wno-format Wno-format)
223 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
226 CHECK_C_COMPILER_FLAG (-Wimplicit-function-declaration Wimplicit-function-declaration)
227 if(Wimplicit-function-declaration)
228 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wimplicit-function-declaration")
232 CHECK_C_COMPILER_FLAG (-Wredundant-decls Wredundant-decls)
234 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls")
237 if(CMAKE_BUILD_TYPE STREQUAL "Release")
238 add_definitions(-DNDEBUG)
240 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
241 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
244 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
248 # When building with Unix Makefiles and doing any release builds
249 # try to set __FILE__ to relative paths via a make specific macro
250 if (CMAKE_GENERATOR MATCHES "Unix Makefile*")
251 if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
252 string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_BUILD_TYPE)
253 CHECK_C_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefined)
254 if(Wno-builtin-macro-redefined)
255 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 $<)))\"'")
258 CHECK_CXX_COMPILER_FLAG (-Wno-builtin-macro-redefined Wno-builtin-macro-redefinedCXX)
259 if(Wno-builtin-macro-redefinedCXX)
260 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 $<)))\"'")
265 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
266 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter")
267 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-macros -Wno-padded")
268 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-c11-extensions -Wno-gnu")
270 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mssse3")
272 CHECK_C_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarations)
273 if(Wno-deprecated-declarations)
274 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
276 CHECK_CXX_COMPILER_FLAG(-Wno-deprecated-declarations Wno-deprecated-declarationsCXX)
277 if(Wno-deprecated-declarationsCXX)
278 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
282 # Enable address sanitizer, where supported and when required
283 if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC)
284 if(WITH_SANITIZE_ADDRESS)
285 if (DEFINED CMAKE_REQUIRED_FLAGS)
286 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
288 set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
289 CHECK_C_COMPILER_FLAG ("-fsanitize=address" fsanitize-address)
290 if(fsanitize-address)
291 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
293 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
294 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
296 unset(CMAKE_REQUIRED_FLAGS)
299 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
300 if(fno-omit-frame-pointer)
301 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
303 elseif(WITH_SANITIZE_LEAK)
304 if (DEFINED CMAKE_REQUIRED_FLAGS)
305 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
307 set(CMAKE_REQUIRED_FLAGS "-fsanitize=leak")
308 CHECK_C_COMPILER_FLAG ("-fsanitize=leak" fsanitize-leak)
310 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=leak")
312 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
313 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
315 unset(CMAKE_REQUIRED_FLAGS)
318 CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer)
319 if(fno-omit-frame-pointer)
320 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
324 if (WITH_NO_UNDEFINED)
325 if (DEFINED CMAKE_REQUIRED_FLAGS)
326 set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
328 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
329 CHECK_C_COMPILER_FLAG (-Wl,--no-undefined no-undefined)
330 if (DEFINED SAVE_CMAKE_REQUIRED_FLAGS)
331 set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
332 unset(SAVE_CMAKE_REQUIRED_FLAGS)
334 unset(CMAKE_REQUIRED_FLAGS)
337 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
343 # Remove previous warning definitions,
344 # NMake is otherwise complaining.
345 foreach (flags_var_to_scrub
348 CMAKE_CXX_FLAGS_RELEASE
349 CMAKE_CXX_FLAGS_RELWITHDEBINFO
350 CMAKE_CXX_FLAGS_MINSIZEREL
351 CMAKE_C_FLAGS_RELEASE
352 CMAKE_C_FLAGS_RELWITHDEBINFO
353 CMAKE_C_FLAGS_MINSIZEREL)
354 string (REGEX REPLACE "(^| )[/-]W[ ]*[1-9]" " "
355 "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
358 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
359 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
361 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
362 add_definitions(-D_AMD64_)
364 add_definitions(-D_X86_)
367 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
368 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
370 if(CMAKE_BUILD_TYPE STREQUAL "Release")
372 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Zi")
373 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
379 add_definitions(-DUNICODE -D_UNICODE)
380 add_definitions(-D_CRT_SECURE_NO_WARNINGS)
381 add_definitions(-DWIN32_LEAN_AND_MEAN)
382 add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
384 set(CMAKE_USE_RELATIVE_PATH ON)
385 if (${CMAKE_GENERATOR} MATCHES "NMake Makefile*")
386 set(CMAKE_PDB_BINARY_DIR ${CMAKE_BINARY_DIR})
387 elseif (${CMAKE_GENERATOR} MATCHES "Visual Studio*")
388 set(CMAKE_PDB_BINARY_DIR "${CMAKE_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
390 message(FATAL "Unknown generator ${CMAKE_GENERATOR}")
393 # Set product and vendor for dll and exe version information.
394 set(RC_VERSION_VENDOR ${VENDOR})
395 set(RC_VERSION_PRODUCT ${PRODUCT})
396 set(RC_VERSION_PATCH ${BUILD_NUMBER})
397 set(RC_VERSION_DESCRIPTION ${GIT_REVISION})
399 string(TIMESTAMP RC_VERSION_YEAR "%Y")
401 if(NOT DEFINED CMAKE_WINDOWS_VERSION)
402 set(CMAKE_WINDOWS_VERSION "WINXP")
405 if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
406 add_definitions(-DWINVER=0x0501 -D_WIN32_WINNT=0x0501)
407 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
408 add_definitions(-DWINVER=0x0601 -D_WIN32_WINNT=0x0601)
409 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
410 add_definitions(-DWINVER=0x0602 -D_WIN32_WINNT=0x0602)
411 elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN10")
412 add_definitions(-DWINVER=0x0A00 -D_WIN32_WINNT=0x0A00)
415 if (FREERDP_EXTERNAL_SSL_PATH)
416 set(OPENSSL_ROOT_DIR ${FREERDP_EXTERNAL_SSL_PATH})
421 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -isysroot ${CMAKE_IOS_SDK_ROOT} -g")
424 add_definitions(-DWINPR_EXPORTS -DFREERDP_EXPORTS)
428 check_include_files(fcntl.h HAVE_FCNTL_H)
429 check_include_files(unistd.h HAVE_UNISTD_H)
430 check_include_files(execinfo.h HAVE_EXECINFO_H)
431 check_include_files(inttypes.h HAVE_INTTYPES_H)
432 check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
433 check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
434 check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
435 check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
436 check_include_files(sys/select.h HAVE_SYS_SELECT_H)
437 check_include_files(syslog.h HAVE_SYSLOG_H)
441 set(HAVE_INTTYPES_H 1)
442 set(HAVE_SYS_FILIO_H 1)
446 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
448 set(HAVE_TM_GMTOFF 1)
454 if (NOT FREERDP_IOS_EXTERNAL_SSL_PATH)
455 message(STATUS "FREERDP_IOS_EXTERNAL_SSL_PATH not set! Required if openssl is not found in the iOS SDK (which usually isn't")
457 set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_IOS_EXTERNAL_SSL_PATH})
458 set_property(GLOBAL PROPERTY XCODE_ATTRIBUTE_SKIP_INSTALL YES)
460 if(NOT DEFINED CMAKE_OSX_ARCHITECTURES)
461 set(CMAKE_OSX_ARCHITECTURES i386 x86_64)
464 if(IS_DIRECTORY /opt/local/include)
465 include_directories(/opt/local/include)
466 link_directories(/opt/local/lib)
470 # Temporarily disabled, causes the cmake script to be reexecuted, causing the compilation to fail.
471 # Workaround: specify the parameter in the command-line
473 # set(CMAKE_C_COMPILER "clang")
477 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -v")
478 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v")
484 set(WITH_MANPAGES "ON")
486 set(WITH_PULSE "OFF")
488 set(WITH_WAYLAND "OFF")
493 set(WITH_LIBRARY_VERSIONING "OFF")
495 set_property( GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ${ANDROID_LIBRARY_USE_LIB64_PATHS} )
497 if (${ANDROID_ABI} STREQUAL "armeabi")
501 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
502 add_definitions(-DNDK_DEBUG=1)
504 # NOTE: Manually add -gdwarf-3, as newer toolchains default to -gdwarf-4,
505 # which is not supported by the gdbserver binary shipped with
506 # the android NDK (tested with r9b)
507 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG} -gdwarf-3")
509 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -llog")
511 if (NOT FREERDP_EXTERNAL_PATH)
512 if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/external/")
513 set (FREERDP_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/external/")
515 message(STATUS "FREERDP_EXTERNAL_PATH not set!")
519 list (APPEND CMAKE_INCLUDE_PATH ${FREERDP_EXTERNAL_PATH}/include)
520 list (APPEND CMAKE_LIBRARY_PATH ${FREERDP_EXTERNAL_PATH}/${ANDROID_ABI}/ )
521 set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH )
522 set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH )
525 CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/scripts/gprof_generate.sh.cmake
526 ${CMAKE_BINARY_DIR}/scripts/gprof_generate.sh @ONLY)
530 set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
533 find_package(Threads REQUIRED)
537 CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
538 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
539 CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
540 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
541 if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
542 CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
543 endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
545 if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
546 set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
547 endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
550 if(WITH_VALGRIND_MEMCHECK)
551 check_include_files(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
553 unset(HAVE_VALGRIND_MEMCHECK_H CACHE)
557 check_include_files(sys/eventfd.h HAVE_AIO_H)
558 check_include_files(sys/eventfd.h HAVE_EVENTFD_H)
560 check_symbol_exists(eventfd_read sys/eventfd.h WITH_EVENTFD_READ_WRITE)
562 check_include_files(sys/timerfd.h HAVE_TIMERFD_H)
563 check_include_files(poll.h HAVE_POLL_H)
564 list(APPEND CMAKE_REQUIRED_LIBRARIES m)
565 check_symbol_exists(ceill math.h HAVE_MATH_C99_LONG_DOUBLE)
566 list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES m)
567 set(X11_FEATURE_TYPE "RECOMMENDED")
568 set(WAYLAND_FEATURE_TYPE "RECOMMENDED")
570 set(X11_FEATURE_TYPE "DISABLED")
571 set(WAYLAND_FEATURE_TYPE "DISABLED")
575 find_package(PCSCWinPR)
578 set(X11_FEATURE_PURPOSE "X11")
579 set(X11_FEATURE_DESCRIPTION "X11 client and server")
581 set(WAYLAND_FEATURE_PURPOSE "Wayland")
582 set(WAYLAND_FEATURE_DESCRIPTION "Wayland client")
584 set(DIRECTFB_FEATURE_TYPE "OPTIONAL")
585 set(DIRECTFB_FEATURE_PURPOSE "DirectFB")
586 set(DIRECTFB_FEATURE_DESCRIPTION "DirectFB client")
588 set(ZLIB_FEATURE_TYPE "REQUIRED")
589 set(ZLIB_FEATURE_PURPOSE "compression")
590 set(ZLIB_FEATURE_DESCRIPTION "data compression")
592 set(OPENSSL_FEATURE_TYPE "REQUIRED")
593 set(OPENSSL_FEATURE_PURPOSE "cryptography")
594 set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
596 set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
597 set(MBEDTLS_FEATURE_PURPOSE "cryptography")
598 set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
600 set(OPENSLES_FEATURE_TYPE "OPTIONAL")
601 set(OPENSLES_FEATURE_PURPOSE "multimedia")
602 set(OPENSLES_FEATURE_DESCRIPTION "OpenSLES audio / video")
604 set(OSS_FEATURE_TYPE "RECOMMENDED")
605 set(OSS_FEATURE_PURPOSE "sound")
606 set(OSS_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
608 set(ALSA_FEATURE_TYPE "RECOMMENDED")
609 set(ALSA_FEATURE_PURPOSE "sound")
610 set(ALSA_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
612 set(PULSE_FEATURE_TYPE "OPTIONAL")
613 set(PULSE_FEATURE_PURPOSE "sound")
614 set(PULSE_FEATURE_DESCRIPTION "audio input, audio output and multimedia redirection")
616 set(CUPS_FEATURE_TYPE "OPTIONAL")
617 set(CUPS_FEATURE_PURPOSE "printing")
618 set(CUPS_FEATURE_DESCRIPTION "printer device redirection")
620 set(PCSC_FEATURE_TYPE "OPTIONAL")
621 set(PCSC_FEATURE_PURPOSE "smart card")
622 set(PCSC_FEATURE_DESCRIPTION "smart card device redirection")
624 set(FFMPEG_FEATURE_TYPE "RECOMMENDED")
625 set(FFMPEG_FEATURE_PURPOSE "multimedia")
626 set(FFMPEG_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
628 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
629 set(GSTREAMER_0_10_FEATURE_PURPOSE "multimedia")
630 set(GSTREAMER_0_10_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback, gstreamer 0.10 version")
632 set(GSTREAMER_1_0_FEATURE_TYPE "RECOMMENDED")
633 set(GSTREAMER_1_0_FEATURE_PURPOSE "multimedia")
634 set(GSTREAMER_1_0_FEATURE_DESCRIPTION "multimedia redirection, audio and video playback")
636 set(IPP_FEATURE_TYPE "OPTIONAL")
637 set(IPP_FEATURE_PURPOSE "performance")
638 set(IPP_FEATURE_DESCRIPTION "Intel Integrated Performance Primitives library")
640 set(JPEG_FEATURE_TYPE "OPTIONAL")
641 set(JPEG_FEATURE_PURPOSE "codec")
642 set(JPEG_FEATURE_DESCRIPTION "use JPEG library")
644 set(X264_FEATURE_TYPE "OPTIONAL")
645 set(X264_FEATURE_PURPOSE "codec")
646 set(X264_FEATURE_DESCRIPTION "use x264 library")
648 set(OPENH264_FEATURE_TYPE "OPTIONAL")
649 set(OPENH264_FEATURE_PURPOSE "codec")
650 set(OPENH264_FEATURE_DESCRIPTION "use OpenH264 library")
652 set(GSM_FEATURE_TYPE "OPTIONAL")
653 set(GSM_FEATURE_PURPOSE "codec")
654 set(GSM_FEATURE_DESCRIPTION "GSM audio codec library")
657 set(X11_FEATURE_TYPE "DISABLED")
658 set(WAYLAND_FEATURE_TYPE "DISABLED")
659 set(ZLIB_FEATURE_TYPE "DISABLED")
660 set(DIRECTFB_FEATURE_TYPE "DISABLED")
661 set(OSS_FEATURE_TYPE "DISABLED")
662 set(ALSA_FEATURE_TYPE "DISABLED")
663 set(PULSE_FEATURE_TYPE "DISABLED")
664 set(CUPS_FEATURE_TYPE "DISABLED")
665 set(PCSC_FEATURE_TYPE "DISABLED")
666 set(FFMPEG_FEATURE_TYPE "DISABLED")
667 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
668 set(GSTREAMER_0_10_FEATURE_TYPE "OPTIONAL")
669 set(OPENSLES_FEATURE_TYPE "DISABLED")
673 set(DIRECTFB_FEATURE_TYPE "DISABLED")
674 set(FFMPEG_FEATURE_TYPE "OPTIONAL")
675 set(GSTREAMER_1_0_FEATURE_TYPE "OPTIONAL")
676 set(X11_FEATURE_TYPE "OPTIONAL")
677 set(WAYLAND_FEATURE_TYPE "DISABLED")
678 set(OSS_FEATURE_TYPE "DISABLED")
679 set(ALSA_FEATURE_TYPE "DISABLED")
681 set(X11_FEATURE_TYPE "DISABLED")
682 set(PULSE_FEATURE_TYPE "DISABLED")
683 set(CUPS_FEATURE_TYPE "DISABLED")
684 set(PCSC_FEATURE_TYPE "DISABLED")
685 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
686 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
688 set(OPENSLES_FEATURE_TYPE "DISABLED")
691 if(UNIX AND NOT ANDROID)
692 set(WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE "RECOMMENDED")
693 set(WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE "systemd journal appender")
694 set(WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION "allows to export wLog to systemd journal")
696 #include(Findlibsystemd)
697 find_feature(libsystemd ${WLOG_SYSTEMD_JOURNAL_FEATURE_TYPE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_PURPOSE} ${WLOG_SYSTEMD_JOURNAL_FEATURE_DESCRIPTION})
700 set(HAVE_JOURNALD_H TRUE)
702 unset(HAVE_JOURNALD_H)
704 endif(UNIX AND NOT ANDROID)
707 set(X11_FEATURE_TYPE "DISABLED")
708 set(WAYLAND_FEATURE_TYPE "DISABLED")
709 set(DIRECTFB_FEATURE_TYPE "DISABLED")
710 set(OSS_FEATURE_TYPE "DISABLED")
711 set(ALSA_FEATURE_TYPE "DISABLED")
712 set(PULSE_FEATURE_TYPE "DISABLED")
713 set(CUPS_FEATURE_TYPE "DISABLED")
714 set(PCSC_FEATURE_TYPE "DISABLED")
715 set(FFMPEG_FEATURE_TYPE "DISABLED")
716 set(GSTREAMER_1_0_FEATURE_TYPE "DISABLED")
717 set(GSTREAMER_0_10_FEATURE_TYPE "DISABLED")
718 set(OPENSLES_FEATURE_TYPE "REQUIRED")
721 find_feature(X11 ${X11_FEATURE_TYPE} ${X11_FEATURE_PURPOSE} ${X11_FEATURE_DESCRIPTION})
722 find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION})
723 find_feature(DirectFB ${DIRECTFB_FEATURE_TYPE} ${DIRECTFB_FEATURE_PURPOSE} ${DIRECTFB_FEATURE_DESCRIPTION})
724 if (${WITH_DIRECTFB})
725 message(WARNING "DIRECTFB is orphaned and not maintained see docs/README.directfb for details")
728 find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION})
729 find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
730 find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
731 find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION})
733 find_feature(OSS ${OSS_FEATURE_TYPE} ${OSS_FEATURE_PURPOSE} ${OSS_FEATURE_DESCRIPTION})
734 find_feature(ALSA ${ALSA_FEATURE_TYPE} ${ALSA_FEATURE_PURPOSE} ${ALSA_FEATURE_DESCRIPTION})
735 find_feature(Pulse ${PULSE_FEATURE_TYPE} ${PULSE_FEATURE_PURPOSE} ${PULSE_FEATURE_DESCRIPTION})
737 find_feature(Cups ${CUPS_FEATURE_TYPE} ${CUPS_FEATURE_PURPOSE} ${CUPS_FEATURE_DESCRIPTION})
738 find_feature(PCSC ${PCSC_FEATURE_TYPE} ${PCSC_FEATURE_PURPOSE} ${PCSC_FEATURE_DESCRIPTION})
740 find_feature(FFmpeg ${FFMPEG_FEATURE_TYPE} ${FFMPEG_FEATURE_PURPOSE} ${FFMPEG_FEATURE_DESCRIPTION})
742 find_feature(GStreamer_0_10 ${GSTREAMER_0_10_FEATURE_TYPE} ${GSTREAMER_0_10_FEATURE_PURPOSE} ${GSTREAMER_0_10_FEATURE_DESCRIPTION})
743 find_feature(GStreamer_1_0 ${GSTREAMER_1_0_FEATURE_TYPE} ${GSTREAMER_1_0_FEATURE_PURPOSE} ${GSTREAMER_1_0_FEATURE_DESCRIPTION})
745 find_feature(JPEG ${JPEG_FEATURE_TYPE} ${JPEG_FEATURE_PURPOSE} ${JPEG_FEATURE_DESCRIPTION})
746 find_feature(x264 ${X264_FEATURE_TYPE} ${X264_FEATURE_PURPOSE} ${X264_FEATURE_DESCRIPTION})
747 find_feature(OpenH264 ${OPENH264_FEATURE_TYPE} ${OPENH264_FEATURE_PURPOSE} ${OPENH264_FEATURE_DESCRIPTION})
748 find_feature(GSM ${GSM_FEATURE_TYPE} ${GSM_FEATURE_PURPOSE} ${GSM_FEATURE_DESCRIPTION})
750 if(TARGET_ARCH MATCHES "x86|x64")
752 # Intel Performance Primitives
753 find_feature(IPP ${IPP_FEATURE_TYPE} ${IPP_FEATURE_PURPOSE} ${IPP_FEATURE_DESCRIPTION})
758 add_definitions("-DWITH_OPENSSL")
762 add_definitions("-DWITH_MBEDTLS")
765 if (TARGET_ARCH MATCHES "sparc")
766 set(HAVE_ALIGNED_REQUIRED 1)
769 # Path to put FreeRDP data
770 set(FREERDP_DATA_PATH "${CMAKE_INSTALL_PREFIX}/share/freerdp${FREERDP_VERSION_MAJOR}")
772 # Path to put plugins
774 set(FREERDP_LIBRARY_PATH "${CMAKE_INSTALL_LIBDIR}")
776 set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}")
777 set(FREERDP_ADDIN_PATH "${FREERDP_PLUGIN_PATH}")
779 # Path to put extensions
780 set(FREERDP_EXTENSION_PATH "${CMAKE_INSTALL_FULL_LIBDIR}/freerdp${FREERDP_VERSION_MAJOR}/extensions")
782 # Include directories
783 include_directories(${CMAKE_CURRENT_BINARY_DIR})
784 include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
785 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
788 add_definitions("-DHAVE_CONFIG_H")
789 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
791 # RPATH configuration
793 set(CMAKE_SKIP_RPATH FALSE)
794 set(CMAKE_SKIP_INSTALL_RPATH TRUE)
796 set(CMAKE_SKIP_BUILD_RPATH FALSE)
797 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
798 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
799 set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}:\$ORIGIN/..")
804 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
805 set(PROFILER_LIBRARIES
806 "${FREERDP_EXTERNAL_PROFILER_PATH}/obj/local/${ANDROID_ABI}/libandroid-ndk-profiler.a")
807 include_directories("${FREERDP_EXTERNAL_PROFILER_PATH}")
819 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
821 set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
826 include_directories("${CMAKE_SOURCE_DIR}/winpr/include")
827 include_directories("${CMAKE_BINARY_DIR}/winpr/include")
829 if (${CMAKE_VERSION} VERSION_LESS 2.8.12)
830 set(PUBLIC_KEYWORD "")
831 set(PRIVATE_KEYWORD "")
833 set(PUBLIC_KEYWORD "PUBLIC")
834 set(PRIVATE_KEYWORD "PRIVATE")
837 add_subdirectory(winpr)
842 add_subdirectory(third-party)
843 if (NOT "${THIRD_PARTY_INCLUDES}" STREQUAL "")
844 include_directories(${THIRD_PARTY_INCLUDES})
848 add_subdirectory(include)
850 add_subdirectory(libfreerdp)
853 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
854 if (IOS_PLATFORM MATCHES "SIMULATOR")
855 set(CMAKE_OSX_SYSROOT "iphonesimulator")
857 set(CMAKE_OSX_SYSROOT "iphoneos")
862 include_directories("${CMAKE_SOURCE_DIR}/rdtk/include")
863 include_directories("${CMAKE_BINARY_DIR}/rdtk/include")
865 add_subdirectory(rdtk)
868 add_subdirectory(uwac)
872 if(IS_DIRECTORY /usr/local/include)
873 include_directories(/usr/local/include)
874 link_directories(/usr/local/lib)
877 if(IS_DIRECTORY /usr/X11R6/include)
878 include_directories(/usr/X11R6/include)
884 add_subdirectory(channels)
887 if(WITH_CLIENT_COMMON OR WITH_CLIENT)
888 add_subdirectory(client)
892 add_subdirectory(server)
897 set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake")
899 if(NOT (VENDOR MATCHES "FreeRDP"))
900 if(DEFINED CLIENT_VENDOR_PATH)
901 if(EXISTS "${CMAKE_SOURCE_DIR}/${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
902 set(CMAKE_CPACK_INCLUDE_FILE "${CLIENT_VENDOR_PATH}/CMakeCPack.cmake")
907 #message("VENDOR: ${VENDOR} CLIENT_VENDOR_PATH: ${CLIENT_VENDOR_PATH} CMAKE_CPACK_INCLUDE_FILE: ${CMAKE_CPACK_INCLUDE_FILE}")
909 include(${CMAKE_CPACK_INCLUDE_FILE})
911 set(FREERDP_BUILD_CONFIG_LIST "")
912 GET_CMAKE_PROPERTY(res VARIABLES)
914 IF (var MATCHES "^WITH_*|^BUILD_TESTING|^BUILTIN_CHANNELS|^HAVE_*")
915 LIST(APPEND FREERDP_BUILD_CONFIG_LIST "${var}=${${var}}")
918 string(REPLACE ";" " " FREERDP_BUILD_CONFIG "${FREERDP_BUILD_CONFIG_LIST}")
919 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/buildflags.h.in ${CMAKE_CURRENT_BINARY_DIR}/buildflags.h)